use crate::{BoundedGraph, BoundedGraphError, FixedEdgeCount, SymmetricFixedEdgeCount};
#[test]
fn test_asymmetric_edge_limits() {
let mut graph = BoundedGraph::<FixedEdgeCount<2, 5>, ()>::new();
let n1 = graph.add_node(FixedEdgeCount::empty());
let n2 = graph.add_node(FixedEdgeCount::empty());
let n3 = graph.add_node(FixedEdgeCount::empty());
let n4 = graph.add_node(FixedEdgeCount::empty());
let n5 = graph.add_node(FixedEdgeCount::empty());
let n6 = graph.add_node(FixedEdgeCount::empty());
assert!(graph.add_edge(n1, n2, ()).is_ok());
assert!(graph.add_edge(n1, n3, ()).is_ok());
assert!(graph.add_edge(n1, n4, ()).is_ok());
assert!(graph.add_edge(n1, n5, ()).is_ok());
assert!(graph.add_edge(n1, n6, ()).is_ok());
let n7 = graph.add_node(FixedEdgeCount::empty());
let result = graph.add_edge(n1, n7, ());
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
BoundedGraphError::EdgeRejected {
source_rejected: true,
target_rejected: false,
..
}
));
assert!(graph.add_edge(n3, n2, ()).is_ok());
let result = graph.add_edge(n4, n2, ());
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
BoundedGraphError::EdgeRejected {
source_rejected: false,
target_rejected: true,
..
}
));
}
#[test]
fn test_asymmetric_hub_and_spoke() {
type Hub = FixedEdgeCount<1, 10>; type Spoke = FixedEdgeCount<10, 1>;
let mut hub_graph = BoundedGraph::<Hub, ()>::new();
let hub = hub_graph.add_node(FixedEdgeCount::empty());
let mut spokes = Vec::new();
for _ in 0..10 {
spokes.push(hub_graph.add_node(FixedEdgeCount::empty()));
}
for &spoke in &spokes {
assert!(hub_graph.add_edge(hub, spoke, ()).is_ok());
}
let extra_spoke = hub_graph.add_node(FixedEdgeCount::empty());
let result = hub_graph.add_edge(hub, extra_spoke, ());
assert!(result.is_err());
assert_eq!(hub_graph.edge_count(), 10);
let mut spoke_graph = BoundedGraph::<Spoke, ()>::new();
let spoke1 = spoke_graph.add_node(FixedEdgeCount::empty());
let spoke2 = spoke_graph.add_node(FixedEdgeCount::empty());
let spoke3 = spoke_graph.add_node(FixedEdgeCount::empty());
assert!(spoke_graph.add_edge(spoke1, spoke2, ()).is_ok());
let result = spoke_graph.add_edge(spoke1, spoke3, ());
assert!(
result.is_err(),
"Spoke should be limited to 1 outgoing edge"
);
assert!(spoke_graph.add_edge(spoke2, spoke3, ()).is_ok());
assert_eq!(spoke_graph.edge_count(), 2);
}
#[test]
fn test_symmetric_vs_asymmetric() {
let mut symmetric = BoundedGraph::<SymmetricFixedEdgeCount<3>, ()>::new();
let n1_sym = symmetric.add_node(SymmetricFixedEdgeCount::empty());
let n2_sym = symmetric.add_node(SymmetricFixedEdgeCount::empty());
for _ in 0..3 {
assert!(symmetric.add_edge(n1_sym, n2_sym, ()).is_ok());
}
for _ in 0..3 {
assert!(symmetric.add_edge(n2_sym, n1_sym, ()).is_ok());
}
assert_eq!(symmetric.edge_count(), 6);
let mut asymmetric = BoundedGraph::<FixedEdgeCount<2, 4>, ()>::new();
let n1_asym = asymmetric.add_node(FixedEdgeCount::empty());
let n2_asym = asymmetric.add_node(FixedEdgeCount::empty());
assert!(asymmetric.add_edge(n1_asym, n2_asym, ()).is_ok());
assert!(asymmetric.add_edge(n1_asym, n2_asym, ()).is_ok());
assert!(asymmetric.add_edge(n1_asym, n2_asym, ()).is_err());
assert!(asymmetric.add_edge(n1_asym, n2_asym, ()).is_err());
assert_eq!(asymmetric.edge_count(), 2);
assert!(asymmetric.add_edge(n2_asym, n1_asym, ()).is_ok());
assert!(asymmetric.add_edge(n2_asym, n1_asym, ()).is_ok());
assert!(asymmetric.add_edge(n2_asym, n1_asym, ()).is_err());
assert_eq!(asymmetric.edge_count(), 4);
}