pub const AC_SHIP1_024_MIN_ADVERSARIAL_SUITE_SIZE: usize = 50;
pub const AC_SHIP1_024_MAX_TOLERATED_PANIC_COUNT: u32 = 0;
pub const AC_SHIP1_024_MAX_TOLERATED_NAN_COUNT: u32 = 0;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ship024Verdict {
Pass,
Fail,
}
#[must_use]
pub const fn verdict_from_adversarial_suite(
inputs_run: usize,
panic_count: u32,
nan_count: u32,
) -> Ship024Verdict {
if inputs_run < AC_SHIP1_024_MIN_ADVERSARIAL_SUITE_SIZE {
return Ship024Verdict::Fail;
}
if panic_count > AC_SHIP1_024_MAX_TOLERATED_PANIC_COUNT {
return Ship024Verdict::Fail;
}
if nan_count > AC_SHIP1_024_MAX_TOLERATED_NAN_COUNT {
return Ship024Verdict::Fail;
}
Ship024Verdict::Pass
}
#[cfg(test)]
mod ship_024_tests {
use super::*;
#[test]
fn falsify_ship_024_adversarial_suite_threshold_logic() {
assert_eq!(
verdict_from_adversarial_suite(50, 0, 0),
Ship024Verdict::Pass,
"canonical (50, 0, 0) must Pass (exact boundary)",
);
assert_eq!(
verdict_from_adversarial_suite(50, 1, 0),
Ship024Verdict::Fail,
"(50, 1, 0) one panic must Fail (zero-tolerance)",
);
assert_eq!(
verdict_from_adversarial_suite(50, 0, 1),
Ship024Verdict::Fail,
"(50, 0, 1) one NaN must Fail (zero-tolerance)",
);
assert_eq!(
verdict_from_adversarial_suite(49, 0, 0),
Ship024Verdict::Fail,
"(49, 0, 0) one-short of floor must Fail (insufficient coverage)",
);
assert_eq!(
verdict_from_adversarial_suite(0, 0, 0),
Ship024Verdict::Fail,
"(0, 0, 0) empty harness must Fail (insufficient coverage)",
);
for &n in &[1_usize, 10, 25, 40, 49] {
assert_eq!(
verdict_from_adversarial_suite(n, 0, 0),
Ship024Verdict::Fail,
"inputs_run={n} below floor must Fail",
);
}
for &n in &[51_usize, 100, 200, 500, 1000, 10_000, usize::MAX] {
assert_eq!(
verdict_from_adversarial_suite(n, 0, 0),
Ship024Verdict::Pass,
"inputs_run={n} above floor with zero defects must Pass",
);
}
for &p in &[1_u32, 2, 5, 10, 100, 1_000] {
assert_eq!(
verdict_from_adversarial_suite(50, p, 0),
Ship024Verdict::Fail,
"(50, {p}, 0) must Fail (any panic count > 0)",
);
}
for &n in &[1_u32, 2, 5, 10, 100, 1_000] {
assert_eq!(
verdict_from_adversarial_suite(50, 0, n),
Ship024Verdict::Fail,
"(50, 0, {n}) must Fail (any NaN count > 0)",
);
}
assert_eq!(
verdict_from_adversarial_suite(50, 1, 1),
Ship024Verdict::Fail,
"(50, 1, 1) compound failure must Fail",
);
assert_eq!(
verdict_from_adversarial_suite(50, 5, 5),
Ship024Verdict::Fail,
"(50, 5, 5) compound failure must Fail",
);
assert_eq!(
verdict_from_adversarial_suite(10, 10, 10),
Ship024Verdict::Fail,
"(10, 10, 10) triple-compound must Fail",
);
assert_eq!(
verdict_from_adversarial_suite(50, u32::MAX, 0),
Ship024Verdict::Fail,
"(50, u32::MAX, 0) panic overflow must Fail",
);
assert_eq!(
verdict_from_adversarial_suite(50, 0, u32::MAX),
Ship024Verdict::Fail,
"(50, 0, u32::MAX) NaN overflow must Fail",
);
assert_eq!(
verdict_from_adversarial_suite(50, u32::MAX, u32::MAX),
Ship024Verdict::Fail,
"(50, u32::MAX, u32::MAX) both-overflow must Fail",
);
assert_eq!(
verdict_from_adversarial_suite(usize::MAX, 1, 0),
Ship024Verdict::Fail,
"(usize::MAX, 1, 0) any panic must Fail even at max coverage",
);
assert_eq!(
AC_SHIP1_024_MIN_ADVERSARIAL_SUITE_SIZE, 50_usize,
"adversarial suite minimum size is 50 (spec §7.1 FALSIFY-SHIP-024)",
);
assert_eq!(
AC_SHIP1_024_MAX_TOLERATED_PANIC_COUNT, 0_u32,
"panic tolerance is 0 (spec §7.1 FALSIFY-SHIP-024)",
);
assert_eq!(
AC_SHIP1_024_MAX_TOLERATED_NAN_COUNT, 0_u32,
"NaN-logit tolerance is 0 (spec §7.1 FALSIFY-SHIP-024)",
);
}
}