| package junit.framework; |
| |
| 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()) { |
| return Assert.format(message, fExpected, fActual); |
| } |
| |
| findCommonPrefix(); |
| findCommonSuffix(); |
| String expected = compactString(fExpected); |
| String actual = compactString(fActual); |
| return Assert.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); |
| } |
| } |