Skip to content

Commit 5781cc5

Browse files
committed
1 parent 37310e1 commit 5781cc5

File tree

2 files changed

+55
-10
lines changed

2 files changed

+55
-10
lines changed

java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static java.util.Comparator.comparing;
2323
import com.github.difflib.algorithm.Change;
2424
import java.util.ArrayList;
25+
import java.util.Collections;
2526
import java.util.List;
2627
import java.util.ListIterator;
2728

@@ -107,10 +108,18 @@ private static <T> Chunk<T> buildChunk(int start, int end, List<T> data) {
107108
return new Chunk<>(start, new ArrayList<>(data.subList(start, end)));
108109
}
109110

110-
public static <T> Patch<T> generate(List<T> original, List<T> revised, List<Change> changes, boolean includeEquals) {
111-
Patch<T> patch = new Patch<>(changes.size());
111+
public static <T> Patch<T> generate(List<T> original, List<T> revised, List<Change> _changes, boolean includeEquals) {
112+
Patch<T> patch = new Patch<>(_changes.size());
112113
int startOriginal = 0;
113114
int startRevised = 0;
115+
116+
List<Change> changes = _changes;
117+
118+
if (includeEquals) {
119+
changes = new ArrayList<Change>(_changes);
120+
Collections.sort(changes, comparing(d -> d.startOriginal));
121+
}
122+
114123
for (Change change : changes) {
115124

116125
if (includeEquals && startOriginal < change.startOriginal) {
@@ -133,8 +142,8 @@ public static <T> Patch<T> generate(List<T> original, List<T> revised, List<Chan
133142
break;
134143
}
135144

136-
startOriginal = change.endOriginal + 1;
137-
startRevised = change.endRevised + 1;
145+
startOriginal = change.endOriginal;
146+
startRevised = change.endRevised;
138147
}
139148

140149
if (includeEquals && startOriginal < original.size()) {

java-diff-utils/src/test/java/com/github/difflib/DiffUtilsTest.java

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import static java.util.stream.Collectors.toList;
2121
import java.util.zip.ZipFile;
22+
import static org.assertj.core.api.Assertions.assertThat;
2223
import static org.junit.jupiter.api.Assertions.assertEquals;
2324
import static org.junit.jupiter.api.Assertions.assertNotNull;
2425
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -160,11 +161,11 @@ public void testDiffMyersExample1() {
160161
assertEquals(4, patch.getDeltas().size());
161162
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());
162163
}
163-
164+
164165
@Test
165166
public void testDiff_Equal() {
166167
final Patch<String> patch = DiffUtils.diff(
167-
Arrays.asList("hhh", "jjj", "kkk"),
168+
Arrays.asList("hhh", "jjj", "kkk"),
168169
Arrays.asList("hhh", "jjj", "kkk"), true);
169170
assertNotNull(patch);
170171
assertEquals(1, patch.getDeltas().size());
@@ -173,22 +174,57 @@ public void testDiff_Equal() {
173174
assertEquals(new Chunk<>(0, Arrays.asList("hhh", "jjj", "kkk")), delta.getSource());
174175
assertEquals(new Chunk<>(0, Arrays.asList("hhh", "jjj", "kkk")), delta.getTarget());
175176
}
176-
177-
@Test
177+
178+
@Test
178179
public void testDiff_InsertWithEqual() {
179180
final Patch<String> patch = DiffUtils.diff(Arrays.asList("hhh"), Arrays.
180181
asList("hhh", "jjj", "kkk"), true);
181182
assertNotNull(patch);
182183
assertEquals(2, patch.getDeltas().size());
183-
184+
184185
AbstractDelta<String> delta = patch.getDeltas().get(0);
185186
assertTrue(delta instanceof EqualDelta);
186187
assertEquals(new Chunk<>(0, Arrays.asList("hhh")), delta.getSource());
187188
assertEquals(new Chunk<>(0, Arrays.asList("hhh")), delta.getTarget());
188-
189+
189190
delta = patch.getDeltas().get(1);
190191
assertTrue(delta instanceof InsertDelta);
191192
assertEquals(new Chunk<>(1, Collections.<String>emptyList()), delta.getSource());
192193
assertEquals(new Chunk<>(1, Arrays.asList("jjj", "kkk")), delta.getTarget());
193194
}
195+
196+
@Test
197+
public void testDiff_ProblemIssue42() {
198+
final Patch<String> patch = DiffUtils.diff(
199+
Arrays.asList("The", "dog", "is", "brown"),
200+
Arrays.asList("The", "fox", "is", "down"), true);
201+
202+
System.out.println(patch);
203+
assertNotNull(patch);
204+
assertEquals(4, patch.getDeltas().size());
205+
206+
207+
assertThat(patch.getDeltas()).extracting(d -> d.getType().name())
208+
.containsExactly("EQUAL", "CHANGE", "EQUAL", "CHANGE");
209+
210+
AbstractDelta<String> delta = patch.getDeltas().get(0);
211+
assertTrue(delta instanceof EqualDelta);
212+
assertEquals(new Chunk<>(0, Arrays.asList("The")), delta.getSource());
213+
assertEquals(new Chunk<>(0, Arrays.asList("The")), delta.getTarget());
214+
215+
delta = patch.getDeltas().get(1);
216+
assertTrue(delta instanceof ChangeDelta);
217+
assertEquals(new Chunk<>(1, Arrays.asList("dog")), delta.getSource());
218+
assertEquals(new Chunk<>(1, Arrays.asList("fox")), delta.getTarget());
219+
220+
delta = patch.getDeltas().get(2);
221+
assertTrue(delta instanceof EqualDelta);
222+
assertEquals(new Chunk<>(2, Arrays.asList("is")), delta.getSource());
223+
assertEquals(new Chunk<>(2, Arrays.asList("is")), delta.getTarget());
224+
225+
delta = patch.getDeltas().get(3);
226+
assertTrue(delta instanceof ChangeDelta);
227+
assertEquals(new Chunk<>(3, Arrays.asList("brown")), delta.getSource());
228+
assertEquals(new Chunk<>(3, Arrays.asList("down")), delta.getTarget());
229+
}
194230
}

0 commit comments

Comments
 (0)