Release 0.3.0 #8
@@ -288,6 +288,8 @@ mod trait_tests {
|
|||||||
crate::graph_topology_addition_clone_tests!(AppendGraph);
|
crate::graph_topology_addition_clone_tests!(AppendGraph);
|
||||||
crate::graph_topology_conversion_tests!(AppendGraph, Graph);
|
crate::graph_topology_conversion_tests!(AppendGraph, Graph);
|
||||||
crate::graph_topology_addition_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);
|
crate::from_tests!(AppendGraph, Graph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -251,11 +251,13 @@ impl<G: GraphTopology> From<&G> for FrozenGraph {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod trait_tests {
|
mod trait_tests {
|
||||||
use super::FrozenGraph;
|
use super::FrozenGraph;
|
||||||
use crate::models::AppendGraph;
|
use crate::models::{AppendGraph, Graph};
|
||||||
|
|
||||||
crate::graph_topology_tests!(FrozenGraph);
|
crate::graph_topology_tests!(FrozenGraph);
|
||||||
crate::graph_topology_clone_tests!(FrozenGraph);
|
crate::graph_topology_clone_tests!(FrozenGraph);
|
||||||
crate::graph_topology_conversion_tests!(FrozenGraph, AppendGraph);
|
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);
|
crate::from_tests!(FrozenGraph, AppendGraph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -434,6 +434,8 @@ mod trait_tests {
|
|||||||
crate::graph_topology_addition_clone_tests!(Graph);
|
crate::graph_topology_addition_clone_tests!(Graph);
|
||||||
crate::graph_topology_conversion_tests!(Graph, AppendGraph);
|
crate::graph_topology_conversion_tests!(Graph, AppendGraph);
|
||||||
crate::graph_topology_addition_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);
|
crate::from_tests!(Graph, AppendGraph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ pub mod fixtures;
|
|||||||
pub mod from_testing;
|
pub mod from_testing;
|
||||||
pub mod graph_topology_addition_clone_testing;
|
pub mod graph_topology_addition_clone_testing;
|
||||||
pub mod graph_topology_addition_conversion_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_deletion_testing;
|
||||||
pub mod graph_topology_addition_testing;
|
pub mod graph_topology_addition_testing;
|
||||||
pub mod graph_topology_clone_testing;
|
pub mod graph_topology_clone_testing;
|
||||||
pub mod graph_topology_conversion_testing;
|
pub mod graph_topology_conversion_testing;
|
||||||
|
pub mod graph_topology_deletion_conversion_testing;
|
||||||
pub mod graph_topology_deletion_testing;
|
pub mod graph_topology_deletion_testing;
|
||||||
pub mod graph_topology_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),
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user