summaryrefslogtreecommitdiff
path: root/test-base/src/junit/framework/ComparisonCompactor.java
blob: e540f03b87d32268a486fa88ac39344c9a0e5a0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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+">";
	}
}