nx_html_to_text_test.nx source
↩ module page · 158 lines · 5652 B
1// nx_html_to_text_test.nx -- KATs for the sovereign browser's text-
2// mode HTML renderer.
3//
4// K1 "<p>hello</p>" → "hello\n"
5// K2 "<p>hi <b>there</b></p>" → "hi there\n"
6// K3 "& < >" → "& < >"
7// K4 "<script>alert(1)</script>X" → "X" (script body suppressed)
8// K5 "<p>a b</p>" → "a b\n" (whitespace collapsed)
9// K6 "<h1>Title</h1><p>body</p>" → "Title\nbody\n"
10//
11// Built per F7 post-order DFS.
12// expect_exit: 0
13// license_tier: ORIGINAL
14
15import "nx_syscalls.nx"
16import "nx_html_to_text.nx"
17
18// ===== fixture helpers ============================================
19
20func t_putstr(buf: *u8, off: i64, s: *u8, n: i64) -> i64 {
21 var i: i64 = 0
22 while i < n { buf[off + i] = s[i]; i = i + 1 }
23 return off + n
24}
25
26func t_eq_bytes(got: *u8, got_len: i64, exp: *u8, exp_len: i64) -> i64 {
27 if got_len != exp_len { return 0 }
28 var i: i64 = 0
29 while i < got_len {
30 if (got[i] & 0xff) != (exp[i] & 0xff) { return 0 }
31 i = i + 1
32 }
33 return 1
34}
35
36// ===== K1 =========================================================
37
38func k1_p_hello() -> i64 {
39 let src: *u8 = sys_mmap(64)
40 // "<p>hello</p>"
41 src[0]=0x3c; src[1]=0x70; src[2]=0x3e
42 src[3]=0x68; src[4]=0x65; src[5]=0x6c; src[6]=0x6c; src[7]=0x6f
43 src[8]=0x3c; src[9]=0x2f; src[10]=0x70; src[11]=0x3e
44 let out: *u8 = sys_mmap(64)
45 let n: i64 = nx_html_to_text(src, 12, out, 64)
46 let exp: *u8 = sys_mmap(16)
47 exp[0]=0x68; exp[1]=0x65; exp[2]=0x6c; exp[3]=0x6c; exp[4]=0x6f
48 exp[5]=0x0a
49 if t_eq_bytes(out, n, exp, 6) != 1 { return 11 }
50 return 0
51}
52
53// ===== K2 =========================================================
54
55func k2_inline_tag() -> i64 {
56 let src: *u8 = sys_mmap(64)
57 // "<p>hi <b>there</b></p>"
58 src[0]=0x3c; src[1]=0x70; src[2]=0x3e
59 src[3]=0x68; src[4]=0x69; src[5]=0x20
60 src[6]=0x3c; src[7]=0x62; src[8]=0x3e
61 src[9]=0x74; src[10]=0x68; src[11]=0x65; src[12]=0x72; src[13]=0x65
62 src[14]=0x3c; src[15]=0x2f; src[16]=0x62; src[17]=0x3e
63 src[18]=0x3c; src[19]=0x2f; src[20]=0x70; src[21]=0x3e
64 let out: *u8 = sys_mmap(64)
65 let n: i64 = nx_html_to_text(src, 22, out, 64)
66 let exp: *u8 = sys_mmap(16)
67 exp[0]=0x68; exp[1]=0x69; exp[2]=0x20
68 exp[3]=0x74; exp[4]=0x68; exp[5]=0x65; exp[6]=0x72; exp[7]=0x65
69 exp[8]=0x0a
70 if t_eq_bytes(out, n, exp, 9) != 1 { return 21 }
71 return 0
72}
73
74// ===== K3 =========================================================
75
76func k3_entities() -> i64 {
77 let src: *u8 = sys_mmap(64)
78 // "& < >"
79 src[0]=0x26; src[1]=0x61; src[2]=0x6d; src[3]=0x70; src[4]=0x3b
80 src[5]=0x20
81 src[6]=0x26; src[7]=0x6c; src[8]=0x74; src[9]=0x3b
82 src[10]=0x20
83 src[11]=0x26; src[12]=0x67; src[13]=0x74; src[14]=0x3b
84 let out: *u8 = sys_mmap(64)
85 let n: i64 = nx_html_to_text(src, 15, out, 64)
86 let exp: *u8 = sys_mmap(16)
87 exp[0]=0x26; exp[1]=0x20; exp[2]=0x3c; exp[3]=0x20; exp[4]=0x3e
88 if t_eq_bytes(out, n, exp, 5) != 1 { return 31 }
89 return 0
90}
91
92// ===== K4 =========================================================
93
94func k4_script_suppressed() -> i64 {
95 let src: *u8 = sys_mmap(64)
96 // "<script>alert(1)</script>X"
97 src[0]=0x3c; src[1]=0x73; src[2]=0x63; src[3]=0x72; src[4]=0x69; src[5]=0x70; src[6]=0x74; src[7]=0x3e
98 src[8]=0x61; src[9]=0x6c; src[10]=0x65; src[11]=0x72; src[12]=0x74
99 src[13]=0x28; src[14]=0x31; src[15]=0x29
100 src[16]=0x3c; src[17]=0x2f; src[18]=0x73; src[19]=0x63; src[20]=0x72; src[21]=0x69; src[22]=0x70; src[23]=0x74; src[24]=0x3e
101 src[25]=0x58
102 let out: *u8 = sys_mmap(64)
103 let n: i64 = nx_html_to_text(src, 26, out, 64)
104 let exp: *u8 = sys_mmap(8)
105 exp[0]=0x58
106 if t_eq_bytes(out, n, exp, 1) != 1 { return 41 }
107 return 0
108}
109
110// ===== K5 =========================================================
111
112func k5_collapse_whitespace() -> i64 {
113 let src: *u8 = sys_mmap(64)
114 // "<p>a b</p>"
115 src[0]=0x3c; src[1]=0x70; src[2]=0x3e
116 src[3]=0x61
117 src[4]=0x20; src[5]=0x20; src[6]=0x20
118 src[7]=0x62
119 src[8]=0x3c; src[9]=0x2f; src[10]=0x70; src[11]=0x3e
120 let out: *u8 = sys_mmap(64)
121 let n: i64 = nx_html_to_text(src, 12, out, 64)
122 let exp: *u8 = sys_mmap(8)
123 exp[0]=0x61; exp[1]=0x20; exp[2]=0x62; exp[3]=0x0a
124 if t_eq_bytes(out, n, exp, 4) != 1 { return 51 }
125 return 0
126}
127
128// ===== K6 =========================================================
129
130func k6_heading_then_para() -> i64 {
131 let src: *u8 = sys_mmap(64)
132 // "<h1>Title</h1><p>body</p>"
133 src[0]=0x3c; src[1]=0x68; src[2]=0x31; src[3]=0x3e
134 src[4]=0x54; src[5]=0x69; src[6]=0x74; src[7]=0x6c; src[8]=0x65
135 src[9]=0x3c; src[10]=0x2f; src[11]=0x68; src[12]=0x31; src[13]=0x3e
136 src[14]=0x3c; src[15]=0x70; src[16]=0x3e
137 src[17]=0x62; src[18]=0x6f; src[19]=0x64; src[20]=0x79
138 src[21]=0x3c; src[22]=0x2f; src[23]=0x70; src[24]=0x3e
139 let out: *u8 = sys_mmap(64)
140 let n: i64 = nx_html_to_text(src, 25, out, 64)
141 let exp: *u8 = sys_mmap(16)
142 exp[0]=0x54; exp[1]=0x69; exp[2]=0x74; exp[3]=0x6c; exp[4]=0x65
143 exp[5]=0x0a
144 exp[6]=0x62; exp[7]=0x6f; exp[8]=0x64; exp[9]=0x79
145 exp[10]=0x0a
146 if t_eq_bytes(out, n, exp, 11) != 1 { return 61 }
147 return 0
148}
149
150func main() -> i64 {
151 let r1: i64 = k1_p_hello(); if r1 != 0 { return r1 }
152 let r2: i64 = k2_inline_tag(); if r2 != 0 { return r2 }
153 let r3: i64 = k3_entities(); if r3 != 0 { return r3 }
154 let r4: i64 = k4_script_suppressed(); if r4 != 0 { return r4 }
155 let r5: i64 = k5_collapse_whitespace(); if r5 != 0 { return r5 }
156 let r6: i64 = k6_heading_then_para(); if r6 != 0 { return r6 }
157 return 0
158}