149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeepackage junit.framework; 249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee/** 449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * Thrown when an assert equals for Strings failed. 549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * 649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com 749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee */ 849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbeepublic class ComparisonFailure extends AssertionFailedError { 949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee private String fExpected; 1049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee private String fActual; 1149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 1249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee /** 1349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * Constructs a comparison failure. 1449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * @param message the identifying message or null 1549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * @param expected the expected string value 1649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * @param actual the actual string value 1749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee */ 1849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee public ComparisonFailure (String message, String expected, String actual) { 1949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee super (message); 2049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee fExpected= expected; 2149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee fActual= actual; 2249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } 2349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 2449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee /** 2549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * Returns "..." in place of common prefix and "..." in 2649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * place of common suffix between expected and actual. 2749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * 2849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee * @see java.lang.Throwable#getMessage() 2949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee */ 3049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee public String getMessage() { 3149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (fExpected == null || fActual == null) 3249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee return Assert.format(super.getMessage(), fExpected, fActual); 3349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 3449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee int end= Math.min(fExpected.length(), fActual.length()); 3549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 3649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee int i= 0; 3749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee for(; i < end; i++) { 3849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (fExpected.charAt(i) != fActual.charAt(i)) 3949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee break; 4049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } 4149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee int j= fExpected.length()-1; 4249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee int k= fActual.length()-1; 4349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee for (; k >= i && j >= i; k--,j--) { 4449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (fExpected.charAt(j) != fActual.charAt(k)) 4549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee break; 4649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } 4749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee String actual, expected; 4849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 4949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee // equal strings 5049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (j < i && k < i) { 5149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee expected= fExpected; 5249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee actual= fActual; 5349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } else { 5449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee expected= fExpected.substring(i, j+1); 5549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee actual= fActual.substring(i, k+1); 5649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (i <= end && i > 0) { 5749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee expected= "..."+expected; 5849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee actual= "..."+actual; 5949024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } 6049024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee 6149024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (j < fExpected.length()-1) 6249024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee expected= expected+"..."; 6349024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee if (k < fActual.length()-1) 6449024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee actual= actual+"..."; 6549024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } 6649024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee return Assert.format(super.getMessage(), expected, actual); 6749024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee } 6849024493479b1ab8b5f9b44c24a3b0c33afc796cBill Buzbee} 69