code wiki / (root) / nx_css_parse_test.nx

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}