code wiki / _hdl_build / nx_galx_tags_gate.nx
nx_galx_tags_gate.nx source
↩ module page · 91 lines · 5504 B
1// nx_galx_tags_gate.nx -- sovereign gate for nx_galx_tags. Builds a tag-op log via tg_op_line (dogfood),
2// then asserts tg_tags_for_id / tg_ids_for_tag replay it to the correct CURRENT set: add, remove (v=0),
3// last-wins, multi-tag ordering, and absent id/tag. No bash. license_tier: ORIGINAL
4import "nx_syscalls.nx"
5import "nx_galx_tags.nx"
6
7func gp_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func gp_n(v: i64) -> i64 {
9 var m: i64=v; var neg: i64=0; if m<0 { neg=1; m=0-m }
10 let b: *u8=sys_mmap(32); var i: i64=32
11 if m==0 { i=i-1; b[i]=(48 as u8) }
12 while m>0 { let q: i64=m/10; i=i-1; b[i]=((48+(m-q*10)) as u8); m=q }
13 if neg==1 { i=i-1; b[i]=(45 as u8) }
14 sys_write(1, ((b as i64)+i) as *u8, 32-i); return 0
15}
16func gp_jeq(out: *u8, len: i64, exp: *u8) -> i64 {
17 var i: i64 = 0
18 while i < len { if out[i] != exp[i] { return 0 } i = i + 1 }
19 if exp[len] != (0 as u8) { return 0 }
20 return 1
21}
22// assert out[0..len)==exp; print + return 1/0.
23func chk_j(label: *u8, out: *u8, len: i64, exp: *u8) -> i64 {
24 if gp_jeq(out, len, exp) == 1 { gp_p(" PASS " as *u8); gp_p(label); gp_p(" = " as *u8); sys_write(1, out, len); gp_p("\n" as *u8); return 1 }
25 gp_p(" FAIL " as *u8); gp_p(label); gp_p(" got=" as *u8); sys_write(1, out, len); gp_p(" want=" as *u8); gp_p(exp); gp_p("\n" as *u8); return 0
26}
27
28func main(argc: i64, argv: *i64) -> i64 {
29 gp_p("nx_galx_tags_gate: append-only tag store, last-wins replay\n" as *u8)
30 let log: *u8 = sys_mmap(8192); var o: i64 = 0
31 o = o + tg_op_line(((log as i64)+o) as *u8, 5, "funny" as *u8, 5, 1)
32 o = o + tg_op_line(((log as i64)+o) as *u8, 5, "cute" as *u8, 4, 1)
33 o = o + tg_op_line(((log as i64)+o) as *u8, 7, "funny" as *u8, 5, 1)
34 o = o + tg_op_line(((log as i64)+o) as *u8, 5, "cute" as *u8, 4, 0)
35 o = o + tg_op_line(((log as i64)+o) as *u8, 9, "funny" as *u8, 5, 1)
36 o = o + tg_op_line(((log as i64)+o) as *u8, 9, "funny" as *u8, 5, 0)
37 o = o + tg_op_line(((log as i64)+o) as *u8, 7, "cute" as *u8, 4, 1)
38 o = o + tg_op_line(((log as i64)+o) as *u8, 8, "gone" as *u8, 4, 1)
39 o = o + tg_op_line(((log as i64)+o) as *u8, 8, "gone" as *u8, 4, 0)
40 let sz: i64 = o
41 let out: *u8 = sys_mmap(4096)
42 var pass: i64 = 0; var tot: i64 = 0; var ln: i64 = 0
43
44 ln = tg_tags_for_id(log, sz, 5, out)
45 tot=tot+1; pass=pass+chk_j("tags(5) cute-removed" as *u8, out, ln, "[\"funny\"]" as *u8)
46 ln = tg_tags_for_id(log, sz, 7, out)
47 tot=tot+1; pass=pass+chk_j("tags(7) multi+order" as *u8, out, ln, "[\"funny\",\"cute\"]" as *u8)
48 ln = tg_tags_for_id(log, sz, 9, out)
49 tot=tot+1; pass=pass+chk_j("tags(9) all-removed" as *u8, out, ln, "[]" as *u8)
50 ln = tg_tags_for_id(log, sz, 3, out)
51 tot=tot+1; pass=pass+chk_j("tags(3) absent" as *u8, out, ln, "[]" as *u8)
52
53 ln = tg_ids_for_tag(log, sz, "funny" as *u8, 5, out)
54 tot=tot+1; pass=pass+chk_j("ids(funny) 9-removed" as *u8, out, ln, "[5,7]" as *u8)
55 ln = tg_ids_for_tag(log, sz, "cute" as *u8, 4, out)
56 tot=tot+1; pass=pass+chk_j("ids(cute) 5-removed+7-added" as *u8, out, ln, "[7]" as *u8)
57 ln = tg_ids_for_tag(log, sz, "nope" as *u8, 4, out)
58 tot=tot+1; pass=pass+chk_j("ids(nope) absent" as *u8, out, ln, "[]" as *u8)
59
60 ln = tg_all_tags(log, sz, out)
61 tot=tot+1; pass=pass+chk_j("all_tags current-only(gone excl)" as *u8, out, ln, "[\"funny\",\"cute\"]" as *u8)
62
63 // STRING-KEYED variants: an image cid and an int-as-string video id share one store
64 let slog: *u8 = sys_mmap(8192); var so: i64 = 0
65 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "img_abcDEF123" as *u8, 13, "funny" as *u8, 5, 1)
66 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "5" as *u8, 1, "funny" as *u8, 5, 1)
67 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "img_abcDEF123" as *u8, 13, "cute" as *u8, 4, 1)
68 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "img_abcDEF123" as *u8, 13, "cute" as *u8, 4, 0)
69 let ssz: i64 = so
70 ln = tg_tags_for_id_s(slog, ssz, "img_abcDEF123" as *u8, 13, out)
71 tot=tot+1; pass=pass+chk_j("s tags(cid) cute-removed" as *u8, out, ln, "[\"funny\"]" as *u8)
72 ln = tg_tags_for_id_s(slog, ssz, "5" as *u8, 1, out)
73 tot=tot+1; pass=pass+chk_j("s tags(int-as-str 5)" as *u8, out, ln, "[\"funny\"]" as *u8)
74 ln = tg_ids_for_tag_s(slog, ssz, "funny" as *u8, 5, out)
75 tot=tot+1; pass=pass+chk_j("s ids(funny) quoted mixed" as *u8, out, ln, "[\"img_abcDEF123\",\"5\"]" as *u8)
76 ln = tg_ids_for_tag_s(slog, ssz, "cute" as *u8, 4, out)
77 tot=tot+1; pass=pass+chk_j("s ids(cute) removed empty" as *u8, out, ln, "[]" as *u8)
78
79 // tg_all_tags_s: the multi-cid same-tag REMOVAL edge case (int tg_all_tags gets this WRONG by collapsing
80 // every cid to id 0). beach removed from AAA but BBB still has it -> beach must stay in the picker.
81 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "img_AAA" as *u8, 7, "beach" as *u8, 5, 1)
82 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "img_BBB" as *u8, 7, "beach" as *u8, 5, 1)
83 so = so + tg_op_line_s(((slog as i64)+so) as *u8, "img_AAA" as *u8, 7, "beach" as *u8, 5, 0)
84 let ssz2: i64 = so
85 ln = tg_all_tags_s(slog, ssz2, out)
86 tot=tot+1; pass=pass+chk_j("s all_tags(multi-cid removal)" as *u8, out, ln, "[\"funny\",\"beach\"]" as *u8)
87
88 gp_p("RESULT " as *u8); gp_n(pass); gp_p("/" as *u8); gp_n(tot); gp_p(" passed\n" as *u8)
89 if pass == tot { gp_p("GATE GREEN\n" as *u8); return 0 }
90 gp_p("GATE RED\n" as *u8); return 1
91}