149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeepackage junit.framework;
249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee/**
449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * Thrown when an assert equals for Strings failed.
549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee *
649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com
749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee */
849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeepublic class ComparisonFailure extends AssertionFailedError {
949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    private String fExpected;
1049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    private String fActual;
1149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
1249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    /**
1349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * Constructs a comparison failure.
1449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * @param message the identifying message or null
1549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * @param expected the expected string value
1649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * @param actual the actual string value
1749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     */
1849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    public ComparisonFailure (String message, String expected, String actual) {
1949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        super (message);
2049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        fExpected= expected;
2149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        fActual= actual;
2249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    }
2349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
2449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    /**
2549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * Returns "..." in place of common prefix and "..." in
2649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * place of common suffix between expected and actual.
2749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     *
2849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     * @see java.lang.Throwable#getMessage()
2949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee     */
3049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    public String getMessage() {
3149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        if (fExpected == null || fActual == null)
3249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            return Assert.format(super.getMessage(), fExpected, fActual);
3349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
3449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        int end= Math.min(fExpected.length(), fActual.length());
3549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
3649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        int i= 0;
3749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        for(; i < end; i++) {
3849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            if (fExpected.charAt(i) != fActual.charAt(i))
3949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee                break;
4049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        }
4149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        int j= fExpected.length()-1;
4249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        int k= fActual.length()-1;
4349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        for (; k >= i && j >= i; k--,j--) {
4449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            if (fExpected.charAt(j) != fActual.charAt(k))
4549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee                break;
4649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        }
4749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        String actual, expected;
4849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
4949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        // equal strings
5049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        if (j < i && k < i) {
5149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            expected= fExpected;
5249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            actual= fActual;
5349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        } else {
5449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            expected= fExpected.substring(i, j+1);
5549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            actual= fActual.substring(i, k+1);
5649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            if (i <= end && i > 0) {
5749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee                expected= "..."+expected;
5849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee                actual= "..."+actual;
5949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            }
6049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee
6149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            if (j < fExpected.length()-1)
6249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee                expected= expected+"...";
6349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee            if (k < fActual.length()-1)
6449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee                actual= actual+"...";
6549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        }
6649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee        return Assert.format(super.getMessage(), expected, actual);
6749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee    }
6849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee}
69