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}