ComparisonFailure.java revision de75089fb7216d19e9c22cce4dc62a49513477d3
1package junit.framework;
2
3/**
4 * Thrown when an assert equals for Strings failed.
5 *
6 * Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com
7 */
8public class ComparisonFailure extends AssertionFailedError {
9    private String fExpected;
10    private String fActual;
11
12    /**
13     * Constructs a comparison failure.
14     * @param message the identifying message or null
15     * @param expected the expected string value
16     * @param actual the actual string value
17     */
18    public ComparisonFailure (String message, String expected, String actual) {
19        super (message);
20        fExpected= expected;
21        fActual= actual;
22    }
23
24    /**
25     * Returns "..." in place of common prefix and "..." in
26     * place of common suffix between expected and actual.
27     *
28     * @see java.lang.Throwable#getMessage()
29     */
30    public String getMessage() {
31        if (fExpected == null || fActual == null)
32            return Assert.format(super.getMessage(), fExpected, fActual);
33
34        int end= Math.min(fExpected.length(), fActual.length());
35
36        int i= 0;
37        for(; i < end; i++) {
38            if (fExpected.charAt(i) != fActual.charAt(i))
39                break;
40        }
41        int j= fExpected.length()-1;
42        int k= fActual.length()-1;
43        for (; k >= i && j >= i; k--,j--) {
44            if (fExpected.charAt(j) != fActual.charAt(k))
45                break;
46        }
47        String actual, expected;
48
49        // equal strings
50        if (j < i && k < i) {
51            expected= fExpected;
52            actual= fActual;
53        } else {
54            expected= fExpected.substring(i, j+1);
55            actual= fActual.substring(i, k+1);
56            if (i <= end && i > 0) {
57                expected= "..."+expected;
58                actual= "..."+actual;
59            }
60
61            if (j < fExpected.length()-1)
62                expected= expected+"...";
63            if (k < fActual.length()-1)
64                actual= actual+"...";
65        }
66        return Assert.format(super.getMessage(), expected, actual);
67    }
68}
69