nx_css_number_parse_test.nx source
↩ module page · 97 lines · 3034 B
1// nx_css_number_parse_test.nx -- smoke for CSS number -> thousandths.
2// Verifies integer + fractional + boundary cases plus error paths.
3
4import "nx_syscalls.nx"
5import "nx_css_number_parse.nx"
6
7func _put_byte(buf: *u8, i: i64, v: i64) -> i64 {
8 buf[i] = v as u8
9 return 0
10}
11
12func _put_ascii(buf: *u8, off: i64, s: *u8, n: i64) -> i64 {
13 var i: i64 = 0
14 while i < n {
15 buf[off + i] = s[i]
16 i = i + 1
17 }
18 return 0
19}
20
21func main() -> i64 {
22 let src: *u8 = (sys_mmap(128)) as *u8
23
24 // "0" at offset 0 len 1 -> 0
25 _put_byte(src, 0, 48)
26
27 // "16" at offset 2 len 2 -> 16000
28 _put_byte(src, 2, 49)
29 _put_byte(src, 3, 54)
30
31 // "1.5" at offset 5 len 3 -> 1500
32 _put_byte(src, 5, 49)
33 _put_byte(src, 6, 46)
34 _put_byte(src, 7, 53)
35
36 // "0.25" at offset 9 len 4 -> 250
37 _put_byte(src, 9, 48)
38 _put_byte(src, 10, 46)
39 _put_byte(src, 11, 50)
40 _put_byte(src, 12, 53)
41
42 // "100" at offset 14 len 3 -> 100000
43 _put_byte(src, 14, 49)
44 _put_byte(src, 15, 48)
45 _put_byte(src, 16, 48)
46
47 // "1.234" at offset 18 len 5 -> 1234
48 _put_byte(src, 18, 49)
49 _put_byte(src, 19, 46)
50 _put_byte(src, 20, 50)
51 _put_byte(src, 21, 51)
52 _put_byte(src, 22, 52)
53
54 // "1.2345" at offset 24 len 6 -> 1234 (truncate past 3 decimals)
55 _put_byte(src, 24, 49)
56 _put_byte(src, 25, 46)
57 _put_byte(src, 26, 50)
58 _put_byte(src, 27, 51)
59 _put_byte(src, 28, 52)
60 _put_byte(src, 29, 53)
61
62 // ".5" at offset 31 len 2 -> ERROR (leading dot)
63 _put_byte(src, 31, 46)
64 _put_byte(src, 32, 53)
65
66 // "1." at offset 34 len 2 -> ERROR (trailing dot, no frac digits)
67 _put_byte(src, 34, 49)
68 _put_byte(src, 35, 46)
69
70 // "1.2.3" at offset 37 len 5 -> ERROR (multiple dots)
71 _put_byte(src, 37, 49)
72 _put_byte(src, 38, 46)
73 _put_byte(src, 39, 50)
74 _put_byte(src, 40, 46)
75 _put_byte(src, 41, 51)
76
77 // "a" at offset 43 len 1 -> ERROR (non-digit)
78 _put_byte(src, 43, 97)
79
80 // ---- positive cases ----
81 if nx_css_number_parse(src, 0, 1) != 0 { return 1 }
82 if nx_css_number_parse(src, 2, 2) != 16000 { return 2 }
83 if nx_css_number_parse(src, 5, 3) != 1500 { return 3 }
84 if nx_css_number_parse(src, 9, 4) != 250 { return 4 }
85 if nx_css_number_parse(src, 14, 3) != 100000 { return 5 }
86 if nx_css_number_parse(src, 18, 5) != 1234 { return 6 }
87 if nx_css_number_parse(src, 24, 6) != 1234 { return 7 } // truncate past 3 decimals
88
89 // ---- error cases ----
90 if nx_css_number_parse(src, 31, 2) != NX_CSS_NUMBER_PARSE_ERROR { return 10 } // ".5"
91 if nx_css_number_parse(src, 34, 2) != NX_CSS_NUMBER_PARSE_ERROR { return 11 } // "1."
92 if nx_css_number_parse(src, 37, 5) != NX_CSS_NUMBER_PARSE_ERROR { return 12 } // "1.2.3"
93 if nx_css_number_parse(src, 43, 1) != NX_CSS_NUMBER_PARSE_ERROR { return 13 } // "a"
94 if nx_css_number_parse(src, 0, 0) != NX_CSS_NUMBER_PARSE_ERROR { return 14 } // empty
95
96 return 0
97}