capability_skeleton/
tree_breadth_measurer.rs1crate::ix!();
3
4impl TreeBreadthMeasurer for Skeleton {
5 #[instrument(level = "trace", skip(self))]
6 fn measure_tree_breadth_distribution(&self) -> Vec<u8> {
7 let mut distribution = Vec::with_capacity(self.nodes().len());
8 for node in self.nodes() {
9 let child_count = node.child_ids().len() as u8;
10 distribution.push(child_count);
11 }
12 distribution
13 }
14}
15
16#[cfg(test)]
17mod skeleton_breadth_measurer_assessment {
18 use super::*;
19
20 #[traced_test]
21 fn check_breadth_distribution_in_empty_skeleton() {
22 let skel = SkeletonBuilder::default().build().unwrap();
23 let dist = skel.measure_tree_breadth_distribution();
24 assert!(dist.is_empty());
25 }
26
27 #[traced_test]
28 fn check_breadth_distribution_for_mixed_branching() {
29 let root = SkeletonNodeBuilder::default()
31 .id(0u16)
32 .child_ids(vec![1u16,2u16])
33 .name("root")
34 .original_key("root")
35 .build(NodeKind::Dispatch)
36 .unwrap();
37 let child_a = SkeletonNodeBuilder::default()
38 .id(1u16)
39 .child_ids(vec![3u16,4u16])
40 .name("childA")
41 .original_key("childA")
42 .build(NodeKind::Dispatch)
43 .unwrap();
44 let child_b = SkeletonNodeBuilder::default()
45 .id(2u16)
46 .name("childB")
47 .original_key("childB")
48 .build(NodeKind::LeafHolder)
49 .unwrap();
50 let child_c = SkeletonNodeBuilder::default()
51 .id(3u16)
52 .name("childC")
53 .original_key("childC")
54 .build(NodeKind::LeafHolder)
55 .unwrap();
56 let child_d = SkeletonNodeBuilder::default()
57 .id(4u16)
58 .name("childD")
59 .original_key("childD")
60 .build(NodeKind::LeafHolder)
61 .unwrap();
62
63 let skel = SkeletonBuilder::default()
64 .nodes(vec![root, child_a, child_b, child_c, child_d])
65 .root_id(Some(0u16))
66 .build()
67 .unwrap();
68
69 let dist = skel.measure_tree_breadth_distribution();
70 assert_eq!(dist, vec![2,2,0,0,0]);
71 }
72}