Merge rust-bitcoin/rust-bitcoin#4217: primitives: Increase test coverage in `block.rs`

c1ea20b958 Increase test coverage in block.rs (Jamil Lambert, PhD)
3e750d7ba1 Create test helper function to create a header (Jamil Lambert, PhD)

Pull request description:

  Add tests to `primitive::block` module to increase test coverage.

  Coverage tested with `cargo-tarpaulin`

  `block.rs` coverage:
  before 13.79%
  after 100%

ACKs for top commit:
  apoelstra:
    ACK c1ea20b958f448a5a35073ce3d5bd5394918eb9b; successfully ran local tests
  tcharding:
    ACK c1ea20b958

Tree-SHA512: 70bbdce9c45e9bdcea76026b7a27582a32b796099329c429527d7dfe574788604020e53e417afd3cf53886ceb87df37b6dcb34a7ff40260b9d8a3811e22a478c
This commit is contained in:
merge-script 2025-03-13 13:19:54 +00:00
commit 1798679145
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
1 changed files with 122 additions and 8 deletions

View File

@ -361,6 +361,17 @@ impl<'a> Arbitrary<'a> for Version {
mod tests {
use super::*;
fn dummy_header() -> Header {
Header {
version: Version::ONE,
prev_blockhash: BlockHash::from_byte_array([0x99; 32]),
merkle_root: TxMerkleNode::from_byte_array([0x77; 32]),
time: Timestamp::from(2),
bits: CompactTarget::from_consensus(3),
nonce: 4,
}
}
#[test]
fn version_is_not_signalling_with_invalid_bit() {
let arbitrary_version = Version::from_consensus(1_234_567_890);
@ -395,17 +406,16 @@ mod tests {
assert_eq!(version.to_consensus(), 1_234_567_890);
}
#[test]
fn version_default() {
let version = Version::default();
assert_eq!(version.to_consensus(), Version::NO_SOFT_FORK_SIGNALLING.to_consensus());
}
// Check that the size of the header consensus serialization matches the const SIZE value
#[test]
fn header_size() {
let header = Header {
version: Version::ONE,
prev_blockhash: BlockHash::from_byte_array([0x99; 32]),
merkle_root: TxMerkleNode::from_byte_array([0x77; 32]),
time: Timestamp::from(2),
bits: CompactTarget::from_consensus(3),
nonce: 4,
};
let header = dummy_header();
// Calculate the size of the block header in bytes from the sum of the serialized lengths
// it's fields: version, prev_blockhash, merkle_root, time, bits, nonce.
@ -418,4 +428,108 @@ mod tests {
assert_eq!(header_size, Header::SIZE);
}
#[test]
#[cfg(feature = "alloc")]
fn block_new_unchecked() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions.clone());
assert_eq!(block.header, header);
assert_eq!(block.transactions, transactions);
}
#[test]
#[cfg(feature = "alloc")]
fn block_assume_checked() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions.clone());
let witness_root = Some(WitnessMerkleNode::from_byte_array([0x88; 32]));
let checked_block = block.assume_checked(witness_root);
assert_eq!(checked_block.header(), &header);
assert_eq!(checked_block.transactions(), &transactions);
assert_eq!(checked_block.cached_witness_root(), witness_root);
}
#[test]
#[cfg(feature = "alloc")]
fn block_into_parts() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions.clone());
let (block_header, block_transactions) = block.into_parts();
assert_eq!(block_header, header);
assert_eq!(block_transactions, transactions);
}
#[test]
#[cfg(feature = "alloc")]
fn block_cached_witness_root() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions);
let witness_root = Some(WitnessMerkleNode::from_byte_array([0x88; 32]));
let checked_block = block.assume_checked(witness_root);
assert_eq!(checked_block.cached_witness_root(), witness_root);
}
#[test]
#[cfg(feature = "alloc")]
fn block_block_hash() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions);
assert_eq!(block.block_hash(), header.block_hash());
}
#[test]
fn block_hash_from_header() {
let header = dummy_header();
let block_hash = header.block_hash();
assert_eq!(block_hash, BlockHash::from(header));
}
#[test]
fn block_hash_from_header_ref() {
let header = dummy_header();
let block_hash: BlockHash = BlockHash::from(&header);
assert_eq!(block_hash, header.block_hash());
}
#[test]
#[cfg(feature = "alloc")]
fn block_hash_from_block() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions);
let block_hash: BlockHash = BlockHash::from(block);
assert_eq!(block_hash, header.block_hash());
}
#[test]
#[cfg(feature = "alloc")]
fn block_hash_from_block_ref() {
let header = dummy_header();
let transactions = vec![];
let block = Block::new_unchecked(header, transactions);
let block_hash: BlockHash = BlockHash::from(&block);
assert_eq!(block_hash, header.block_hash());
}
#[test]
fn header_debug() {
let header = dummy_header();
let expected = format!(
"Header {{ block_hash: {:?}, version: {:?}, prev_blockhash: {:?}, merkle_root: {:?}, time: {:?}, bits: {:?}, nonce: {:?} }}",
header.block_hash(),
header.version,
header.prev_blockhash,
header.merkle_root,
header.time,
header.bits,
header.nonce
);
assert_eq!(format!("{:?}", header), expected);
}
}