#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_defect_probability_calculation() {
let calculator = DefectProbabilityCalculator::new();
let metrics = FileMetrics {
file_path: "test.rs".to_string(),
churn_score: 0.8,
complexity: 15.0,
duplicate_ratio: 0.3,
afferent_coupling: 5.0,
efferent_coupling: 3.0,
lines_of_code: 200,
cyclomatic_complexity: 15,
cognitive_complexity: 20,
};
let score = calculator.calculate(&metrics);
assert!(score.probability >= 0.0 && score.probability <= 1.0);
assert!(score.confidence >= 0.0 && score.confidence <= 1.0);
assert_eq!(score.contributing_factors.len(), 4);
assert!(!score.recommendations.is_empty());
}
#[test]
fn test_cdf_interpolation() {
let percentiles = [(0.0, 0.0), (5.0, 0.5), (10.0, 1.0)];
assert_eq!(interpolate_cdf(&percentiles, 0.0), 0.0);
assert_eq!(interpolate_cdf(&percentiles, 5.0), 0.5);
assert_eq!(interpolate_cdf(&percentiles, 10.0), 1.0);
assert_eq!(interpolate_cdf(&percentiles, 2.5), 0.25);
assert_eq!(interpolate_cdf(&percentiles, 7.5), 0.75);
}
#[test]
fn test_project_analysis() {
let scores = vec![
(
"high_risk.rs".to_string(),
DefectScore {
probability: 0.8,
contributing_factors: vec![],
confidence: 0.9,
risk_level: RiskLevel::High,
recommendations: vec![],
},
),
(
"medium_risk.rs".to_string(),
DefectScore {
probability: 0.5,
contributing_factors: vec![],
confidence: 0.8,
risk_level: RiskLevel::Medium,
recommendations: vec![],
},
),
(
"low_risk.rs".to_string(),
DefectScore {
probability: 0.2,
contributing_factors: vec![],
confidence: 0.9,
risk_level: RiskLevel::Low,
recommendations: vec![],
},
),
];
let analysis = ProjectDefectAnalysis::from_scores(scores);
assert_eq!(analysis.total_files, 3);
assert_eq!(analysis.high_risk_files.len(), 1);
assert_eq!(analysis.medium_risk_files.len(), 1);
assert!((analysis.average_probability - 0.5).abs() < 0.01);
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}