crate::ix!();
impl TreeBreadthMeasurer for Skeleton {
#[instrument(level = "trace", skip(self))]
fn measure_tree_breadth_distribution(&self) -> Vec<u8> {
let mut distribution = Vec::with_capacity(self.nodes().len());
for node in self.nodes() {
let child_count = node.child_ids().len() as u8;
distribution.push(child_count);
}
distribution
}
}
#[cfg(test)]
mod skeleton_breadth_measurer_assessment {
use super::*;
#[traced_test]
fn check_breadth_distribution_in_empty_skeleton() {
let skel = SkeletonBuilder::default().build().unwrap();
let dist = skel.measure_tree_breadth_distribution();
assert!(dist.is_empty());
}
#[traced_test]
fn check_breadth_distribution_for_mixed_branching() {
let root = SkeletonNodeBuilder::default()
.id(0u16)
.child_ids(vec![1u16,2u16])
.name("root")
.original_key("root")
.build(NodeKind::Dispatch)
.unwrap();
let child_a = SkeletonNodeBuilder::default()
.id(1u16)
.child_ids(vec![3u16,4u16])
.name("childA")
.original_key("childA")
.build(NodeKind::Dispatch)
.unwrap();
let child_b = SkeletonNodeBuilder::default()
.id(2u16)
.name("childB")
.original_key("childB")
.build(NodeKind::LeafHolder)
.unwrap();
let child_c = SkeletonNodeBuilder::default()
.id(3u16)
.name("childC")
.original_key("childC")
.build(NodeKind::LeafHolder)
.unwrap();
let child_d = SkeletonNodeBuilder::default()
.id(4u16)
.name("childD")
.original_key("childD")
.build(NodeKind::LeafHolder)
.unwrap();
let skel = SkeletonBuilder::default()
.nodes(vec![root, child_a, child_b, child_c, child_d])
.root_id(Some(0u16))
.build()
.unwrap();
let dist = skel.measure_tree_breadth_distribution();
assert_eq!(dist, vec![2,2,0,0,0]);
}
}