convert test_singlethreaded_subtree to use SubtreeLeavesIter
This commit is contained in:
parent
f2e20bc630
commit
99298a6bb7
1 changed files with 42 additions and 33 deletions
|
@ -763,14 +763,15 @@ fn add_subtree_leaf(subtrees: &mut Vec<Vec<SubtreeLeaf>>, leaf: SubtreeLeaf) {
|
|||
// ================================================================================================
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use core::mem;
|
||||
|
||||
use alloc::{collections::BTreeMap, vec::Vec};
|
||||
|
||||
use super::{InnerNode, PairComputations, SparseMerkleTree, SubtreeLeaf};
|
||||
use super::{
|
||||
InnerNode, LeafIndex, PairComputations, SmtLeaf, SparseMerkleTree, SubtreeLeaf,
|
||||
SubtreeLeavesIter,
|
||||
};
|
||||
use crate::{
|
||||
hash::rpo::RpoDigest,
|
||||
merkle::{LeafIndex, NodeIndex, Smt, SmtLeaf, SMT_DEPTH},
|
||||
merkle::{NodeIndex, Smt, SMT_DEPTH},
|
||||
Felt, Word, ONE,
|
||||
};
|
||||
|
||||
|
@ -962,38 +963,46 @@ mod test {
|
|||
} = Smt::sorted_pairs_to_leaves(entries);
|
||||
|
||||
for current_depth in (8..=SMT_DEPTH).step_by(8).rev() {
|
||||
for (i, subtree) in mem::take(&mut leaf_subtrees).into_iter().enumerate() {
|
||||
// Pre-assertions.
|
||||
assert!(
|
||||
subtree.is_sorted(),
|
||||
"subtree {i} at bottom-depth {current_depth} is not sorted",
|
||||
);
|
||||
assert!(
|
||||
!subtree.is_empty(),
|
||||
"subtree {i} at bottom-depth {current_depth} is empty!",
|
||||
);
|
||||
|
||||
// Do actual things.
|
||||
let (nodes, next_leaves) = Smt::build_subtree(subtree, current_depth);
|
||||
|
||||
// Post-assertions.
|
||||
assert!(next_leaves.is_sorted());
|
||||
for (&index, test_node) in nodes.iter() {
|
||||
let control_node = control.get_inner_node(index);
|
||||
assert_eq!(
|
||||
test_node, &control_node,
|
||||
"depth {} subtree {}: test node does not match control at index {:?}",
|
||||
current_depth, i, index,
|
||||
// There's no flat_map_unzip(), so this is the best we can do.
|
||||
let (nodes, subtrees): (Vec<BTreeMap<_, _>>, Vec<Vec<SubtreeLeaf>>) = leaf_subtrees
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
.map(|(i, subtree)| {
|
||||
// Pre-assertions.
|
||||
assert!(
|
||||
subtree.is_sorted(),
|
||||
"subtree {i} at bottom-depth {current_depth} is not sorted",
|
||||
);
|
||||
assert!(
|
||||
!subtree.is_empty(),
|
||||
"subtree {i} at bottom-depth {current_depth} is empty!",
|
||||
);
|
||||
}
|
||||
|
||||
// Update state.
|
||||
accumulated_nodes.extend(nodes);
|
||||
// Do actual things.
|
||||
let (nodes, next_leaves) = Smt::build_subtree(subtree, current_depth);
|
||||
// Post-assertions.
|
||||
assert!(next_leaves.is_sorted());
|
||||
|
||||
for subtree_leaf in next_leaves {
|
||||
super::add_subtree_leaf(&mut leaf_subtrees, subtree_leaf);
|
||||
}
|
||||
}
|
||||
for (&index, test_node) in nodes.iter() {
|
||||
let control_node = control.get_inner_node(index);
|
||||
assert_eq!(
|
||||
test_node, &control_node,
|
||||
"depth {} subtree {}: test node does not match control at index {:?}",
|
||||
current_depth, i, index,
|
||||
);
|
||||
}
|
||||
|
||||
(nodes, next_leaves)
|
||||
})
|
||||
.unzip();
|
||||
|
||||
// Update state between each depth iteration.
|
||||
|
||||
// FIXME: is this flatten or Box<dyn Iterator> better?
|
||||
let mut all_leaves: Vec<SubtreeLeaf> = subtrees.into_iter().flatten().collect();
|
||||
leaf_subtrees = SubtreeLeavesIter::from_leaves(&mut all_leaves).collect();
|
||||
|
||||
accumulated_nodes.extend(nodes.into_iter().flatten());
|
||||
|
||||
assert!(!leaf_subtrees.is_empty(), "on depth {current_depth}");
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue