ComparisonCompactor.java revision 58a8b0aba2dec5695628a2bf25a3fae42c2c3533
158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.framework;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class ComparisonCompactor {
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final String ELLIPSIS= "...";
658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final String DELTA_END= "]";
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final String DELTA_START= "[";
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private int fContextLength;
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String fExpected;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String fActual;
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private int fPrefix;
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private int fSuffix;
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public ComparisonCompactor(int contextLength, String expected, String actual) {
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fContextLength= contextLength;
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fExpected= expected;
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fActual= actual;
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public String compact(String message) {
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fExpected == null || fActual == null || areStringsEqual())
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return Assert.format(message, fExpected, fActual);
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		findCommonPrefix();
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		findCommonSuffix();
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String expected= compactString(fExpected);
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String actual= compactString(fActual);
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return Assert.format(message, expected, actual);
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String compactString(String source) {
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fPrefix > 0)
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			result= computeCommonPrefix() + result;
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fSuffix > 0)
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			result= result + computeCommonSuffix();
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return result;
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void findCommonPrefix() {
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrefix= 0;
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int end= Math.min(fExpected.length(), fActual.length());
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (; fPrefix < end; fPrefix++) {
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				break;
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void findCommonSuffix() {
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int expectedSuffix= fExpected.length() - 1;
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int actualSuffix= fActual.length() - 1;
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix))
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				break;
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuffix=  fExpected.length() - expectedSuffix;
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String computeCommonPrefix() {
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private String computeCommonSuffix() {
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private boolean areStringsEqual() {
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fExpected.equals(fActual);
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}
73