• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package junit.framework;
2 
3 public class ComparisonCompactor {
4 
5 	private static final String ELLIPSIS= "...";
6 	private static final String DELTA_END= "]";
7 	private static final String DELTA_START= "[";
8 
9 	private int fContextLength;
10 	private String fExpected;
11 	private String fActual;
12 	private int fPrefix;
13 	private int fSuffix;
14 
ComparisonCompactor(int contextLength, String expected, String actual)15 	public ComparisonCompactor(int contextLength, String expected, String actual) {
16 		fContextLength= contextLength;
17 		fExpected= expected;
18 		fActual= actual;
19 	}
20 
compact(String message)21 	public String compact(String message) {
22 		if (fExpected == null || fActual == null || areStringsEqual())
23 			return Assert.format(message, fExpected, fActual);
24 
25 		findCommonPrefix();
26 		findCommonSuffix();
27 		String expected= compactString(fExpected);
28 		String actual= compactString(fActual);
29 		return Assert.format(message, expected, actual);
30 	}
31 
compactString(String source)32 	private String compactString(String source) {
33 		String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
34 		if (fPrefix > 0)
35 			result= computeCommonPrefix() + result;
36 		if (fSuffix > 0)
37 			result= result + computeCommonSuffix();
38 		return result;
39 	}
40 
findCommonPrefix()41 	private void findCommonPrefix() {
42 		fPrefix= 0;
43 		int end= Math.min(fExpected.length(), fActual.length());
44 		for (; fPrefix < end; fPrefix++) {
45 			if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
46 				break;
47 		}
48 	}
49 
findCommonSuffix()50 	private void findCommonSuffix() {
51 		int expectedSuffix= fExpected.length() - 1;
52 		int actualSuffix= fActual.length() - 1;
53 		for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
54 			if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix))
55 				break;
56 		}
57 		fSuffix=  fExpected.length() - expectedSuffix;
58 	}
59 
computeCommonPrefix()60 	private String computeCommonPrefix() {
61 		return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
62 	}
63 
computeCommonSuffix()64 	private String computeCommonSuffix() {
65 		int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
66 		return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
67 	}
68 
areStringsEqual()69 	private boolean areStringsEqual() {
70 		return fExpected.equals(fActual);
71 	}
72 }
73