Add incident vertices to edges return value in make_test_graph() fixture

This commit is contained in:
2026-05-12 13:55:04 +02:00
parent ac688b4fc0
commit be63527478
+74 -113
View File
@@ -5,7 +5,11 @@ macro_rules! graph_topology_test_fixtures {
fn make_test_graph() -> ( fn make_test_graph() -> (
$T, $T,
[<$T as $crate::traits::GraphTopology>::Vertex; 10], [<$T as $crate::traits::GraphTopology>::Vertex; 10],
[<$T as $crate::traits::GraphTopology>::Edge; 18], [(
<$T as $crate::traits::GraphTopology>::Edge,
<$T as $crate::traits::GraphTopology>::Vertex,
<$T as $crate::traits::GraphTopology>::Vertex,
); 18],
[Vec<( [Vec<(
<$T as $crate::traits::GraphTopology>::Vertex, <$T as $crate::traits::GraphTopology>::Vertex,
<$T as $crate::traits::GraphTopology>::Edge, <$T as $crate::traits::GraphTopology>::Edge,
@@ -15,69 +19,70 @@ macro_rules! graph_topology_test_fixtures {
let vertices: [<$T as $crate::traits::GraphTopology>::Vertex; 10] = let vertices: [<$T as $crate::traits::GraphTopology>::Vertex; 10] =
core::array::from_fn(|_| graph.add_vertex()); core::array::from_fn(|_| graph.add_vertex());
let edges = [ let edges = [
graph.add_edge(vertices[0], vertices[1]), (vertices[0], vertices[1]),
graph.add_edge(vertices[0], vertices[1]), (vertices[0], vertices[1]),
graph.add_edge(vertices[1], vertices[2]), (vertices[1], vertices[2]),
graph.add_edge(vertices[1], vertices[3]), (vertices[1], vertices[3]),
graph.add_edge(vertices[1], vertices[4]), (vertices[1], vertices[4]),
graph.add_edge(vertices[2], vertices[2]), (vertices[2], vertices[2]),
graph.add_edge(vertices[2], vertices[4]), (vertices[2], vertices[4]),
graph.add_edge(vertices[2], vertices[4]), (vertices[2], vertices[4]),
graph.add_edge(vertices[2], vertices[5]), (vertices[2], vertices[5]),
graph.add_edge(vertices[2], vertices[6]), (vertices[2], vertices[6]),
graph.add_edge(vertices[3], vertices[6]), (vertices[3], vertices[6]),
graph.add_edge(vertices[4], vertices[4]), (vertices[4], vertices[4]),
graph.add_edge(vertices[4], vertices[7]), (vertices[4], vertices[7]),
graph.add_edge(vertices[4], vertices[8]), (vertices[4], vertices[8]),
graph.add_edge(vertices[5], vertices[9]), (vertices[5], vertices[9]),
graph.add_edge(vertices[6], vertices[9]), (vertices[6], vertices[9]),
graph.add_edge(vertices[7], vertices[8]), (vertices[7], vertices[8]),
graph.add_edge(vertices[7], vertices[9]), (vertices[7], vertices[9]),
]; ]
.map(|(v1, v2)| (graph.add_edge(v1, v2), v1, v2));
let incidences: [Vec<_>; 10] = [ let incidences: [Vec<_>; 10] = [
vec![(vertices[1], edges[0]), (vertices[1], edges[1])], vec![(vertices[1], edges[0].0), (vertices[1], edges[1].0)],
vec![ vec![
(vertices[0], edges[0]), (vertices[0], edges[0].0),
(vertices[0], edges[1]), (vertices[0], edges[1].0),
(vertices[2], edges[2]), (vertices[2], edges[2].0),
(vertices[3], edges[3]), (vertices[3], edges[3].0),
(vertices[4], edges[4]), (vertices[4], edges[4].0),
], ],
vec![ vec![
(vertices[2], edges[5]), (vertices[2], edges[5].0),
(vertices[2], edges[5]), (vertices[2], edges[5].0),
(vertices[1], edges[2]), (vertices[1], edges[2].0),
(vertices[4], edges[6]), (vertices[4], edges[6].0),
(vertices[4], edges[7]), (vertices[4], edges[7].0),
(vertices[5], edges[8]), (vertices[5], edges[8].0),
(vertices[6], edges[9]), (vertices[6], edges[9].0),
], ],
vec![(vertices[1], edges[3]), (vertices[6], edges[10])], vec![(vertices[1], edges[3].0), (vertices[6], edges[10].0)],
vec![ vec![
(vertices[1], edges[4]), (vertices[1], edges[4].0),
(vertices[2], edges[6]), (vertices[2], edges[6].0),
(vertices[2], edges[7]), (vertices[2], edges[7].0),
(vertices[4], edges[11]), (vertices[4], edges[11].0),
(vertices[4], edges[11]), (vertices[4], edges[11].0),
(vertices[7], edges[12]), (vertices[7], edges[12].0),
(vertices[8], edges[13]), (vertices[8], edges[13].0),
], ],
vec![(vertices[2], edges[8]), (vertices[9], edges[14])], vec![(vertices[2], edges[8].0), (vertices[9], edges[14].0)],
vec![ vec![
(vertices[2], edges[9]), (vertices[2], edges[9].0),
(vertices[3], edges[10]), (vertices[3], edges[10].0),
(vertices[9], edges[15]), (vertices[9], edges[15].0),
], ],
vec![ vec![
(vertices[4], edges[12]), (vertices[4], edges[12].0),
(vertices[8], edges[16]), (vertices[8], edges[16].0),
(vertices[9], edges[17]), (vertices[9], edges[17].0),
], ],
vec![(vertices[4], edges[13]), (vertices[7], edges[16])], vec![(vertices[4], edges[13].0), (vertices[7], edges[16].0)],
vec![ vec![
(vertices[5], edges[14]), (vertices[5], edges[14].0),
(vertices[6], edges[15]), (vertices[6], edges[15].0),
(vertices[7], edges[17]), (vertices[7], edges[17].0),
], ],
]; ];
(graph, vertices, edges, incidences) (graph, vertices, edges, incidences)
@@ -412,33 +417,12 @@ macro_rules! graph_topology_tests {
#[test] #[test]
fn incident_vertices() { fn incident_vertices() {
let (graph, vertices, edges, _) = make_test_graph(); let (graph, _, edges, _) = make_test_graph();
let expected: [(<$T as $crate::traits::GraphTopology>::Vertex, <$T as $crate::traits::GraphTopology>::Vertex); 18] = [ for &(e, v1, v2) in edges.iter() {
(vertices[0], vertices[1]), let (u1, u2) = graph.incident_vertices(e);
(vertices[0], vertices[1]),
(vertices[1], vertices[2]),
(vertices[1], vertices[3]),
(vertices[1], vertices[4]),
(vertices[2], vertices[2]),
(vertices[2], vertices[4]),
(vertices[2], vertices[4]),
(vertices[2], vertices[5]),
(vertices[2], vertices[6]),
(vertices[3], vertices[6]),
(vertices[4], vertices[4]),
(vertices[4], vertices[7]),
(vertices[4], vertices[8]),
(vertices[5], vertices[9]),
(vertices[6], vertices[9]),
(vertices[7], vertices[8]),
(vertices[7], vertices[9]),
];
for (i, &(v1, v2)) in expected.iter().enumerate() {
let (u1, u2) = graph.incident_vertices(edges[i]);
assert!( assert!(
(u1 == v1 && u2 == v2) || (u1 == v2 && u2 == v1), (u1 == v1 && u2 == v2) || (u1 == v2 && u2 == v1),
"unexpected incident vertices {u1:?} and {u2:?} for edges[{i}]: edge {:?}", "unexpected incident vertices {u1:?} and {u2:?} for edge {e:?}"
edges[i]
); );
} }
} }
@@ -461,7 +445,7 @@ macro_rules! graph_topology_tests {
// Expects each edge to appear exactly once. // Expects each edge to appear exactly once.
for e in graph.edges() { for e in graph.edges() {
assert_eq!( assert_eq!(
edges.iter().filter(|&x| *x == e).count(), edges.iter().filter(|&&(f, _, _)| f == e).count(),
1, 1,
"unexpected edge {e:?} from the iterator" "unexpected edge {e:?} from the iterator"
); );
@@ -894,37 +878,14 @@ macro_rules! graph_topology_deletion_tests {
#[test] #[test]
fn incident_vertices_after_delete_edge() { fn incident_vertices_after_delete_edge() {
let (mut graph, vertices, edges, _) = make_test_graph(); let (mut graph, _, edges, _) = make_test_graph();
graph.delete_edge(edges[2]); let e = edges[2].0;
let expected: [( graph.delete_edge(e);
usize, for &(f, v1, v2) in edges.iter().filter(|&&(f, _, _)| f != e) {
<Graph as $crate::traits::GraphTopology>::Vertex, let (u1, u2) = graph.incident_vertices(f);
<Graph as $crate::traits::GraphTopology>::Vertex,
); 17] = [
(0, vertices[0], vertices[1]),
(1, vertices[0], vertices[1]),
(3, vertices[1], vertices[3]),
(4, vertices[1], vertices[4]),
(5, vertices[2], vertices[2]),
(6, vertices[2], vertices[4]),
(7, vertices[2], vertices[4]),
(8, vertices[2], vertices[5]),
(9, vertices[2], vertices[6]),
(10, vertices[3], vertices[6]),
(11, vertices[4], vertices[4]),
(12, vertices[4], vertices[7]),
(13, vertices[4], vertices[8]),
(14, vertices[5], vertices[9]),
(15, vertices[6], vertices[9]),
(16, vertices[7], vertices[8]),
(17, vertices[7], vertices[9]),
];
for (i, v1, v2) in expected {
let (u1, u2) = graph.incident_vertices(edges[i]);
assert!( assert!(
(u1 == v1 && u2 == v2) || (u1 == v2 && u2 == v1), (u1 == v1 && u2 == v2) || (u1 == v2 && u2 == v1),
"unexpected incident vertices {u1:?} and {u2:?} for edges[{i}] ({:?}) after delete", "unexpected incident vertices {u1:?} and {u2:?} for edge {f:?} after delete"
edges[i]
); );
} }
} }
@@ -941,16 +902,16 @@ macro_rules! graph_topology_deletion_tests {
); );
for i in [2, 5, 6, 7, 8, 9] { for i in [2, 5, 6, 7, 8, 9] {
assert!( assert!(
!graph.edges().any(|e| e == edges[i]), !graph.edges().any(|e| e == edges[i].0),
"deleted edge {:?} appeared in iterator", "deleted edge {:?} appeared in iterator",
edges[i] edges[i].0
); );
} }
for i in [0, 1, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17] { for i in [0, 1, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17] {
assert!( assert!(
graph.edges().any(|e| e == edges[i]), graph.edges().any(|e| e == edges[i].0),
"expected edge {:?} missing from iterator after delete", "expected edge {:?} missing from iterator after delete",
edges[i] edges[i].0
); );
} }
} }
@@ -973,11 +934,11 @@ macro_rules! graph_topology_deletion_tests {
fn incidences_after_delete_edge() { fn incidences_after_delete_edge() {
let (mut graph, vertices, edges, incidences) = make_test_graph(); let (mut graph, vertices, edges, incidences) = make_test_graph();
// Deletes the edge from vertices[1] to vertices[2]. // Deletes the edge from vertices[1] to vertices[2].
graph.delete_edge(edges[2]); graph.delete_edge(edges[2].0);
for i in 0..10 { for i in 0..10 {
let remaining = incidences[i] let remaining = incidences[i]
.iter() .iter()
.filter(|(_, e)| *e != edges[2]) .filter(|(_, e)| *e != edges[2].0)
.cloned() .cloned()
.collect(); .collect();
assert_vertex_incidences(&graph, vertices[i], remaining); assert_vertex_incidences(&graph, vertices[i], remaining);