capability_skeleton/
tree_breadth_measurer.rs

1// ---------------- [ File: capability-skeleton/src/tree_breadth_measurer.rs ]
2crate::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        // root->(childA, childB), childA->(childC, childD), childB->()
30        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}