From 28d3ad6f1d63fde1b6794d8b7f62f3ea50a14156 Mon Sep 17 00:00:00 2001 From: Martin von Zweigbergk Date: Sun, 14 May 2023 22:27:56 -0700 Subject: [PATCH] files: add more multi-hunk tests We seemed to have poor coverage of merges affecting multiple hunks, so I added a few. Thanks to @quark-zju for providing the last of them. --- lib/src/files.rs | 91 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 12 deletions(-) diff --git a/lib/src/files.rs b/lib/src/files.rs index 91c46fd16..ebb319202 100644 --- a/lib/src/files.rs +++ b/lib/src/files.rs @@ -263,7 +263,7 @@ mod tests { use super::*; #[test] - fn test_merge() { + fn test_merge_single_hunk() { // Unchanged and empty on all sides assert_eq!( merge(&[b""], &[b"", b""]), @@ -330,17 +330,6 @@ mod tests { merge(&[b"a", b"a"], &[b"b", b"b", b"b"]), MergeResult::Resolved(b"b".to_vec()) ); - // Two sides left one line unchanged, and added conflicting additional lines - assert_eq!( - merge(&[b"a\n"], &[b"a\nb\n", b"a\nc\n"]), - MergeResult::Conflict(vec![ - MergeHunk::Resolved(b"a\n".to_vec()), - MergeHunk::Conflict(ConflictHunk { - removes: vec![b"".to_vec()], - adds: vec![b"b\n".to_vec(), b"c\n".to_vec()] - }) - ]) - ); // One side removed, one side modified assert_eq!( merge(&[b"a\n"], &[b"", b"b\n"]), @@ -410,4 +399,82 @@ mod tests { })]) ); } + + #[test] + fn test_merge_multi_hunk() { + // Two sides left one line unchanged, and added conflicting additional lines + assert_eq!( + merge(&[b"a\n"], &[b"a\nb\n", b"a\nc\n"]), + MergeResult::Conflict(vec![ + MergeHunk::Resolved(b"a\n".to_vec()), + MergeHunk::Conflict(ConflictHunk { + removes: vec![b"".to_vec()], + adds: vec![b"b\n".to_vec(), b"c\n".to_vec()] + }) + ]) + ); + // Two sides changed different lines: no conflict + assert_eq!( + merge(&[b"a\nb\nc\n"], &[b"a2\nb\nc\n", b"a\nb\nc2\n"]), + MergeResult::Resolved(b"a2\nb\nc2\n".to_vec()) + ); + // Conflict with non-conflicting lines around + assert_eq!( + merge(&[b"a\nb\nc\n"], &[b"a\nb1\nc\n", b"a\nb2\nc\n"]), + MergeResult::Conflict(vec![ + MergeHunk::Resolved(b"a\n".to_vec()), + MergeHunk::Conflict(ConflictHunk { + removes: vec![b"b\n".to_vec()], + adds: vec![b"b1\n".to_vec(), b"b2\n".to_vec()] + }), + MergeHunk::Resolved(b"c\n".to_vec()) + ]) + ); + // One side changes a line and adds a block after. The other side just adds the + // same block. This currently behaves as one would reasonably hope, but + // it's likely that it will change if when we fix + // https://github.com/martinvonz/jj/issues/761. Git and Mercurial both duplicate + // the block in the result. + assert_eq!( + merge( + &[b"\ +a { + p +} +"], + &[ + b"\ +a { + q +} + +b { + x +} +", + b"\ +a { + p +} + +b { + x +} +" + ] + ), + MergeResult::Resolved( + b"\ +a { + q +} + +b { + x +} +" + .to_vec() + ) + ); + } }