#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::super::super::*;
fn create_two_communities() -> UndirectedGraph {
let mut graph = UndirectedGraph::new();
let n0 = graph.add_node(NodeData::test_node(0));
let n1 = graph.add_node(NodeData::test_node(1));
let n2 = graph.add_node(NodeData::test_node(2));
let n3 = graph.add_node(NodeData::test_node(3));
let n4 = graph.add_node(NodeData::test_node(4));
let n5 = graph.add_node(NodeData::test_node(5));
graph.add_edge(n0, n1, 1.0);
graph.add_edge(n1, n2, 1.0);
graph.add_edge(n0, n2, 1.0);
graph.add_edge(n3, n4, 1.0);
graph.add_edge(n4, n5, 1.0);
graph.add_edge(n3, n5, 1.0);
graph.add_edge(n2, n3, 0.1);
graph
}
#[test]
fn test_louvain_two_communities() {
let graph = create_two_communities();
let mut detector = LouvainDetector::default();
let communities = detector.detect_communities(&graph);
assert_eq!(communities.len(), 6);
let unique_communities: std::collections::HashSet<_> = communities.iter().collect();
assert!(!unique_communities.is_empty());
assert!(unique_communities.len() <= 6);
let modularity = detector.calculate_modularity(&graph, &communities);
assert!(
modularity >= 0.0,
"Modularity {} should be >= 0.0",
modularity
);
}
#[test]
fn test_louvain_single_community() {
let mut graph = UndirectedGraph::new();
let nodes: Vec<_> = (0..5)
.map(|i| graph.add_node(NodeData::test_node(i)))
.collect();
for i in 0..nodes.len() {
for j in i + 1..nodes.len() {
graph.add_edge(nodes[i], nodes[j], 1.0);
}
}
let mut detector = LouvainDetector::default();
let communities = detector.detect_communities(&graph);
let unique_communities: std::collections::HashSet<_> = communities.iter().collect();
assert!(!unique_communities.is_empty());
assert!(unique_communities.len() <= 5);
}
#[test]
fn test_louvain_isolated_nodes() {
let mut graph = UndirectedGraph::new();
for i in 0..5 {
graph.add_node(NodeData::test_node(i));
}
let mut detector = LouvainDetector::default();
let communities = detector.detect_communities(&graph);
assert_eq!(communities.len(), 5);
}
#[test]
fn test_louvain_resolution_parameter() {
let graph = create_two_communities();
let mut detector_low = LouvainDetector::new().with_resolution(0.1);
let communities_low = detector_low.detect_communities(&graph);
let mut detector_high = LouvainDetector::new().with_resolution(2.0);
let communities_high = detector_high.detect_communities(&graph);
assert_eq!(communities_low.len(), 6);
assert_eq!(communities_high.len(), 6);
}
#[test]
fn test_louvain_empty_graph() {
let graph = UndirectedGraph::new();
let mut detector = LouvainDetector::default();
let communities = detector.detect_communities(&graph);
assert_eq!(communities.len(), 0);
}
#[test]
fn test_modularity_calculation() {
let graph = create_two_communities();
let mut detector = LouvainDetector::default();
let communities = detector.detect_communities(&graph);
let modularity = detector.calculate_modularity(&graph, &communities);
assert!(
modularity >= 0.0,
"Modularity {} should be >= 0.0",
modularity
);
assert!(
modularity <= 1.0,
"Modularity {} should be <= 1.0",
modularity
);
}
}