nx_ferment_safety_test.nx source
↩ module page · 98 lines · 5206 B
1// nx_ferment_safety_test.nx -- smoke for nx_ferment_safety.
2//
3// Proves the never-poison law MECHANICALLY (Rule 26 discipline):
4// - every refusal verdict actually fires (a rubber-stamp validate
5// would fail assertions 8-12, 15, 18)
6// - negative controls do NOT over-refuse (assertions 13-14, 19-21)
7// Exit code = failed assertion number; 0 = all pass.
8
9import "nx_syscalls.nx"
10import "nx_ferment_safety.nx"
11
12func main() -> i64 {
13 // --- sealed enum cardinality + validity ---
14 if NX_FK_N_KINDS != 6 { return 1 }
15 if nx_fk_is_valid(NX_FK_VEG_ANAEROBIC) != 1 { return 2 }
16 if nx_fk_is_valid(6) != 0 { return 3 }
17 var neg1: nx_int = 0 - 1
18 if nx_fk_is_valid(neg1) != 0 { return 4 }
19
20 // --- default envelope carries the cited constants ---
21 let env: *NxFermentSafetyEnvelope = nx_ferment_safety_envelope_default(1)
22 if env.botulism_ph_milli != 4600 { return 5 }
23 if env.min_raw_milk_age_days != 60 { return 6 }
24
25 let nolog: *NxFermentReadingLog = (0) as *NxFermentReadingLog
26
27 // --- SAFE: yogurt held 43 C, acidified to pH 4.4 after the window ---
28 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC,
29 43000, 4400, 0, 60, 0, nolog, 100) != NX_FS_OK { return 7 }
30
31 // --- REFUSE: culture killed (60 C > 55 C kill) ---
32 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC,
33 60000, 4400, 0, 6, 0, nolog, 101) != NX_FS_REFUSED_CULTURE_KILLED { return 8 }
34
35 // --- REFUSE: veg anaerobic under the 2% salt floor (1.5%) ---
36 if nx_ferment_validate(env, NX_FK_VEG_ANAEROBIC, NX_OX_ANAEROBIC,
37 20000, 3800, 1500, 6, 0, nolog, 102) != NX_FS_REFUSED_INSUFFICIENT_SALT { return 9 }
38
39 // --- REFUSE: raw-milk cheese aged only 30 days (< 60) ---
40 if nx_ferment_validate(env, NX_FK_CHEESE_RAWMILK, NX_OX_AEROBIC,
41 12000, 5200, 0, 6, 30, nolog, 103) != NX_FS_REFUSED_RAW_MILK_AGE { return 10 }
42
43 // --- REFUSE: botulism -- anaerobic, past 48 h window, pH still 5.0 ---
44 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC,
45 20000, 5000, 0, 72, 0, nolog, 104) != NX_FS_REFUSED_BOTULISM_PH { return 11 }
46
47 // --- REFUSE: botulism -- anaerobic veg, past window, pH unknown (0), salt OK 5% ---
48 if nx_ferment_validate(env, NX_FK_VEG_ANAEROBIC, NX_OX_ANAEROBIC,
49 20000, 0, 5000, 72, 0, nolog, 105) != NX_FS_REFUSED_BOTULISM_PH { return 12 }
50
51 // --- SAFE: anaerobic veg EARLY (within window), pH not yet down, salt OK ---
52 if nx_ferment_validate(env, NX_FK_VEG_ANAEROBIC, NX_OX_ANAEROBIC,
53 20000, 6000, 3000, 6, 0, nolog, 106) != NX_FS_OK { return 13 }
54
55 // --- SAFE: pasteurized cheese, young, aerobic (no raw-milk age rule) ---
56 if nx_ferment_validate(env, NX_FK_CHEESE_PASTEUR, NX_OX_AEROBIC,
57 12000, 5200, 0, 6, 2, nolog, 107) != NX_FS_OK { return 14 }
58
59 // --- REFUSE: bad kind (6 is out of the sealed enum) ---
60 if nx_ferment_validate(env, 6, NX_OX_AEROBIC,
61 20000, 4000, 0, 6, 0, nolog, 108) != NX_FS_REFUSED_BAD_KIND { return 15 }
62
63 // --- ABUSE-PATTERN: 3 readings in the danger zone (25 C) with pH
64 // stuck at 6.0 (> 4.6) = stalled ferment trending septic ---
65 let plog: *NxFermentReadingLog = nx_ferment_reading_log_new(16)
66 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
67 25000, 6000, 0, 1, 0, plog, 200) != NX_FS_OK { return 16 }
68 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
69 25000, 6000, 0, 1, 0, plog, 201) != NX_FS_OK { return 17 }
70 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
71 25000, 6000, 0, 1, 0, plog, 202) != NX_FS_REFUSED_PATHOGEN_PATTERN { return 18 }
72
73 // --- NEGATIVE CONTROL: cool + ACIDIFIED readings (pH 4.2) must NOT
74 // trip the pattern (proves the detector keys on pH, not noise) ---
75 let qlog: *NxFermentReadingLog = nx_ferment_reading_log_new(16)
76 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
77 25000, 4200, 0, 1, 0, qlog, 300) != NX_FS_OK { return 19 }
78 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
79 25000, 4200, 0, 1, 0, qlog, 301) != NX_FS_OK { return 20 }
80 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
81 25000, 4200, 0, 1, 0, qlog, 302) != NX_FS_OK { return 21 }
82
83 // --- NEGATIVE CONTROL 2: a normally-SOURING warm ferment (43 C, pH
84 // declining 6.5 -> 6.1 -> 5.7 -> 5.3, > 0.2 drop/reading) must
85 // NOT trip the stall pattern even though every reading is deep
86 // in the danger zone. This is the realistic yogurt case. ---
87 let rlog: *NxFermentReadingLog = nx_ferment_reading_log_new(16)
88 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
89 43000, 6500, 0, 1, 0, rlog, 400) != NX_FS_OK { return 22 }
90 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
91 43000, 6100, 0, 1, 0, rlog, 401) != NX_FS_OK { return 23 }
92 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
93 43000, 5700, 0, 1, 0, rlog, 402) != NX_FS_OK { return 24 }
94 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_AEROBIC,
95 43000, 5300, 0, 1, 0, rlog, 403) != NX_FS_OK { return 25 }
96
97 return 0
98}