From 5781cc51786dc59dbde55a501102f359b81a8b9f Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sun, 19 Apr 2020 23:51:23 +0200 Subject: [PATCH] --- .../java/com/github/difflib/patch/Patch.java | 17 +++++-- .../com/github/difflib/DiffUtilsTest.java | 48 ++++++++++++++++--- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java b/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java index 821d21b..161293e 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java +++ b/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java @@ -22,6 +22,7 @@ package com.github.difflib.patch; import static java.util.Comparator.comparing; import com.github.difflib.algorithm.Change; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.ListIterator; @@ -107,10 +108,18 @@ public final class Patch { return new Chunk<>(start, new ArrayList<>(data.subList(start, end))); } - public static Patch generate(List original, List revised, List changes, boolean includeEquals) { - Patch patch = new Patch<>(changes.size()); + public static Patch generate(List original, List revised, List _changes, boolean includeEquals) { + Patch patch = new Patch<>(_changes.size()); int startOriginal = 0; int startRevised = 0; + + List changes = _changes; + + if (includeEquals) { + changes = new ArrayList(_changes); + Collections.sort(changes, comparing(d -> d.startOriginal)); + } + for (Change change : changes) { if (includeEquals && startOriginal < change.startOriginal) { @@ -133,8 +142,8 @@ public final class Patch { break; } - startOriginal = change.endOriginal + 1; - startRevised = change.endRevised + 1; + startOriginal = change.endOriginal; + startRevised = change.endRevised; } if (includeEquals && startOriginal < original.size()) { diff --git a/java-diff-utils/src/test/java/com/github/difflib/DiffUtilsTest.java b/java-diff-utils/src/test/java/com/github/difflib/DiffUtilsTest.java index 6272e3d..c02c444 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/DiffUtilsTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/DiffUtilsTest.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.List; import static java.util.stream.Collectors.toList; import java.util.zip.ZipFile; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -160,11 +161,11 @@ public class DiffUtilsTest { assertEquals(4, patch.getDeltas().size()); assertEquals("Patch{deltas=[[DeleteDelta, position: 0, lines: [A, B]], [InsertDelta, position: 3, lines: [B]], [DeleteDelta, position: 5, lines: [B]], [InsertDelta, position: 7, lines: [C]]]}", patch.toString()); } - + @Test public void testDiff_Equal() { final Patch patch = DiffUtils.diff( - Arrays.asList("hhh", "jjj", "kkk"), + Arrays.asList("hhh", "jjj", "kkk"), Arrays.asList("hhh", "jjj", "kkk"), true); assertNotNull(patch); assertEquals(1, patch.getDeltas().size()); @@ -173,22 +174,57 @@ public class DiffUtilsTest { assertEquals(new Chunk<>(0, Arrays.asList("hhh", "jjj", "kkk")), delta.getSource()); assertEquals(new Chunk<>(0, Arrays.asList("hhh", "jjj", "kkk")), delta.getTarget()); } - - @Test + + @Test public void testDiff_InsertWithEqual() { final Patch patch = DiffUtils.diff(Arrays.asList("hhh"), Arrays. asList("hhh", "jjj", "kkk"), true); assertNotNull(patch); assertEquals(2, patch.getDeltas().size()); - + AbstractDelta delta = patch.getDeltas().get(0); assertTrue(delta instanceof EqualDelta); assertEquals(new Chunk<>(0, Arrays.asList("hhh")), delta.getSource()); assertEquals(new Chunk<>(0, Arrays.asList("hhh")), delta.getTarget()); - + delta = patch.getDeltas().get(1); assertTrue(delta instanceof InsertDelta); assertEquals(new Chunk<>(1, Collections.emptyList()), delta.getSource()); assertEquals(new Chunk<>(1, Arrays.asList("jjj", "kkk")), delta.getTarget()); } + + @Test + public void testDiff_ProblemIssue42() { + final Patch patch = DiffUtils.diff( + Arrays.asList("The", "dog", "is", "brown"), + Arrays.asList("The", "fox", "is", "down"), true); + + System.out.println(patch); + assertNotNull(patch); + assertEquals(4, patch.getDeltas().size()); + + + assertThat(patch.getDeltas()).extracting(d -> d.getType().name()) + .containsExactly("EQUAL", "CHANGE", "EQUAL", "CHANGE"); + + AbstractDelta delta = patch.getDeltas().get(0); + assertTrue(delta instanceof EqualDelta); + assertEquals(new Chunk<>(0, Arrays.asList("The")), delta.getSource()); + assertEquals(new Chunk<>(0, Arrays.asList("The")), delta.getTarget()); + + delta = patch.getDeltas().get(1); + assertTrue(delta instanceof ChangeDelta); + assertEquals(new Chunk<>(1, Arrays.asList("dog")), delta.getSource()); + assertEquals(new Chunk<>(1, Arrays.asList("fox")), delta.getTarget()); + + delta = patch.getDeltas().get(2); + assertTrue(delta instanceof EqualDelta); + assertEquals(new Chunk<>(2, Arrays.asList("is")), delta.getSource()); + assertEquals(new Chunk<>(2, Arrays.asList("is")), delta.getTarget()); + + delta = patch.getDeltas().get(3); + assertTrue(delta instanceof ChangeDelta); + assertEquals(new Chunk<>(3, Arrays.asList("brown")), delta.getSource()); + assertEquals(new Chunk<>(3, Arrays.asList("down")), delta.getTarget()); + } }