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
@@ -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),
);
}