1mod bst;
2pub mod bst_hashmap;
3
4#[cfg(test)]
34mod tests {
35 use super::bst::Bst;
36 use super::bst_hashmap::BstHashmap;
37
38 #[test]
39 fn test_insert_and_search() {
40 let mut map = BstHashmap::default();
41 map.insert(5, "five");
42 map.insert(3, "three");
43 map.insert(7, "seven");
44
45 assert_eq!(map.search(5), Some("five"));
46 assert_eq!(map.search(3), Some("three"));
47 assert_eq!(map.search(7), Some("seven"));
48 assert_eq!(map.search(10), None);
49 }
50
51 #[test]
52 fn test_min_max() {
53 let mut map = BstHashmap::default();
54 map.insert(10, "ten");
55 map.insert(5, "five");
56 map.insert(15, "fifteen");
57 map.insert(3, "three");
58 map.insert(7, "seven");
59
60 assert_eq!(map.min(10), Some((3, "three")));
61 assert_eq!(map.max(10), Some((15, "fifteen")));
62 assert_eq!(map.min(5), Some((3, "three")));
63 assert_eq!(map.max(5), Some((7, "seven")));
64 }
65
66 #[test]
67 fn test_remove() {
68 let mut map = BstHashmap::default();
69 map.insert(5, "five");
70 map.insert(3, "three");
71 map.insert(7, "seven");
72
73 map.remove(3);
74 assert_eq!(map.search(3), None);
75
76 map.remove(5);
77 assert_eq!(map.search(5), None);
78
79 assert_eq!(map.search(7), Some("seven"));
80 }
81
82 #[test]
83 fn basic_bst_operations() {
84 let mut bst = Bst::default();
85
86 bst.insert(3, "val3");
87 bst.insert(4, "val4");
88 bst.insert(6, "val6");
89 bst.insert(7, "val7");
90 bst.insert(2, "val2");
91
92 let node = bst.search(6);
93 assert!(node.is_some(), "Node with key 6 should be found");
94 let node_ref = node.unwrap();
95 assert_eq!(node_ref.borrow().key, 6);
96
97 let min_node = bst.min(Some(node_ref.clone()));
98 assert!(min_node.is_some(), "Min should exist in subtree");
99 assert_eq!(min_node.unwrap().borrow().key, 6);
100
101 let max_node = bst.max(Some(node_ref));
102 assert!(max_node.is_some(), "Max should exist in subtree");
103 assert_eq!(max_node.unwrap().borrow().key, 7);
104
105 assert_eq!(bst.root.as_ref().unwrap().borrow().key, 3);
106 }
107
108 #[test]
109 fn remove_leaf_node() {
110 let mut bst = Bst::default();
111 bst.insert(5, "val5");
112 bst.insert(3, "val3");
113 bst.insert(7, "val7");
114
115 let node = bst.search(3);
116 assert!(node.is_some());
117 bst.remove(node);
118
119 assert!(bst.search(3).is_none());
120
121 assert_eq!(bst.root.as_ref().unwrap().borrow().key, 5);
122 assert!(bst.search(7).is_some());
123 }
124
125 #[test]
126 fn remove_node_with_one_child() {
127 let mut bst = Bst::default();
128 bst.insert(5, "val5");
129 bst.insert(3, "val3");
130 bst.insert(4, "val4"); let node = bst.search(3);
133 assert!(node.is_some());
134 bst.remove(node);
135
136 assert!(bst.search(3).is_none());
137 assert!(bst.search(4).is_some());
138 assert_eq!(bst.root.as_ref().unwrap().borrow().key, 5);
139 }
140
141 #[test]
142 fn remove_node_with_two_children() {
143 let mut bst = Bst::default();
144 bst.insert(5, "val5");
145 bst.insert(3, "val3");
146 bst.insert(7, "val7");
147 bst.insert(6, "val6");
148 bst.insert(8, "val8");
149
150 let node = bst.search(7);
151 assert!(node.is_some());
152 bst.remove(node);
153
154 assert!(bst.search(7).is_none());
155 assert!(bst.search(6).is_some());
156 assert!(bst.search(8).is_some());
157 }
158
159 #[test]
160 fn remove_root_node() {
161 let mut bst = Bst::default();
162 bst.insert(5, "val5");
163 bst.insert(3, "val3");
164 bst.insert(7, "val7");
165
166 let root_node = bst.root.clone();
167 bst.remove(root_node);
168
169 assert!(bst.root.is_some());
170 assert_ne!(bst.root.as_ref().unwrap().borrow().key, 5);
171 }
172}