ade_graph/utils/
build.rs

1use crate::implementations::Edge;
2use crate::implementations::Graph;
3use crate::implementations::Node;
4
5/// Build a graph from node keys and edge pairs
6pub 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        // Check nodes exist
62        assert!(graph.has_node(1));
63        assert!(graph.has_node(2));
64        assert!(graph.has_node(3));
65
66        // Check edges exist
67        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        // Check node 1: successor=2, predecessor=3
77        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        // Check node 2: successor=3, predecessor=1
84        let node2 = graph.get_node(2);
85        assert!(node2.successors().contains(&3));
86        assert!(node2.predecessors().contains(&1));
87
88        // Check node 3: successor=1, predecessor=2
89        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        // Check self-loop
121        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)); // self-loop
126        assert!(node1.successors().contains(&2));
127        assert!(node1.predecessors().contains(&1)); // self-loop
128    }
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        // Every node should have 2 predecessors and 2 successors
153        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}