Add GraphTopologyConversion tests related to addition and deletion

This commit is contained in:
2026-10-15 10:01:54 +02:00
parent 7196871a96
commit 90a2bd9e9e
6 changed files with 120 additions and 1 deletions
+2
View File
@@ -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);
}
+3 -1
View File
@@ -251,11 +251,13 @@ impl<G: GraphTopology> 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);
}
+2
View File
@@ -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);
}
+2
View File
@@ -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;
@@ -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<G, H>()
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),
);
}
@@ -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<G, H>()
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),
);
}