use mnem_core::id::{NodeId, StableId};
use mnem_core::index::AuthoredSliceAdjacency;
use mnem_graphrag::compute_communities;
fn nid(i: u8) -> NodeId {
let mut b = [0_u8; 16];
b[15] = i;
StableId::from_bytes(&b).unwrap()
}
#[test]
fn two_cliques_beats_singletons() {
let n: Vec<NodeId> = (0_u8..8).map(nid).collect();
let edges = vec![
(n[0], n[1]),
(n[0], n[2]),
(n[0], n[3]),
(n[1], n[2]),
(n[1], n[3]),
(n[2], n[3]),
(n[4], n[5]),
(n[4], n[6]),
(n[4], n[7]),
(n[5], n[6]),
(n[5], n[7]),
(n[6], n[7]),
(n[3], n[4]),
];
let adj = AuthoredSliceAdjacency::new(&edges);
let a = compute_communities(&adj, 0);
assert!(
a.community_count() >= 2,
"Expected two cliques to split into >= 2 communities"
);
assert!(
a.modularity > 0.0,
"Leiden partition modularity {} should exceed singleton baseline (0)",
a.modularity
);
assert!(
a.modularity > 0.35,
"Two-cliques modularity {} unexpectedly low",
a.modularity
);
}
#[test]
fn empty_graph_is_empty_assignment() {
let edges: Vec<(NodeId, NodeId)> = Vec::new();
let adj = AuthoredSliceAdjacency::new(&edges);
let a = compute_communities(&adj, 7);
assert_eq!(a.map.len(), 0);
assert!(a.modularity.abs() < f32::EPSILON);
assert_eq!(a.seed, 7);
}