in merkledb/src/tests.rs [239:284]
fn test_db_difference() {
// create db1 which is "hello world" "pika"
let mut mdb = MerkleMemDB::default();
let h1 = compute_data_hash("hello world".as_bytes());
let h2 = compute_data_hash("pikachu".as_bytes());
let chunks = [ChunkInfo { hash: h1, length: 11 }, ChunkInfo { hash: h2, length: 7 }];
let nodes: Vec<_> = chunks.iter().map(|x| mdb.add_chunk(x).0).collect();
let f1hash = *mdb.merge_to_file(&nodes).hash();
// create db1 which is "hello world" "pika" "poo"
// but "hello world" and "pika" are merged first
let h3 = compute_data_hash("poo".as_bytes());
let mut mdb2 = MerkleMemDB::default();
let chunks = [ChunkInfo { hash: h1, length: 11 }, ChunkInfo { hash: h2, length: 7 }];
let nodes: Vec<_> = chunks.iter().map(|x| mdb2.add_chunk(x).0).collect();
let f1node = mdb2.merge_to_file(&nodes);
let append_poo: Vec<_> = vec![f1node, mdb2.add_chunk(&ChunkInfo { hash: h3, length: 3 }).0];
let f2node = mdb2.merge_to_file(&append_poo);
let f2hash = *f2node.hash();
mdb2.only_file_invariant_checks();
let mut diff = MerkleMemDB::default();
diff.difference(&mdb2, &mdb);
eprintln!("Old: {:?}\n", mdb);
eprintln!("New: {:?}\n", mdb2);
eprintln!("Diff: {:?}\n", diff);
// diff should contain h3, f2hash and f1hash
// (seq number is 4 cos id 0 is reserved)
assert_eq!(diff.get_sequence_number(), 4);
// check that these two nodes are there
diff.find_node(&h3).unwrap();
diff.find_node(&f2hash).unwrap();
diff.find_node(&f1hash).unwrap();
mdb.union_with(&diff);
mdb.union_finalize().unwrap();
eprintln!("Union: {:?}\n", mdb);
mdb.only_file_invariant_checks();
assert_eq!(mdb.get_sequence_number(), mdb2.get_sequence_number());
}