nx_css_parse_test.nx source
↩ module page · 131 lines · 5512 B
1// nx_css_parse_test.nx -- smoke for the CSS parser Phase-2 second
2// primitive. Reuses the same fixture shape as nx_css_tokenize_test.
3//
4// Asserts:
5// - 1 rule parsed
6// - selector kind = TAG, name = "body"
7// - 2 declarations: ("color", HEXCOLOR "ff0000") and
8// ("font-size", DIMENSION 16 + UNIT "px")
9
10import "nx_syscalls.nx"
11import "nx_css_tokenize.nx"
12import "nx_css_parse.nx"
13
14func _put_byte(buf: *u8, i: i64, v: i64) -> i64 {
15 buf[i] = v as u8
16 return 0
17}
18
19// "body { color: #ff0000; font-size: 16px; }" (41 chars including closing brace, no trailing newline)
20func _build_fixture(out_len: *i64) -> *u8 {
21 let s: *u8 = (sys_mmap(64)) as *u8
22 var i: i64 = 0
23 _put_byte(s, i, 98); i = i + 1 // b
24 _put_byte(s, i, 111); i = i + 1 // o
25 _put_byte(s, i, 100); i = i + 1 // d
26 _put_byte(s, i, 121); i = i + 1 // y
27 _put_byte(s, i, 32); i = i + 1 // ' '
28 _put_byte(s, i, 123); i = i + 1 // '{'
29 _put_byte(s, i, 32); i = i + 1 // ' '
30 _put_byte(s, i, 99); i = i + 1 // c
31 _put_byte(s, i, 111); i = i + 1 // o
32 _put_byte(s, i, 108); i = i + 1 // l
33 _put_byte(s, i, 111); i = i + 1 // o
34 _put_byte(s, i, 114); i = i + 1 // r
35 _put_byte(s, i, 58); i = i + 1 // ':'
36 _put_byte(s, i, 32); i = i + 1 // ' '
37 _put_byte(s, i, 35); i = i + 1 // '#'
38 _put_byte(s, i, 102); i = i + 1 // f
39 _put_byte(s, i, 102); i = i + 1 // f
40 _put_byte(s, i, 48); i = i + 1 // 0
41 _put_byte(s, i, 48); i = i + 1 // 0
42 _put_byte(s, i, 48); i = i + 1 // 0
43 _put_byte(s, i, 48); i = i + 1 // 0
44 _put_byte(s, i, 59); i = i + 1 // ';'
45 _put_byte(s, i, 32); i = i + 1 // ' '
46 _put_byte(s, i, 102); i = i + 1 // f
47 _put_byte(s, i, 111); i = i + 1 // o
48 _put_byte(s, i, 110); i = i + 1 // n
49 _put_byte(s, i, 116); i = i + 1 // t
50 _put_byte(s, i, 45); i = i + 1 // '-'
51 _put_byte(s, i, 115); i = i + 1 // s
52 _put_byte(s, i, 105); i = i + 1 // i
53 _put_byte(s, i, 122); i = i + 1 // z
54 _put_byte(s, i, 101); i = i + 1 // e
55 _put_byte(s, i, 58); i = i + 1 // ':'
56 _put_byte(s, i, 32); i = i + 1 // ' '
57 _put_byte(s, i, 49); i = i + 1 // '1'
58 _put_byte(s, i, 54); i = i + 1 // '6'
59 _put_byte(s, i, 112); i = i + 1 // p
60 _put_byte(s, i, 120); i = i + 1 // x
61 _put_byte(s, i, 59); i = i + 1 // ';'
62 _put_byte(s, i, 32); i = i + 1 // ' '
63 _put_byte(s, i, 125); i = i + 1 // '}'
64 out_len[0] = i
65 return s
66}
67
68func main() -> i64 {
69 let len_box: *i64 = (sys_mmap(8)) as *i64
70 let src: *u8 = _build_fixture(len_box)
71 let src_len: i64 = len_box[0]
72
73 let cur: *CssCursor = (sys_mmap(NX_CSS_CURSOR_BYTES as nx_size)) as *CssCursor
74 nx_css_cursor_init(cur, src, src_len)
75
76 let tok: *CssToken = (sys_mmap(NX_CSS_TOKEN_BYTES as nx_size)) as *CssToken
77
78 let max_rules: i64 = 8
79 let rules: *CssRule = (sys_mmap((max_rules * NX_CSS_RULE_BYTES) as nx_size)) as *CssRule
80
81 let max_decls: i64 = 32
82 let decls: *CssDeclaration = (sys_mmap((max_decls * NX_CSS_DECLARATION_BYTES) as nx_size)) as *CssDeclaration
83
84 let st: *CssParseState = (sys_mmap(NX_CSS_PARSE_STATE_BYTES as nx_size)) as *CssParseState
85 nx_css_parse_state_init(st, cur, tok, rules, max_rules, decls, max_decls)
86
87 let rc: i64 = nx_css_parse(st)
88 if rc != 1 { return 1 }
89 if st.rule_count != 1 { return 2 }
90 if st.decl_count != 2 { return 3 }
91
92 // Rule 0: selector "body" (TAG).
93 let r0: *CssRule = rules
94 if r0.sel_kind != NX_CSS_SEL_TAG { return 10 }
95 if r0.sel_len != 4 { return 11 }
96 if (src[r0.sel_off] as i64) & 255 != 98 { return 12 } // 'b'
97 if (src[r0.sel_off + 1] as i64) & 255 != 111 { return 13 } // 'o'
98 if (src[r0.sel_off + 2] as i64) & 255 != 100 { return 14 } // 'd'
99 if (src[r0.sel_off + 3] as i64) & 255 != 121 { return 15 } // 'y'
100
101 if r0.decl_first != 0 { return 16 }
102 if r0.decl_count != 2 { return 17 }
103
104 // Declaration 0: "color: #ff0000"
105 let d0: *CssDeclaration = decls
106 if d0.prop_len != 5 { return 20 }
107 if (src[d0.prop_off] as i64) & 255 != 99 { return 21 } // 'c'
108 if (src[d0.prop_off + 1] as i64) & 255 != 111 { return 22 } // 'o'
109 if (src[d0.prop_off + 4] as i64) & 255 != 114 { return 23 } // 'r'
110 if d0.val_kind != NX_CSS_VAL_HEXCOLOR { return 24 }
111 if d0.val_len != 6 { return 25 }
112 if (src[d0.val_off] as i64) & 255 != 102 { return 26 } // 'f'
113 if (src[d0.val_off + 5] as i64) & 255 != 48 { return 27 } // '0'
114 if d0.unit_len != 0 { return 28 }
115
116 // Declaration 1: "font-size: 16px"
117 let d1: *CssDeclaration = (decls as *u8 + (1 as nx_size) * (NX_CSS_DECLARATION_BYTES as nx_size)) as *CssDeclaration
118 if d1.prop_len != 9 { return 30 }
119 if (src[d1.prop_off] as i64) & 255 != 102 { return 31 } // 'f'
120 if (src[d1.prop_off + 4] as i64) & 255 != 45 { return 32 } // '-'
121 if (src[d1.prop_off + 8] as i64) & 255 != 101 { return 33 } // 'e'
122 if d1.val_kind != NX_CSS_VAL_DIMENSION { return 34 }
123 if d1.val_len != 2 { return 35 }
124 if (src[d1.val_off] as i64) & 255 != 49 { return 36 } // '1'
125 if (src[d1.val_off + 1] as i64) & 255 != 54 { return 37 } // '6'
126 if d1.unit_len != 2 { return 38 }
127 if (src[d1.unit_off] as i64) & 255 != 112 { return 39 } // 'p'
128 if (src[d1.unit_off + 1] as i64) & 255 != 120 { return 40 } // 'x'
129
130 return 0
131}