package bluej.collect;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

import junit.framework.TestCase;
import difflib.DiffUtils;
import difflib.Patch;

public class TestDiff
extends TestCase{    
   private String[] readFile( File file ) throws IOException
{           
BufferedReader reader = new BufferedReader( new FileReader (file));
       
   String         line = null;
       
   ArrayList<String> lines = new ArrayList<String>();
        
   while ( ( line = reader.readLine() ) != null ) {
      lines.add(line);         
      }
        
   reader.close();
       
   return lines.toArray(new String[0]);     
   }
    
   
private void assertDiffRoundTrip(String[] orig, String[] mod) throws IOException, InterruptedException
   {        
   
   Patch patch = DiffUtils.diff(Arrays.asList(orig), Arrays.asList(mod));
   String diff = DataCollectorImpl.makeDiff(patch);
       
   
        
       
   
   File tempFile = File.createTempFile("SRC", ".java");
       
   FileWriter fileWriter = new FileWriter(tempFile);
       
   BufferedWriter bufferedWriter = new BufferedWriter( fileWriter);
       
   for (String line : orig)
       {
      bufferedWriter.write(line + "\n");         
      }
   bufferedWriter.close();
   fileWriter.close();
        
       
   
   Process p = Runtime.getRuntime().exec("patch --force " + tempFile.getAbsolutePath());
   p.getOutputStream().write(diff.getBytes(Charset.forName("UTF-8")));
   p.getOutputStream().close();

   int returnCode = p.waitFor();        
   assertEquals("Patch exit code", 0, returnCode);
        
       
   
   String[] patched = readFile(tempFile);
        
   assertEqualStringArray(orig, diff, mod, patched);     
   }
    
    
   
private void assertEqualStringArray(String[] orig, String diff, String[] a, String[] b)
   {
   assertEquals("Array length: " + printInfo(orig, diff, a, b), a.length, b.length);
       
   for (int i = 0; i < a.length; i++)
   assertEquals("Line " + i + " for\n"  + printInfo(orig, diff, a, b), a[i], b[i]);              
   }

   
private String printInfo(String[] orig, String diff, String[] a, String[] b)
   {        
   StringBuilder s = new StringBuilder();
   s.append("### Original:\n");
       
   for (String line : orig) s.append(line + "\n");
   s.append("### Diff:\n").append(diff).append("### Expected:\n");
       
   for (String line : a) s.append(line + "\n");
   s.append("### Actual:\n");
       
   for (String line : b) s.append(line + "\n");
   s.append("###\n");
   return s.toString();     
   }

   
public void testInsert() throws IOException, InterruptedException
   {        
   assertDiffRoundTrip(new String[] {
   "class Foo",
   "{",
   "}"}, new String[] {
   "class Foo",
   "{",
   "  public int x;",
   "}"});     
   }
    
   


|
|
|public void testBruteForceDiffs() throws IOException, InterruptedException
|
|{}        String[] choices = new String[] {}aaaa", "bbbb", ""};
//Forms all files of length 0 to 4 with all possible combinations of those three lines:
final int LONGEST_FILE = 4;
Collection<String[]>[] allFiles = new Collection[LONGEST_FILE + 1];
|
|allFiles[0] = new ArrayList<String[]>();
|
|allFiles[0].add(new String[0]);
|
|for (int length = 1; length <= LONGEST_FILE; length++)
|
|{}            allFiles[length] = new ArrayList<String[]>();
|
|// For that length, create all possible files by building on all files of previous length:
|
|for (int chosenNew = 0; chosenNew < choices.length; chosenNew++)
|
|{}                for (String[] shorterFile : allFiles[length - 1])
|
|{}String[] newFile = Arrays.copyOf(shorterFile, length);
|
|newFile[length - 1] = choices[chosenNew];
|
|allFiles[length].add(newFile);
|
|}
|
|}
|
|}
|
|// Now flatten:
|
|ArrayList<String[]> flattened = new ArrayList<String[]>();
|
|for (Collection<String[]> coll : allFiles)
|
|{}            for (String[] f : coll)
|
|{}flattened.add(f);
|
|}
|
|}
|
|allFiles = null;
|
|for (int i = 0; i < flattened.size(); i++)
|
|{}            for (int j = 0; j < flattened.size(); j++)
|
|{}assertDiffRoundTrip(flattened.get(i), flattened.get(j));
|
|}
|
|}
|
|}   
}
top, use, map, class TestDiff

.   readFile
.   assertDiffRoundTrip
.   assertEqualStringArray
.   printInfo
.   testInsert




122 neLoCode + 30 LoComm