use super::*;
#[test]
fn falsify_pr_001_probability_distribution() {
let g = Graph::from_edges(&[(0, 1), (1, 2), (2, 0)], true);
let ranks = g
.pagerank(0.85, 100, 1e-8)
.expect("pagerank should converge");
for (i, &r) in ranks.iter().enumerate() {
assert!(r >= 0.0, "FALSIFIED PR-001: rank[{i}] = {r} < 0");
}
let total: f64 = ranks.iter().sum();
assert!(
(total - 1.0).abs() < 1e-6,
"FALSIFIED PR-001: sum(ranks) = {total}, expected 1.0"
);
}
#[test]
fn falsify_pr_002_symmetric_equal_rank() {
let g = Graph::from_edges(&[(0, 1), (1, 2), (2, 0)], true);
let ranks = g
.pagerank(0.85, 100, 1e-8)
.expect("pagerank should converge");
let expected = 1.0 / 3.0;
for (i, &r) in ranks.iter().enumerate() {
assert!(
(r - expected).abs() < 1e-4,
"FALSIFIED PR-002: rank[{i}] = {r}, expected {expected} (symmetric cycle)"
);
}
}
#[test]
fn falsify_pr_003_hub_ranks_higher() {
let g = Graph::from_edges(&[(0, 2), (1, 2), (2, 0)], true);
let ranks = g
.pagerank(0.85, 100, 1e-8)
.expect("pagerank should converge");
assert!(
ranks[2] > ranks[0],
"FALSIFIED PR-003: hub rank[2]={} not > rank[0]={}",
ranks[2],
ranks[0]
);
}
#[test]
fn falsify_pr_004_single_node() {
let g = Graph::from_edges(&[(0, 0)], true);
let ranks = g
.pagerank(0.85, 100, 1e-8)
.expect("pagerank should converge");
assert_eq!(ranks.len(), 1);
assert!(
(ranks[0] - 1.0).abs() < 1e-6,
"FALSIFIED PR-004: single node rank = {}, expected 1.0",
ranks[0]
);
}
#[test]
fn falsify_pr_005_empty_graph() {
let g = Graph::new(true);
let ranks = g.pagerank(0.85, 100, 1e-8).expect("empty graph");
assert!(
ranks.is_empty(),
"FALSIFIED PR-005: empty graph returned {} ranks",
ranks.len()
);
}