use std::sync::Arc;
use proptest::prelude::*;
use crate::{
block::{CountedHeader, Hash, Header, MAX_BLOCK_LOCATOR_LENGTH},
serialization::{
arbitrary::max_allocation_is_big_enough, TrustedPreallocate, ZcashSerialize,
MAX_HEADERS_PER_MESSAGE, MAX_PROTOCOL_MESSAGE_LEN,
},
};
const BLOCK_HEADER_LENGTH: usize =
crate::work::equihash::Solution::INPUT_LENGTH + 32 + 3 + crate::work::equihash::SOLUTION_SIZE;
const MIN_COUNTED_HEADER_LEN: usize = BLOCK_HEADER_LENGTH + 1;
proptest! {
#[test]
fn block_hash_size_is_correct(hash in Hash::arbitrary()) {
let serialized = hash.zcash_serialize_to_vec().expect("Serialization to vec must succeed");
prop_assert!(serialized.len() as u64 == 32);
}
#[test]
fn block_hash_max_allocation(hash in Hash::arbitrary_with(())) {
let (
smallest_disallowed_vec_len,
_smallest_disallowed_serialized_len,
largest_allowed_vec_len,
largest_allowed_serialized_len,
) = max_allocation_is_big_enough(hash);
prop_assert!(Hash::max_allocation() == MAX_BLOCK_LOCATOR_LENGTH);
prop_assert!(((smallest_disallowed_vec_len - 1) as u64) == Hash::max_allocation());
prop_assert!((largest_allowed_vec_len as u64) == Hash::max_allocation());
prop_assert!(largest_allowed_serialized_len <= MAX_PROTOCOL_MESSAGE_LEN);
}
#[test]
fn counted_header_min_length(header in any::<Arc<Header>>()) {
let header = CountedHeader {
header,
};
let serialized_header = header.zcash_serialize_to_vec().expect("Serialization to vec must succeed");
prop_assert!(serialized_header.len() >= MIN_COUNTED_HEADER_LEN)
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(128))]
#[test]
fn counted_header_max_allocation(header in any::<Arc<Header>>()) {
let header = CountedHeader {
header,
};
let (
smallest_disallowed_vec_len,
_smallest_disallowed_serialized_len,
largest_allowed_vec_len,
largest_allowed_serialized_len,
) = max_allocation_is_big_enough(header);
prop_assert!(CountedHeader::max_allocation() == MAX_HEADERS_PER_MESSAGE as u64);
prop_assert!(((smallest_disallowed_vec_len - 1) as u64) == CountedHeader::max_allocation());
prop_assert!((largest_allowed_vec_len as u64) == CountedHeader::max_allocation());
prop_assert!(largest_allowed_serialized_len <= MAX_PROTOCOL_MESSAGE_LEN);
}
}