use open_eeg_codec_standard::levels::{self, EcsLevel};
type BandContract = (f64, f64, f64, f64);
struct TierContract {
code: char,
name: &'static str,
max_prd: f64,
min_r: f64,
max_snr_loss: f64,
min_cr: f64,
bands: &'static [(&'static str, BandContract)],
}
const SPEC_TIERS: &[TierContract] = &[
TierContract {
code: 'N',
name: "Near-Lossless",
max_prd: 5.0,
min_r: 0.99,
max_snr_loss: 2.0,
min_cr: 1.0,
bands: &[],
},
TierContract {
code: 'C',
name: "Clinical",
max_prd: 9.0,
min_r: 0.95,
max_snr_loss: 3.0,
min_cr: 20.0,
bands: &[
("delta", (0.5, 4.0, 5.0, 0.98)),
("theta", (4.0, 8.0, 7.0, 0.97)),
("alpha", (8.0, 13.0, 8.0, 0.96)),
("beta", (13.0, 30.0, 12.0, 0.93)),
("gamma", (30.0, 50.0, 20.0, 0.85)),
],
},
TierContract {
code: 'M',
name: "Monitoring",
max_prd: 20.0,
min_r: 0.85,
max_snr_loss: 6.0,
min_cr: 100.0,
bands: &[
("delta", (0.5, 4.0, 10.0, 0.95)),
("theta", (4.0, 8.0, 12.0, 0.93)),
("alpha", (8.0, 13.0, 15.0, 0.90)),
("beta", (13.0, 30.0, 25.0, 0.80)),
("gamma", (30.0, 50.0, 40.0, 0.60)),
],
},
TierContract {
code: 'A',
name: "Alerting",
max_prd: 40.0,
min_r: 0.70,
max_snr_loss: 10.0,
min_cr: 200.0,
bands: &[
("delta", (0.5, 4.0, 20.0, 0.85)),
("theta", (4.0, 8.0, 25.0, 0.80)),
("alpha", (8.0, 13.0, 30.0, 0.75)),
("beta", (13.0, 30.0, 40.0, 0.65)),
("gamma", (30.0, 50.0, 60.0, 0.40)),
],
},
];
fn assert_eq_f64(label: &str, actual: f64, expected: f64) {
assert!(
actual == expected,
"{label}: levels() {actual} != pinned spec {expected} — tier table \
drifted; reconcile src/levels.rs against this contract",
);
}
fn rust_tier(code: char) -> EcsLevel {
levels::level_by_char(code).unwrap_or_else(|| panic!("Rust table missing tier {code:?}"))
}
#[test]
fn tiers_match_spec_globals() {
for c in SPEC_TIERS {
let r = rust_tier(c.code);
assert_eq!(r.name, c.name, "tier {} name", c.code);
assert_eq_f64(&format!("tier {} max_prd", c.code), r.max_prd, c.max_prd);
assert_eq_f64(&format!("tier {} min_r", c.code), r.min_r, c.min_r);
assert_eq_f64(
&format!("tier {} max_snr_loss", c.code),
r.max_snr_loss,
c.max_snr_loss,
);
assert_eq_f64(&format!("tier {} min_cr", c.code), r.min_cr, c.min_cr);
}
}
#[test]
fn tiers_match_spec_per_band() {
for c in SPEC_TIERS {
let r = rust_tier(c.code);
assert_eq!(
r.band_fidelity.len(),
c.bands.len(),
"tier {} band count",
c.code
);
for (band_name, (lo, hi, max_prd, min_r)) in c.bands {
let rb = r
.band_fidelity
.get(*band_name)
.unwrap_or_else(|| panic!("tier {} missing band {band_name}", c.code));
assert_eq_f64(
&format!("tier {} band {band_name} freq_lo", c.code),
rb.freq_range.0,
*lo,
);
assert_eq_f64(
&format!("tier {} band {band_name} freq_hi", c.code),
rb.freq_range.1,
*hi,
);
assert_eq_f64(
&format!("tier {} band {band_name} max_prd", c.code),
rb.max_prd,
*max_prd,
);
assert_eq_f64(
&format!("tier {} band {band_name} min_r", c.code),
rb.min_r,
*min_r,
);
}
}
}
#[test]
fn l_tier_invariants() {
let l = rust_tier('L');
assert_eq!(l.name, "Lossless");
assert_eq_f64("L max_prd", l.max_prd, 0.0);
assert_eq_f64("L min_r", l.min_r, 1.0);
assert_eq_f64("L min_cr (no-expansion floor)", l.min_cr, 0.8);
assert!(
l.band_fidelity.is_empty(),
"L tier must carry no per-band requirements"
);
}
#[test]
fn rust_table_is_lncma_in_order() {
let t = levels::levels();
let codes: Vec<char> = t.iter().map(|l| l.level).collect();
assert_eq!(codes, vec!['L', 'N', 'C', 'M', 'A'], "tier order / membership");
}