mirror of
https://github.com/martinvonz/jj.git
synced 2025-02-06 03:22:59 +00:00
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.
This commit is contained in:
parent
1c284322b3
commit
28d3ad6f1d
1 changed files with 79 additions and 12 deletions
|
@ -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()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue