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);
}
}