use serde::{Deserialize, Serialize};
use tatara_lisp::DeriveTataraDomain;
use crate::SpecError;
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Surface {
S1Language,
S2Closure,
S4Cli,
S5Config,
S6Daemon,
S7Path,
UPerf,
}
impl Surface {
pub const ALL: &'static [Surface] = &[
Surface::S1Language,
Surface::S2Closure,
Surface::S4Cli,
Surface::S5Config,
Surface::S6Daemon,
Surface::S7Path,
Surface::UPerf,
];
#[must_use]
pub fn tag(self) -> &'static str {
match self {
Surface::S1Language => "S1Language",
Surface::S2Closure => "S2Closure",
Surface::S4Cli => "S4Cli",
Surface::S5Config => "S5Config",
Surface::S6Daemon => "S6Daemon",
Surface::S7Path => "S7Path",
Surface::UPerf => "UPerf",
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Reflects {
BuiltinRegistry,
SuiCommandsEnum,
WireOpcodeCatalog,
NixShowConfigKeys,
CppnixBinListing,
ClosureWalk,
UseCaseCatalog,
None,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum Oracle {
ByteParity,
ExpFixture,
ParityCheck,
RealClient,
PathResolve,
PerfSeal,
Absent,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum SurfaceTier {
Absent,
Design,
Enumerated,
ParityWired,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum SurfaceBlocker {
None,
MemoryWall,
NoParser,
NoShims,
HarnessOnlyNoOracle,
}
#[derive(DeriveTataraDomain, Serialize, Deserialize, Debug, Clone)]
#[tatara(keyword = "defnix-surface")]
pub struct NixSurface {
pub id: Surface,
pub covers: String,
#[serde(default, rename = "rowForm")]
pub row_form: String,
pub reflects: Reflects,
pub oracle: Oracle,
pub tier: SurfaceTier,
pub blocker: SurfaceBlocker,
#[serde(default)]
pub notes: String,
}
#[must_use]
pub fn earned_tier(row_form: &str, reflects: Reflects, oracle: Oracle) -> SurfaceTier {
if row_form.trim().is_empty() || reflects == Reflects::None {
return SurfaceTier::Design;
}
if oracle == Oracle::Absent {
return SurfaceTier::Enumerated;
}
SurfaceTier::ParityWired
}
impl NixSurface {
#[must_use]
pub fn earned_tier(&self) -> SurfaceTier {
earned_tier(&self.row_form, self.reflects, self.oracle)
}
#[must_use]
pub fn is_honest(&self) -> bool {
self.tier <= self.earned_tier()
}
pub fn validate(&self) -> Result<(), SpecError> {
if self.is_honest() {
Ok(())
} else {
Err(SpecError::Interp {
phase: "nix_surface::validate".to_string(),
message: format!(
"surface `{}` claims tier {:?} but its machinery (row_form={:?}, \
reflects={:?}, oracle={:?}) earns only {:?} — a coverage row must \
never round its tier up",
self.id.tag(),
self.tier,
if self.row_form.trim().is_empty() { "<none>" } else { self.row_form.as_str() },
self.reflects,
self.oracle,
self.earned_tier()
),
})
}
}
}
const CANONICAL_NIX_SURFACE_LISP: &str = include_str!("../specs/nix_surface.lisp");
pub fn load_canonical() -> Result<Vec<NixSurface>, SpecError> {
crate::loader::load_all::<NixSurface>(CANONICAL_NIX_SURFACE_LISP)
}
#[cfg(test)]
mod tests {
use super::{load_canonical, earned_tier, NixSurface, Oracle, Reflects, Surface, SurfaceTier};
use crate::SpecError;
#[test]
fn surfaces_are_complete() {
for s in Surface::ALL {
let _covered: &str = match s {
Surface::S1Language => "language",
Surface::S2Closure => "whole-closure byte-parity",
Surface::S4Cli => "CLI contract",
Surface::S5Config => "config parsing",
Surface::S6Daemon => "daemon worker protocol",
Surface::S7Path => "drop-in PATH",
Surface::UPerf => "performance matrix",
};
}
assert_eq!(Surface::ALL.len(), 7, "the five/seven-surface set is closed");
}
#[test]
fn earned_tier_never_rounds_up() {
assert_eq!(earned_tier("", Reflects::BuiltinRegistry, Oracle::ByteParity), SurfaceTier::Design);
assert_eq!(earned_tier("defbuiltincase", Reflects::None, Oracle::ByteParity), SurfaceTier::Design);
assert_eq!(earned_tier("defbuiltincase", Reflects::BuiltinRegistry, Oracle::Absent), SurfaceTier::Enumerated);
assert_eq!(earned_tier("defbuiltincase", Reflects::BuiltinRegistry, Oracle::ExpFixture), SurfaceTier::ParityWired);
}
#[test]
fn a_row_claiming_more_than_it_earns_is_refused() {
let dishonest = NixSurface {
id: Surface::S5Config,
covers: "config".into(),
row_form: String::new(), reflects: Reflects::None, oracle: Oracle::Absent,
tier: SurfaceTier::ParityWired, blocker: super::SurfaceBlocker::NoParser,
notes: String::new(),
};
assert!(!dishonest.is_honest());
let err = dishonest.validate().expect_err("must refuse a rounded-up tier");
assert!(matches!(err, SpecError::Interp { .. }));
}
#[test]
fn canonical_board_parses_covers_every_surface_and_is_all_honest() {
let board = load_canonical().expect("nix_surface canonical board must compile");
assert_eq!(board.len(), Surface::ALL.len(), "one board row per surface");
for s in Surface::ALL {
let n = board.iter().filter(|r| r.id == *s).count();
assert_eq!(n, 1, "surface {:?} must have exactly one board row (found {n})", s);
}
for r in &board {
r.validate()
.unwrap_or_else(|e| panic!("authored surface `{}` is dishonest: {e:?}", r.id.tag()));
}
}
}