package junit.framework; // android-changed add @hide /** * @hide not needed for public API */ public class ComparisonCompactor { private static final String ELLIPSIS= "..."; private static final String DELTA_END= "]"; private static final String DELTA_START= "["; private int fContextLength; private String fExpected; private String fActual; private int fPrefix; private int fSuffix; public ComparisonCompactor(int contextLength, String expected, String actual) { fContextLength= contextLength; fExpected= expected; fActual= actual; } public String compact(String message) { if (fExpected == null || fActual == null || areStringsEqual()) { // android-changed use local method instead of Assert.format, since // the later is not part of Android API till API 16 return format(message, fExpected, fActual); } findCommonPrefix(); findCommonSuffix(); String expected= compactString(fExpected); String actual= compactString(fActual); // android-changed use local format method return format(message, expected, actual); } private String compactString(String source) { String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END; if (fPrefix > 0) result= computeCommonPrefix() + result; if (fSuffix > 0) result= result + computeCommonSuffix(); return result; } private void findCommonPrefix() { fPrefix= 0; int end= Math.min(fExpected.length(), fActual.length()); for (; fPrefix < end; fPrefix++) { if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix)) break; } } private void findCommonSuffix() { int expectedSuffix= fExpected.length() - 1; int actualSuffix= fActual.length() - 1; for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) { if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix)) break; } fSuffix= fExpected.length() - expectedSuffix; } private String computeCommonPrefix() { return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix); } private String computeCommonSuffix() { int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length()); return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : ""); } private boolean areStringsEqual() { return fExpected.equals(fActual); } // android-changed copy of Assert.format for reasons described above private static String format(String message, Object expected, Object actual) { String formatted= ""; if (message != null && message.length() > 0) formatted= message+" "; return formatted+"expected:<"+expected+"> but was:<"+actual+">"; } }