use super::graded::{GradedObligation, Resolution};
use crate::record::{ObligationKind, ObligationState};
use std::panic;
#[derive(Debug, Clone)]
pub struct GradedConformanceResult {
pub requirement_id: &'static str,
pub description: &'static str,
pub level: RequirementLevel,
pub status: TestStatus,
pub evidence: String,
pub confidence: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequirementLevel {
Must,
Should,
May,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TestStatus {
Pass,
Fail,
Skip,
XFail,
}
pub struct GradedConformanceHarness {
tests: Vec<GradedConformanceTest>,
results: Vec<GradedConformanceResult>,
}
pub struct GradedConformanceTest {
pub id: &'static str,
pub description: &'static str,
pub level: RequirementLevel,
pub test_fn: fn() -> GradedConformanceResult,
}
impl GradedConformanceHarness {
pub fn new() -> Self {
let tests = vec![
GradedConformanceTest {
id: "GRAD-001",
description: "Commit resolution marks obligation as fulfilled",
level: RequirementLevel::Must,
test_fn: test_commit_resolution_fulfillment,
},
GradedConformanceTest {
id: "GRAD-002",
description: "Abort resolution marks obligation as cancelled",
level: RequirementLevel::Must,
test_fn: test_abort_resolution_cancellation,
},
GradedConformanceTest {
id: "GRAD-003",
description: "Drop without resolution triggers safety mechanism",
level: RequirementLevel::Must,
test_fn: test_drop_without_resolution_safety,
},
GradedConformanceTest {
id: "GRAD-004",
description: "Double resolution is rejected",
level: RequirementLevel::Must,
test_fn: test_double_resolution_rejection,
},
GradedConformanceTest {
id: "GRAD-005",
description: "Different obligation kinds are distinguishable",
level: RequirementLevel::Must,
test_fn: test_obligation_kinds_distinguishable,
},
GradedConformanceTest {
id: "GRAD-006",
description: "Clone is intentionally unavailable to preserve linearity",
level: RequirementLevel::Should,
test_fn: test_clone_preserves_state,
},
GradedConformanceTest {
id: "GRAD-007",
description: "Debug output includes obligation information",
level: RequirementLevel::Should,
test_fn: test_debug_output_informative,
},
GradedConformanceTest {
id: "GRAD-008",
description: "Send + Sync if inner type supports it",
level: RequirementLevel::Should,
test_fn: test_send_sync_conditional,
},
];
Self {
tests,
results: Vec::new(),
}
}
pub fn run_all(&mut self) {
self.results.clear();
for test in &self.tests {
let result = (test.test_fn)();
self.results.push(GradedConformanceResult {
requirement_id: test.id,
description: test.description,
level: test.level,
status: result.status,
evidence: result.evidence,
confidence: result.confidence,
});
}
}
pub fn compliance_matrix(&self) -> String {
let mut output = String::new();
output.push_str("# Graded Types Conformance Matrix\n\n");
output.push_str("| Req ID | Level | Status | Description | Evidence |\n");
output.push_str("|--------|-------|--------|-------------|----------|\n");
let mut must_total = 0;
let mut must_pass = 0;
let mut should_total = 0;
let mut should_pass = 0;
for result in &self.results {
let status_str = match result.status {
TestStatus::Pass => "✅ PASS",
TestStatus::Fail => "❌ FAIL",
TestStatus::Skip => "⏸️ SKIP",
TestStatus::XFail => "⚠️ XFAIL",
};
let level_str = match result.level {
RequirementLevel::Must => {
must_total += 1;
if result.status == TestStatus::Pass {
must_pass += 1;
}
"MUST"
}
RequirementLevel::Should => {
should_total += 1;
if result.status == TestStatus::Pass {
should_pass += 1;
}
"SHOULD"
}
RequirementLevel::May => "MAY",
};
output.push_str(&format!(
"| {} | {} | {} | {} | {} |\n",
result.requirement_id,
level_str,
status_str,
result.description,
result.evidence.chars().take(50).collect::<String>()
));
}
output.push_str("\n## Compliance Summary\n\n");
let must_score = if must_total > 0 {
(must_pass as f64 / must_total as f64) * 100.0
} else {
100.0
};
let should_score = if should_total > 0 {
(should_pass as f64 / should_total as f64) * 100.0
} else {
100.0
};
output.push_str(&format!(
"**MUST Requirements**: {}/{} ({:.1}%)\n",
must_pass, must_total, must_score
));
output.push_str(&format!(
"**SHOULD Requirements**: {}/{} ({:.1}%)\n",
should_pass, should_total, should_score
));
if must_score >= 95.0 {
output.push_str(
"\n✅ **CONFORMANT**: Implementation satisfies graded types requirements\n",
);
} else {
output.push_str(
"\n❌ **NON-CONFORMANT**: Critical graded types requirements not satisfied\n",
);
}
output
}
pub fn failed_requirements(&self) -> Vec<&GradedConformanceResult> {
self.results
.iter()
.filter(|r| r.status == TestStatus::Fail)
.collect()
}
pub fn results(&self) -> &[GradedConformanceResult] {
&self.results
}
}
fn test_commit_resolution_fulfillment() -> GradedConformanceResult {
let ob = GradedObligation::reserve(ObligationKind::SendPermit, "test_commit");
let was_unresolved_before = !ob.is_resolved();
let proof = ob.resolve(Resolution::Commit);
let resolution_ok = proof.kind() == ObligationKind::SendPermit
&& proof.resolution() == Resolution::Commit
&& proof.obligation_state() == ObligationState::Committed;
if was_unresolved_before && resolution_ok {
GradedConformanceResult {
requirement_id: "GRAD-001",
description: "Commit resolution fulfillment",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: format!("Move-only obligation consumed into proof `{proof}`"),
confidence: 1.0,
}
} else {
GradedConformanceResult {
requirement_id: "GRAD-001",
description: "Commit resolution fulfillment",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: was_unresolved_before={}, proof={proof:?}",
was_unresolved_before
),
confidence: 1.0,
}
}
}
fn test_abort_resolution_cancellation() -> GradedConformanceResult {
let ob = GradedObligation::reserve(ObligationKind::Ack, "test_abort");
let was_unresolved_before = !ob.is_resolved();
let proof = ob.resolve(Resolution::Abort);
let resolution_ok = proof.kind() == ObligationKind::Ack
&& proof.resolution() == Resolution::Abort
&& proof.obligation_state() == ObligationState::Aborted;
if was_unresolved_before && resolution_ok {
GradedConformanceResult {
requirement_id: "GRAD-002",
description: "Abort resolution cancellation",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: format!("Move-only obligation consumed into proof `{proof}`"),
confidence: 1.0,
}
} else {
GradedConformanceResult {
requirement_id: "GRAD-002",
description: "Abort resolution cancellation",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!(
"VIOLATION: was_unresolved_before={}, proof={proof:?}",
was_unresolved_before
),
confidence: 1.0,
}
}
}
fn test_drop_without_resolution_safety() -> GradedConformanceResult {
let panic_result = panic::catch_unwind(|| {
let _ob = GradedObligation::reserve(ObligationKind::IoOp, "test_drop");
});
let did_panic = panic_result.is_err();
if did_panic {
GradedConformanceResult {
requirement_id: "GRAD-003",
description: "Drop safety mechanism",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: "Unresolved obligation panicked on drop".to_string(),
confidence: 1.0,
}
} else {
GradedConformanceResult {
requirement_id: "GRAD-003",
description: "Drop safety mechanism",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: "VIOLATION: unresolved obligation dropped without panic".to_string(),
confidence: 1.0,
}
}
}
fn test_double_resolution_rejection() -> GradedConformanceResult {
let ob = GradedObligation::reserve(ObligationKind::SemaphorePermit, "test_double");
let proof = ob.resolve(Resolution::Commit);
let first_ok =
proof.kind() == ObligationKind::SemaphorePermit && proof.resolution() == Resolution::Commit;
if first_ok {
GradedConformanceResult {
requirement_id: "GRAD-004",
description: "Double resolution rejection",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: "First resolve consumes the obligation; a second resolve is type-impossible"
.to_string(),
confidence: 1.0,
}
} else {
GradedConformanceResult {
requirement_id: "GRAD-004",
description: "Double resolution rejection",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!("VIOLATION: first proof had wrong metadata: {proof:?}"),
confidence: 1.0,
}
}
}
fn test_obligation_kinds_distinguishable() -> GradedConformanceResult {
let kinds = [
ObligationKind::SendPermit,
ObligationKind::Ack,
ObligationKind::Lease,
ObligationKind::IoOp,
ObligationKind::SemaphorePermit,
];
let mut obligations = Vec::new();
for (i, &kind) in kinds.iter().enumerate() {
let ob = GradedObligation::reserve(kind, format!("test_{}", i));
obligations.push(ob);
}
let mut distinguishable = true;
let mut evidence_parts = Vec::new();
for (i, ob) in obligations.iter().enumerate() {
let expected_kind = kinds[i];
let actual_kind = ob.kind();
if actual_kind == expected_kind {
evidence_parts.push(format!("{:?}: OK", expected_kind));
} else {
distinguishable = false;
evidence_parts.push(format!("{:?}: WRONG", expected_kind));
}
}
for ob in obligations {
let _ = ob.resolve(Resolution::Abort);
}
if distinguishable {
GradedConformanceResult {
requirement_id: "GRAD-005",
description: "Obligation kinds distinguishable",
level: RequirementLevel::Must,
status: TestStatus::Pass,
evidence: evidence_parts.join(", "),
confidence: 1.0,
}
} else {
GradedConformanceResult {
requirement_id: "GRAD-005",
description: "Obligation kinds distinguishable",
level: RequirementLevel::Must,
status: TestStatus::Fail,
evidence: format!("VIOLATION: {}", evidence_parts.join(", ")),
confidence: 1.0,
}
}
}
fn test_clone_preserves_state() -> GradedConformanceResult {
let ob = GradedObligation::reserve(ObligationKind::Lease, "test_no_clone");
let raw = ob.into_raw();
GradedConformanceResult {
requirement_id: "GRAD-006",
description: "Clone unavailable preserves linearity",
level: RequirementLevel::Should,
status: TestStatus::Pass,
evidence: format!(
"GradedObligation intentionally exposes no Clone impl; raw escape kept metadata kind={:?}, description={}",
raw.kind, raw.description
),
confidence: 0.9,
}
}
fn test_debug_output_informative() -> GradedConformanceResult {
let ob = GradedObligation::reserve(ObligationKind::IoOp, "test_debug");
let debug_str = format!("{:?}", ob);
let has_kind = debug_str.contains("IoOp") || debug_str.contains("kind");
let has_context = debug_str.contains("test_debug") || debug_str.contains("description");
let has_state = debug_str.contains("resolved");
let _ = ob.resolve(Resolution::Abort);
let informative = has_kind && (has_context || has_state);
if informative {
GradedConformanceResult {
requirement_id: "GRAD-007",
description: "Debug output informative",
level: RequirementLevel::Should,
status: TestStatus::Pass,
evidence: format!(
"Debug includes key info: '{}'",
debug_str.chars().take(40).collect::<String>()
),
confidence: 0.95,
}
} else {
GradedConformanceResult {
requirement_id: "GRAD-007",
description: "Debug output informative",
level: RequirementLevel::Should,
status: TestStatus::Fail,
evidence: format!("VIOLATION: Debug lacks info: '{}'", debug_str),
confidence: 0.95,
}
}
}
fn test_send_sync_conditional() -> GradedConformanceResult {
let ob = GradedObligation::reserve(ObligationKind::SendPermit, "test_send_sync");
let ob_moved = ob;
let _ = ob_moved.resolve(Resolution::Commit);
GradedConformanceResult {
requirement_id: "GRAD-008",
description: "Send + Sync conditional",
level: RequirementLevel::Should,
status: TestStatus::Pass,
evidence: "Basic Send usage works".to_string(),
confidence: 0.8,
}
}
impl Default for GradedConformanceHarness {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
#![allow(
clippy::pedantic,
clippy::nursery,
clippy::expect_fun_call,
clippy::map_unwrap_or,
clippy::cast_possible_wrap,
clippy::future_not_send
)]
use super::*;
#[test]
fn conformance_harness_runs_all_tests() {
let mut harness = GradedConformanceHarness::new();
harness.run_all();
assert_eq!(harness.results.len(), 8);
let matrix = harness.compliance_matrix();
assert!(matrix.contains("Graded Types Conformance Matrix"));
let must_count = harness
.results
.iter()
.filter(|r| r.level == RequirementLevel::Must)
.count();
assert!(must_count >= 5); }
#[test]
fn individual_graded_test_runs() {
let result = test_commit_resolution_fulfillment();
assert!(result.requirement_id == "GRAD-001");
let result = test_abort_resolution_cancellation();
assert!(result.requirement_id == "GRAD-002");
assert!(result.confidence > 0.0);
}
}