158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.framework;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot// android-changed add @hide
4909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot/**
5909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot * @hide not needed for public API
6909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot */
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class ComparisonCompactor {
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final String ELLIPSIS= "...";
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final String DELTA_END= "]";
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final String DELTA_START= "[";
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private int fContextLength;
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String fExpected;
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String fActual;
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private int fPrefix;
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private int fSuffix;
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public ComparisonCompactor(int contextLength, String expected, String actual) {
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fContextLength= contextLength;
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fExpected= expected;
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fActual= actual;
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public String compact(String message) {
26131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot		if (fExpected == null || fActual == null || areStringsEqual()) {
27131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot			// android-changed use local method instead of Assert.format, since
28131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot			// the later is not part of Android API till API 16
29131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot			return format(message, fExpected, fActual);
30131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot		}
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		findCommonPrefix();
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		findCommonSuffix();
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String expected= compactString(fExpected);
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String actual= compactString(fActual);
35131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot		// android-changed use local format method
36131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot		return format(message, expected, actual);
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String compactString(String source) {
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fPrefix > 0)
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			result= computeCommonPrefix() + result;
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fSuffix > 0)
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			result= result + computeCommonSuffix();
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return result;
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void findCommonPrefix() {
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrefix= 0;
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int end= Math.min(fExpected.length(), fActual.length());
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (; fPrefix < end; fPrefix++) {
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				break;
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void findCommonSuffix() {
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int expectedSuffix= fExpected.length() - 1;
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int actualSuffix= fActual.length() - 1;
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix))
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				break;
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuffix=  fExpected.length() - expectedSuffix;
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String computeCommonPrefix() {
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String computeCommonSuffix() {
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private boolean areStringsEqual() {
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fExpected.equals(fActual);
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
79131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot
80131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot	// android-changed copy of Assert.format for reasons described above
81131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot	private static String format(String message, Object expected, Object actual) {
82131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot        	String formatted= "";
83131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot        	if (message != null && message.length() > 0)
84131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot            		formatted= message+" ";
85131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot        	return formatted+"expected:<"+expected+"> but was:<"+actual+">";
86131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot	}
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}
88