package junit.framework;

/**
 * Thrown when an assert equals for Strings failed.
 *
 * Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com
 */
public class ComparisonFailure extends AssertionFailedError {
    private String fExpected;
    private String fActual;

    /**
     * Constructs a comparison failure.
     * @param message the identifying message or null
     * @param expected the expected string value
     * @param actual the actual string value
     */
    public ComparisonFailure (String message, String expected, String actual) {
        super (message);
        fExpected= expected;
        fActual= actual;
    }

    /**
     * Returns "..." in place of common prefix and "..." in
     * place of common suffix between expected and actual.
     *
     * @see java.lang.Throwable#getMessage()
     */
    public String getMessage() {
        if (fExpected == null || fActual == null)
            return Assert.format(super.getMessage(), fExpected, fActual);

        int end= Math.min(fExpected.length(), fActual.length());

        int i= 0;
        for(; i < end; i++) {
            if (fExpected.charAt(i) != fActual.charAt(i))
                break;
        }
        int j= fExpected.length()-1;
        int k= fActual.length()-1;
        for (; k >= i && j >= i; k--,j--) {
            if (fExpected.charAt(j) != fActual.charAt(k))
                break;
        }
        String actual, expected;

        // equal strings
        if (j < i && k < i) {
            expected= fExpected;
            actual= fActual;
        } else {
            expected= fExpected.substring(i, j+1);
            actual= fActual.substring(i, k+1);
            if (i <= end && i > 0) {
                expected= "..."+expected;
                actual= "..."+actual;
            }

            if (j < fExpected.length()-1)
                expected= expected+"...";
            if (k < fActual.length()-1)
                actual= actual+"...";
        }
        return Assert.format(super.getMessage(), expected, actual);
    }
}