1use crate::error::Error::{InvalidOperation, NodeNotFound, RootNodeAlreadyPresent};
2#[cfg(feature = "no_std")]
3use crate::lib::BTreeSet;
4use crate::lib::*;
5use crate::node::Nodes;
6use crate::prelude::{Node, Result};
7
8#[cfg(feature = "serde")]
9mod serde;
10
11#[derive(Clone, Debug, Copy)]
17pub enum NodeRemovalStrategy {
18 RetainChildren,
22 RemoveNodeAndChildren,
26}
27
28#[allow(clippy::enum_variant_names)]
32#[derive(Clone, Debug, Copy)]
33pub enum TraversalStrategy {
34 PreOrder,
37 PostOrder,
40 InOrder,
43}
44
45pub type SubTree<Q, T> = Tree<Q, T>;
49
50#[derive(Clone, Debug, PartialEq, Eq, Hash)]
73pub struct Tree<Q, T>
74where
75 Q: PartialEq + Eq + Clone,
76 T: PartialEq + Eq + Clone,
77{
78 name: Option<String>,
79 nodes: Nodes<Q, T>,
80}
81
82impl<Q, T> Tree<Q, T>
83where
84 Q: PartialEq + Eq + Clone + Display + Hash + Ord,
85 T: PartialEq + Eq + Clone,
86{
87 pub fn new(tree_name: Option<&str>) -> Self {
103 Self {
104 name: tree_name.map(|x| x.to_string()),
105 nodes: Nodes::default(),
106 }
107 }
108
109 pub fn add_node(&mut self, node: Node<Q, T>, parent_id: Option<&Q>) -> Result<Q> {
141 if let Some(parent_id) = parent_id {
142 let parent = self
143 .nodes
144 .iter()
145 .find(|n| &n.get_node_id() == parent_id)
146 .ok_or(NodeNotFound(parent_id.to_string()))?;
147 parent.add_child(node.clone());
148 } else if self.get_root_node().is_some() {
149 return Err(RootNodeAlreadyPresent);
150 }
151 self.nodes.push(node.clone());
152 Ok(node.get_node_id())
153 }
154
155 pub fn get_name(&self) -> Option<&str> {
173 self.name.as_deref()
174 }
175
176 pub fn rename(&mut self, name: Option<&str>) {
194 self.name = name.map(|x| x.to_string());
195 }
196
197 pub fn get_node_by_id(&self, node_id: &Q) -> Option<Node<Q, T>> {
222 self.nodes
223 .iter()
224 .find(|n| &n.get_node_id() == node_id)
225 .cloned()
226 }
227
228 pub fn get_root_node(&self) -> Option<Node<Q, T>> {
250 self.nodes
251 .iter()
252 .find(|n| n.get_parent_id().is_none())
253 .cloned()
254 }
255
256 pub fn get_node_height(&self, node_id: &Q) -> Result<i32> {
281 let node = self
282 .get_node_by_id(node_id)
283 .ok_or(NodeNotFound(node_id.to_string()))?;
284 let children = node.get_children_ids();
285 if children.is_empty() {
286 return Ok(0);
287 }
288 let mut height = 0;
289 for child in children {
290 let child_height = self.get_node_height(&child)?;
291 if child_height > height {
292 height = child_height;
293 }
294 }
295 Ok(height + 1)
296 }
297
298 pub fn get_node_depth(&self, node_id: &Q) -> Result<i32> {
327 let node = self
328 .get_node_by_id(node_id)
329 .ok_or(NodeNotFound(node_id.to_string()))?;
330 let mut depth = 0;
331 let mut parent = node.get_parent_id();
332 while let Some(parent_id) = parent {
333 depth += 1;
334 parent = self
335 .get_node_by_id(&parent_id)
336 .ok_or(NodeNotFound(parent_id.to_string()))?
337 .get_parent_id();
338 }
339 Ok(depth)
340 }
341
342 pub fn get_ancestor_ids(&self, node_id: &Q) -> Result<Vec<Q>> {
370 let node = self
371 .get_node_by_id(node_id)
372 .ok_or(NodeNotFound(node_id.to_string()))?;
373 let mut ancestors = vec![];
374 let mut parent = node.get_parent_id();
375 while let Some(parent_id) = parent {
376 ancestors.push(parent_id.clone());
377 parent = self
378 .get_node_by_id(&parent_id)
379 .ok_or(NodeNotFound(parent_id.to_string()))?
380 .get_parent_id();
381 }
382 Ok(ancestors)
383 }
384
385 pub fn get_height(&self) -> Result<i32> {
413 let root = self
414 .get_root_node()
415 .ok_or(InvalidOperation(String::from("Tree has no root node")))?;
416 self.get_node_height(&root.get_node_id())
417 }
418
419 pub fn get_node_degree(&self, node_id: &Q) -> Result<i32> {
451 let node = self
452 .get_node_by_id(node_id)
453 .ok_or(NodeNotFound(node_id.to_string()))?;
454 Ok(node.get_children_ids().len() as i32)
455 }
456
457 pub fn get_nodes(&self) -> &Nodes<Q, T> {
478 self.nodes.as_ref()
479 }
480
481 pub fn remove_node(&mut self, node_id: &Q, strategy: NodeRemovalStrategy) -> Result<()> {
515 match strategy {
516 NodeRemovalStrategy::RetainChildren => {
517 let node = self
518 .get_node_by_id(node_id)
519 .ok_or(NodeNotFound(node_id.to_string()))?;
520 let parent_node_id = &node.get_parent_id().ok_or(InvalidOperation(
521 String::from("Cannot remove root node with RetainChildren strategy"),
522 ))?;
523 let parent_node = self
524 .get_node_by_id(parent_node_id)
525 .ok_or(NodeNotFound(parent_node_id.to_string()))?;
526 parent_node.remove_child(node.clone());
527 let children = node.get_children_ids();
528 for child in children {
529 if let Some(child) = self.get_node_by_id(&child) {
530 parent_node.add_child(child);
531 }
532 }
533 self.nodes.retain(|n| &n.get_node_id() != node_id);
534 Ok(())
535 }
536 NodeRemovalStrategy::RemoveNodeAndChildren => {
537 let node = self
538 .get_node_by_id(node_id)
539 .ok_or(NodeNotFound(node_id.to_string()))?;
540 let children = node.get_children_ids();
541 if let Some(parent_id) = node.get_parent_id() {
542 let parent = self
543 .get_node_by_id(&parent_id)
544 .ok_or(NodeNotFound(parent_id.to_string()))?;
545 parent.remove_child(node.clone());
546 }
547 self.nodes.retain(|n| &n.get_node_id() != node_id);
548 for child in children {
549 let child = self
550 .get_node_by_id(&child)
551 .ok_or(NodeNotFound(child.to_string()))?;
552 node.remove_child(child.clone());
553 self.remove_node(&child.get_node_id(), strategy)?;
554 }
555 Ok(())
556 }
557 }
558 }
559
560 pub fn get_subtree(&self, node_id: &Q, generations: Option<i32>) -> Result<SubTree<Q, T>> {
594 let mut subsection = Nodes::default();
595 let node = self
596 .get_node_by_id(node_id)
597 .ok_or(NodeNotFound(node_id.to_string()))?;
598 subsection.push(node.clone());
599 if let Some(generations) = generations {
601 let children = node.get_children_ids();
602 for current_generation in 0..generations {
603 for child in children.clone() {
604 subsection.append(
605 &mut self
606 .get_subtree(&child, Some(current_generation))?
607 .get_nodes()
608 .clone(),
609 );
610 }
611 }
612 } else {
613 let children = node.get_children_ids();
614 for child in children {
615 subsection.append(&mut self.get_subtree(&child, None)?.get_nodes().clone());
616 }
617 }
618
619 Ok(SubTree {
620 name: Some(node_id.to_string()),
621 nodes: subsection,
622 })
623 }
624
625 pub fn get_sibling_ids(&self, node_id: &Q, inclusive: bool) -> Result<Vec<Q>> {
660 let node = self
661 .get_node_by_id(node_id)
662 .ok_or(NodeNotFound(node_id.to_string()))?;
663 if let Some(parent_id) = node.get_parent_id() {
664 let parent = self
665 .get_node_by_id(&parent_id)
666 .ok_or(NodeNotFound(parent_id.to_string()))?;
667 if inclusive {
668 Ok(parent.get_children_ids().clone())
669 } else {
670 Ok(parent
671 .get_children_ids()
672 .iter()
673 .filter(|x| *x != node_id)
674 .cloned()
675 .collect())
676 }
677 } else if inclusive {
678 Ok(vec![node_id.clone()])
680 } else {
681 Ok(vec![])
682 }
683 }
684
685 pub fn add_subtree(&mut self, node_id: &Q, subtree: SubTree<Q, T>) -> Result<()> {
718 let node = self
719 .get_node_by_id(node_id)
720 .ok_or(NodeNotFound(node_id.to_string()))?;
721 let subtree_nodes = subtree.get_nodes();
723 let root_node = subtree
724 .get_root_node()
725 .ok_or(InvalidOperation(String::from("Subtree has no root node.")))?;
726 node.add_child(root_node.clone());
727 self.nodes.append(&mut subtree_nodes.clone());
728 Ok(())
729 }
730
731 pub fn traverse(&self, node_id: &Q, order: TraversalStrategy) -> Result<Vec<Q>> {
763 let mut nodes = vec![];
764 let node = self
765 .get_node_by_id(node_id)
766 .ok_or(NodeNotFound(node_id.to_string()))?;
767 match &order {
768 TraversalStrategy::PreOrder => {
769 nodes.push(node_id.clone());
770 for child_id in node.get_children_ids().iter() {
771 nodes.append(&mut self.traverse(child_id, order)?);
772 }
773 }
774 TraversalStrategy::PostOrder => {
775 for child_id in node.get_children_ids().iter() {
776 nodes.append(&mut self.traverse(child_id, order)?);
777 }
778 nodes.push(node_id.clone());
779 }
780 TraversalStrategy::InOrder => {
781 for (index, child_id) in node.get_children_ids().iter().enumerate() {
782 if index == 0 {
783 nodes.append(&mut self.traverse(child_id, order)?);
784 if !nodes.contains(child_id) {
785 nodes.push(child_id.clone());
786 }
787 if !nodes.contains(node_id) {
788 nodes.push(node_id.clone());
789 }
790 } else {
791 nodes.push(child_id.clone());
792 nodes.append(&mut self.traverse(child_id, order)?);
793 }
794 }
795 }
796 }
797 #[cfg(not(feature = "no_std"))]
798 let mut seen = HashSet::new();
799 #[cfg(feature = "no_std")]
800 let mut seen = BTreeSet::new();
801 nodes.retain(|x| seen.insert(x.clone()));
802 Ok(nodes)
803 }
804
805 #[doc(hidden)]
809 fn print_tree(
810 tree: &Tree<Q, T>,
811 f: &mut Formatter<'_>,
812 ) -> Result<()>
813 where
814 Q: PartialEq + Eq + Clone + Display + Hash,
815 T: PartialEq + Eq + Clone + Display + Default,
816 {
817 Tree::print_sub_tree(tree, f, &tree.get_root_node().ok_or(FmtError)?, String::new(), true)?;
818 Ok(())
819 }
820
821 fn print_sub_tree(tree: &Tree<Q, T>,
822 f: &mut Formatter<'_>,
823 root_node: &Node<Q, T>,
824 mut parent_prefix: String,
825 is_last_child: bool,
826 ) -> Result<()>
827 where
828 Q: PartialEq + Eq + Clone + Display + Hash,
829 T: PartialEq + Eq + Clone + Display + Default,
830 {
831 write!(f, "{}", parent_prefix)?;
832 if is_last_child {
833 if tree.get_root_node().is_some_and(|x| x.get_node_id() == root_node.get_node_id()) {
834 writeln!(f, "{}", root_node)?;
835 } else {
836 writeln!(f, "└── {}", root_node)?;
837 parent_prefix = format!("{} ", parent_prefix);
838 }
839 } else {
840 writeln!(f, "├── {}", root_node)?;
841 parent_prefix = format!("{}│ ", parent_prefix);
842 }
843 let children = root_node.get_children_ids();
844 for (index, node_id) in children.iter().enumerate() {
845 let node = tree
846 .get_node_by_id(node_id)
847 .ok_or(NodeNotFound(node_id.to_string()))?;
848
849 Tree::print_sub_tree(tree, f, &node, parent_prefix.clone(), index == children.len() - 1)?;
850 }
851 Ok(())
852 }
853}
854
855impl<Q, T> Default for Tree<Q, T>
856where
857 Q: PartialEq + Eq + Clone,
858 T: PartialEq + Eq + Clone,
859{
860 fn default() -> Self {
862 Tree {
863 name: None,
864 nodes: Nodes::default(),
865 }
866 }
867}
868
869impl<Q, T> Display for Tree<Q, T>
870where
871 Q: PartialEq + Eq + Clone + Display + Hash + Ord,
872 T: PartialEq + Eq + Clone + Display + Default,
873{
874 fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
876 if let Some(name) = &self.name {
877 writeln!(f, "{}", name)?;
878 writeln!(
879 f,
880 "{}",
881 name.clone().chars().map(|_| "*").collect::<String>()
882 )?;
883 }
884 Tree::print_tree(self, f).map_err(|_| FmtError)?;
885 Ok(())
886 }
887}
888
889impl<Q, T> Drop for Tree<Q, T>
890where
891 Q: PartialEq + Eq + Clone,
892 T: PartialEq + Eq + Clone,
893{
894 #[doc(hidden)]
896 fn drop(&mut self) {
897 self.nodes.clear();
898 }
899}
900
901#[cfg(test)]
902mod tests {
903 #[allow(deprecated)]
904 #[cfg(feature = "no_std")]
905 use core::hash::SipHasher as DefaultHasher;
906 #[cfg(not(feature = "no_std"))]
907 use std::hash::DefaultHasher;
908
909 use crate::lib::*;
910
911 use super::*;
912
913 #[test]
914 fn test_tree_new() {
915 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
916 assert_eq!(tree.nodes.len(), 0);
917 }
918
919 #[test]
920 fn test_tree_add_node() {
921 let mut tree = Tree::new(Some("Sample Tree"));
922 let node_id = tree.add_node(Node::new(1, Some(2)), None).unwrap();
923 assert_eq!(tree.nodes.len(), 1);
924 assert_eq!(node_id, 1);
925 let node_id_2 = tree.add_node(Node::new(2, Some(3)), Some(&1)).unwrap();
926 assert_eq!(tree.nodes.len(), 2);
927 assert_eq!(node_id_2, 2);
928 let node_2 = tree.get_node_by_id(&2).unwrap();
929 assert_eq!(node_2.get_parent_id().unwrap(), 1);
930 }
931
932 #[test]
933 fn test_tree_add_more_than_one_root_node() {
934 let mut tree = Tree::new(Some("Sample Tree"));
935 let result = tree.add_node(Node::new(1, Some(2)), None);
936 assert!(result.is_ok());
937 let node_id = result.unwrap();
938 assert_eq!(tree.nodes.len(), 1);
939 assert_eq!(node_id, 1);
940 let result = tree.add_node(Node::new(2, Some(3)), None);
941 assert!(result.is_err());
942 assert_eq!(result.unwrap_err(), RootNodeAlreadyPresent);
943 }
944
945 #[test]
946 fn test_tree_get_node() {
947 let mut tree = Tree::new(Some("Sample Tree"));
948 let node = Node::new(1, Some(2));
949 tree.add_node(node.clone(), None).unwrap();
950 assert_eq!(tree.get_node_by_id(&1), Some(node));
951 assert_eq!(tree.get_node_by_id(&2), None);
952 }
953
954 #[test]
955 fn test_tree_get_no_existent_node() {
956 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
957 assert_eq!(tree.get_node_by_id(&1), None);
958 }
959
960 #[test]
961 fn test_tree_get_nodes() {
962 let mut tree = Tree::new(Some("Sample Tree"));
963 let node1 = Node::new(1, Some(2));
964 let node2 = Node::new(2, Some(4));
965 let node3 = Node::new(3, Some(7));
966 let node1_id = tree.add_node(node1.clone(), None).unwrap();
967 let node2_id = tree.add_node(node2.clone(), Some(&node1_id)).unwrap();
968 let _ = tree.add_node(node3.clone(), Some(&node2_id)).unwrap();
969 assert_eq!(tree.get_nodes().len(), 3);
970 }
971
972 #[test]
973 fn test_tree_get_root_node() {
974 let mut tree = Tree::new(Some("Sample Tree"));
975 let node = Node::new(1, Some(2));
976 tree.add_node(node.clone(), None).unwrap();
977 assert_eq!(tree.get_root_node(), Some(node));
978 }
979
980 #[test]
981 fn test_tree_get_node_height() {
982 let mut tree = Tree::new(Some("Sample Tree"));
983 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
984 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
985 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
986 assert_eq!(tree.get_node_height(&node_1).unwrap(), 2);
987 assert_eq!(tree.get_node_height(&node_2).unwrap(), 1);
988 assert_eq!(tree.get_node_height(&node_3).unwrap(), 0);
989 }
990
991 #[test]
992 fn test_tree_get_node_height_no_existent_node() {
993 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
994 let result = tree.get_node_height(&1);
995 assert!(result.is_err());
996 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
997 }
998
999 #[test]
1000 fn test_tree_get_node_depth() {
1001 let mut tree = Tree::new(Some("Sample Tree"));
1002 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1003 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1004 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
1005 assert_eq!(tree.get_node_depth(&node_3).unwrap(), 2);
1006 assert_eq!(tree.get_node_depth(&node_2).unwrap(), 1);
1007 assert_eq!(tree.get_node_depth(&node_1).unwrap(), 0);
1008 }
1009
1010 #[test]
1011 fn test_tree_get_ancestor_ids() {
1012 let mut tree = Tree::new(Some("Sample Tree"));
1013 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1014 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1015 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
1016 let node_4 = tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
1017 assert_eq!(tree.get_ancestor_ids(&node_4).unwrap(), vec![2, 1]);
1018 assert_eq!(tree.get_ancestor_ids(&node_3).unwrap(), vec![2, 1]);
1019 assert_eq!(tree.get_ancestor_ids(&node_2).unwrap(), vec![1]);
1020 assert_eq!(tree.get_ancestor_ids(&node_1).unwrap(), Vec::<i32>::new());
1021 }
1022
1023 #[test]
1024 fn test_tree_get_node_ancestor_ids_no_existent_node() {
1025 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
1026 let result = tree.get_ancestor_ids(&1);
1027 assert!(result.is_err());
1028 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1029 }
1030
1031 #[test]
1032 fn test_tree_get_node_depth_no_existent_node() {
1033 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
1034 let result = tree.get_node_depth(&1);
1035 assert!(result.is_err());
1036 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1037 }
1038
1039 #[test]
1040 fn test_tree_get_height() {
1041 let mut tree = Tree::new(Some("Sample Tree"));
1042 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1043 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1044 tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
1045 assert_eq!(tree.get_height().unwrap(), 2);
1046 }
1047
1048 #[test]
1049 fn test_tree_get_height_no_root_node() {
1050 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
1051 let result = tree.get_height();
1052 assert!(result.is_err());
1053 assert_eq!(
1054 result.unwrap_err(),
1055 InvalidOperation("Tree has no root node".to_string())
1056 );
1057 }
1058
1059 #[test]
1060 fn test_tree_get_node_degree() {
1061 let mut tree = Tree::new(Some("Sample Tree"));
1062 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1063 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1064 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_1)).unwrap();
1065 assert_eq!(tree.get_node_degree(&node_1).unwrap(), 2);
1066 assert_eq!(tree.get_node_degree(&node_2).unwrap(), 0);
1067 assert_eq!(tree.get_node_degree(&node_3).unwrap(), 0);
1068 }
1069
1070 #[test]
1071 fn test_tree_get_node_degree_no_existent_node() {
1072 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
1073 let result = tree.get_node_degree(&1);
1074 assert!(result.is_err());
1075 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1076 }
1077
1078 #[test]
1079 fn test_tree_remove_node() -> crate::prelude::Result<()> {
1080 let mut tree = Tree::new(Some("Sample Tree"));
1081 let node = Node::new(1, Some(2));
1082 tree.add_node(node.clone(), None)?;
1083 let node_2 = Node::new(2, Some(3));
1084 tree.add_node(node_2.clone(), Some(&1))?;
1085 let node_3 = Node::new(3, Some(6));
1086 tree.add_node(node_3.clone(), Some(&2))?;
1087 tree.remove_node(&2, NodeRemovalStrategy::RetainChildren)?;
1088 assert_eq!(tree.get_nodes().len(), 2);
1089 let node_4 = Node::new(4, Some(5));
1090 let node_5 = Node::new(5, Some(12));
1091 tree.add_node(node_4.clone(), Some(&3))?;
1092 tree.add_node(node_5.clone(), Some(&3))?;
1093 tree.remove_node(&3, NodeRemovalStrategy::RemoveNodeAndChildren)?;
1094 assert_eq!(tree.get_nodes().len(), 1);
1095 Ok(())
1096 }
1097
1098 #[test]
1099 fn test_tree_remove_node_no_existent_node() {
1100 let mut tree: Tree<i32, i32> = Tree::new(Some("Sample Tree"));
1101 let result = tree.remove_node(&1, NodeRemovalStrategy::RetainChildren);
1102 assert!(result.is_err());
1103 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1104 }
1105
1106 #[test]
1107 fn test_tree_remove_node_no_root_node() {
1108 let mut tree: Tree<i32, i32> = Tree::new(Some("Sample Tree"));
1109 tree.add_node(Node::new(1, Some(2)), None).unwrap();
1110 let result = tree.remove_node(&1, NodeRemovalStrategy::RetainChildren);
1111 assert!(result.is_err());
1112 assert_eq!(
1113 result.unwrap_err(),
1114 InvalidOperation("Cannot remove root node with RetainChildren strategy".to_string())
1115 );
1116 }
1117
1118 #[test]
1119 fn test_tree_get_subsection() {
1120 let mut tree = Tree::new(Some("Sample Tree"));
1121 let node = Node::new(1, Some(2));
1122 tree.add_node(node.clone(), None).unwrap();
1123 let node_2 = Node::new(2, Some(3));
1124 tree.add_node(node_2.clone(), Some(&1)).unwrap();
1125 let node_3 = Node::new(3, Some(6));
1126 tree.add_node(node_3.clone(), Some(&2)).unwrap();
1127 let node_4 = Node::new(4, Some(5));
1128 tree.add_node(node_4.clone(), Some(&2)).unwrap();
1129 let node_5 = Node::new(5, Some(6));
1130 tree.add_node(node_5.clone(), Some(&3)).unwrap();
1131 let subsection = tree.get_subtree(&2, None).unwrap();
1132 assert_eq!(subsection.get_name(), Some("2"));
1133 assert_eq!(subsection.get_nodes().len(), 4);
1134 let subsection = tree.get_subtree(&2, Some(0)).unwrap();
1135 assert_eq!(subsection.get_nodes().len(), 1);
1136 let subsection = tree.get_subtree(&2, Some(1)).unwrap();
1137 assert_eq!(subsection.get_nodes().len(), 3);
1138 }
1139
1140 #[test]
1141 fn test_tree_get_subsection_no_existent_node() {
1142 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
1143 let result = tree.get_subtree(&1, None);
1144 assert!(result.is_err());
1145 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1146 }
1147
1148 #[test]
1149 fn get_siblings() {
1150 let mut tree = Tree::new(Some("Sample Tree"));
1151 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1152 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1153 tree.add_node(Node::new(3, Some(6)), Some(&node_1)).unwrap();
1154 tree.add_node(Node::new(4, Some(7)), Some(&node_1)).unwrap();
1155 let siblings = tree.get_sibling_ids(&node_2, false).unwrap();
1156 assert_eq!(siblings.len(), 2);
1157 let siblings = tree.get_sibling_ids(&node_2, true).unwrap();
1158 assert_eq!(siblings.len(), 3);
1159 }
1160
1161 #[test]
1162 fn test_tree_get_siblings_no_existent_node() {
1163 let tree = Tree::<u32, u32>::new(Some("Sample Tree"));
1164 let result = tree.get_sibling_ids(&1, false);
1165 assert!(result.is_err());
1166 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1167 }
1168
1169 #[test]
1170 fn test_tree_add_subsection() {
1171 let mut tree = Tree::new(Some("Sample Tree"));
1172 let node_id = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1173 let mut subtree = SubTree::new(Some("Sample Tree"));
1174 let node_2 = subtree.add_node(Node::new(2, Some(3)), None).unwrap();
1175 subtree
1176 .add_node(Node::new(3, Some(6)), Some(&node_2))
1177 .unwrap();
1178 tree.add_subtree(&node_id, subtree).unwrap();
1179 assert_eq!(tree.get_nodes().len(), 3);
1180 }
1181
1182 #[test]
1183 fn test_tree_add_subsection_no_attaching_node() {
1184 let mut tree = Tree::new(Some("Sample Tree"));
1185 let mut subtree = SubTree::new(Some("Sample Tree"));
1186 let node_2 = subtree.add_node(Node::new(2, Some(3)), None).unwrap();
1187 subtree
1188 .add_node(Node::new(3, Some(6)), Some(&node_2))
1189 .unwrap();
1190 let result = tree.add_subtree(&1, subtree);
1191 assert!(result.is_err());
1192 assert_eq!(result.unwrap_err(), NodeNotFound("1".to_string()));
1193 }
1194
1195 #[test]
1196 fn test_tree_add_subsection_with_no_root_node() {
1197 let mut tree = Tree::new(Some("Sample Tree"));
1198 let node_id = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1199 let mut subtree = SubTree::new(Some("Sample Tree"));
1200 let node_2 = Node::new(2, Some(3));
1201 let result = subtree.add_node(Node::new(3, Some(3)), Some(&node_2.get_node_id()));
1202 assert!(result.is_err());
1203 assert_eq!(result.unwrap_err(), NodeNotFound("2".to_string()));
1204 let result = tree.add_subtree(&node_id, subtree);
1205 assert!(result.is_err());
1206 assert_eq!(
1207 result.unwrap_err(),
1208 InvalidOperation("Subtree has no root node.".to_string())
1209 );
1210 }
1211
1212 #[test]
1213 fn test_tree_display() {
1214 let mut tree = Tree::new(Some("Sample Tree"));
1215 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1216 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1217 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
1218 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
1219 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
1220 #[cfg(feature = "print_node_id")]
1221 let expected_str = "Sample Tree\n***********\n1: 2\n└── 2: 3\n ├── 3: 6\n │ └── 5: 6\n └── 4: 5\n";
1222 #[cfg(not(feature = "print_node_id"))]
1223 let expected_str =
1224 "Sample Tree\n***********\n2\n└── 3\n ├── 6\n │ └── 6\n └── 5\n";
1225
1226 assert_eq!(tree.to_string(), expected_str);
1227 }
1228
1229 #[test]
1230 fn compare_tree() {
1231 let mut tree = Tree::new(Some("Sample Tree"));
1232 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1233 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1234 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
1235 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
1236 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
1237 let mut tree_2 = Tree::new(Some("Sample Tree"));
1238 let node_1 = tree_2.add_node(Node::new(1, Some(2)), None).unwrap();
1239 let node_2 = tree_2
1240 .add_node(Node::new(2, Some(3)), Some(&node_1))
1241 .unwrap();
1242 let node_3 = tree_2
1243 .add_node(Node::new(3, Some(6)), Some(&node_2))
1244 .unwrap();
1245 tree_2
1246 .add_node(Node::new(4, Some(5)), Some(&node_2))
1247 .unwrap();
1248 tree_2
1249 .add_node(Node::new(5, Some(6)), Some(&node_3))
1250 .unwrap();
1251 assert_eq!(tree, tree_2);
1252 let tree_3 = Tree::new(Some("Sample Tree"));
1253 assert_ne!(tree, tree_3);
1254 }
1255
1256 #[test]
1257 fn test_tree_traverse() {
1258 let mut tree = Tree::new(Some("Sample Tree"));
1259 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1260 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1261 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_1)).unwrap();
1262 let node_4 = tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
1263 let node_5 = tree.add_node(Node::new(5, Some(6)), Some(&node_2)).unwrap();
1264 let node_6 = tree.add_node(Node::new(6, Some(7)), Some(&node_3)).unwrap();
1265 let preorder_nodes = tree.traverse(&node_1, TraversalStrategy::PreOrder).unwrap();
1266 let expected_preorder = vec![node_1, node_2, node_4, node_5, node_3, node_6];
1267 assert_eq!(preorder_nodes, expected_preorder);
1268
1269 let in_order_nodes = tree.traverse(&node_1, TraversalStrategy::InOrder).unwrap();
1270 let expected_in_order = vec![node_4, node_2, node_5, node_1, node_3, node_6];
1271 assert_eq!(in_order_nodes, expected_in_order);
1272
1273 let post_order_nodes = tree
1274 .traverse(&node_1, TraversalStrategy::PostOrder)
1275 .unwrap();
1276 let expected_post_order = vec![node_4, node_5, node_2, node_6, node_3, node_1];
1277 assert_eq!(post_order_nodes, expected_post_order);
1278 }
1279
1280 #[allow(deprecated)] #[test]
1282 fn test_hashing() {
1283 let mut tree = Tree::new(Some("Sample Tree"));
1284 let node_1 = tree.add_node(Node::new(1, Some(2)), None).unwrap();
1285 let node_2 = tree.add_node(Node::new(2, Some(3)), Some(&node_1)).unwrap();
1286 let node_3 = tree.add_node(Node::new(3, Some(6)), Some(&node_2)).unwrap();
1287 tree.add_node(Node::new(4, Some(5)), Some(&node_2)).unwrap();
1288 tree.add_node(Node::new(5, Some(6)), Some(&node_3)).unwrap();
1289 let mut tree_2 = Tree::new(Some("Sample Tree"));
1290 let node_1 = tree_2.add_node(Node::new(1, Some(2)), None).unwrap();
1291 let node_2 = tree_2
1292 .add_node(Node::new(2, Some(3)), Some(&node_1))
1293 .unwrap();
1294 let node_3 = tree_2
1295 .add_node(Node::new(3, Some(6)), Some(&node_2))
1296 .unwrap();
1297 tree_2
1298 .add_node(Node::new(4, Some(5)), Some(&node_2))
1299 .unwrap();
1300 tree_2
1301 .add_node(Node::new(5, Some(6)), Some(&node_3))
1302 .unwrap();
1303 assert_eq!(tree, tree_2);
1304 let mut hasher = DefaultHasher::new();
1305 tree.hash(&mut hasher);
1306 let tree_hash = hasher.finish();
1307 let mut hasher = DefaultHasher::new();
1308 tree_2.hash(&mut hasher);
1309 let tree_2_hash = hasher.finish();
1310 assert_eq!(tree_hash, tree_2_hash);
1311 }
1312
1313 #[test]
1314 fn test_sort_children_by_height() {
1315 let mut tree = Tree::new(Some("Sample Tree"));
1316 let node_1 = tree.add_node(Node::new(1, Some(1)), None).unwrap();
1317 let _node_2 = tree.add_node(Node::new(2, Some(2)), Some(&node_1)).unwrap();
1318 let node_3 = tree.add_node(Node::new(3, Some(3)), Some(&node_1)).unwrap();
1319 let node_4 = tree.add_node(Node::new(4, Some(4)), Some(&node_3)).unwrap();
1320 let _node_5 = tree.add_node(Node::new(5, Some(5)), Some(&node_4)).unwrap();
1321
1322 let root = tree.get_node_by_id(&node_1).unwrap();
1323 root.sort_children(|a, b| {
1324 let a_height = tree.get_node_height(a).unwrap();
1325 let b_height = tree.get_node_height(b).unwrap();
1326 a_height.cmp(&b_height).reverse()
1327 });
1328
1329 assert_eq!(
1330 tree.get_node_by_id(&node_1).unwrap().get_children_ids(),
1331 vec![3, 2]
1332 );
1333 }
1334}