blob: e540f03b87d32268a486fa88ac39344c9a0e5a0c [file] [log] [blame]
Paul Duffincd7c34d2016-12-12 16:35:36 +00001package junit.framework;
2
3// android-changed add @hide
4/**
5 * @hide not needed for public API
6 */
7public 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}