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 & Wesson <LLP></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}