#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quality_check_variants() {
let _complexity = QualityCheck::Complexity(20);
let _coverage = QualityCheck::TestCoverage(80);
let _docs = QualityCheck::Documentation;
let _satd = QualityCheck::NoSatd;
let _lint = QualityCheck::LintCompliance;
let _roadmap = QualityCheck::RoadmapUpdated;
}
#[test]
fn test_check_result_creation() {
let result = CheckResult {
check: QualityCheck::TestCoverage(80),
passed: true,
message: "Test coverage meets threshold".to_string(),
details: Some("Coverage: 85%".to_string()),
};
assert!(result.passed);
assert!(result.message.contains("coverage"));
assert!(result.details.is_some());
}
#[test]
fn test_quality_report_new() {
let report = QualityReport::new("PMAT-1001");
assert_eq!(report.task_id, "PMAT-1001");
assert!(report.checks.is_empty());
assert!(report.overall_passed);
}
#[test]
fn test_quality_report_add_check_result() {
let mut report = QualityReport::new("PMAT-2001");
let passing_check = CheckResult {
check: QualityCheck::LintCompliance,
passed: true,
message: "Lint checks passed".to_string(),
details: None,
};
report.add_check_result(QualityCheck::LintCompliance, passing_check);
assert_eq!(report.checks.len(), 1);
assert!(report.overall_passed);
let failing_check = CheckResult {
check: QualityCheck::TestCoverage(80),
passed: false,
message: "Coverage below threshold".to_string(),
details: Some("Current: 65%".to_string()),
};
report.add_check_result(QualityCheck::TestCoverage(80), failing_check);
assert_eq!(report.checks.len(), 2);
assert!(!report.overall_passed);
}
#[test]
fn test_quality_gate_enforcer_new() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config.clone());
assert_eq!(enforcer.config.coverage_min, config.coverage_min);
assert_eq!(enforcer.config.complexity_max, config.complexity_max);
}
#[test]
fn test_run_quality_checks() {
let config = QualityGateConfig::default();
let mut enforcer = QualityGateEnforcer::new(config);
let result = enforcer.run_quality_checks("PMAT-3001");
assert!(result.is_ok());
let report = result.unwrap();
assert_eq!(report.task_id, "PMAT-3001");
assert!(!report.checks.is_empty());
}
#[test]
fn test_check_complexity() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config);
let result = enforcer.check_complexity();
assert!(result.check.matches(&QualityCheck::Complexity(0)));
}
#[test]
fn test_check_test_coverage() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config);
let result = enforcer.check_test_coverage();
assert!(result.check.matches(&QualityCheck::TestCoverage(0)));
}
#[test]
fn test_check_documentation() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config);
let result = enforcer.check_documentation();
assert!(matches!(result.check, QualityCheck::Documentation));
}
#[test]
fn test_check_satd() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config);
let result = enforcer.check_satd();
assert!(matches!(result.check, QualityCheck::NoSatd));
}
#[test]
fn test_check_lint_compliance() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config);
let result = enforcer.check_lint_compliance();
assert!(matches!(result.check, QualityCheck::LintCompliance));
}
#[test]
fn test_check_roadmap_updated() {
let config = QualityGateConfig::default();
let enforcer = QualityGateEnforcer::new(config);
let result = enforcer.check_roadmap_updated();
assert!(matches!(result.check, QualityCheck::RoadmapUpdated));
}
#[test]
fn test_format_report() {
let mut report = QualityReport::new("PMAT-4001");
report.add_check_result(
QualityCheck::TestCoverage(80),
CheckResult {
check: QualityCheck::TestCoverage(80),
passed: true,
message: "Coverage meets threshold".to_string(),
details: Some("85% coverage".to_string()),
},
);
let formatted = QualityGateEnforcer::format_report(&report);
assert!(formatted.contains("PMAT-4001"));
assert!(formatted.contains("Coverage meets threshold"));
assert!(formatted.contains("PASSED") || formatted.contains("passed"));
}
#[test]
fn test_extract_coverage_from_output() {
let output = "test result: ok. 10 passed; 0 failed; Coverage: 85%";
let coverage = extract_coverage_from_output(output);
assert_eq!(coverage, Some(85));
let output2 = "Coverage 92.5%";
let coverage2 = extract_coverage_from_output(output2);
assert_eq!(coverage2, Some(92));
let output3 = "No coverage data";
let coverage3 = extract_coverage_from_output(output3);
assert_eq!(coverage3, None);
}
#[test]
fn test_quality_check_serialization() {
let check = QualityCheck::Complexity(15);
let json = serde_json::to_string(&check).unwrap();
let deserialized: QualityCheck = serde_json::from_str(&json).unwrap();
match deserialized {
QualityCheck::Complexity(val) => assert_eq!(val, 15),
_ => panic!("Wrong variant deserialized"),
}
}
}
#[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);
}
}
}