| 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+">"; |
| } |
| } |