rust_igraph/algorithms/properties/
edgelist.rs1use crate::core::{Graph, IgraphResult, VertexId};
9
10pub fn get_edgelist(graph: &Graph) -> IgraphResult<Vec<(VertexId, VertexId)>> {
24 let ecount = graph.ecount();
25 let mut result = Vec::with_capacity(ecount);
26 for eid in 0..ecount {
27 #[allow(clippy::cast_possible_truncation)]
28 let e = eid as u32;
29 result.push(graph.edge(e)?);
30 }
31 Ok(result)
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37 use crate::core::Graph;
38
39 #[test]
40 fn empty_graph() {
41 let g = Graph::new(0, false).unwrap();
42 let el = get_edgelist(&g).unwrap();
43 assert!(el.is_empty());
44 }
45
46 #[test]
47 fn no_edges() {
48 let g = Graph::new(5, false).unwrap();
49 let el = get_edgelist(&g).unwrap();
50 assert!(el.is_empty());
51 }
52
53 #[test]
54 fn triangle_undirected() {
55 let mut g = Graph::new(3, false).unwrap();
56 g.add_edges(vec![(0, 1), (1, 2), (2, 0)]).unwrap();
57 let el = get_edgelist(&g).unwrap();
58 assert_eq!(el.len(), 3);
59 }
60
61 #[test]
62 fn directed_edges_preserved() {
63 let mut g = Graph::new(3, true).unwrap();
64 g.add_edges(vec![(0, 1), (1, 2)]).unwrap();
65 let el = get_edgelist(&g).unwrap();
66 assert_eq!(el.len(), 2);
67 assert_eq!(el[0], (0, 1));
68 assert_eq!(el[1], (1, 2));
69 }
70
71 #[test]
72 fn single_vertex_no_edges() {
73 let g = Graph::new(1, false).unwrap();
74 let el = get_edgelist(&g).unwrap();
75 assert!(el.is_empty());
76 }
77
78 #[test]
79 fn self_loop() {
80 let mut g = Graph::new(2, false).unwrap();
81 g.add_edges(vec![(0, 0), (0, 1)]).unwrap();
82 let el = get_edgelist(&g).unwrap();
83 assert_eq!(el.len(), 2);
84 }
85}