code wiki / _hdl_build / nx_grid_test.nx
nx_grid_test.nx source
↩ module page · 132 lines · 8160 B
1// nx_grid_test.nx -- ISOLATION diagnostic for the GRID rung (display:grid + grid-template-columns).
2// Runs the REAL render pipeline prefix (from_dom -> box<->element map -> rh_cascade -> block_layout) on
3// controlled grid fixtures and DUMPS per-box geometry, so grid placement is MEASURED before the gate
4// asserts it. Mirrors nx_float_test. 100% sovereign (no gcc/V8/Chrome).
5import "nx_syscalls.nx"
6import "nx_css_tokenize.nx"
7import "nx_css_parse.nx"
8import "nx_css_apply.nx"
9import "nx_css_color_decode.nx"
10import "nx_css_dimension_to_px.nx"
11import "nx_css_selector_match.nx"
12import "nx_html_tokenizer.nx"
13import "nx_dom_query.nx"
14import "nx_layout_box.nx"
15import "nx_layout_default_display.nx"
16import "nx_layout_from_dom.nx"
17import "nx_layout_block.nx"
18import "nx_render_html.nx"
19
20func ps(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
21func 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 }
22func emit(src: *u8, off: i64, len: i64) -> i64 { sys_write(1, ((src as i64)+off) as *u8, len); return 0 }
23
24func run(html: *u8, css: *u8, vw: i64) -> i64 {
25 var hlen: i64 = 0
26 while html[hlen]!=(0 as u8) { hlen=hlen+1 }
27 var clen: i64 = 0
28 while css[clen]!=(0 as u8) { clen=clen+1 }
29 let total: i64 = hlen + clen
30 let buf: *u8 = sys_mmap(total + 16)
31 var i: i64 = 0
32 while i < hlen { buf[i]=html[i]; i=i+1 }
33 var j: i64 = 0
34 while j < clen { buf[hlen+j]=css[j]; j=j+1 }
35 ps("=== HTML: \x00" as *u8); sys_write(1, html, hlen); ps(" CSS: \x00" as *u8); sys_write(1, css, clen); ps(" vw=\x00" as *u8); pn(vw); ps("\n\x00" as *u8)
36
37 let boxes: *LayoutBox = (sys_mmap(NX_LAYOUT_BOX_BYTES*1024+16)) as *LayoutBox
38 let tree: *LayoutTree = (sys_mmap(64)) as *LayoutTree
39 nx_layout_tree_init(tree, boxes, 1024)
40 let stk: *LayoutFromDomStack = (sys_mmap(NX_LAYOUT_FROM_DOM_STACK_BYTES+8)) as *LayoutFromDomStack
41 let sidx: *i64 = (sys_mmap(8*64)) as *i64
42 nx_layout_from_dom_stack_init(stk, sidx, 64)
43 nx_layout_from_dom(buf, hlen, tree, stk)
44
45 let ext: *CssElement = (sys_mmap(NX_CSS_ELEMENT_BYTES*1024 as nx_size)) as *CssElement
46 let n_ext: i64 = rh_extract(buf, hlen, ext, 1024)
47 let boxel: *CssElement = (sys_mmap((NX_CSS_ELEMENT_BYTES*(tree.count+1)) as nx_size)) as *CssElement
48 var k: i64 = 0
49 i = 0
50 while i < tree.count {
51 let bb: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
52 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
53 e.src = buf
54 var mapped: i64 = 0
55 if rh_is_elem(bb.kind)==1 { if bb.parent_idx != (0-1) { if k < n_ext {
56 let s: *CssElement = ((ext as i64)+k*NX_CSS_ELEMENT_BYTES) as *CssElement
57 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
58 k=k+1; mapped=1
59 } } }
60 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 }
61 i=i+1
62 }
63
64 let cur: *CssCursor = (sys_mmap(NX_CSS_CURSOR_BYTES) as nx_size) as *CssCursor
65 nx_css_cursor_init(cur, buf, total); cur.pos = hlen
66 let tok: *CssToken = (sys_mmap(NX_CSS_TOKEN_BYTES) as nx_size) as *CssToken
67 let rules: *CssRule = (sys_mmap(NX_CSS_RULE_BYTES*512 as nx_size)) as *CssRule
68 let decls: *CssDeclaration = (sys_mmap(NX_CSS_DECLARATION_BYTES*512 as nx_size)) as *CssDeclaration
69 let st: *CssParseState = (sys_mmap(128) as nx_size) as *CssParseState
70 nx_css_parse_state_init(st, cur, tok, rules, 512, decls, 512)
71 nx_css_parse(st)
72 let computed: *CssComputedDecl = (sys_mmap(NX_CSS_COMPUTED_DECL_BYTES*4096 as nx_size)) as *CssComputedDecl
73 let cb: *i64 = (sys_mmap(8)) as *i64
74 rh_cascade(buf, rules, st.rule_count, decls, st.decl_count, boxel, tree.count, tree, computed, 4096, cb)
75 let ncomp: i64 = cb[0]
76 ps("rules=\x00" as *u8); pn(st.rule_count); ps(" ncomp=\x00" as *u8); pn(ncomp); ps("\n\x00" as *u8)
77
78 let pbuf: *u8 = sys_mmap(256)
79 let ltable: *LayoutPropTable = (sys_mmap(NX_LAYOUT_PROP_TABLE_BYTES)) as *LayoutPropTable
80 nx_layout_prop_table_init(ltable, pbuf)
81 let resolve: *CssResolveCtx = (sys_mmap(NX_CSS_RESOLVE_CTX_BYTES)) as *CssResolveCtx
82 resolve.root_font_size_px = 16; resolve.parent_font_size_px = 16; resolve.parent_dimension_px = vw
83 let lctx: *LayoutCtx = (sys_mmap(NX_LAYOUT_CTX_BYTES)) as *LayoutCtx
84 nx_layout_ctx_init(lctx, tree, computed, ncomp, buf, vw, resolve)
85 let ph: i64 = nx_layout_block_layout(lctx, ltable, 0)
86 ps("page_h=\x00" as *u8); pn(ph); ps("\n\x00" as *u8)
87
88 i = 0
89 while i < tree.count {
90 let bb: *LayoutBox = ((tree.boxes as i64)+i*NX_LAYOUT_BOX_BYTES) as *LayoutBox
91 let e: *CssElement = ((boxel as i64)+i*NX_CSS_ELEMENT_BYTES) as *CssElement
92 ps(" box\x00" as *u8); pn(i); ps(" kind=\x00" as *u8); pn(bb.kind)
93 if e.tag_len>0 { ps(" <\x00" as *u8); emit(buf,e.tag_off,e.tag_len); ps(">\x00" as *u8) }
94 if e.id_len>0 { ps(" #\x00" as *u8); emit(buf,e.id_off,e.id_len) }
95 if bb.kind==NX_LAYOUT_BOX_TEXT { ps(" '\x00" as *u8); emit(buf,bb.text_off,bb.text_len); ps("'\x00" as *u8) }
96 ps(" x=\x00" as *u8); pn(bb.x); ps(" y=\x00" as *u8); pn(bb.y); ps(" w=\x00" as *u8); pn(bb.w); ps(" h=\x00" as *u8); pn(bb.h); ps("\n\x00" as *u8)
97 i=i+1
98 }
99 ps("\n\x00" as *u8)
100 return 0
101}
102
103func main() -> i64 {
104 // G1 three equal columns via explicit track list: a@x=0 b@x=300 c@x=600 (vw=900 -> 300 each), y=0
105 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div><div id=\"c\">C</div></div>\x00" as *u8,
106 "#g{display:grid;grid-template-columns:1fr 1fr 1fr}\x00" as *u8, 900)
107 // G2 same via repeat(3, 1fr) -> proves the repeat() track count parse
108 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div><div id=\"c\">C</div></div>\x00" as *u8,
109 "#g{display:grid;grid-template-columns:repeat(3, 1fr)}\x00" as *u8, 900)
110 // G3 WRAP: 4 children in 2 cols (vw=800 -> 400 each). a,b on row0 (y=0); c,d wrap to row1 (y=row_h)
111 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div><div id=\"c\">C</div><div id=\"d\">D</div></div>\x00" as *u8,
112 "#g{display:grid;grid-template-columns:1fr 1fr}\x00" as *u8, 800)
113 // G4 CONTROL: no grid -> children STACK vertically full-width (differential vs G1)
114 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div><div id=\"c\">C</div></div>\x00" as *u8,
115 "#g{color:#000}\x00" as *u8, 900)
116 // T1 MIXED px+fr: 200px fixed sidebar + 2 fr (vw=800 -> col0=200, leftover 600 / 2 = 300 each)
117 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div><div id=\"c\">C</div></div>\x00" as *u8,
118 "#g{display:grid;grid-template-columns:200px 1fr 1fr}\x00" as *u8, 800)
119 // T2 WEIGHTED fr: 1fr 2fr (vw=900 -> unit=300 -> col0=300, col1=600)
120 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div></div>\x00" as *u8,
121 "#g{display:grid;grid-template-columns:1fr 2fr}\x00" as *u8, 900)
122 // T3 COLUMN-GAP: 1fr 1fr with column-gap:20px (vw=800 -> free=780 -> 390 each; col1 x=390+20=410)
123 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div></div>\x00" as *u8,
124 "#g{display:grid;grid-template-columns:1fr 1fr;column-gap:20px}\x00" as *u8, 800)
125 // T4 GAP shorthand + WRAP: 1fr 1fr gap:10px, 4 kids (vw=800 -> 395 each; row1 y = 10+10)
126 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div><div id=\"c\">C</div><div id=\"d\">D</div></div>\x00" as *u8,
127 "#g{display:grid;grid-template-columns:1fr 1fr;gap:10px}\x00" as *u8, 800)
128 // T5 repeat(N, px): repeat(2, 150px) (vw=800 -> col0 x=0 w=150, col1 x=150 w=150)
129 run("<div id=\"g\"><div id=\"a\">A</div><div id=\"b\">B</div></div>\x00" as *u8,
130 "#g{display:grid;grid-template-columns:repeat(2, 150px)}\x00" as *u8, 800)
131 return 0
132}