#![cfg_attr(coverage_nightly, coverage(off))]
#[derive(Debug, Clone)]
pub struct ClaudeIntegrationQualityGate {
pub max_complexity: u32,
pub max_cognitive_complexity: u32,
pub min_test_coverage: f64,
pub max_coupling: usize,
}
impl Default for ClaudeIntegrationQualityGate {
fn default() -> Self {
Self {
max_complexity: 15, max_cognitive_complexity: 10, min_test_coverage: 0.95, max_coupling: 3, }
}
}
#[derive(Debug)]
pub enum QualityResult {
Pass,
Failure(String),
}
impl ClaudeIntegrationQualityGate {
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn check(&self, metrics: &QualityMetrics) -> QualityResult {
if metrics.satd_count > 0 {
return QualityResult::Failure(format!(
"SATD detected in integration layer: {}. Zero-tolerance policy violated.",
metrics.satd_count
));
}
if metrics.cyclomatic_complexity > self.max_complexity {
return QualityResult::Failure(format!(
"Cyclomatic complexity {} exceeds maximum {}",
metrics.cyclomatic_complexity, self.max_complexity
));
}
if metrics.cognitive_complexity > self.max_cognitive_complexity {
return QualityResult::Failure(format!(
"Cognitive complexity {} exceeds maximum {}",
metrics.cognitive_complexity, self.max_cognitive_complexity
));
}
if metrics.test_coverage < self.min_test_coverage {
return QualityResult::Failure(format!(
"Test coverage {:.2}% below minimum {:.2}%",
metrics.test_coverage * 100.0,
self.min_test_coverage * 100.0
));
}
QualityResult::Pass
}
}
#[derive(Debug, Default)]
pub struct QualityMetrics {
pub cyclomatic_complexity: u32,
pub cognitive_complexity: u32,
pub satd_count: usize,
pub test_coverage: f64,
pub coupling_count: usize,
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quality_gate_pass() {
let gate = ClaudeIntegrationQualityGate::default();
let metrics = QualityMetrics {
cyclomatic_complexity: 10,
cognitive_complexity: 8,
satd_count: 0,
test_coverage: 0.96,
coupling_count: 2,
};
let result = gate.check(&metrics);
assert!(matches!(result, QualityResult::Pass));
}
#[test]
fn test_quality_gate_satd_failure() {
let gate = ClaudeIntegrationQualityGate::default();
let metrics = QualityMetrics {
cyclomatic_complexity: 10,
cognitive_complexity: 8,
satd_count: 1,
test_coverage: 0.96,
coupling_count: 2,
};
let result = gate.check(&metrics);
assert!(matches!(result, QualityResult::Failure(_)));
}
#[test]
fn test_quality_gate_complexity_failure() {
let gate = ClaudeIntegrationQualityGate::default();
let metrics = QualityMetrics {
cyclomatic_complexity: 20,
cognitive_complexity: 8,
satd_count: 0,
test_coverage: 0.96,
coupling_count: 2,
};
let result = gate.check(&metrics);
assert!(matches!(result, QualityResult::Failure(_)));
}
#[test]
fn test_quality_gate_coverage_failure() {
let gate = ClaudeIntegrationQualityGate::default();
let metrics = QualityMetrics {
cyclomatic_complexity: 10,
cognitive_complexity: 8,
satd_count: 0,
test_coverage: 0.90,
coupling_count: 2,
};
let result = gate.check(&metrics);
assert!(matches!(result, QualityResult::Failure(_)));
}
}