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