diff --git a/src/models/append_graph.rs b/src/models/append_graph.rs index c653627..a872e6a 100644 --- a/src/models/append_graph.rs +++ b/src/models/append_graph.rs @@ -288,6 +288,8 @@ mod trait_tests { crate::graph_topology_addition_clone_tests!(AppendGraph); crate::graph_topology_conversion_tests!(AppendGraph, Graph); crate::graph_topology_addition_conversion_tests!(AppendGraph, Graph); + crate::graph_topology_deletion_conversion_tests!(AppendGraph, Graph); + crate::graph_topology_addition_deletion_conversion_tests!(AppendGraph, Graph); crate::from_tests!(AppendGraph, Graph); } diff --git a/src/models/frozen_graph.rs b/src/models/frozen_graph.rs index 4c1f8c5..3215a67 100644 --- a/src/models/frozen_graph.rs +++ b/src/models/frozen_graph.rs @@ -251,11 +251,13 @@ impl From<&G> for FrozenGraph { #[cfg(test)] mod trait_tests { use super::FrozenGraph; - use crate::models::AppendGraph; + use crate::models::{AppendGraph, Graph}; crate::graph_topology_tests!(FrozenGraph); crate::graph_topology_clone_tests!(FrozenGraph); crate::graph_topology_conversion_tests!(FrozenGraph, AppendGraph); + crate::graph_topology_deletion_conversion_tests!(FrozenGraph, Graph); + crate::graph_topology_addition_deletion_conversion_tests!(FrozenGraph, Graph); crate::from_tests!(FrozenGraph, AppendGraph); } diff --git a/src/models/graph.rs b/src/models/graph.rs index 628cf3a..ae225ed 100644 --- a/src/models/graph.rs +++ b/src/models/graph.rs @@ -434,6 +434,8 @@ mod trait_tests { crate::graph_topology_addition_clone_tests!(Graph); crate::graph_topology_conversion_tests!(Graph, AppendGraph); crate::graph_topology_addition_conversion_tests!(Graph, AppendGraph); + crate::graph_topology_deletion_conversion_tests!(Graph, Graph); + crate::graph_topology_addition_deletion_conversion_tests!(Graph, Graph); crate::from_tests!(Graph, AppendGraph); } diff --git a/src/testing.rs b/src/testing.rs index 5d54232..0c39578 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -4,9 +4,11 @@ pub mod fixtures; pub mod from_testing; pub mod graph_topology_addition_clone_testing; pub mod graph_topology_addition_conversion_testing; +pub mod graph_topology_addition_deletion_conversion_testing; pub mod graph_topology_addition_deletion_testing; pub mod graph_topology_addition_testing; pub mod graph_topology_clone_testing; pub mod graph_topology_conversion_testing; +pub mod graph_topology_deletion_conversion_testing; pub mod graph_topology_deletion_testing; pub mod graph_topology_testing; diff --git a/src/testing/graph_topology_addition_deletion_conversion_testing.rs b/src/testing/graph_topology_addition_deletion_conversion_testing.rs new file mode 100644 index 0000000..aa8e2d4 --- /dev/null +++ b/src/testing/graph_topology_addition_deletion_conversion_testing.rs @@ -0,0 +1,56 @@ +use std::fmt::Debug; + +use crate::testing::fixtures; +use crate::testing::fixtures::MakeTestGraph; +use crate::traits::{GraphTopologyAddition, GraphTopologyConversion, GraphTopologyDeletion}; + +#[doc(hidden)] +#[macro_export] +macro_rules! graph_topology_addition_deletion_conversion_tests { + ($T:ty, $U:ty) => { + $crate::graph_topology_addition_deletion_conversion_tests!(@wrap $T, $U, + convert_after_delete_add_vertex, + ); + }; + + (@wrap $T:ty, $U:ty, $($name:ident),* $(,)?) => { + $( + #[test] + fn $name() { + $crate::testing::graph_topology_addition_deletion_conversion_testing::$name::<$T, $U>(); + } + )* + }; +} + +pub fn convert_after_delete_add_vertex() +where + G: GraphTopologyConversion, + H: MakeTestGraph + GraphTopologyDeletion + GraphTopologyAddition, + G::Vertex: Debug, + G::Edge: Debug, + H::Vertex: Debug, + H::Edge: Debug, +{ + let (mut source, vertices, edges, _) = H::standard(); + let del = vertices[2]; + source.delete_vertex(del); + // Depending on the graph type, the new vertex may reuse the slot of the deleted one. + let added = source.add_vertex(); + let mut vertices: Vec<_> = vertices.into_iter().filter(|&v| v != del).collect(); + vertices.push(added); + let edges: Vec<_> = edges + .into_iter() + .filter(|&(_, u, v)| u != del && v != del) + .collect(); + + let (graph, iso) = G::convert(&source); + fixtures::assert_isomorphic( + &source, + &graph, + &vertices, + |v| iso.vertex(v), + &edges, + |e| iso.edge(e), + ); +} diff --git a/src/testing/graph_topology_deletion_conversion_testing.rs b/src/testing/graph_topology_deletion_conversion_testing.rs new file mode 100644 index 0000000..31aea56 --- /dev/null +++ b/src/testing/graph_topology_deletion_conversion_testing.rs @@ -0,0 +1,55 @@ +use std::fmt::Debug; + +use crate::testing::fixtures; +use crate::testing::fixtures::MakeTestGraph; +use crate::traits::{GraphTopologyConversion, GraphTopologyDeletion}; + +#[doc(hidden)] +#[macro_export] +macro_rules! graph_topology_deletion_conversion_tests { + ($T:ty, $U:ty) => { + $crate::graph_topology_deletion_conversion_tests!(@wrap $T, $U, + convert_after_deletion, + ); + }; + + (@wrap $T:ty, $U:ty, $($name:ident),* $(,)?) => { + $( + #[test] + fn $name() { + $crate::testing::graph_topology_deletion_conversion_testing::$name::<$T, $U>(); + } + )* + }; +} + +pub fn convert_after_deletion() +where + G: GraphTopologyConversion, + H: MakeTestGraph + GraphTopologyDeletion, + G::Vertex: Debug, + G::Edge: Debug, + H::Vertex: Debug, + H::Edge: Debug, +{ + let (mut source, vertices, edges, _) = H::standard(); + + // Deletes a vertex together with its incident edges, which leaves gaps in the source's slots. + let del = vertices[2]; + source.delete_vertex(del); + let vertices: Vec<_> = vertices.into_iter().filter(|&v| v != del).collect(); + let edges: Vec<_> = edges + .into_iter() + .filter(|&(_, u, v)| u != del && v != del) + .collect(); + + let (graph, iso) = G::convert(&source); + fixtures::assert_isomorphic( + &source, + &graph, + &vertices, + |v| iso.vertex(v), + &edges, + |e| iso.edge(e), + ); +}