my fork of dmp
Merge pull request #15 from aschamp-figma/insert_overlap_elimination
Fix full overlap elimination for inserts
Anubhab Bandyopadhyay 10 months ago
parent fed91cb · parent 2c3e089 · commit 46951d5
-rw-r--r--src/dmp.rs33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/dmp.rs b/src/dmp.rs
index 0838a62..1a06603 100644
--- a/src/dmp.rs
+++ b/src/dmp.rs
@@ -1300,7 +1300,7 @@ impl DiffMatchPatch {
if p_prev < diffs.len() && del_idx_end <= delete.len() {
diffs[p_prev].1 = delete[..del_idx_end].to_vec();
}
- if p_next < diffs.len() && overlap_1 < insert.len() {
+ if p_next < diffs.len() && overlap_1 <= insert.len() {
diffs[p_next].1 = insert[overlap_1..].to_vec();
}
pointer += 1;
@@ -4459,6 +4459,37 @@ mod tests {
];
DiffMatchPatch::cleanup_semantic(&mut diffs);
assert_eq!(test, diffs);
+
+ // overlap that fully eliminates an delete
+ let mut diffs = vec![
+ Diff::delete(&"abcd".chars().collect::<Vec<_>>()[..]),
+ Diff::insert(&"abcd1212".chars().collect::<Vec<_>>()[..]),
+ Diff::equal(&"wxyz".chars().collect::<Vec<_>>()[..]),
+ ];
+ let test = vec![
+ Diff::delete(&"".chars().collect::<Vec<_>>()[..]),
+ Diff::equal(&"abcd".chars().collect::<Vec<_>>()[..]),
+ Diff::insert(&"1212".chars().collect::<Vec<_>>()[..]),
+ Diff::equal(&"wxyz".chars().collect::<Vec<_>>()[..]),
+ ];
+ DiffMatchPatch::cleanup_semantic(&mut diffs);
+ assert_eq!(test, diffs);
+
+ // overlap that fully eliminates an insert
+ let mut diffs = vec![
+ Diff::delete(&"abcd1212".chars().collect::<Vec<_>>()[..]),
+ Diff::insert(&"1212".chars().collect::<Vec<_>>()[..]),
+ Diff::equal(&"wxyz".chars().collect::<Vec<_>>()[..]),
+ ];
+ let test = vec![
+ Diff::delete(&"abcd".chars().collect::<Vec<_>>()[..]),
+ Diff::equal(&"1212".chars().collect::<Vec<_>>()[..]),
+ Diff::insert(&"".chars().collect::<Vec<_>>()[..]),
+ Diff::equal(&"wxyz".chars().collect::<Vec<_>>()[..]),
+ ];
+ DiffMatchPatch::cleanup_semantic(&mut diffs);
+ assert_eq!(test, diffs);
+
}
#[test]