content: package junit.framework;
  
  // android-changed add @hide
  /**
   * @hide not needed for public API
   */
  public class ComparisonCompactor {
  
  	private static final String ELLIPSIS= "...";
  	private static final String DELTA_END= "]";
  	private static final String DELTA_START= "[";
  	
  	private int fContextLength;
  	private String fExpected;
  	private String fActual;
  	private int fPrefix;
  	private int fSuffix;
  
  	public ComparisonCompactor(int contextLength, String expected, String actual) {
  		fContextLength= contextLength;
  		fExpected= expected;
  		fActual= actual;
  	}
  
  	public String compact(String message) {
  		if (fExpected == null || fActual == null || areStringsEqual()) {
  			// android-changed use local method instead of Assert.format, since
  			// the later is not part of Android API till API 16
  			return format(message, fExpected, fActual);
  		}
  		findCommonPrefix();
  		findCommonSuffix();
  		String expected= compactString(fExpected);
  		String actual= compactString(fActual);
  		// android-changed use local format method
  		return format(message, expected, actual);
  	}
  
  	private String compactString(String source) {
  		String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
  		if (fPrefix > 0)
  			result= computeCommonPrefix() + result;
  		if (fSuffix > 0)
  			result= result + computeCommonSuffix();
  		return result;
  	}
  
  	private void findCommonPrefix() {
  		fPrefix= 0;
  		int end= Math.min(fExpected.length(), fActual.length());
  		for (; fPrefix < end; fPrefix++) {
  			if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
  				break;
  		}
  	}
  
  	private void findCommonSuffix() {
  		int expectedSuffix= fExpected.length() - 1;
  		int actualSuffix= fActual.length() - 1;
  		for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
  			if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix))
  				break;
  		}
  		fSuffix=  fExpected.length() - expectedSuffix;
  	}
  
  	private String computeCommonPrefix() {
  		return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
  	}
  
  	private String computeCommonSuffix() {
  		int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
  		return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
  	}
  
  	private boolean areStringsEqual() {
  		return fExpected.equals(fActual);
  	}
  
  	// android-changed copy of Assert.format for reasons described above
  	private static String format(String message, Object expected, Object actual) {
          	String formatted= "";
          	if (message != null && message.length() > 0)
              		formatted= message+" ";
          	return formatted+"expected:<"+expected+"> but was:<"+actual+">";
  	}
  }
  