Skip to content

Commit 5f2d199

Browse files
committed
test(chain): Add test for inserting Header into LocalChain
1 parent af8204b commit 5f2d199

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

crates/chain/tests/test_local_chain.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![cfg(feature = "miniscript")]
22

3+
use std::collections::BTreeMap;
34
use std::ops::{Bound, RangeBounds};
45

56
use bdk_chain::{
@@ -378,6 +379,88 @@ fn local_chain_insert_block() {
378379
}
379380
}
380381

382+
#[test]
383+
fn local_chain_insert_header() {
384+
fn header(prev_blockhash: BlockHash) -> Header {
385+
Header {
386+
version: bitcoin::block::Version::default(),
387+
prev_blockhash,
388+
merkle_root: bitcoin::hash_types::TxMerkleNode::all_zeros(),
389+
time: 0,
390+
bits: bitcoin::CompactTarget::default(),
391+
nonce: 0,
392+
}
393+
}
394+
395+
fn local_chain(data: Vec<(u32, Header)>) -> LocalChain<Header> {
396+
bdk_chain::local_chain::LocalChain::from_data(data.into_iter().collect::<BTreeMap<_, _>>())
397+
.expect("chain must have genesis block")
398+
}
399+
400+
struct TestCase {
401+
original: LocalChain<Header>,
402+
insert: (u32, Header),
403+
expected_result: Result<ChangeSet<Header>, AlterCheckPointError>,
404+
expected_final: LocalChain<Header>,
405+
}
406+
407+
let test_cases = [
408+
TestCase {
409+
original: local_chain(vec![(0, header(hash!("_")))]),
410+
insert: (5, header(hash!("block5"))),
411+
expected_result: Ok([(5, Some(header(hash!("block5"))))].into()),
412+
expected_final: local_chain(vec![(0, header(hash!("_"))), (5, header(hash!("block5")))]),
413+
},
414+
TestCase {
415+
original: local_chain(vec![(0, header(hash!("_"))), (3, header(hash!("A")))]),
416+
insert: (4, header(hash!("B"))),
417+
expected_result: Ok([(4, Some(header(hash!("B"))))].into()),
418+
expected_final: local_chain(vec![
419+
(0, header(hash!("_"))),
420+
(3, header(hash!("A"))),
421+
(4, header(hash!("B"))),
422+
]),
423+
},
424+
TestCase {
425+
original: local_chain(vec![(0, header(hash!("_"))), (4, header(hash!("B")))]),
426+
insert: (3, header(hash!("A"))),
427+
expected_result: Ok([(3, Some(header(hash!("A"))))].into()),
428+
expected_final: local_chain(vec![
429+
(0, header(hash!("_"))),
430+
(3, header(hash!("A"))),
431+
(4, header(hash!("B"))),
432+
]),
433+
},
434+
TestCase {
435+
original: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
436+
insert: (2, header(hash!("K"))),
437+
expected_result: Ok([].into()),
438+
expected_final: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
439+
},
440+
TestCase {
441+
original: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
442+
insert: (2, header(hash!("J"))),
443+
expected_result: Err(AlterCheckPointError {
444+
height: 2,
445+
original_hash: header(hash!("K")).block_hash(),
446+
update_hash: Some(header(hash!("J")).block_hash()),
447+
}),
448+
expected_final: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
449+
},
450+
];
451+
452+
for (i, t) in test_cases.into_iter().enumerate() {
453+
let mut chain = t.original;
454+
assert_eq!(
455+
chain.insert_data(t.insert.0, t.insert.1),
456+
t.expected_result,
457+
"[{}] unexpected result when inserting block",
458+
i,
459+
);
460+
assert_eq!(chain, t.expected_final, "[{}] unexpected final chain", i,);
461+
}
462+
}
463+
381464
#[test]
382465
fn local_chain_disconnect_from() {
383466
struct TestCase {

0 commit comments

Comments
 (0)