Alex Light | 1ef4ce8 | 2014-08-27 11:13:47 -0700 | [diff] [blame] | 1 | package junit.framework; |
| 2 | |
| 3 | // android-changed add @hide |
| 4 | /** |
| 5 | * @hide not needed for public API |
| 6 | */ |
| 7 | public class ComparisonCompactor { |
| 8 | |
| 9 | private static final String ELLIPSIS= "..."; |
| 10 | private static final String DELTA_END= "]"; |
| 11 | private static final String DELTA_START= "["; |
| 12 | |
| 13 | private int fContextLength; |
| 14 | private String fExpected; |
| 15 | private String fActual; |
| 16 | private int fPrefix; |
| 17 | private int fSuffix; |
| 18 | |
| 19 | public ComparisonCompactor(int contextLength, String expected, String actual) { |
| 20 | fContextLength= contextLength; |
| 21 | fExpected= expected; |
| 22 | fActual= actual; |
| 23 | } |
| 24 | |
| 25 | public String compact(String message) { |
| 26 | if (fExpected == null || fActual == null || areStringsEqual()) { |
| 27 | // android-changed use local method instead of Assert.format, since |
| 28 | // the later is not part of Android API till API 16 |
| 29 | return format(message, fExpected, fActual); |
| 30 | } |
| 31 | findCommonPrefix(); |
| 32 | findCommonSuffix(); |
| 33 | String expected= compactString(fExpected); |
| 34 | String actual= compactString(fActual); |
| 35 | // android-changed use local format method |
| 36 | return format(message, expected, actual); |
| 37 | } |
| 38 | |
| 39 | private String compactString(String source) { |
| 40 | String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END; |
| 41 | if (fPrefix > 0) |
| 42 | result= computeCommonPrefix() + result; |
| 43 | if (fSuffix > 0) |
| 44 | result= result + computeCommonSuffix(); |
| 45 | return result; |
| 46 | } |
| 47 | |
| 48 | private void findCommonPrefix() { |
| 49 | fPrefix= 0; |
| 50 | int end= Math.min(fExpected.length(), fActual.length()); |
| 51 | for (; fPrefix < end; fPrefix++) { |
| 52 | if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix)) |
| 53 | break; |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | private void findCommonSuffix() { |
| 58 | int expectedSuffix= fExpected.length() - 1; |
| 59 | int actualSuffix= fActual.length() - 1; |
| 60 | for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) { |
| 61 | if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix)) |
| 62 | break; |
| 63 | } |
| 64 | fSuffix= fExpected.length() - expectedSuffix; |
| 65 | } |
| 66 | |
| 67 | private String computeCommonPrefix() { |
| 68 | return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix); |
| 69 | } |
| 70 | |
| 71 | private String computeCommonSuffix() { |
| 72 | int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length()); |
| 73 | return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : ""); |
| 74 | } |
| 75 | |
| 76 | private boolean areStringsEqual() { |
| 77 | return fExpected.equals(fActual); |
| 78 | } |
| 79 | |
| 80 | // android-changed copy of Assert.format for reasons described above |
| 81 | private static String format(String message, Object expected, Object actual) { |
| 82 | String formatted= ""; |
| 83 | if (message != null && message.length() > 0) |
| 84 | formatted= message+" "; |
| 85 | return formatted+"expected:<"+expected+"> but was:<"+actual+">"; |
| 86 | } |
| 87 | } |