code wiki / _hdl_build / nx_site_pages_gate.nx
nx_site_pages_gate.nx source
↩ module page · 94 lines · 5606 B
1// nx_site_pages_gate.nx -- MEASURED gate for the data-driven website page generator. Generates the andelinwest
2// site into a test docroot and proves the visitor content exists + is branded + the practice slugs EXACTLY match
3// the onsite-search URLs (so search results never dangle):
4// T1 homepage generated + branded (index.html contains the firm name) + 4 cards -> 4 practice pages
5// T2 /practice/family-law.html exists + contains "Family Law"
6// T3 /practice/estate-planning.html exists + contains "Estate Planning"
7// T4 the other two search targets exist: /practice/business-law.html + /practice/personal-injury.html
8// T5 neg-control: a non-card slug (/practice/divorce.html) is NOT generated
9// GREEN iff 5/5. Appends knowledge/status/site_pages_gate.log. license_tier: ORIGINAL
10import "nx_site_pages.nx"
11
12func g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
13func g_num(v: i64) -> i64 {
14 let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
15 let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 }
16 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
17 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0
18}
19func g_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
20func g_wn(fd: i64, v: i64) -> i64 {
21 let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m }
22 let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 }
23 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
24 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(fd, bb, k); return 0
25}
26func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
27func g_contains(hay: *u8, n: i64, ndl: *u8) -> i64 {
28 let nl: i64 = g_slen(ndl); if nl == 0 { return 0 }
29 var i: i64 = 0
30 while i + nl <= n { var j: i64 = 0; var hit: i64 = 1; while j < nl { if hay[i + j] != ndl[j] { hit = 0; j = nl } else { j = j + 1 } } if hit == 1 { return 1 } i = i + 1 }
31 return 0
32}
33// returns file length (0 if absent/empty), buf via bufout[0]
34func g_read(path: *u8, bufout: *i64) -> i64 {
35 let szp: *i64 = sys_mmap(16) as *i64
36 let buf: *u8 = sys_read_file(path, szp)
37 bufout[0] = buf as i64
38 if (buf as i64) == 0 { return 0 }
39 return szp[0]
40}
41func g_has(path: *u8) -> i64 { let bo: *i64 = sys_mmap(16) as *i64; if g_read(path, bo) > 0 { return 1 } return 0 }
42// does file at path contain needle?
43func g_file_has(path: *u8, ndl: *u8) -> i64 {
44 let bo: *i64 = sys_mmap(16) as *i64
45 let n: i64 = g_read(path, bo)
46 if n <= 0 { return 0 }
47 return g_contains(bo[0] as *u8, n, ndl)
48}
49
50func main() -> i64 {
51 g_puts("=== SITE PAGES GATE (data-driven website: homepage + per-practice pages; search URLs resolve) ===\n" as *u8)
52 let dr: *u8 = "web_assets/_aw_pages_gate" as *u8
53 let cnt: i64 = sp_gen_file("web_assets/_sites/andelinwest.site" as *u8, dr)
54
55 var pass: i64 = 0
56
57 // T1 homepage + 4 practice pages + branded
58 var t1: i64 = 0
59 if cnt == 4 { if g_file_has("web_assets/_aw_pages_gate/index.html" as *u8, "Andelin West" as *u8) == 1 { t1 = 1 } }
60 pass = pass + t1
61 g_puts(" T1 homepage branded + 4 practice pages (cnt="); g_num(cnt); g_puts("): "); if t1 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
62
63 var t2: i64 = 0
64 if g_file_has("web_assets/_aw_pages_gate/practice/family-law.html" as *u8, "Family Law" as *u8) == 1 { t2 = 1 }
65 pass = pass + t2
66 g_puts(" T2 /practice/family-law.html branded: "); if t2 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
67
68 var t3: i64 = 0
69 if g_file_has("web_assets/_aw_pages_gate/practice/estate-planning.html" as *u8, "Estate Planning" as *u8) == 1 { t3 = 1 }
70 pass = pass + t3
71 g_puts(" T3 /practice/estate-planning.html branded: "); if t3 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
72
73 var t4: i64 = 0
74 if g_has("web_assets/_aw_pages_gate/practice/business-law.html" as *u8) == 1 { if g_has("web_assets/_aw_pages_gate/practice/personal-injury.html" as *u8) == 1 { t4 = 1 } }
75 pass = pass + t4
76 g_puts(" T4 business-law + personal-injury pages exist (search targets resolve): "); if t4 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
77
78 var t5: i64 = 0
79 if g_has("web_assets/_aw_pages_gate/practice/divorce.html" as *u8) == 0 { t5 = 1 }
80 pass = pass + t5
81 g_puts(" T5 neg-control (non-card slug not generated): "); if t5 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
82
83 g_puts("----\nSITE-PAGES rows=5 pass="); g_num(pass); g_puts("\n" as *u8)
84 let lg: i64 = sys_openat_append("knowledge/status/site_pages_gate.log" as *u8, 0x1a4)
85 if lg >= 0 {
86 g_w(lg, "SITE-PAGES homepage_branded="); g_wn(lg, t1); g_w(lg, " family_law="); g_wn(lg, t2); g_w(lg, " estate_planning="); g_wn(lg, t3)
87 g_w(lg, " other_targets="); g_wn(lg, t4); g_w(lg, " negctrl="); g_wn(lg, t5); g_w(lg, " cards="); g_wn(lg, cnt)
88 g_w(lg, " rows=5 pass="); g_wn(lg, pass)
89 if pass == 5 { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) }
90 sys_close(lg)
91 }
92 if pass == 5 { g_puts("SITE-PAGES GREEN (homepage + per-practice visitor pages, data-driven, search URLs resolve -- measured)\n" as *u8); sys_exit(0); return 0 }
93 g_puts("SITE-PAGES RED\n" as *u8); sys_exit(1); return 1
94}