Skip to content

Commit 367099a

Browse files
committed
test(chain): Add test for inserting Header into LocalChain
1 parent 2644431 commit 367099a

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

crates/chain/tests/test_local_chain.rs

Lines changed: 86 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,91 @@ 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![
413+
(0, header(hash!("_"))),
414+
(5, header(hash!("block5"))),
415+
]),
416+
},
417+
TestCase {
418+
original: local_chain(vec![(0, header(hash!("_"))), (3, header(hash!("A")))]),
419+
insert: (4, header(hash!("B"))),
420+
expected_result: Ok([(4, Some(header(hash!("B"))))].into()),
421+
expected_final: local_chain(vec![
422+
(0, header(hash!("_"))),
423+
(3, header(hash!("A"))),
424+
(4, header(hash!("B"))),
425+
]),
426+
},
427+
TestCase {
428+
original: local_chain(vec![(0, header(hash!("_"))), (4, header(hash!("B")))]),
429+
insert: (3, header(hash!("A"))),
430+
expected_result: Ok([(3, Some(header(hash!("A"))))].into()),
431+
expected_final: local_chain(vec![
432+
(0, header(hash!("_"))),
433+
(3, header(hash!("A"))),
434+
(4, header(hash!("B"))),
435+
]),
436+
},
437+
TestCase {
438+
original: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
439+
insert: (2, header(hash!("K"))),
440+
expected_result: Ok([].into()),
441+
expected_final: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
442+
},
443+
TestCase {
444+
original: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
445+
insert: (2, header(hash!("J"))),
446+
expected_result: Err(AlterCheckPointError {
447+
height: 2,
448+
original_hash: header(hash!("K")).block_hash(),
449+
update_hash: Some(header(hash!("J")).block_hash()),
450+
}),
451+
expected_final: local_chain(vec![(0, header(hash!("_"))), (2, header(hash!("K")))]),
452+
},
453+
];
454+
455+
for (i, t) in test_cases.into_iter().enumerate() {
456+
let mut chain = t.original;
457+
assert_eq!(
458+
chain.insert_data(t.insert.0, t.insert.1),
459+
t.expected_result,
460+
"[{}] unexpected result when inserting block",
461+
i,
462+
);
463+
assert_eq!(chain, t.expected_final, "[{}] unexpected final chain", i,);
464+
}
465+
}
466+
381467
#[test]
382468
fn local_chain_disconnect_from() {
383469
struct TestCase {

0 commit comments

Comments
 (0)