erpc_analysis/models/
partitions.rsuse std::collections::HashMap;
#[derive(Debug, Clone, PartialEq)]
pub struct ConnectedComponent {
pub component_id: i64,
pub relay_fingerprints: Vec<String>,
pub size: usize,
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct ComponentAnalysisResult {
pub components: Vec<ConnectedComponent>,
pub total_components: Option<usize>,
pub largest_component_size: Option<usize>,
pub smallest_component_size: Option<usize>,
pub component_size_distribution: Option<HashMap<usize, usize>>,
pub isolation_ratio: Option<f64>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_component_analysis_result_comprehensive() {
let component1 = ConnectedComponent {
component_id: 1,
relay_fingerprints: vec![
"RELAY001".to_string(),
"RELAY002".to_string(),
"RELAY003".to_string(),
],
size: 3,
};
let component2 = ConnectedComponent {
component_id: 2,
relay_fingerprints: vec!["RELAY004".to_string()],
size: 1,
};
let mut size_distribution = HashMap::new();
size_distribution.insert(1, 1); size_distribution.insert(3, 1); let result = ComponentAnalysisResult {
components: vec![component1, component2],
total_components: Some(2),
largest_component_size: Some(3),
smallest_component_size: Some(1),
component_size_distribution: Some(size_distribution.clone()),
isolation_ratio: Some(75.0),
};
assert_eq!(result.components.len(), 2);
assert_eq!(result.total_components.unwrap(), 2);
assert_eq!(result.largest_component_size.unwrap(), 3);
assert_eq!(result.smallest_component_size.unwrap(), 1);
assert_eq!(result.isolation_ratio.unwrap(), 75.0);
assert_eq!(
result.component_size_distribution.unwrap(),
size_distribution
);
assert_eq!(result.components[0].size, 3);
assert_eq!(result.components[1].size, 1);
assert_eq!(result.components[0].relay_fingerprints.len(), 3);
}
#[test]
fn test_isolation_ratio_edge_cases() {
let perfect_isolation = ComponentAnalysisResult {
components: vec![],
total_components: Some(1),
largest_component_size: Some(100),
smallest_component_size: Some(100),
component_size_distribution: None,
isolation_ratio: Some(100.0),
};
assert_eq!(perfect_isolation.isolation_ratio.unwrap(), 100.0);
let complete_fragmentation = ComponentAnalysisResult {
components: vec![],
total_components: Some(50),
largest_component_size: Some(1),
smallest_component_size: Some(1),
component_size_distribution: None,
isolation_ratio: Some(2.0), };
assert_eq!(complete_fragmentation.isolation_ratio.unwrap(), 2.0);
}
}