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 31c2c3e..340cf5e 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 @@ -110,7 +110,10 @@ public List applyFuzzy(List target, int maxFuzz) throws PatchFailedExcepti int patchPosition = findPositionFuzzy(ctx, delta); if (0 <= patchPosition) { delta.applyFuzzyToAt(ctx.result, ctx.currentFuzz, patchPosition); - lastPatchDelta = patchPosition - delta.getSource().getPosition(); + lastPatchDelta = patchPosition + - delta.getSource().getPosition() + + delta.getTarget().size() + - delta.getSource().size(); ctx.lastPatchEnd = delta.getSource().last() + lastPatchDelta; } else { conflictOutput.processConflict(VerifyChunk.CONTENT_DOES_NOT_MATCH_TARGET, delta, ctx.result); diff --git a/java-diff-utils/src/test/java/com/github/difflib/patch/PatchWithMyerDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/patch/PatchWithMyerDiffTest.java index 0dab69f..ab0103e 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/patch/PatchWithMyerDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/patch/PatchWithMyerDiffTest.java @@ -31,6 +31,25 @@ */ public class PatchWithMyerDiffTest { + @Test + public void fuzzyApplyAfterShrinkingChange() throws PatchFailedException { + List source = Arrays.asList("a", "b", "c", "d", "e"); + List target = Arrays.asList("x", "d", "y"); + Patch patch = DiffUtils.diff(source, target); + assertEquals(target, patch.applyFuzzy(source, 0)); + assertEquals( + Arrays.asList("prefix", "x", "d", "y"), + patch.applyFuzzy(Arrays.asList("prefix", "a", "b", "c", "d", "e"), 0)); + } + + @Test + public void fuzzyApplyDoesNotMatchNewlyInsertedLines() throws PatchFailedException { + Patch patch = new Patch<>(); + patch.addDelta(new ChangeDelta<>(new Chunk<>(0, Arrays.asList("a")), new Chunk<>(0, Arrays.asList("x", "c")))); + patch.addDelta(new ChangeDelta<>(new Chunk<>(2, Arrays.asList("c")), new Chunk<>(3, Arrays.asList("y")))); + assertEquals(Arrays.asList("x", "c", "b", "y"), patch.applyFuzzy(Arrays.asList("a", "b", "c"), 0)); + } + @Test public void testPatch_Change_withExceptionProcessor() { final List changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd");