use super::*;
#[test]
fn falsify_gr_001_dijkstra_shortest_path() {
let g = Graph::from_weighted_edges(&[(0, 1, 1.0), (1, 2, 2.0), (0, 2, 5.0)], false);
let (path, dist) = g.dijkstra(0, 2).expect("path should exist");
assert_eq!(
path,
vec![0, 1, 2],
"FALSIFIED GR-001: path={path:?}, expected [0, 1, 2]"
);
assert!(
(dist - 3.0).abs() < 1e-6,
"FALSIFIED GR-001: distance={dist}, expected 3.0"
);
}
#[test]
fn falsify_gr_002_dijkstra_unreachable() {
let g = Graph::from_weighted_edges(&[(0, 1, 1.0)], false);
let result = g.dijkstra(0, 2);
assert!(
result.is_none(),
"FALSIFIED GR-002: expected None for unreachable node, got {result:?}"
);
}
#[test]
fn falsify_gr_003_dijkstra_self_path() {
let g = Graph::from_weighted_edges(&[(0, 1, 1.0), (1, 2, 2.0)], false);
let (path, dist) = g.dijkstra(0, 0).expect("self-path should exist");
assert_eq!(
path,
vec![0],
"FALSIFIED GR-003: self-path={path:?}, expected [0]"
);
assert!(
dist.abs() < 1e-6,
"FALSIFIED GR-003: self-distance={dist}, expected 0.0"
);
}
#[test]
fn falsify_gr_004_bfs_shortest_path() {
let g = Graph::from_edges(&[(0, 1), (1, 2), (0, 2)], false);
let path = g.shortest_path(0, 2);
assert!(
path.is_some(),
"FALSIFIED GR-004: BFS returned None for connected graph"
);
let p = path.expect("checked above");
assert!(
p.len() <= 3,
"FALSIFIED GR-004: path len {} > 3 for 3-node graph",
p.len()
);
}
mod gr_proptest_falsify {
use super::*;
use proptest::prelude::*;
proptest! {
#![proptest_config(ProptestConfig::with_cases(15))]
#[test]
fn falsify_gr_003_prop_self_path_zero(
n in 3..=8usize,
src in 0..8usize,
) {
let src = src % n;
let edges: Vec<(usize, usize, f64)> =
(0..n - 1).map(|i| (i, i + 1, 1.0)).collect();
let g = Graph::from_weighted_edges(&edges, false);
let (path, dist) = g.dijkstra(src, src).expect("self-path must exist");
prop_assert!(
path == vec![src],
"FALSIFIED GR-003-prop: self-path={:?}, expected [{}]",
path, src
);
prop_assert!(
dist.abs() < 1e-6,
"FALSIFIED GR-003-prop: self-distance={}, expected 0.0",
dist
);
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(15))]
#[test]
fn falsify_gr_004_prop_bfs_connected(
n in 3..=8usize,
) {
let edges: Vec<(usize, usize)> = (0..n - 1).map(|i| (i, i + 1)).collect();
let g = Graph::from_edges(&edges, false);
let path = g.shortest_path(0, n - 1);
prop_assert!(
path.is_some(),
"FALSIFIED GR-004-prop: BFS returned None in connected chain (n={})",
n
);
let p = path.expect("checked");
prop_assert!(
p.len() <= n,
"FALSIFIED GR-004-prop: path len {} > n={} for chain graph",
p.len(), n
);
}
}
}