Home | History | Annotate | Download | only in framework
      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 }
     88