1#![allow(clippy::missing_panics_doc)]
2
3use std::collections::HashMap;
4
5use crate::prelude::*;
6
7#[derive(Default)]
8pub struct TestingTree {
9 mapper: HashMap<usize, (Option<usize>, Vec<usize>, u16, Node)>,
10}
11
12impl TestingTree {
13 pub fn add(&mut self, node_id: usize, parent: Option<usize>, children: Vec<usize>, node: Node) {
14 let depth = parent.map_or(0, |p| self.mapper.get(&p).unwrap().2) + 1;
15 self.mapper.insert(node_id, (parent, children, depth, node));
16 }
17
18 pub fn set_node(&mut self, node_id: usize, node: Node) {
19 self.mapper.get_mut(&node_id).unwrap().3 = node;
20 }
21
22 pub fn remove(&mut self, node_id: usize) {
23 let node = self.mapper.remove(&node_id).unwrap();
24
25 if let Some((_, parent_children, _, _)) = node.0.and_then(|p| self.mapper.get_mut(&p)) {
26 parent_children.retain(|c| *c != node_id);
27 }
28
29 for child in node.1 {
30 self.remove(child);
31 }
32 }
33}
34
35impl TreeAdapter<usize> for TestingTree {
36 fn children_of(&mut self, node_id: &usize) -> Vec<usize> {
37 self.mapper
38 .get(node_id)
39 .map(|c| c.1.clone())
40 .unwrap_or_default()
41 }
42
43 fn parent_of(&self, node_id: &usize) -> Option<usize> {
44 self.mapper.get(node_id).and_then(|c| c.0)
45 }
46
47 fn height(&self, node_id: &usize) -> Option<u16> {
48 self.mapper.get(node_id).map(|c| c.2)
49 }
50
51 fn get_node(&self, node_id: &usize) -> Option<Node> {
52 self.mapper.get(node_id).map(|c| c.3.clone())
53 }
54
55 fn root_id(&self) -> usize {
56 0
57 }
58}
59
60pub fn test_utils() -> (Torin<usize>, Option<NoopMeasurer>) {
61 let layout = Torin::<usize>::new();
62 let measurer = None::<NoopMeasurer>;
63
64 (layout, measurer)
65}