package diffutils; import difflib.DiffUtils; import difflib.Patch; import difflib.PatchFailedException; import junit.framework.TestCase; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class GenerateUnifiedDiffTest extends TestCase { private static final String FS = File.separator; private static final String MOCK_FOLDER = "test" + FS + "mocks" + FS; public List fileToLines(String filename) { List lines = new LinkedList(); String line = ""; try { BufferedReader in = new BufferedReader(new FileReader(filename)); while ((line = in.readLine()) != null) { lines.add(line); } } catch (IOException e) { e.printStackTrace(); fail(e.getMessage()); } return lines; } public void testGenerateUnified() { List origLines = fileToLines(MOCK_FOLDER + "original.txt"); List revLines = fileToLines(MOCK_FOLDER + "revised.txt"); verify(origLines, revLines, "original.txt", "revised.txt"); } public void testGenerateUnifiedWithOneDelta() { List origLines = fileToLines(MOCK_FOLDER + "one_delta_test_original.txt"); List revLines = fileToLines(MOCK_FOLDER + "one_delta_test_revised.txt"); verify(origLines, revLines, "one_delta_test_original.txt", "one_delta_test_revised.txt"); } public void testGenerateUnifiedDiffWithoutAnyDeltas() { List test = Arrays.asList("abc"); Patch patch = DiffUtils.diff(test, test); DiffUtils.generateUnifiedDiff("abc", "abc", test, patch, 0); } public void testDiff_Issue10() { final List baseLines = fileToLines(MOCK_FOLDER + "issue10_base.txt"); final List patchLines = fileToLines(MOCK_FOLDER + "issue10_patch.txt"); final Patch p = DiffUtils.parseUnifiedDiff(patchLines); try { DiffUtils.patch(baseLines, p); } catch (PatchFailedException e) { fail(e.getMessage()); } } /** * Issue 12 */ public void testPatchWithNoDeltas() { final List lines1 = fileToLines(MOCK_FOLDER + "issue11_1.txt"); final List lines2 = fileToLines(MOCK_FOLDER + "issue11_2.txt"); verify(lines1, lines2, "issue11_1.txt", "issue11_2.txt"); } public void testDiff5() { final List lines1 = fileToLines(MOCK_FOLDER + "5A.txt"); final List lines2 = fileToLines(MOCK_FOLDER + "5B.txt"); verify(lines1, lines2, "5A.txt", "5B.txt"); } /** * Issue 19 */ public void testDiffWithHeaderLineInText() { List original = new ArrayList(); List revised = new ArrayList(); original.add("test line1"); original.add("test line2"); original.add("test line 4"); original.add("test line 5"); revised.add("test line1"); revised.add("test line2"); revised.add("@@ -2,6 +2,7 @@"); revised.add("test line 4"); revised.add("test line 5"); Patch patch = DiffUtils.diff(original, revised); List udiff = DiffUtils.generateUnifiedDiff("original", "revised", original, patch, 10); DiffUtils.parseUnifiedDiff(udiff); } @SuppressWarnings("unchecked") private void verify(List origLines, List revLines, String originalFile, String revisedFile) { Patch patch = DiffUtils.diff(origLines, revLines); List unifiedDiff = DiffUtils.generateUnifiedDiff(originalFile, revisedFile, origLines, patch, 10); Patch fromUnifiedPatch = DiffUtils.parseUnifiedDiff(unifiedDiff); List patchedLines; try { patchedLines = (List) fromUnifiedPatch.applyTo(origLines); assertTrue(revLines.size() == patchedLines.size()); for (int i = 0; i < revLines.size(); i++) { String l1 = revLines.get(i); String l2 = patchedLines.get(i); if (!l1.equals(l2)) { fail("Line " + (i + 1) + " of the patched file did not match the revised original"); } } } catch (PatchFailedException e) { fail(e.getMessage()); } } }