diff --git a/.idea/grapherity.iml b/.idea/grapherity.iml index cf84ae4..bbe0a70 100644 --- a/.idea/grapherity.iml +++ b/.idea/grapherity.iml @@ -3,6 +3,7 @@ + diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..67722ce --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +pub mod algorithms; +pub mod models; diff --git a/src/models.rs b/src/models.rs index e54ba13..a9d59ab 100644 --- a/src/models.rs +++ b/src/models.rs @@ -88,3 +88,99 @@ impl Graph { Some(Incidence(self.incidence_vertices.len() - 1)); } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn vertex_count() { + let (graph, _) = make_test_graph(); + assert_eq!(graph.vertex_count(), 10, "unexpected vertex count"); + } + + #[test] + fn edge_count() { + let (graph, _) = make_test_graph(); + assert_eq!(graph.edge_count(), 14, "unexpected edge count"); + } + + #[test] + fn degrees() { + let (graph, vertices) = make_test_graph(); + let expected_degrees = [1, 4, 4, 2, 4, 2, 3, 3, 2, 3]; + for i in 0..graph.vertex_count() { + assert_eq!( + graph.degree(vertices[i]), + expected_degrees[i], + "unexpected degree of {:?}", + vertices[i] + ); + } + } + + #[test] + fn adjacencies() { + let (graph, vertices) = make_test_graph(); + assert!( + graph.are_adjacent(vertices[0], vertices[1]), + "expected {:?} and {:?} to be adjacent", + vertices[0], + vertices[1] + ); + assert!( + graph.are_adjacent(vertices[9], vertices[5]), + "expected {:?} and {:?} to be adjacent", + vertices[0], + vertices[5] + ); + assert!( + !graph.are_adjacent(vertices[9], vertices[3]), + "unexpected adjacency of {:?} and {:?}", + vertices[9], + vertices[3] + ); + + for i in 0..graph.vertex_count() { + let exp = match i { + 2 => continue, + 1 | 4 | 5 | 6 => true, + _ => false, + }; + assert_eq!( + graph.are_adjacent(vertices[2], vertices[i]), + exp, + "unexpected adjacency of {:?} and {:?}", + vertices[2], + vertices[i] + ); + assert_eq!( + graph.are_adjacent(vertices[i], vertices[2]), + exp, + "unexpected adjacency of {:?} and {:?}", + vertices[i], + vertices[2] + ); + } + } + + fn make_test_graph() -> (Graph, [Vertex; 10]) { + let mut graph = Graph::new(); + let vertices: [Vertex; 10] = core::array::from_fn(|_| graph.add_vertex()); + graph.add_edge(vertices[0], vertices[1]); + graph.add_edge(vertices[1], vertices[2]); + graph.add_edge(vertices[1], vertices[3]); + graph.add_edge(vertices[1], vertices[4]); + graph.add_edge(vertices[2], vertices[4]); + graph.add_edge(vertices[2], vertices[5]); + graph.add_edge(vertices[2], vertices[6]); + graph.add_edge(vertices[3], vertices[6]); + graph.add_edge(vertices[4], vertices[7]); + graph.add_edge(vertices[4], vertices[8]); + graph.add_edge(vertices[5], vertices[9]); + graph.add_edge(vertices[6], vertices[9]); + graph.add_edge(vertices[7], vertices[8]); + graph.add_edge(vertices[7], vertices[9]); + (graph, vertices) + } +} diff --git a/src/main.rs b/tests/dijkstra.rs similarity index 57% rename from src/main.rs rename to tests/dijkstra.rs index 49ba617..b540223 100644 --- a/src/main.rs +++ b/tests/dijkstra.rs @@ -1,81 +1,10 @@ -mod algorithms; -mod models; - -use models::Graph; -use models::Vertex; - -fn main() { - // TODO: Move this graph example into one or more tests. - let mut graph = Graph::new(); - let vertices: [Vertex; 10] = core::array::from_fn(|_| graph.add_vertex()); - graph.add_edge(vertices[0], vertices[1]); - graph.add_edge(vertices[1], vertices[2]); - graph.add_edge(vertices[1], vertices[3]); - graph.add_edge(vertices[1], vertices[4]); - graph.add_edge(vertices[2], vertices[4]); - graph.add_edge(vertices[2], vertices[5]); - graph.add_edge(vertices[2], vertices[6]); - graph.add_edge(vertices[3], vertices[6]); - graph.add_edge(vertices[4], vertices[7]); - graph.add_edge(vertices[4], vertices[8]); - graph.add_edge(vertices[5], vertices[9]); - graph.add_edge(vertices[6], vertices[9]); - graph.add_edge(vertices[7], vertices[8]); - graph.add_edge(vertices[7], vertices[9]); - - assert_eq!(graph.vertex_count(), 10, "unexpected vertex count"); - assert_eq!(graph.edge_count(), 14, "unexpected edge count"); - let expected_degrees = [1, 4, 4, 2, 4, 2, 3, 3, 2, 3]; - for i in 0..graph.vertex_count() { - assert_eq!( - graph.degree(vertices[i]), - expected_degrees[i], - "unexpected degree of {:?}", - vertices[i] - ); - } - - assert!( - graph.are_adjacent(vertices[0], vertices[1]), - "expected {:?} and {:?} to be adjacent", - vertices[0], - vertices[1] - ); - assert!( - graph.are_adjacent(vertices[9], vertices[5]), - "expected {:?} and {:?} to be adjacent", - vertices[0], - vertices[5] - ); - assert!( - !graph.are_adjacent(vertices[9], vertices[3]), - "unexpected adjacency of {:?} and {:?}", - vertices[9], - vertices[3] - ); - - for i in 0..graph.vertex_count() { - let exp = match i { - 2 => continue, - 1 | 4 | 5 | 6 => true, - _ => false, - }; - assert_eq!( - graph.are_adjacent(vertices[2], vertices[i]), - exp, - "unexpected adjacency of {:?} and {:?}", - vertices[2], - vertices[i] - ); - assert_eq!( - graph.are_adjacent(vertices[i], vertices[2]), - exp, - "unexpected adjacency of {:?} and {:?}", - vertices[i], - vertices[2] - ); - } +use grapherity::algorithms; +use grapherity::models::Graph; +use grapherity::models::Vertex; +#[test] +fn dijkstra() { + let (graph, vertices) = make_test_graph(); let (distances, predecessors) = algorithms::dijkstra(&graph, vertices[0]); let expected_distances_from_v0 = [ Some(0), @@ -124,5 +53,24 @@ fn main() { vertices[i] ); } - println!("Example test success!"); +} + +fn make_test_graph() -> (Graph, [Vertex; 10]) { + let mut graph = Graph::new(); + let vertices: [Vertex; 10] = core::array::from_fn(|_| graph.add_vertex()); + graph.add_edge(vertices[0], vertices[1]); + graph.add_edge(vertices[1], vertices[2]); + graph.add_edge(vertices[1], vertices[3]); + graph.add_edge(vertices[1], vertices[4]); + graph.add_edge(vertices[2], vertices[4]); + graph.add_edge(vertices[2], vertices[5]); + graph.add_edge(vertices[2], vertices[6]); + graph.add_edge(vertices[3], vertices[6]); + graph.add_edge(vertices[4], vertices[7]); + graph.add_edge(vertices[4], vertices[8]); + graph.add_edge(vertices[5], vertices[9]); + graph.add_edge(vertices[6], vertices[9]); + graph.add_edge(vertices[7], vertices[8]); + graph.add_edge(vertices[7], vertices[9]); + (graph, vertices) }