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}