code wiki / _hdl_build / nx_ecomat_seed_gate.nx
nx_ecomat_seed_gate.nx source
↩ module page · 85 lines · 4840 B
1// nx_ecomat_seed_gate.nx -- proves the NATIVE seg_store round-trip (no TSV): author 2 records,
2// read them back byte/field-exact, and a NEGATIVE CONTROL (a missing key must NOT be found -- the
3// store never fabricates). license_tier: ORIGINAL
4import "nx_ecomat_lib.nx"
5
6// fill buf with n deterministic bytes + NUL -- builds an arbitrarily long field at runtime so the
7// bound tests do not depend on a giant string literal.
8func sg_fill(buf: *u8, n: i64) -> i64 {
9 var i: i64 = 0
10 while i < n { buf[i] = (97 + (i % 26)) as u8; i = i + 1 }
11 buf[n] = 0 as u8
12 return n
13}
14
15func main() -> i64 {
16 var fails: i64 = 0
17 let w: *i64 = ss_begin()
18 ec_seed_one(w, 0, 0, 1, 2, 5, 9, 1, "alpha" as *u8, "b1" as *u8, "n1" as *u8)
19 ec_seed_one(w, 1, 1, 7, 3, 5, 8, 1, "beta" as *u8, "b2" as *u8, "n2" as *u8)
20 ss_commit("/tmp/ecomat_seedtest" as *u8, w, sys_now_realtime_sec())
21 let h: *i64 = ss_open("/tmp/ecomat_seedtest" as *u8)
22 let pq: *i64 = sys_mmap(16) as *i64
23 let lq: *i64 = sys_mmap(16) as *i64
24 let dom: *u8 = sys_mmap(ECOMAT_DOM_CAP)
25 let nr: *u8 = sys_mmap(ECOMAT_NR_CAP)
26 // row 0: all fields exact
27 let k0: *u8 = sys_mmap(64); ec_key(0, k0)
28 if ss_hget(h, k0, pq, lq) == 1 {
29 let v: *u8 = pq[0] as *u8
30 if ec_axis(v) != 0 { fails = fails + 1 }
31 if ec_cur(v) != 2 { fails = fails + 1 }
32 if ec_bar(v) != 5 { fails = fails + 1 }
33 if ec_weight(v) != 9 { fails = fails + 1 }
34 ec_str(v, 0, dom, ECOMAT_DOM_CAP); if el_streq(dom, "alpha" as *u8) == 0 { fails = fails + 1 }
35 ec_str(v, 2, nr, ECOMAT_NR_CAP); if el_streq(nr, "n1" as *u8) == 0 { fails = fails + 1 }
36 // T-STRCAP neg-control: a too-small out must be REFUSED (-1) and left EMPTY. A truncated but
37 // plausible domain name silently reaching a caller is the failure this bound exists to stop.
38 let tiny: *u8 = sys_mmap(64)
39 tiny[0] = 88 as u8
40 if ec_str(v, 0, tiny, 3) != (0 - 1) { fails = fails + 1 }
41 if tiny[0] != (0 as u8) { fails = fails + 1 }
42 } else { fails = fails + 1 }
43 // row 1: axis/cur + a different string field
44 let k1: *u8 = sys_mmap(64); ec_key(1, k1)
45 if ss_hget(h, k1, pq, lq) == 1 {
46 let v: *u8 = pq[0] as *u8
47 if ec_axis(v) != 1 { fails = fails + 1 }
48 if ec_cur(v) != 3 { fails = fails + 1 }
49 ec_str(v, 1, dom, ECOMAT_DOM_CAP); if el_streq(dom, "b2" as *u8) == 0 { fails = fails + 1 }
50 } else { fails = fails + 1 }
51 // NEG-CONTROL: a missing key must NOT be found
52 let kn: *u8 = sys_mmap(64); ec_key(99, kn)
53 if ss_hget(h, kn, pq, lq) == 1 { fails = fails + 1 }
54 // T-EXACT: ec_reclen must equal what ec_pack actually writes -- if the derived size were merely
55 // "big enough" the two could drift and the guard would fire on valid rows.
56 let need: i64 = ec_reclen("alpha" as *u8, "b1" as *u8, "n1" as *u8, "" as *u8, "" as *u8, "" as *u8, "" as *u8)
57 let tb: *u8 = sys_mmap(need)
58 if ec_pack(tb, need, 0, 1, 2, 5, 9, 1, 0, 0, "alpha" as *u8, "b1" as *u8, "n1" as *u8, "" as *u8, "" as *u8, "" as *u8, "" as *u8) != need { fails = fails + 1 }
59 // T-REFUSE neg-control: one byte short must FAIL CLOSED (-1), never a partial record.
60 if ec_pack(tb, need - 1, 0, 1, 2, 5, 9, 1, 0, 0, "alpha" as *u8, "b1" as *u8, "n1" as *u8, "" as *u8, "" as *u8, "" as *u8, "" as *u8) != (0 - 1) { fails = fails + 1 }
61
62 // T-LONG: the REGRESSION WITNESS for the domain that died as "record too large" -- a next-rung
63 // far past the old fixed 512/1024 buffers. Derived sizing must pack AND round-trip it byte-exact.
64 let big: *u8 = sys_mmap(4096)
65 sg_fill(big, 2000)
66 let w2: *i64 = ss_begin()
67 if ec_seed_one(w2, 0, 0, 1, 2, 5, 9, 1, "lab-science" as *u8, "USP-ICH-Q1A-AOAC-PubChem" as *u8, big) != 0 { fails = fails + 1 }
68 ss_commit("/tmp/ecomat_bigtest" as *u8, w2, sys_now_realtime_sec())
69 let h2: *i64 = ss_open("/tmp/ecomat_bigtest" as *u8)
70 let kb: *u8 = sys_mmap(64); ec_key(0, kb)
71 if ss_hget(h2, kb, pq, lq) == 1 {
72 let v2: *u8 = pq[0] as *u8
73 let back: *u8 = sys_mmap(4096)
74 if ec_str(v2, 2, back, 4096) != 2000 { fails = fails + 1 }
75 if el_streq(back, big) == 0 { fails = fails + 1 }
76 let d2: *u8 = sys_mmap(ECOMAT_DOM_CAP)
77 ec_str(v2, 0, d2, ECOMAT_DOM_CAP); if el_streq(d2, "lab-science" as *u8) == 0 { fails = fails + 1 }
78 } else { fails = fails + 1 }
79
80 _p("seed-gate native round-trip ... fails=" as *u8); _fn(1, fails); _p("\n" as *u8)
81 if fails == 0 { _p("GATE nx_ecomat_seed verdict=GREEN pass=18/18 (round-trip + missing-key neg-ctrl + ec_reclen-exact + pack-refuse + str-cap-refuse + 2000B long-row witness)\n" as *u8); sys_exit(0); return 0 }
82 _p("GATE nx_ecomat_seed verdict=RED fails=" as *u8); _fn(1, fails); _p("\n" as *u8)
83 sys_exit(1)
84 return 1
85}