mirror of
https://github.com/martinvonz/jj.git
synced 2024-12-28 07:20:11 +00:00
index: make tests more focused, and add tests of octopus merge
This commit is contained in:
parent
ab57584281
commit
afc59a210a
1 changed files with 116 additions and 31 deletions
147
lib/src/index.rs
147
lib/src/index.rs
|
@ -1446,10 +1446,10 @@ mod tests {
|
||||||
|
|
||||||
#[test_case(false; "memory")]
|
#[test_case(false; "memory")]
|
||||||
#[test_case(true; "file")]
|
#[test_case(true; "file")]
|
||||||
fn index_empty(use_file: bool) {
|
fn index_empty(on_disk: bool) {
|
||||||
let temp_dir = tempfile::tempdir().unwrap();
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
let index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
let index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
||||||
let index = if use_file {
|
let index = if on_disk {
|
||||||
IndexRef::Readonly(index.save().unwrap())
|
IndexRef::Readonly(index.save().unwrap())
|
||||||
} else {
|
} else {
|
||||||
IndexRef::Mutable(&index)
|
IndexRef::Mutable(&index)
|
||||||
|
@ -1470,12 +1470,12 @@ mod tests {
|
||||||
|
|
||||||
#[test_case(false; "memory")]
|
#[test_case(false; "memory")]
|
||||||
#[test_case(true; "file")]
|
#[test_case(true; "file")]
|
||||||
fn index_root_commit(use_file: bool) {
|
fn index_root_commit(on_disk: bool) {
|
||||||
let temp_dir = tempfile::tempdir().unwrap();
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
let mut index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
let mut index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
||||||
let id_0 = CommitId::from_hex("000000");
|
let id_0 = CommitId::from_hex("000000");
|
||||||
index.add_commit_data(id_0.clone(), vec![]);
|
index.add_commit_data(id_0.clone(), vec![]);
|
||||||
let index = if use_file {
|
let index = if on_disk {
|
||||||
IndexRef::Readonly(index.save().unwrap())
|
IndexRef::Readonly(index.save().unwrap())
|
||||||
} else {
|
} else {
|
||||||
IndexRef::Mutable(&index)
|
IndexRef::Mutable(&index)
|
||||||
|
@ -1515,7 +1515,7 @@ mod tests {
|
||||||
#[test_case(false, true; "full on disk")]
|
#[test_case(false, true; "full on disk")]
|
||||||
#[test_case(true, false; "incremental in memory")]
|
#[test_case(true, false; "incremental in memory")]
|
||||||
#[test_case(true, true; "incremental on disk")]
|
#[test_case(true, true; "incremental on disk")]
|
||||||
fn index_multiple_commits(incremental: bool, use_file: bool) {
|
fn index_multiple_commits(incremental: bool, on_disk: bool) {
|
||||||
let temp_dir = tempfile::tempdir().unwrap();
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
let mut index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
let mut index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
||||||
// 5
|
// 5
|
||||||
|
@ -1526,11 +1526,8 @@ mod tests {
|
||||||
// |/
|
// |/
|
||||||
// 0
|
// 0
|
||||||
let id_0 = CommitId::from_hex("000000");
|
let id_0 = CommitId::from_hex("000000");
|
||||||
let id_1 = CommitId::from_hex("009999");
|
let id_1 = CommitId::from_hex("111111");
|
||||||
let id_2 = CommitId::from_hex("055488");
|
let id_2 = CommitId::from_hex("222222");
|
||||||
let id_3 = CommitId::from_hex("055444");
|
|
||||||
let id_4 = CommitId::from_hex("055555");
|
|
||||||
let id_5 = CommitId::from_hex("033333");
|
|
||||||
index.add_commit_data(id_0.clone(), vec![]);
|
index.add_commit_data(id_0.clone(), vec![]);
|
||||||
index.add_commit_data(id_1.clone(), vec![id_0.clone()]);
|
index.add_commit_data(id_1.clone(), vec![id_0.clone()]);
|
||||||
index.add_commit_data(id_2.clone(), vec![id_0.clone()]);
|
index.add_commit_data(id_2.clone(), vec![id_0.clone()]);
|
||||||
|
@ -1542,10 +1539,13 @@ mod tests {
|
||||||
index = MutableIndex::incremental(initial_file);
|
index = MutableIndex::incremental(initial_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let id_3 = CommitId::from_hex("333333");
|
||||||
|
let id_4 = CommitId::from_hex("444444");
|
||||||
|
let id_5 = CommitId::from_hex("555555");
|
||||||
index.add_commit_data(id_3.clone(), vec![id_2.clone()]);
|
index.add_commit_data(id_3.clone(), vec![id_2.clone()]);
|
||||||
index.add_commit_data(id_4.clone(), vec![id_1.clone()]);
|
index.add_commit_data(id_4.clone(), vec![id_1.clone()]);
|
||||||
index.add_commit_data(id_5.clone(), vec![id_4.clone(), id_2.clone()]);
|
index.add_commit_data(id_5.clone(), vec![id_4.clone(), id_2.clone()]);
|
||||||
let index = if use_file {
|
let index = if on_disk {
|
||||||
IndexRef::Readonly(index.save().unwrap())
|
IndexRef::Readonly(index.save().unwrap())
|
||||||
} else {
|
} else {
|
||||||
IndexRef::Mutable(&index)
|
IndexRef::Mutable(&index)
|
||||||
|
@ -1560,31 +1560,114 @@ mod tests {
|
||||||
assert_eq!(index.num_commits(), 6);
|
assert_eq!(index.num_commits(), 6);
|
||||||
// Can find all the commits
|
// Can find all the commits
|
||||||
let entry_0 = index.entry_by_id(&id_0).unwrap();
|
let entry_0 = index.entry_by_id(&id_0).unwrap();
|
||||||
let entry_9 = index.entry_by_id(&id_1).unwrap();
|
let entry_1 = index.entry_by_id(&id_1).unwrap();
|
||||||
let entry_8 = index.entry_by_id(&id_2).unwrap();
|
let entry_2 = index.entry_by_id(&id_2).unwrap();
|
||||||
let entry_4 = index.entry_by_id(&id_3).unwrap();
|
let entry_3 = index.entry_by_id(&id_3).unwrap();
|
||||||
let entry_5 = index.entry_by_id(&id_4).unwrap();
|
let entry_4 = index.entry_by_id(&id_4).unwrap();
|
||||||
let entry_3 = index.entry_by_id(&id_5).unwrap();
|
let entry_5 = index.entry_by_id(&id_5).unwrap();
|
||||||
// Check properties of some entries
|
// Check properties of some entries
|
||||||
assert_eq!(entry_0.pos, 0);
|
assert_eq!(entry_0.pos, 0);
|
||||||
assert_eq!(entry_0.commit_id(), id_0);
|
assert_eq!(entry_0.commit_id(), id_0);
|
||||||
assert_eq!(entry_9.pos, 1);
|
assert_eq!(entry_1.pos, 1);
|
||||||
assert_eq!(entry_9.commit_id(), id_1);
|
assert_eq!(entry_1.commit_id(), id_1);
|
||||||
assert_eq!(entry_9.generation_number(), 1);
|
assert_eq!(entry_1.generation_number(), 1);
|
||||||
assert_eq!(entry_9.parents_positions(), vec![0]);
|
assert_eq!(entry_1.parents_positions(), vec![0]);
|
||||||
assert_eq!(entry_8.pos, 2);
|
assert_eq!(entry_2.pos, 2);
|
||||||
assert_eq!(entry_8.commit_id(), id_2);
|
assert_eq!(entry_2.commit_id(), id_2);
|
||||||
assert_eq!(entry_8.generation_number(), 1);
|
assert_eq!(entry_2.generation_number(), 1);
|
||||||
assert_eq!(entry_8.parents_positions(), vec![0]);
|
assert_eq!(entry_2.parents_positions(), vec![0]);
|
||||||
|
assert_eq!(entry_3.generation_number(), 2);
|
||||||
|
assert_eq!(entry_3.parents_positions(), vec![2]);
|
||||||
|
assert_eq!(entry_4.pos, 4);
|
||||||
assert_eq!(entry_4.generation_number(), 2);
|
assert_eq!(entry_4.generation_number(), 2);
|
||||||
assert_eq!(entry_4.parents_positions(), vec![2]);
|
assert_eq!(entry_4.parents_positions(), vec![1]);
|
||||||
assert_eq!(entry_5.pos, 4);
|
assert_eq!(entry_5.generation_number(), 3);
|
||||||
assert_eq!(entry_5.generation_number(), 2);
|
assert_eq!(entry_5.parents_positions(), vec![4, 2]);
|
||||||
assert_eq!(entry_5.parents_positions(), vec![1]);
|
}
|
||||||
assert_eq!(entry_3.generation_number(), 3);
|
|
||||||
assert_eq!(entry_3.parents_positions(), vec![4, 2]);
|
|
||||||
|
|
||||||
// Test resolve_prefix
|
#[test_case(false; "in memory")]
|
||||||
|
#[test_case(true; "on disk")]
|
||||||
|
fn index_many_parents(on_disk: bool) {
|
||||||
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
|
let mut index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
||||||
|
// 6
|
||||||
|
// /|\
|
||||||
|
// / | \
|
||||||
|
// / /|\ \
|
||||||
|
// 1 2 3 4 5
|
||||||
|
// \ \|/ /
|
||||||
|
// \ | /
|
||||||
|
// \|/
|
||||||
|
// 0
|
||||||
|
let id_0 = CommitId::from_hex("000000");
|
||||||
|
let id_1 = CommitId::from_hex("111111");
|
||||||
|
let id_2 = CommitId::from_hex("222222");
|
||||||
|
let id_3 = CommitId::from_hex("333333");
|
||||||
|
let id_4 = CommitId::from_hex("444444");
|
||||||
|
let id_5 = CommitId::from_hex("555555");
|
||||||
|
let id_6 = CommitId::from_hex("666666");
|
||||||
|
index.add_commit_data(id_0.clone(), vec![]);
|
||||||
|
index.add_commit_data(id_1.clone(), vec![id_0.clone()]);
|
||||||
|
index.add_commit_data(id_2.clone(), vec![id_0.clone()]);
|
||||||
|
index.add_commit_data(id_3.clone(), vec![id_0.clone()]);
|
||||||
|
index.add_commit_data(id_4.clone(), vec![id_0.clone()]);
|
||||||
|
index.add_commit_data(id_5.clone(), vec![id_0.clone()]);
|
||||||
|
index.add_commit_data(
|
||||||
|
id_6.clone(),
|
||||||
|
vec![
|
||||||
|
id_1.clone(),
|
||||||
|
id_2.clone(),
|
||||||
|
id_3.clone(),
|
||||||
|
id_4.clone(),
|
||||||
|
id_5.clone(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
let index = if on_disk {
|
||||||
|
IndexRef::Readonly(index.save().unwrap())
|
||||||
|
} else {
|
||||||
|
IndexRef::Mutable(&index)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Stats are as expected
|
||||||
|
let stats = index.stats();
|
||||||
|
assert_eq!(stats.num_commits, 7);
|
||||||
|
assert_eq!(stats.num_heads, 1);
|
||||||
|
assert_eq!(stats.max_generation_number, 2);
|
||||||
|
assert_eq!(stats.num_merges, 1);
|
||||||
|
|
||||||
|
// The octopus merge has the right parents
|
||||||
|
let entry_6 = index.entry_by_id(&id_6).unwrap();
|
||||||
|
assert_eq!(entry_6.commit_id(), id_6.clone());
|
||||||
|
assert_eq!(entry_6.num_parents(), 5);
|
||||||
|
assert_eq!(entry_6.parents_positions(), vec![1, 2, 3, 4, 5]);
|
||||||
|
assert_eq!(entry_6.generation_number(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn resolve_prefix() {
|
||||||
|
let temp_dir = tempfile::tempdir().unwrap();
|
||||||
|
let mut index = MutableIndex::full(temp_dir.path().to_owned(), 3);
|
||||||
|
|
||||||
|
// Create some commits with different various common prefixes.
|
||||||
|
let id_0 = CommitId::from_hex("000000");
|
||||||
|
let id_1 = CommitId::from_hex("009999");
|
||||||
|
let id_2 = CommitId::from_hex("055488");
|
||||||
|
index.add_commit_data(id_0.clone(), vec![]);
|
||||||
|
index.add_commit_data(id_1.clone(), vec![]);
|
||||||
|
index.add_commit_data(id_2.clone(), vec![]);
|
||||||
|
|
||||||
|
// Write the first three commits to one file and build the remainder on top.
|
||||||
|
let initial_file = index.save().unwrap();
|
||||||
|
index = MutableIndex::incremental(initial_file);
|
||||||
|
|
||||||
|
let id_3 = CommitId::from_hex("055444");
|
||||||
|
let id_4 = CommitId::from_hex("055555");
|
||||||
|
let id_5 = CommitId::from_hex("033333");
|
||||||
|
index.add_commit_data(id_3.clone(), vec![]);
|
||||||
|
index.add_commit_data(id_4.clone(), vec![]);
|
||||||
|
index.add_commit_data(id_5.clone(), vec![]);
|
||||||
|
|
||||||
|
// Can find commits given the full hex number
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
index.resolve_prefix(&HexPrefix::new(id_0.hex())),
|
index.resolve_prefix(&HexPrefix::new(id_0.hex())),
|
||||||
PrefixResolution::SingleMatch(id_0.clone())
|
PrefixResolution::SingleMatch(id_0.clone())
|
||||||
|
@ -1597,6 +1680,7 @@ mod tests {
|
||||||
index.resolve_prefix(&HexPrefix::new(id_2.hex())),
|
index.resolve_prefix(&HexPrefix::new(id_2.hex())),
|
||||||
PrefixResolution::SingleMatch(id_2.clone())
|
PrefixResolution::SingleMatch(id_2.clone())
|
||||||
);
|
);
|
||||||
|
// Test non-existent commits
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
index.resolve_prefix(&HexPrefix::new("ffffff".to_string())),
|
index.resolve_prefix(&HexPrefix::new("ffffff".to_string())),
|
||||||
PrefixResolution::NoMatch
|
PrefixResolution::NoMatch
|
||||||
|
@ -1605,6 +1689,7 @@ mod tests {
|
||||||
index.resolve_prefix(&HexPrefix::new("000001".to_string())),
|
index.resolve_prefix(&HexPrefix::new("000001".to_string())),
|
||||||
PrefixResolution::NoMatch
|
PrefixResolution::NoMatch
|
||||||
);
|
);
|
||||||
|
// Test ambiguous prefix
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
index.resolve_prefix(&HexPrefix::new("0".to_string())),
|
index.resolve_prefix(&HexPrefix::new("0".to_string())),
|
||||||
PrefixResolution::AmbiguousMatch
|
PrefixResolution::AmbiguousMatch
|
||||||
|
|
Loading…
Reference in a new issue