pub const AC_QACOV_MIN_CATEGORY_COVERAGE: f64 = 0.80;
pub const AC_QACOV_INFERENCE_COVERAGE: f64 = 1.00;
pub const AC_QACOV_TRANSFORM_COVERAGE: f64 = 0.90;
pub const AC_QACOV_HIGH_IMPACT_THRESHOLD: f64 = 0.80;
pub const AC_QACOV_MAX_CC: u32 = 15;
pub const AC_QACOV_CC_REQUIRES_TEST: u32 = 10;
pub const AC_QACOV_MAX_HIGH_SATD: u32 = 0;
pub const AC_QACOV_CRITICAL_MODULES: [&str; 6] = ["hex", "profile", "cbtop", "train", "chat", "serve"];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CategoryCoverageVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_category_coverage(category_coverage: &[(&str, f64)]) -> CategoryCoverageVerdict {
for (category, ratio) in category_coverage {
let threshold = match *category {
"inference" => AC_QACOV_INFERENCE_COVERAGE,
"transform" => AC_QACOV_TRANSFORM_COVERAGE,
_ => AC_QACOV_MIN_CATEGORY_COVERAGE,
};
if *ratio + 1e-9 < threshold {
return CategoryCoverageVerdict::Fail;
}
}
CategoryCoverageVerdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UntestedSurfaceVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_untested_surface(uncovered: &[(f64, bool)]) -> UntestedSurfaceVerdict {
for (score, has_issue) in uncovered {
if *score > AC_QACOV_HIGH_IMPACT_THRESHOLD && !*has_issue {
return UntestedSurfaceVerdict::Fail;
}
}
UntestedSurfaceVerdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ComplexityGateVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_complexity_gate(
function_metrics: &[(u32, bool, bool)],
) -> ComplexityGateVerdict {
for (cc, has_test, has_issue) in function_metrics {
if *cc > AC_QACOV_MAX_CC && !*has_issue {
return ComplexityGateVerdict::Fail;
}
if *cc > AC_QACOV_CC_REQUIRES_TEST && !*has_test {
return ComplexityGateVerdict::Fail;
}
}
ComplexityGateVerdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SatdZeroVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_satd_zero(high_severity_count: u32) -> SatdZeroVerdict {
if high_severity_count == AC_QACOV_MAX_HIGH_SATD {
SatdZeroVerdict::Pass
} else {
SatdZeroVerdict::Fail
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DogfoodMapVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_dogfood_map(module_results: &[(&str, bool, bool)]) -> DogfoodMapVerdict {
use std::collections::HashSet;
let mut exercised: HashSet<&&str> = HashSet::new();
for (name, was_exercised, panicked) in module_results {
if *was_exercised {
if *panicked {
return DogfoodMapVerdict::Fail;
}
exercised.insert(name);
}
}
for required in AC_QACOV_CRITICAL_MODULES {
if !exercised.contains(&required) {
return DogfoodMapVerdict::Fail;
}
}
DogfoodMapVerdict::Pass
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn provenance_min_category_coverage_080() {
assert!((AC_QACOV_MIN_CATEGORY_COVERAGE - 0.80).abs() < f64::EPSILON);
}
#[test]
fn provenance_inference_coverage_100() {
assert!((AC_QACOV_INFERENCE_COVERAGE - 1.00).abs() < f64::EPSILON);
}
#[test]
fn provenance_transform_coverage_090() {
assert!((AC_QACOV_TRANSFORM_COVERAGE - 0.90).abs() < f64::EPSILON);
}
#[test]
fn provenance_max_cc_15() {
assert_eq!(AC_QACOV_MAX_CC, 15);
}
#[test]
fn provenance_max_high_satd_0() {
assert_eq!(AC_QACOV_MAX_HIGH_SATD, 0);
}
#[test]
fn provenance_critical_modules_count_6() {
assert_eq!(AC_QACOV_CRITICAL_MODULES.len(), 6);
}
#[test]
fn fc001_pass_all_above_threshold() {
let cov = [
("inspection", 0.91),
("inference", 1.00),
("transform", 1.00),
("training", 0.85),
];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Pass);
}
#[test]
fn fc001_pass_inference_at_100() {
let cov = [("inference", 1.00)];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Pass);
}
#[test]
fn fc001_fail_inference_below_100() {
let cov = [("inference", 0.99)];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Fail);
}
#[test]
fn fc001_fail_transform_below_90() {
let cov = [("transform", 0.89)];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Fail);
}
#[test]
fn fc001_fail_general_below_80() {
let cov = [("misc", 0.79)];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Fail);
}
#[test]
fn fc001_pass_general_at_exactly_80() {
let cov = [("misc", 0.80)];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Pass);
}
#[test]
fn fc002_pass_no_high_impact_uncovered() {
let uncovered = [(0.5, false), (0.7, false), (0.79, false)];
assert_eq!(verdict_from_untested_surface(&uncovered), UntestedSurfaceVerdict::Pass);
}
#[test]
fn fc002_pass_high_impact_with_issue() {
let uncovered = [(0.95, true)];
assert_eq!(verdict_from_untested_surface(&uncovered), UntestedSurfaceVerdict::Pass);
}
#[test]
fn fc002_fail_high_impact_no_issue() {
let uncovered = [(0.85, false)];
assert_eq!(verdict_from_untested_surface(&uncovered), UntestedSurfaceVerdict::Fail);
}
#[test]
fn fc002_pass_at_threshold() {
let uncovered = [(0.80, false)];
assert_eq!(verdict_from_untested_surface(&uncovered), UntestedSurfaceVerdict::Pass);
}
#[test]
fn fc003_pass_low_complexity() {
let metrics = [(8, false, false), (5, false, false)];
assert_eq!(verdict_from_complexity_gate(&metrics), ComplexityGateVerdict::Pass);
}
#[test]
fn fc003_pass_cc_11_with_dedicated_test() {
let metrics = [(11, true, false)];
assert_eq!(verdict_from_complexity_gate(&metrics), ComplexityGateVerdict::Pass);
}
#[test]
fn fc003_fail_cc_11_no_test() {
let metrics = [(11, false, false)];
assert_eq!(verdict_from_complexity_gate(&metrics), ComplexityGateVerdict::Fail);
}
#[test]
fn fc003_fail_cc_16_no_issue() {
let metrics = [(16, true, false)];
assert_eq!(verdict_from_complexity_gate(&metrics), ComplexityGateVerdict::Fail);
}
#[test]
fn fc003_pass_cc_16_with_issue_and_test() {
let metrics = [(16, true, true)];
assert_eq!(verdict_from_complexity_gate(&metrics), ComplexityGateVerdict::Pass);
}
#[test]
fn fc004_pass_zero_high() {
assert_eq!(verdict_from_satd_zero(0), SatdZeroVerdict::Pass);
}
#[test]
fn fc004_fail_one_high() {
assert_eq!(verdict_from_satd_zero(1), SatdZeroVerdict::Fail);
}
#[test]
fn fc004_fail_many_high() {
assert_eq!(verdict_from_satd_zero(50), SatdZeroVerdict::Fail);
}
#[test]
fn fc005_pass_all_6_exercised() {
let results = [
("hex", true, false),
("profile", true, false),
("cbtop", true, false),
("train", true, false),
("chat", true, false),
("serve", true, false),
];
assert_eq!(verdict_from_dogfood_map(&results), DogfoodMapVerdict::Pass);
}
#[test]
fn fc005_fail_one_module_panicked() {
let results = [
("hex", true, true), ("profile", true, false),
("cbtop", true, false),
("train", true, false),
("chat", true, false),
("serve", true, false),
];
assert_eq!(verdict_from_dogfood_map(&results), DogfoodMapVerdict::Fail);
}
#[test]
fn fc005_fail_one_module_skipped() {
let results = [
("hex", true, false),
("profile", true, false),
("cbtop", true, false),
("train", true, false),
("chat", true, false),
];
assert_eq!(verdict_from_dogfood_map(&results), DogfoodMapVerdict::Fail);
}
#[test]
fn fc005_fail_empty() {
let results: [(&str, bool, bool); 0] = [];
assert_eq!(verdict_from_dogfood_map(&results), DogfoodMapVerdict::Fail);
}
#[test]
fn realistic_healthy_dogfood_passes_all_5() {
let cov = [
("inspection", 0.91),
("inference", 1.00),
("transform", 0.95),
("training", 0.82),
("registry", 0.85),
("hardware", 0.80),
("qa", 0.83),
("ui", 0.84),
("pipeline", 0.81),
("misc", 0.86),
];
assert_eq!(verdict_from_category_coverage(&cov), CategoryCoverageVerdict::Pass);
let uncovered = [(0.5, false), (0.85, true)];
assert_eq!(verdict_from_untested_surface(&uncovered), UntestedSurfaceVerdict::Pass);
let metrics = [(8, false, false), (12, true, false), (16, true, true)];
assert_eq!(verdict_from_complexity_gate(&metrics), ComplexityGateVerdict::Pass);
assert_eq!(verdict_from_satd_zero(0), SatdZeroVerdict::Pass);
let results = [
("hex", true, false),
("profile", true, false),
("cbtop", true, false),
("train", true, false),
("chat", true, false),
("serve", true, false),
];
assert_eq!(verdict_from_dogfood_map(&results), DogfoodMapVerdict::Pass);
}
#[test]
fn realistic_pre_fix_all_5_failures() {
assert_eq!(
verdict_from_category_coverage(&[("inference", 0.95)]),
CategoryCoverageVerdict::Fail
);
assert_eq!(
verdict_from_untested_surface(&[(0.92, false)]),
UntestedSurfaceVerdict::Fail
);
assert_eq!(
verdict_from_complexity_gate(&[(20, false, false)]),
ComplexityGateVerdict::Fail
);
assert_eq!(verdict_from_satd_zero(3), SatdZeroVerdict::Fail);
let bad = [
("hex", true, true),
("profile", true, false),
("cbtop", true, false),
("train", true, false),
("chat", true, false),
("serve", true, false),
];
assert_eq!(verdict_from_dogfood_map(&bad), DogfoodMapVerdict::Fail);
}
}