code wiki / _hdl_build / nx_real_page_gate.nx
nx_real_page_gate.nx source
↩ module page · 171 lines · 10404 B
1// nx_real_page_gate.nx -- VERDICT gate that LOCKS IN the real-page (Wikipedia) render against regression.
2// Runs the FULL render pipeline on a stable 420KB Wikipedia snapshot (knowledge/fixtures/wiki_tbl_snapshot
3// .html) -- the same buffer construction _rh_to_fb uses (HTML + page inline <style> @media-filtered + UA
4// sheet) -- and asserts the structural wins this session earned:
5// - pipeline renders a real page (box count > 1000, no crash)
6// - the <h1> title text "Tim Berners-Lee" is present (title renders)
7// - the .infobox table is NOT collapsed (h > 200) -- the td/th table-cell containment fix
8// - the "vector-dropdown" chrome is DROPPED (no such class box) -- layout-level chrome drop
9// - the display:none short-description "English computer scientist" is DROPPED (no such text)
10// LIAR-KILL: asserts a guaranteed-absent token is reported absent (the checker has teeth). 100% sovereign.
11// license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_css_tokenize.nx"
14import "nx_css_parse.nx"
15import "nx_css_apply.nx"
16import "nx_css_color_decode.nx"
17import "nx_css_dimension_to_px.nx"
18import "nx_css_selector_match.nx"
19import "nx_html_tokenizer.nx"
20import "nx_html_entities.nx"
21import "nx_dom_query.nx"
22import "nx_layout_box.nx"
23import "nx_layout_default_display.nx"
24import "nx_layout_from_dom.nx"
25import "nx_layout_block.nx"
26import "nx_render_html.nx"
27
28func g_w(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
29func pn(v0: i64) -> i64 { var v: i64=v0; if v<0 { let m: *u8=sys_mmap(8); m[0]=45 as u8; sys_write(1,m,1); v=0-v } let b: *u8=sys_mmap(24); var k: i64=0; if v==0 {b[0]=48;k=1} while v>0 {b[k]=(48+(v%10)) as u8; v=v/10; k=k+1} let o: *u8=sys_mmap(24); var j: i64=0; while j<k {o[j]=b[k-1-j];j=j+1} sys_write(1,o,k); return 0 }
30func chk(cond: i64, label: *u8, pass: *i64) -> i64 {
31 g_w(" " as *u8); g_w(label); g_w(": " as *u8)
32 if cond==1 { g_w("OK\n" as *u8); pass[0]=pass[0]+1 } else { g_w("FAIL\n" as *u8) }
33 return cond
34}
35// does src[a..a+alen) contain the NUL-terminated needle?
36func has_sub(src: *u8, a: i64, alen: i64, needle: *u8) -> i64 {
37 var nl: i64 = 0
38 while needle[nl]!=(0 as u8) { nl=nl+1 }
39 if nl==0 { return 1 }
40 if alen < nl { return 0 }
41 var i: i64 = 0
42 while i <= alen - nl {
43 var j: i64 = 0; var ok: i64 = 1
44 while j < nl { if (src[a+i+j]&0xff) != (needle[j]&0xff) { ok=0; j=nl } else { j=j+1 } }
45 if ok==1 { return 1 }
46 i = i + 1
47 }
48 return 0
49}
50
51func main() -> i64 {
52 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0
53 g_w("=== REAL-PAGE GATE (Wikipedia snapshot full-pipeline regression lock, sovereign) ===\n" as *u8)
54
55 let lp: *i64 = sys_mmap(8) as *i64
56 let raw: *u8 = sys_read_file("knowledge/fixtures/wiki_tbl_snapshot.html\x00" as *u8, lp)
57 let hlen: i64 = lp[0]
58 chk((hlen > 100000) as i64, "snapshot loaded (>100KB real page)\x00" as *u8, pass)
59 if hlen <= 0 { g_w("REAL-PAGE rows=8 pass=" as *u8); pn(pass[0]); g_w(" verdict=RED (no fixture)\n" as *u8); sys_exit(1); return 1 }
60
61 // mirror _rh_to_fb's buffer: [HTML][page inline <style>, @media-filtered to 800][UA reader sheet]
62 let css: *u8 = "h1{background-color:#a8c8ff;margin-top:10px;margin-bottom:4px;font-size:40px}h2{background-color:#d0d0d0;margin-top:10px;margin-bottom:3px;font-size:28px}h3{background-color:#e4e4e4;margin-top:6px;margin-bottom:2px;font-size:24px}body{background-color:#ffffff;padding-left:8px;padding-top:6px}p{margin-top:6px;margin-bottom:5px}ul{padding-left:16px;margin-top:3px;margin-bottom:3px}ol{padding-left:24px;margin-top:3px;margin-bottom:3px}li{margin-bottom:2px}tr{display:flex}th{font-weight:bold;padding-left:4px;padding-right:4px}td{padding-left:4px;padding-right:4px}a{color:#3366cc}b{font-weight:bold}strong{font-weight:bold}i{font-style:italic}em{font-style:italic}.vector-menu-content-list{display:none}.vector-dropdown{display:none}.mw-interlanguage-selector{display:none}.wbc-editpage{display:none}.infobox{float:right;width:300px;margin-left:8px;background-color:#f8f8f8}\x00" as *u8
63 var clen: i64 = 0
64 while css[clen]!=(0 as u8) { clen=clen+1 }
65 let STYCAP: i64 = 262144
66 let buf: *u8 = sys_mmap(hlen + STYCAP + clen + 16)
67 var i: i64 = 0
68 while i < hlen { buf[i]=raw[i]; i=i+1 }
69 let rawsty: *u8 = sys_mmap(STYCAP)
70 let rawstylen: i64 = rh_extract_styles(raw, hlen, rawsty, STYCAP)
71 let stylen: i64 = rh_filter_media(rawsty, 0, rawstylen, ((buf as i64)+hlen) as *u8, STYCAP, 800)
72 i = 0
73 while i < clen { buf[hlen + stylen + i] = css[i]; i=i+1 }
74 let total: i64 = hlen + stylen + clen
75
76 let VW: i64 = 800
77 let boxes: *LayoutBox = (sys_mmap(NX_LAYOUT_BOX_BYTES*16384+16)) as *LayoutBox
78 let tree: *LayoutTree = (sys_mmap(64)) as *LayoutTree
79 nx_layout_tree_init(tree, boxes, 16384)
80 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES+8)) as *LayoutFromDomStack
81 let sidx: *i64 = (sys_mmap(8*128)) as *i64
82 nx_layout_from_dom_stack_init(stk, sidx, 128)
83 nx_layout_from_dom(buf, hlen, tree, stk)
84
85 let ext: *CssElement = (sys_mmap(NX_CSS_ELEMENT_BYTES*16384 as nx_size)) as *CssElement
86 let n_ext: i64 = rh_extract(buf, hlen, ext, 16384)
87 let boxel: *CssElement = (sys_mmap((NX_CSS_ELEMENT_BYTES*(tree.count+1)) as nx_size)) as *CssElement
88 var k: i64 = 0
89 i = 0
90 while i < tree.count {
91 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
92 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
93 e.src = buf
94 var mapped: i64 = 0
95 if rh_is_elem(b.kind)==1 { if b.parent_idx != (0-1) { if k < n_ext {
96 let s: *CssElement = ((ext as i64)+k*NX_CSS_ELEMENT_BYTES) as *CssElement
97 e.tag_off=s.tag_off; e.tag_len=s.tag_len; e.id_off=s.id_off; e.id_len=s.id_len; e.class_off=s.class_off; e.class_len=s.class_len
98 k=k+1; mapped=1
99 } } }
100 if mapped==0 { e.tag_off=0; e.tag_len=0; e.id_off=0; e.id_len=0; e.class_off=0; e.class_len=0 }
101 i = i + 1
102 }
103
104 let cur: *CssCursor = (sys_mmap(NX_CSS_CURSOR_BYTES) as nx_size) as *CssCursor
105 nx_css_cursor_init(cur, buf, total); cur.pos = hlen
106 let tok: *CssToken = (sys_mmap(NX_CSS_TOKEN_BYTES) as nx_size) as *CssToken
107 let rules: *CssRule = (sys_mmap(NX_CSS_RULE_BYTES*8192 as nx_size)) as *CssRule
108 let decls: *CssDeclaration = (sys_mmap(NX_CSS_DECLARATION_BYTES*32768 as nx_size)) as *CssDeclaration
109 let st: *CssParseState = (sys_mmap(128) as nx_size) as *CssParseState
110 nx_css_parse_state_init(st, cur, tok, rules, 8192, decls, 32768)
111 nx_css_parse(st)
112 let computed: *CssComputedDecl = (sys_mmap(NX_CSS_COMPUTED_DECL_BYTES*262144 as nx_size)) as *CssComputedDecl
113 let cb: *i64 = (sys_mmap(8)) as *i64
114 rh_cascade(buf, rules, st.rule_count, decls, st.decl_count, boxel, tree.count, tree, computed, 262144, cb)
115 let ncomp: i64 = cb[0]
116
117 let pbuf: *u8 = sys_mmap(256)
118 let ltable: *LayoutPropTable = (sys_mmap(NX_LAYOUT_PROP_TABLE_BYTES)) as *LayoutPropTable
119 nx_layout_prop_table_init(ltable, pbuf)
120 let resolve: *CssResolveCtx = (sys_mmap(NX_CSS_RESOLVE_CTX_BYTES)) as *CssResolveCtx
121 resolve.root_font_size_px = 16; resolve.parent_font_size_px = 16; resolve.parent_dimension_px = VW
122 let lctx: *LayoutCtx = (sys_mmap(NX_LAYOUT_CTX_BYTES)) as *LayoutCtx
123 nx_layout_ctx_init(lctx, tree, computed, ncomp, buf, VW, resolve)
124 nx_layout_block_layout(lctx, ltable, 0)
125
126 g_w(" tree.count=\x00" as *u8); pn(tree.count); g_w(" rules=\x00" as *u8); pn(st.rule_count); g_w("\n\x00" as *u8)
127 chk((tree.count > 1000) as i64, "real page rendered (>1000 boxes)\x00" as *u8, pass)
128
129 // scan boxes: title text, short-desc text (must be absent), infobox table height, vector-dropdown class
130 var title_found: i64 = 0
131 var sdclass_found: i64 = 0
132 var content_found: i64 = 0
133 var infobox_h: i64 = 0
134 var vdrop_found: i64 = 0
135 i = 0
136 while i < tree.count {
137 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
138 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
139 if b.kind==NX_LAYOUT_BOX_TEXT { if b.text_len>0 {
140 if has_sub(buf, b.text_off, b.text_len, "Tim Berners-Lee\x00" as *u8)==1 { title_found=1 }
141 if has_sub(buf, b.text_off, b.text_len, "World Wide Web\x00" as *u8)==1 { content_found=1 }
142 } }
143 if e.class_len>0 {
144 if has_sub(buf, e.class_off, e.class_len, "infobox\x00" as *u8)==1 { if b.h > infobox_h { infobox_h = b.h } }
145 if has_sub(buf, e.class_off, e.class_len, "vector-dropdown\x00" as *u8)==1 { vdrop_found=1 }
146 // the shortdescription div is style="display:none" -> dropped at layout level -> NO box keeps that class
147 if has_sub(buf, e.class_off, e.class_len, "shortdescription\x00" as *u8)==1 { sdclass_found=1 }
148 }
149 i = i + 1
150 }
151 g_w(" title=\x00" as *u8); pn(title_found); g_w(" content=\x00" as *u8); pn(content_found); g_w(" infobox_h=\x00" as *u8); pn(infobox_h); g_w(" vdrop=\x00" as *u8); pn(vdrop_found); g_w(" shortdesc_class=\x00" as *u8); pn(sdclass_found); g_w("\n\x00" as *u8)
152
153 chk(title_found, "h1 title 'Tim Berners-Lee' renders\x00" as *u8, pass)
154 chk(content_found, "article body 'World Wide Web' renders\x00" as *u8, pass)
155 chk((infobox_h > 200) as i64, ".infobox table NOT collapsed (h>200) -- table-cell fix\x00" as *u8, pass)
156 chk((vdrop_found == 0) as i64, "vector-dropdown chrome DROPPED at layout level\x00" as *u8, pass)
157 chk((sdclass_found == 0) as i64, "display:none .shortdescription DROPPED (inline-hidden fix)\x00" as *u8, pass)
158 // LIAR-KILL: a token guaranteed absent must be reported absent by has_sub
159 var lk: i64 = 0
160 i = 0
161 while i < tree.count {
162 let b: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
163 if b.kind==NX_LAYOUT_BOX_TEXT { if b.text_len>0 { if has_sub(buf, b.text_off, b.text_len, "ZZNOTONTHISPAGE\x00" as *u8)==1 { lk=1 } } }
164 i = i + 1
165 }
166 chk((lk == 0) as i64, "LIAR-KILL: absent token 'ZZNOTONTHISPAGE' reported absent\x00" as *u8, pass)
167
168 g_w("REAL-PAGE rows=8 pass=\x00" as *u8); pn(pass[0])
169 if pass[0]==8 { g_w(" verdict=GREEN\n\x00" as *u8); sys_exit(0); return 0 }
170 g_w(" verdict=RED\n\x00" as *u8); sys_exit(1); return 1
171}