15d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopackage junit.framework;
25d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
35d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/**
45d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Thrown when an assert equals for Strings failed.
55d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
65d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com
75d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
85d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class ComparisonFailure extends AssertionFailedError {
95d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private String fExpected;
105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private String fActual;
115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Constructs a comparison failure.
145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * @param message the identifying message or null
155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * @param expected the expected string value
165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * @param actual the actual string value
175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public ComparisonFailure (String message, String expected, String actual) {
195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        super (message);
205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        fExpected= expected;
215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        fActual= actual;
225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    /**
255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * Returns "..." in place of common prefix and "..." in
265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * place of common suffix between expected and actual.
275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     *
285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     * @see java.lang.Throwable#getMessage()
295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao     */
305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public String getMessage() {
315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        if (fExpected == null || fActual == null)
325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return Assert.format(super.getMessage(), fExpected, fActual);
335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        int end= Math.min(fExpected.length(), fActual.length());
355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        int i= 0;
37b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes        for (; i < end; i++) {
385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (fExpected.charAt(i) != fActual.charAt(i))
395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                break;
405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        int j= fExpected.length()-1;
425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        int k= fActual.length()-1;
435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        for (; k >= i && j >= i; k--,j--) {
445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (fExpected.charAt(j) != fActual.charAt(k))
455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                break;
465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String actual, expected;
485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        // equal strings
505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        if (j < i && k < i) {
515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            expected= fExpected;
525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            actual= fActual;
535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } else {
545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            expected= fExpected.substring(i, j+1);
555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            actual= fActual.substring(i, k+1);
565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (i <= end && i > 0) {
575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                expected= "..."+expected;
585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                actual= "..."+actual;
595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (j < fExpected.length()-1)
625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                expected= expected+"...";
635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (k < fActual.length()-1)
645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                actual= actual+"...";
655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        return Assert.format(super.getMessage(), expected, actual);
675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
69