1package junit.framework;
2
3// android-changed add @hide
4/**
5 * @hide not needed for public API
6 */
7public class ComparisonCompactor {
8
9	private static final String ELLIPSIS= "...";
10	private static final String DELTA_END= "]";
11	private static final String DELTA_START= "[";
12
13	private int fContextLength;
14	private String fExpected;
15	private String fActual;
16	private int fPrefix;
17	private int fSuffix;
18
19	public ComparisonCompactor(int contextLength, String expected, String actual) {
20		fContextLength= contextLength;
21		fExpected= expected;
22		fActual= actual;
23	}
24
25	public String compact(String message) {
26		if (fExpected == null || fActual == null || areStringsEqual()) {
27			// android-changed use local method instead of Assert.format, since
28			// the later is not part of Android API till API 16
29			return format(message, fExpected, fActual);
30		}
31		findCommonPrefix();
32		findCommonSuffix();
33		String expected= compactString(fExpected);
34		String actual= compactString(fActual);
35		// android-changed use local format method
36		return format(message, expected, actual);
37	}
38
39	private String compactString(String source) {
40		String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
41		if (fPrefix > 0)
42			result= computeCommonPrefix() + result;
43		if (fSuffix > 0)
44			result= result + computeCommonSuffix();
45		return result;
46	}
47
48	private void findCommonPrefix() {
49		fPrefix= 0;
50		int end= Math.min(fExpected.length(), fActual.length());
51		for (; fPrefix < end; fPrefix++) {
52			if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
53				break;
54		}
55	}
56
57	private void findCommonSuffix() {
58		int expectedSuffix= fExpected.length() - 1;
59		int actualSuffix= fActual.length() - 1;
60		for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
61			if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix))
62				break;
63		}
64		fSuffix=  fExpected.length() - expectedSuffix;
65	}
66
67	private String computeCommonPrefix() {
68		return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
69	}
70
71	private String computeCommonSuffix() {
72		int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
73		return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
74	}
75
76	private boolean areStringsEqual() {
77		return fExpected.equals(fActual);
78	}
79
80	// android-changed copy of Assert.format for reasons described above
81	private static String format(String message, Object expected, Object actual) {
82        	String formatted= "";
83        	if (message != null && message.length() > 0)
84            		formatted= message+" ";
85        	return formatted+"expected:<"+expected+"> but was:<"+actual+">";
86	}
87}
88