1use crate::lib::*;
2
3#[cfg(feature = "async")]
4pub use async_tree::Tree;
5#[cfg(not(feature = "async"))]
6pub use sync_tree::Tree;
7
8#[cfg(feature = "async")]
9mod async_tree;
10
11#[cfg(not(feature = "async"))]
12mod sync_tree;
13
14#[derive(Clone, Debug, Copy)]
20pub enum NodeRemovalStrategy {
21 RetainChildren,
25 RemoveNodeAndChildren,
29}
30
31#[allow(clippy::enum_variant_names)]
35#[derive(Clone, Debug, Copy)]
36pub enum TraversalStrategy {
37 PreOrder,
40 PostOrder,
43 InOrder,
46}
47
48pub type SubTree<Q, T> = Tree<Q, T>;
52
53#[cfg(test)]
54mod tests {
55 use crate::error::Error::{InvalidOperation, NodeNotFound, RootNodeAlreadyPresent};
56 use crate::lib::*;
57 #[allow(deprecated)]
58 #[cfg(feature = "no_std")]
59 use core::hash::SipHasher as DefaultHasher;
60 #[cfg(not(feature = "no_std"))]
61 use std::hash::DefaultHasher;
62
63 use super::*;
64 use crate::prelude::{Node, Result};
65
66 #[test]
67 fn test_tree_new() {
68 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
69 assert_eq!(tree.get_nodes().len(), 0);
70 }
71
72 #[test]
73 fn test_tree_add_node() -> Result<()> {
74 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
75 let node_id = tree.add_node(Node::new(1, Some(2)), None)?;
76 assert_eq!(tree.get_nodes().len(), 1);
77 assert_eq!(node_id, 1);
78 let node_id_2 = tree.add_node(Node::new(2, Some(3)), Some(&1))?;
79 assert_eq!(tree.get_nodes().len(), 2);
80 assert_eq!(node_id_2, 2);
81 let node_2 = tree.get_node_by_id(&2).unwrap();
82 assert_eq!(node_2.get_parent_id()?.unwrap(), 1);
83 Ok(())
84 }
85
86 #[test]
87 fn test_tree_add_more_than_one_root_node() {
88 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
89 let result = tree.add_node(Node::new(1, Some(2)), None);
90 assert!(result.is_ok());
91 let node_id = result.unwrap();
92 assert_eq!(tree.get_nodes().len(), 1);
93 assert_eq!(node_id, 1);
94 let result = tree.add_node(Node::new(2, Some(3)), None);
95 assert!(result.is_err());
96 assert_eq!(result.unwrap_err(), RootNodeAlreadyPresent);
97 }
98
99 #[test]
100 fn test_tree_get_node() {
101 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
102 let node = Node::new(1, Some(2));
103 tree.add_node(node.clone(), None).unwrap();
104 assert_eq!(tree.get_node_by_id(&1), Some(node));
105 assert_eq!(tree.get_node_by_id(&2), None);
106 }
107
108 #[test]
109 fn test_tree_get_no_existent_node() {
110 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
111 assert_eq!(tree.get_node_by_id(&1), None);
112 }
113
114 #[test]
115 fn test_tree_get_nodes() {
116 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
117 let node1 = Node::new(1, Some(2));
118 let node2 = Node::new(2, Some(4));
119 let node3 = Node::new(3, Some(7));
120 let node1_id = tree.add_node(node1.clone(), None).unwrap();
121 let node2_id = tree.add_node(node2.clone(), Some(&node1_id)).unwrap();
122 let _ = tree.add_node(node3.clone(), Some(&node2_id)).unwrap();
123 assert_eq!(tree.get_nodes().len(), 3);
124 }
125
126 #[test]
127 fn test_tree_get_root_node() {
128 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
129 let node = Node::new(1, Some(2));
130 tree.add_node(node.clone(), None).unwrap();
131 assert_eq!(tree.get_root_node(), Some(node));
132 }
133
134 #[test]
135 fn test_tree_get_node_height() {
136 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
137 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
138 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
139 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
140 assert_eq!(tree.get_node_height(&node_1).unwrap(), 2);
141 assert_eq!(tree.get_node_height(&node_2).unwrap(), 1);
142 assert_eq!(tree.get_node_height(&node_3).unwrap(), 0);
143 }
144
145 #[test]
146 fn test_tree_get_node_height_no_existent_node() {
147 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
148 let result = tree.get_node_height(&1);
149 assert!(result.is_err());
150 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
151 }
152
153 #[test]
154 fn test_tree_get_node_depth() {
155 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
156 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
157 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
158 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
159 assert_eq!(tree.get_node_depth(&node_3).unwrap(), 2);
160 assert_eq!(tree.get_node_depth(&node_2).unwrap(), 1);
161 assert_eq!(tree.get_node_depth(&node_1).unwrap(), 0);
162 }
163
164 #[test]
165 fn test_tree_get_ancestor_ids() {
166 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
167 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
168 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
169 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
170 let node_4 = tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
171 assert_eq!(tree.get_ancestor_ids(&node_4).unwrap(), vec![2, 1]);
172 assert_eq!(tree.get_ancestor_ids(&node_3).unwrap(), vec![2, 1]);
173 assert_eq!(tree.get_ancestor_ids(&node_2).unwrap(), vec![1]);
174 assert_eq!(tree.get_ancestor_ids(&node_1).unwrap(), Vec::<u32>::new());
175 }
176
177 #[test]
178 fn test_tree_get_node_ancestor_ids_no_existent_node() {
179 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
180 let result = tree.get_ancestor_ids(&1);
181 assert!(result.is_err());
182 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
183 }
184
185 #[test]
186 fn test_tree_get_node_depth_no_existent_node() {
187 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
188 let result = tree.get_node_depth(&1);
189 assert!(result.is_err());
190 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
191 }
192
193 #[test]
194 fn test_tree_get_height() {
195 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
196 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
197 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
198 tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
199 assert_eq!(tree.get_height().unwrap(), 2);
200 }
201
202 #[test]
203 fn test_tree_get_height_no_root_node() {
204 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
205 let result = tree.get_height();
206 assert!(result.is_err());
207 assert_eq!(
208 result.unwrap_err(),
209 InvalidOperation("Tree has no root node".to_string())
210 );
211 }
212
213 #[test]
214 fn test_tree_get_node_degree() {
215 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
216 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
217 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
218 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_1)).unwrap();
219 assert_eq!(tree.get_node_degree(&node_1).unwrap(), 2);
220 assert_eq!(tree.get_node_degree(&node_2).unwrap(), 0);
221 assert_eq!(tree.get_node_degree(&node_3).unwrap(), 0);
222 }
223
224 #[test]
225 fn test_tree_get_node_degree_no_existent_node() {
226 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
227 let result = tree.get_node_degree(&1);
228 assert!(result.is_err());
229 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
230 }
231
232 #[test]
233 fn test_tree_remove_node() -> Result<()> {
234 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
235 let node = Node::new(1, Some(2));
236 tree.add_node(node.clone(), None)?;
237 let node_2 = Node::new(2, Some(3));
238 tree.add_node(node_2.clone(), Some(&1))?;
239 let node_3 = Node::new(3, Some(6));
240 tree.add_node(node_3.clone(), Some(&2))?;
241 tree.remove_node(&2, NodeRemovalStrategy::RetainChildren)?;
242 assert_eq!(tree.get_nodes().len(), 2);
243 let node_4 = Node::new(4, Some(5));
244 let node_5 = Node::new(5, Some(12));
245 tree.add_node(node_4.clone(), Some(&3))?;
246 tree.add_node(node_5.clone(), Some(&3))?;
247 tree.remove_node(&3, NodeRemovalStrategy::RemoveNodeAndChildren)?;
248 assert_eq!(tree.get_nodes().len(), 1);
249 Ok(())
250 }
251
252 #[test]
253 fn test_tree_remove_node_no_existent_node() {
254 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
255 let result = tree.remove_node(&1, NodeRemovalStrategy::RetainChildren);
256 assert!(result.is_err());
257 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
258 }
259
260 #[test]
261 fn test_tree_remove_node_no_root_node() {
262 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
263 tree.add_node(Node::new(1, Some(2)), None).unwrap();
264 let result = tree.remove_node(&1, NodeRemovalStrategy::RetainChildren);
265 assert!(result.is_err());
266 assert_eq!(
267 result.unwrap_err(),
268 InvalidOperation("Cannot remove root node with RetainChildren strategy".to_string())
269 );
270 }
271
272 #[test]
273 fn test_tree_get_subsection() {
274 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
275 let node = Node::new(1, Some(2));
276 tree.add_node(node.clone(), None).unwrap();
277 let node_2 = Node::new(2, Some(3));
278 tree.add_node(node_2.clone(), Some(&1)).unwrap();
279 let node_3 = Node::new(3, Some(6));
280 tree.add_node(node_3.clone(), Some(&2)).unwrap();
281 let node_4 = Node::new(4, Some(5));
282 tree.add_node(node_4.clone(), Some(&2)).unwrap();
283 let node_5 = Node::new(5, Some(6));
284 tree.add_node(node_5.clone(), Some(&3)).unwrap();
285 let subsection = tree.get_subtree(&2, None).unwrap();
286 assert_eq!(subsection.get_name(), Some("2"));
287 assert_eq!(subsection.get_nodes().len(), 4);
288 let subsection = tree.get_subtree(&2, Some(0)).unwrap();
289 assert_eq!(subsection.get_nodes().len(), 1);
290 let subsection = tree.get_subtree(&2, Some(1)).unwrap();
291 assert_eq!(subsection.get_nodes().len(), 3);
292 }
293
294 #[test]
295 fn test_tree_get_subsection_no_existent_node() {
296 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
297 let result = tree.get_subtree(&1, None);
298 assert!(result.is_err());
299 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
300 }
301
302 #[test]
303 fn get_siblings() {
304 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
305 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
306 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
307 tree.add_node(Node::new(3, Some(6)), Some(&node_1)).unwrap();
308 tree.add_node(Node::new(4, Some(7)), Some(&node_1)).unwrap();
309 let siblings = tree.get_sibling_ids(&node_2, false).unwrap();
310 assert_eq!(siblings.len(), 2);
311 let siblings = tree.get_sibling_ids(&node_2, true).unwrap();
312 assert_eq!(siblings.len(), 3);
313 }
314
315 #[test]
316 fn test_tree_get_siblings_no_existent_node() {
317 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
318 let result = tree.get_sibling_ids(&1, false);
319 assert!(result.is_err());
320 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
321 }
322
323 #[test]
324 fn test_tree_add_subsection() {
325 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
326 let node_id = tree.add_node(Node::new(1, Some(2)), None).unwrap();
327 let mut subtree = SubTree::<u32, u32>::new(Some("Sample Tree"));
328 let node_2 = subtree.add_node(Node::new(2, Some(3)), None).unwrap();
329 subtree
330 .add_node(Node::new(3, Some(6)), Some(&node_2))
331 .unwrap();
332 tree.add_subtree(&node_id, subtree).unwrap();
333 assert_eq!(tree.get_nodes().len(), 3);
334 }
335
336 #[test]
337 fn test_tree_add_subsection_no_attaching_node() {
338 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
339 let mut subtree = SubTree::<u32, u32>::new(Some("Sample Tree"));
340 let node_2 = subtree.add_node(Node::new(2, Some(3)), None).unwrap();
341 subtree
342 .add_node(Node::new(3, Some(6)), Some(&node_2))
343 .unwrap();
344 let result = tree.add_subtree(&1, subtree);
345 assert!(result.is_err());
346 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
347 }
348
349 #[test]
350 fn test_tree_add_subsection_with_no_root_node() -> Result<()> {
351 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
352 let node_id = tree.add_node(Node::new(1, Some(2)), None)?;
353 let mut subtree = SubTree::<u32, u32>::new(Some("Sample Tree"));
354 let node_2 = Node::new(2, Some(3));
355 let result = subtree.add_node(Node::new(3, Some(3)), Some(&node_2.get_node_id()?));
356 assert!(result.is_err());
357 assert_eq!(result.unwrap_err(), NodeNotFound("2".to_string()));
358 let result = tree.add_subtree(&node_id, subtree);
359 assert!(result.is_err());
360 assert_eq!(
361 result.unwrap_err(),
362 InvalidOperation("Subtree has no root node.".to_string())
363 );
364 Ok(())
365 }
366
367 #[test]
368 fn test_tree_display() {
369 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
370 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
371 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
372 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
373 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
374 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
375 #[cfg(feature = "print_node_id")]
376 let expected_str = "Sample Tree\n***********\n1: 2\n└── 2: 3\n ├── 3: 6\n │ └── 5: 6\n └── 4: 5\n";
377 #[cfg(not(feature = "print_node_id"))]
378 let expected_str =
379 "Sample Tree\n***********\n2\n└── 3\n ├── 6\n │ └── 6\n └── 5\n";
380
381 assert_eq!(tree.to_string(), expected_str);
382 }
383
384 #[test]
385 fn compare_tree() {
386 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
387 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
388 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
389 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
390 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
391 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
392 let mut tree_2 = Tree::<u32, u32>::new(Some("Sample Tree"));
393 let node_1 = tree_2.add_node(Node::new(1, Some(2)), None).unwrap();
394 let node_2 = tree_2
395 .add_node(Node::new(2, Some(3)), Some(&node_1))
396 .unwrap();
397 let node_3 = tree_2
398 .add_node(Node::new(3, Some(6)), Some(&node_2))
399 .unwrap();
400 tree_2
401 .add_node(Node::new(4, Some(5)), Some(&node_2))
402 .unwrap();
403 tree_2
404 .add_node(Node::new(5, Some(6)), Some(&node_3))
405 .unwrap();
406 assert_eq!(tree, tree_2);
407 let tree_3 = Tree::<u32, u32>::new(Some("Sample Tree"));
408 assert_ne!(tree, tree_3);
409 }
410
411 #[test]
412 fn test_tree_traverse() {
413 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
414 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
415 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
416 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_1)).unwrap();
417 let node_4 = tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
418 let node_5 = tree.add_node(Node::new(5, Some(6)), Some(&node_2)).unwrap();
419 let node_6 = tree.add_node(Node::new(6, Some(7)), Some(&node_3)).unwrap();
420 let preorder_nodes = tree.traverse(&node_1, TraversalStrategy::PreOrder).unwrap();
421 let expected_preorder = vec![node_1, node_2, node_4, node_5, node_3, node_6];
422 assert_eq!(preorder_nodes, expected_preorder);
423
424 let in_order_nodes = tree.traverse(&node_1, TraversalStrategy::InOrder).unwrap();
425 let expected_in_order = vec![node_4, node_2, node_5, node_1, node_3, node_6];
426 assert_eq!(in_order_nodes, expected_in_order);
427
428 let post_order_nodes = tree
429 .traverse(&node_1, TraversalStrategy::PostOrder)
430 .unwrap();
431 let expected_post_order = vec![node_4, node_5, node_2, node_6, node_3, node_1];
432 assert_eq!(post_order_nodes, expected_post_order);
433 }
434
435 #[allow(deprecated)] #[test]
437 fn test_hashing() {
438 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
439 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
440 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
441 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
442 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
443 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
444 let mut tree_2 = Tree::<u32, u32>::new(Some("Sample Tree"));
445 let node_1 = tree_2.add_node(Node::new(1, Some(2)), None).unwrap();
446 let node_2 = tree_2
447 .add_node(Node::new(2, Some(3)), Some(&node_1))
448 .unwrap();
449 let node_3 = tree_2
450 .add_node(Node::new(3, Some(6)), Some(&node_2))
451 .unwrap();
452 tree_2
453 .add_node(Node::new(4, Some(5)), Some(&node_2))
454 .unwrap();
455 tree_2
456 .add_node(Node::new(5, Some(6)), Some(&node_3))
457 .unwrap();
458 assert_eq!(tree, tree_2);
459 let mut hasher = DefaultHasher::new();
460 tree.hash(&mut hasher);
461 let tree_hash = hasher.finish();
462 let mut hasher = DefaultHasher::new();
463 tree_2.hash(&mut hasher);
464 let tree_2_hash = hasher.finish();
465 assert_eq!(tree_hash, tree_2_hash);
466 }
467
468 #[test]
469 fn test_sort_children_by_height() -> Result<()> {
470 let mut tree = Tree::<u32, u32>::new(Some("Sample Tree"));
471 let node_1 = tree.add_node(Node::new(1, Some(1)), None)?;
472 let _node_2 = tree.add_node(Node::new(2, Some(2)), Some(&node_1))?;
473 let node_3 = tree.add_node(Node::new(3, Some(3)), Some(&node_1))?;
474 let node_4 = tree.add_node(Node::new(4, Some(4)), Some(&node_3))?;
475 let _node_5 = tree.add_node(Node::new(5, Some(5)), Some(&node_4))?;
476
477 let root = tree.get_node_by_id(&node_1).unwrap();
478 root.sort_children(|a, b| {
479 let a_height = tree.get_node_height(a).unwrap();
480 let b_height = tree.get_node_height(b).unwrap();
481 a_height.cmp(&b_height).reverse()
482 })?;
483
484 assert_eq!(
485 tree.get_node_by_id(&node_1).unwrap().get_children_ids()?,
486 vec![3, 2]
487 );
488 Ok(())
489 }
490}
491
492#[cfg(all(test, feature = "serde"))]
493mod serde_tests {
494 use crate::prelude::Node;
495
496 use super::*;
497
498 #[test]
499 fn test_tree_serialize_and_deserialize() {
500 let mut tree = Tree::new(None);
501 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
502 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
503 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
504 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
505 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
506 let serialized = serde_json::to_string(&tree).unwrap();
507 let expected = r#"{"nodes":[{"node_id":1,"value":2,"parent":null,"children":[2]},{"node_id":2,"value":3,"parent":1,"children":[3,4]},{"node_id":3,"value":6,"parent":2,"children":[5]},{"node_id":4,"value":5,"parent":2,"children":[]},{"node_id":5,"value":6,"parent":3,"children":[]}]}"#;
508 let deserialized: Tree<u32, u32> = serde_json::from_str(&serialized).unwrap();
509 let expected_tree: Tree<u32, u32> = serde_json::from_str(expected).unwrap();
510 assert_eq!(deserialized, expected_tree);
511 }
512
513 #[test]
514 #[cfg_attr(not(feature = "compact_serde"), ignore)]
515 fn test_tree_compact_serialize() {
516 let mut tree = Tree::new(None);
517 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
518 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
519 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
520 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
521 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
522 let serialized = serde_json::to_string(&tree).unwrap();
523 let expected = r#"{"nodes":[{"node_id":1,"value":2,"parent":null},{"node_id":2,"value":3,"parent":1},{"node_id":3,"value":6,"parent":2},{"node_id":4,"value":5,"parent":2},{"node_id":5,"value":6,"parent":3}]}"#;
524 assert_eq!(serialized, expected);
525 }
526
527 #[test]
528 #[cfg_attr(not(feature = "compact_serde"), ignore)]
529 fn test_tree_compact_deserialize() {
530 let tree_str = r#"{"nodes":[{"node_id":1,"value":2,"parent":null},{"node_id":2,"value":3,"parent":1},{"node_id":3,"value":6,"parent":2},{"node_id":4,"value":5,"parent":2},{"node_id":5,"value":6,"parent":3}]}"#;
531 let deserialized: Tree<u32, u32> = serde_json::from_str(tree_str).unwrap();
532 let mut tree = Tree::new(None);
533 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
534 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
535 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
536 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
537 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
538 assert_eq!(deserialized, tree);
539 }
540
541 #[cfg(feature = "auto_id")]
542 #[test]
543 fn test_tree_serialize_and_deserialize_with_auto_id_ensuring_uniqueness() {
544 let mut tree = Tree::<crate::prelude::AutomatedId, i32>::new(Some("Sample Tree"));
545 let root = tree
546 .add_node(Node::new_with_auto_id(Some(2)), None)
547 .unwrap();
548 let child_1 = tree
549 .add_node(Node::new_with_auto_id(Some(3)), Some(&root))
550 .unwrap();
551 let child_2 = tree
552 .add_node(Node::new_with_auto_id(Some(4)), Some(&child_1))
553 .unwrap();
554 let child_3 = tree
555 .add_node(Node::new_with_auto_id(Some(5)), Some(&child_2))
556 .unwrap();
557 let serialized_tree = serde_json::to_string(&tree).unwrap();
558 let mut deserialized_tree: Tree<crate::prelude::AutomatedId, i32> =
559 serde_json::from_str(&serialized_tree).unwrap();
560 deserialized_tree
561 .add_node(Node::new_with_auto_id(Some(6)), Some(&child_3))
562 .unwrap();
563 let mut node_ids = deserialized_tree
564 .get_nodes()
565 .iter()
566 .map(|node| node.get_node_id().unwrap())
567 .collect::<Vec<_>>();
568 node_ids.sort();
569 node_ids.dedup();
570 assert_eq!(node_ids.len(), deserialized_tree.get_nodes().len());
571 }
572
573 #[cfg(feature = "auto_id")]
574 #[test]
575 #[cfg_attr(feature = "no_std", ignore)]
576 fn test_tree_deserialize_from_disk_with_auto_id_ensuring_uniqueness() {
577 let tree_str = serde_json::json!({"name":"Sample Tree","nodes":[{"node_id":3,"value":2,"children":[4],"parent":null},{"node_id":4,"value":3,"children":[5],"parent":3},{"node_id":5,"value":4,"children":[6],"parent":4},{"node_id":6,"value":5,"children":[],"parent":5}]});
578 let mut deserialized_tree =
579 serde_json::from_value::<Tree<crate::prelude::AutomatedId, i32>>(tree_str).unwrap();
580 deserialized_tree
581 .add_node(Node::new_with_auto_id(Some(6)), Some(&6))
582 .unwrap();
583 let mut node_ids = deserialized_tree
584 .get_nodes()
585 .iter()
586 .map(|node| node.get_node_id().unwrap())
587 .collect::<Vec<_>>();
588 node_ids.sort();
589 node_ids.dedup();
590 assert_eq!(node_ids.len(), deserialized_tree.get_nodes().len());
591 }
592}