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