1use crate::implementations::Edge;
2use crate::implementations::Graph;
3use crate::implementations::Node;
4
5pub fn build_graph(node_keys: Vec<u32>, edge_pairs: Vec<(u32, u32)>) -> Graph<Node, Edge> {
7 let nodes: Vec<Node> = node_keys.into_iter().map(Node::new).collect();
8 let edges: Vec<Edge> = edge_pairs
9 .into_iter()
10 .map(|(source, target)| Edge::new(source, target))
11 .collect();
12
13 Graph::new(nodes, edges)
14}
15
16#[cfg(test)]
17mod tests {
18 use super::*;
19 use ade_traits::{GraphViewTrait, NodeTrait};
20
21 #[test]
22 fn test_build_empty_graph() {
23 let graph = build_graph(vec![], vec![]);
24
25 assert_eq!(graph.get_nodes().count(), 0);
26 assert_eq!(graph.get_edges().count(), 0);
27 }
28
29 #[test]
30 fn test_build_graph_single_node() {
31 let graph = build_graph(vec![1], vec![]);
32
33 assert_eq!(graph.get_nodes().count(), 1);
34 assert_eq!(graph.get_edges().count(), 0);
35 assert!(graph.has_node(1));
36
37 let node = graph.get_node(1);
38 assert_eq!(node.key(), 1);
39 assert!(node.predecessors().is_empty());
40 assert!(node.successors().is_empty());
41 }
42
43 #[test]
44 fn test_build_graph_multiple_nodes_no_edges() {
45 let graph = build_graph(vec![1, 2, 3], vec![]);
46
47 assert_eq!(graph.get_nodes().count(), 3);
48 assert_eq!(graph.get_edges().count(), 0);
49 assert!(graph.has_node(1));
50 assert!(graph.has_node(2));
51 assert!(graph.has_node(3));
52 }
53
54 #[test]
55 fn test_build_graph_with_edges() {
56 let graph = build_graph(vec![1, 2, 3], vec![(1, 2), (2, 3)]);
57
58 assert_eq!(graph.get_nodes().count(), 3);
59 assert_eq!(graph.get_edges().count(), 2);
60
61 assert!(graph.has_node(1));
63 assert!(graph.has_node(2));
64 assert!(graph.has_node(3));
65
66 assert!(graph.has_edge(1, 2));
68 assert!(graph.has_edge(2, 3));
69 assert!(!graph.has_edge(1, 3));
70 }
71
72 #[test]
73 fn test_build_graph_node_connections() {
74 let graph = build_graph(vec![1, 2, 3], vec![(1, 2), (2, 3), (3, 1)]);
75
76 let node1 = graph.get_node(1);
78 assert!(node1.successors().contains(&2));
79 assert!(node1.predecessors().contains(&3));
80 assert_eq!(node1.successors().len(), 1);
81 assert_eq!(node1.predecessors().len(), 1);
82
83 let node2 = graph.get_node(2);
85 assert!(node2.successors().contains(&3));
86 assert!(node2.predecessors().contains(&1));
87
88 let node3 = graph.get_node(3);
90 assert!(node3.successors().contains(&1));
91 assert!(node3.predecessors().contains(&2));
92 }
93
94 #[test]
95 fn test_build_graph_multiple_edges_same_node() {
96 let graph = build_graph(vec![1, 2, 3], vec![(1, 2), (1, 3)]);
97
98 let node1 = graph.get_node(1);
99 assert_eq!(node1.successors().len(), 2);
100 assert!(node1.successors().contains(&2));
101 assert!(node1.successors().contains(&3));
102 assert_eq!(node1.predecessors().len(), 0);
103
104 let node2 = graph.get_node(2);
105 assert_eq!(node2.predecessors().len(), 1);
106 assert!(node2.predecessors().contains(&1));
107
108 let node3 = graph.get_node(3);
109 assert_eq!(node3.predecessors().len(), 1);
110 assert!(node3.predecessors().contains(&1));
111 }
112
113 #[test]
114 fn test_build_graph_with_self_loop() {
115 let graph = build_graph(vec![1, 2], vec![(1, 1), (1, 2)]);
116
117 assert_eq!(graph.get_nodes().count(), 2);
118 assert_eq!(graph.get_edges().count(), 2);
119
120 assert!(graph.has_edge(1, 1));
122 assert!(graph.has_edge(1, 2));
123
124 let node1 = graph.get_node(1);
125 assert!(node1.successors().contains(&1)); assert!(node1.successors().contains(&2));
127 assert!(node1.predecessors().contains(&1)); }
129
130 #[test]
131 fn test_build_graph_large_keys() {
132 let large_key = u32::MAX - 1;
133 let graph = build_graph(vec![0, large_key], vec![(0, large_key)]);
134
135 assert_eq!(graph.get_nodes().count(), 2);
136 assert_eq!(graph.get_edges().count(), 1);
137 assert!(graph.has_node(0));
138 assert!(graph.has_node(large_key));
139 assert!(graph.has_edge(0, large_key));
140 }
141
142 #[test]
143 fn test_build_complete_triangle() {
144 let graph = build_graph(
145 vec![1, 2, 3],
146 vec![(1, 2), (2, 3), (3, 1), (1, 3), (3, 2), (2, 1)],
147 );
148
149 assert_eq!(graph.get_nodes().count(), 3);
150 assert_eq!(graph.get_edges().count(), 6);
151
152 for key in [1, 2, 3] {
154 let node = graph.get_node(key);
155 assert_eq!(node.predecessors().len(), 2);
156 assert_eq!(node.successors().len(), 2);
157 }
158 }
159}