code wiki / _hdl_build / nx_cms_c2_test.nx

nx_cms_c2_test.nx source

↩ module page · 70 lines · 4033 B

1// nx_cms_c2_test.nx -- ENGINEER verification of CMS C2 (content model): store get/set/append, 2// ATOMIC publish + one-deep revision + rollback (rule 13 additive), and render-from-data with 3// escape-on-render (plain) vs raw-insert (_html, sanitized at write). Exit 0 = all green. 4import "nx_cms_render.nx" 5import "nx_syscalls.nx" 6 7func c2t_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func c2t_len(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 9func c2t_eq(a: *u8, al: i64, b: *u8) -> i64 { 10 if al != c2t_len(b) { return 0 } 11 var i: i64 = 0 12 while i < al { if (a[i] as i64) != (b[i] as i64) { return 0 } i = i + 1 } 13 return 1 14} 15 16func main() -> i64 { 17 var bad: i64 = 0 18 let s1: *u8 = sys_mmap(8192) 19 let s2: *u8 = sys_mmap(8192) 20 let v: *u8 = sys_mmap(8192) 21 22 // 1) append three records, read each back 23 var n: i64 = cst_set(s1, 0, "hero_title" as *u8, "Andelin West Law" as *u8, 16, s2, 8191) 24 n = cst_set(s2, n, "hero_tag" as *u8, "A modern legal practice." as *u8, 24, s1, 8191) 25 n = cst_set(s1, n, "note_html" as *u8, "<p>Open <b>now</b>.</p>" as *u8, 23, s2, 8191) 26 var vl: i64 = cst_get(s2, n, "hero_title" as *u8, v, 8191) 27 if c2t_eq(v, vl, "Andelin West Law" as *u8) == 0 { bad = bad + 1; c2t_w("FAIL get-1\n" as *u8) } 28 vl = cst_get(s2, n, "note_html" as *u8, v, 8191) 29 if c2t_eq(v, vl, "<p>Open <b>now</b>.</p>" as *u8) == 0 { bad = bad + 1; c2t_w("FAIL get-3\n" as *u8) } 30 vl = cst_get(s2, n, "absent" as *u8, v, 8191) 31 if vl + 1 != 0 { bad = bad + 1; c2t_w("FAIL get-absent\n" as *u8) } 32 33 // 2) replace the MIDDLE key; neighbors must survive byte-exact 34 n = cst_set(s2, n, "hero_tag" as *u8, "Trusted counsel since 1998." as *u8, 27, s1, 8191) 35 vl = cst_get(s1, n, "hero_tag" as *u8, v, 8191) 36 if c2t_eq(v, vl, "Trusted counsel since 1998." as *u8) == 0 { bad = bad + 1; c2t_w("FAIL replace\n" as *u8) } 37 vl = cst_get(s1, n, "hero_title" as *u8, v, 8191) 38 if c2t_eq(v, vl, "Andelin West Law" as *u8) == 0 { bad = bad + 1; c2t_w("FAIL replace-neighbor-a\n" as *u8) } 39 vl = cst_get(s1, n, "note_html" as *u8, v, 8191) 40 if c2t_eq(v, vl, "<p>Open <b>now</b>.</p>" as *u8) == 0 { bad = bad + 1; c2t_w("FAIL replace-neighbor-b\n" as *u8) } 41 42 // 3) atomic publish + revision + rollback 43 let path: *u8 = "/tmp/_cms_c2_store.txt" as *u8 44 if cst_write_atomic(path, s1, n) != 1 { bad = bad + 1; c2t_w("FAIL atomic-1\n" as *u8) } 45 let m2: i64 = cst_set(s1, n, "hero_title" as *u8, "EDITED TITLE v2" as *u8, 15, s2, 8191) 46 if cst_write_atomic(path, s2, m2) != 1 { bad = bad + 1; c2t_w("FAIL atomic-2\n" as *u8) } 47 var rl: i64 = cst_read(path, v, 8191) 48 var vs2: *i64 = sys_mmap(16) as *i64 49 let g2: i64 = cst_find(v, rl, "hero_title" as *u8, vs2) 50 if g2 != 15 { bad = bad + 1; c2t_w("FAIL readback-v2\n" as *u8) } 51 if cst_rollback(path) != 1 { bad = bad + 1; c2t_w("FAIL rollback-call\n" as *u8) } 52 rl = cst_read(path, v, 8191) 53 let g1: i64 = cst_find(v, rl, "hero_title" as *u8, vs2) 54 if g1 != 16 { bad = bad + 1; c2t_w("FAIL rollback-content\n" as *u8) } 55 56 // 4) render-from-data: plain key ESCAPED, _html key RAW, unknown key = nothing 57 var rn: i64 = cst_set(v, 0, "hero_title" as *u8, "Smith & Wesson <LLP>" as *u8, 20, s2, 8191) 58 rn = cst_set(s2, rn, "note_html" as *u8, "<p>Open <b>now</b>.</p>" as *u8, 23, s1, 8191) 59 let tpl: *u8 = "<h1>{{hero_title}}</h1><div>{{note_html}}</div><p>{{missing}}</p>" as *u8 60 let out: *u8 = sys_mmap(8192) 61 let ol: i64 = crd_render(tpl, c2t_len(tpl), s1, rn, out, 8191) 62 if c2t_eq(out, ol, "<h1>Smith &amp; Wesson &lt;LLP&gt;</h1><div><p>Open <b>now</b>.</p></div><p></p>" as *u8) == 0 { 63 bad = bad + 1; c2t_w("FAIL render: [" as *u8); sys_write(1, out, ol); c2t_w("]\n" as *u8) 64 } 65 66 if bad == 0 { c2t_w("CMS C2 KATs ALL GREEN (store/replace/atomic/revision/rollback/render)\n" as *u8); sys_exit(0) } 67 c2t_w("CMS C2 KATs FAILED\n" as *u8) 68 sys_exit(1) 69 return 1 70}