use crate::merkle::{hasher::Hasher, mem::Mem, Family};
use commonware_conformance::{conformance_tests, Conformance};
use commonware_cryptography::{sha256, Sha256};
pub fn build_test_mem<F, H>(
hasher: &H,
mut mem: Mem<F, sha256::Digest>,
elements: u64,
) -> Mem<F, sha256::Digest>
where
F: Family,
H: Hasher<F, Digest = sha256::Digest>,
{
let batch = {
let mut batch = mem.new_batch();
for i in 0u64..elements {
let element = hasher.digest(&i.to_be_bytes());
batch = batch.add(hasher, &element);
}
batch.merkleize(&mem, hasher)
};
mem.apply_batch(&batch).unwrap();
mem
}
pub fn build_test_mmr<H: Hasher<crate::mmr::Family, Digest = sha256::Digest>>(
hasher: &H,
mmr: crate::mmr::mem::Mmr<sha256::Digest>,
elements: u64,
) -> crate::mmr::mem::Mmr<sha256::Digest> {
build_test_mem(hasher, mmr, elements)
}
type Standard = crate::merkle::hasher::Standard<Sha256>;
struct MmrRootStability;
impl Conformance for MmrRootStability {
async fn commit(seed: u64) -> Vec<u8> {
let hasher = Standard::new();
let mmr = crate::mmr::mem::Mmr::new(&hasher);
build_test_mem(&hasher, mmr, seed).root().to_vec()
}
}
struct MmbRootStability;
impl Conformance for MmbRootStability {
async fn commit(seed: u64) -> Vec<u8> {
let hasher = Standard::new();
let mmb = crate::mmb::mem::Mmb::new(&hasher);
build_test_mem(&hasher, mmb, seed).root().to_vec()
}
}
conformance_tests! {
MmrRootStability => 200,
MmbRootStability => 200,
}