001 package junit.framework;
002
003 public class ComparisonCompactor {
004
005 private static final String ELLIPSIS = "...";
006 private static final String DELTA_END = "]";
007 private static final String DELTA_START = "[";
008
009 private int fContextLength;
010 private String fExpected;
011 private String fActual;
012 private int fPrefix;
013 private int fSuffix;
014
015 public ComparisonCompactor(int contextLength, String expected, String actual) {
016 fContextLength = contextLength;
017 fExpected = expected;
018 fActual = actual;
019 }
020
021 @SuppressWarnings("deprecation")
022 public String compact(String message) {
023 if (fExpected == null || fActual == null || areStringsEqual()) {
024 return Assert.format(message, fExpected, fActual);
025 }
026
027 findCommonPrefix();
028 findCommonSuffix();
029 String expected = compactString(fExpected);
030 String actual = compactString(fActual);
031 return Assert.format(message, expected, actual);
032 }
033
034 private String compactString(String source) {
035 String result = DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
036 if (fPrefix > 0) {
037 result = computeCommonPrefix() + result;
038 }
039 if (fSuffix > 0) {
040 result = result + computeCommonSuffix();
041 }
042 return result;
043 }
044
045 private void findCommonPrefix() {
046 fPrefix = 0;
047 int end = Math.min(fExpected.length(), fActual.length());
048 for (; fPrefix < end; fPrefix++) {
049 if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix)) {
050 break;
051 }
052 }
053 }
054
055 private void findCommonSuffix() {
056 int expectedSuffix = fExpected.length() - 1;
057 int actualSuffix = fActual.length() - 1;
058 for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
059 if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix)) {
060 break;
061 }
062 }
063 fSuffix = fExpected.length() - expectedSuffix;
064 }
065
066 private String computeCommonPrefix() {
067 return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
068 }
069
070 private String computeCommonSuffix() {
071 int end = Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
072 return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
073 }
074
075 private boolean areStringsEqual() {
076 return fExpected.equals(fActual);
077 }
078 }