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}