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