158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.framework; 258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 3909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot// android-changed add @hide 4909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot/** 5909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot * @hide not needed for public API 6909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot */ 758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class ComparisonCompactor { 858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private static final String ELLIPSIS= "..."; 1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private static final String DELTA_END= "]"; 1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private static final String DELTA_START= "["; 1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private int fContextLength; 1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private String fExpected; 1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private String fActual; 1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private int fPrefix; 1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private int fSuffix; 1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public ComparisonCompactor(int contextLength, String expected, String actual) { 2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fContextLength= contextLength; 2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fExpected= expected; 2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fActual= actual; 2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public String compact(String message) { 26131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot if (fExpected == null || fActual == null || areStringsEqual()) { 27131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot // android-changed use local method instead of Assert.format, since 28131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot // the later is not part of Android API till API 16 29131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot return format(message, fExpected, fActual); 30131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot } 3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot findCommonPrefix(); 3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot findCommonSuffix(); 3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String expected= compactString(fExpected); 3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String actual= compactString(fActual); 35131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot // android-changed use local format method 36131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot return format(message, expected, actual); 3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private String compactString(String source) { 4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END; 4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (fPrefix > 0) 4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot result= computeCommonPrefix() + result; 4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (fSuffix > 0) 4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot result= result + computeCommonSuffix(); 4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return result; 4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private void findCommonPrefix() { 4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrefix= 0; 5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot int end= Math.min(fExpected.length(), fActual.length()); 5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot for (; fPrefix < end; fPrefix++) { 5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix)) 5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot break; 5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private void findCommonSuffix() { 5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot int expectedSuffix= fExpected.length() - 1; 5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot int actualSuffix= fActual.length() - 1; 6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) { 6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix)) 6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot break; 6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fSuffix= fExpected.length() - expectedSuffix; 6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private String computeCommonPrefix() { 6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix); 6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private String computeCommonSuffix() { 7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length()); 7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : ""); 7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private boolean areStringsEqual() { 7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return fExpected.equals(fActual); 7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 79131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot 80131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot // android-changed copy of Assert.format for reasons described above 81131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot private static String format(String message, Object expected, Object actual) { 82131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot String formatted= ""; 83131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot if (message != null && message.length() > 0) 84131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot formatted= message+" "; 85131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot return formatted+"expected:<"+expected+"> but was:<"+actual+">"; 86131ae36bedb326432f4b830c12abfb1274cc391bBrett Chabot } 8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot} 88