code wiki / (root) / nx_html_to_text_test.nx

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 "&amp; &lt; &gt;" → "& < >" 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 // "&amp; &lt; &gt;" 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}