nx_html_to_text_entity_test.nx source
↩ module page · 136 lines · 5661 B
1// nx_html_to_text_entity_test.nx -- X-HTML-ENT-001 KAT: HTML character-
2// reference decoding in the sovereign browser's text renderer.
3//
4// Corpus (each a distinct exit code on failure):
5// E1 "'" -> "'" decimal numeric ref
6// E2 "'" -> "'" hex numeric ref (lowercase x)
7// E3 "A" -> "A" hex numeric ref (uppercase X)
8// E4 "’" -> U+2019 (E2 80 99) numeric ref >= 0x80 -> UTF-8
9// E5 "'" -> "'" named entity (newly added)
10// E6 recorded snippet "<p>Claude's Constitution</p>"
11// -> "Claude's Constitution\n" (the anthropic.com case)
12// E7 "&#;" -> "&#;" malformed: graceful literal, no skip
13//
14// E4 is the build-intelligence check (codepoint faithfully UTF-8 encoded,
15// not dropped). E7 is the no-silent-skip check (malformed ref renders
16// literally, never crashes or vanishes).
17//
18// expect_exit: 0
19// license_tier: ORIGINAL
20
21import "nx_syscalls.nx"
22import "nx_html_to_text.nx"
23
24func ent_eq(got: *u8, got_len: i64, exp: *u8, exp_len: i64) -> i64 {
25 if got_len != exp_len { return 0 }
26 var i: i64 = 0
27 while i < got_len {
28 if (got[i] & 0xff) != (exp[i] & 0xff) { return 0 }
29 i = i + 1
30 }
31 return 1
32}
33
34// E1: "'" -> "'"
35func e1_decimal() -> i64 {
36 let src: *u8 = sys_mmap(16)
37 src[0]=0x26; src[1]=0x23; src[2]=0x33; src[3]=0x39; src[4]=0x3b // & # 3 9 ;
38 let out: *u8 = sys_mmap(64)
39 let n: i64 = nx_html_to_text(src, 5, out, 64)
40 let exp: *u8 = sys_mmap(8); exp[0]=0x27 // '
41 if ent_eq(out, n, exp, 1) != 1 { return 11 }
42 return 0
43}
44
45// E2: "'" -> "'"
46func e2_hex_lower() -> i64 {
47 let src: *u8 = sys_mmap(16)
48 src[0]=0x26; src[1]=0x23; src[2]=0x78; src[3]=0x32; src[4]=0x37; src[5]=0x3b // & # x 2 7 ;
49 let out: *u8 = sys_mmap(64)
50 let n: i64 = nx_html_to_text(src, 6, out, 64)
51 let exp: *u8 = sys_mmap(8); exp[0]=0x27
52 if ent_eq(out, n, exp, 1) != 1 { return 22 }
53 return 0
54}
55
56// E3: "A" -> "A"
57func e3_hex_upper() -> i64 {
58 let src: *u8 = sys_mmap(16)
59 src[0]=0x26; src[1]=0x23; src[2]=0x58; src[3]=0x34; src[4]=0x31; src[5]=0x3b // & # X 4 1 ;
60 let out: *u8 = sys_mmap(64)
61 let n: i64 = nx_html_to_text(src, 6, out, 64)
62 let exp: *u8 = sys_mmap(8); exp[0]=0x41 // A
63 if ent_eq(out, n, exp, 1) != 1 { return 33 }
64 return 0
65}
66
67// E4: "’" -> U+2019 right single quote -> UTF-8 E2 80 99
68func e4_utf8() -> i64 {
69 let src: *u8 = sys_mmap(16)
70 src[0]=0x26; src[1]=0x23; src[2]=0x38; src[3]=0x32 // & # 8 2
71 src[4]=0x31; src[5]=0x37; src[6]=0x3b // 1 7 ;
72 let out: *u8 = sys_mmap(64)
73 let n: i64 = nx_html_to_text(src, 7, out, 64)
74 let exp: *u8 = sys_mmap(8); exp[0]=0xe2; exp[1]=0x80; exp[2]=0x99
75 if ent_eq(out, n, exp, 3) != 1 { return 44 }
76 return 0
77}
78
79// E5: "'" -> "'"
80func e5_apos() -> i64 {
81 let src: *u8 = sys_mmap(16)
82 src[0]=0x26; src[1]=0x61; src[2]=0x70; src[3]=0x6f; src[4]=0x73; src[5]=0x3b // & a p o s ;
83 let out: *u8 = sys_mmap(64)
84 let n: i64 = nx_html_to_text(src, 6, out, 64)
85 let exp: *u8 = sys_mmap(8); exp[0]=0x27
86 if ent_eq(out, n, exp, 1) != 1 { return 55 }
87 return 0
88}
89
90// E6: recorded anthropic.com snippet "<p>Claude's Constitution</p>"
91// -> "Claude's Constitution\n"
92func e6_recorded() -> i64 {
93 let src: *u8 = sys_mmap(64)
94 src[0]=0x3c; src[1]=0x70; src[2]=0x3e // < p >
95 src[3]=0x43; src[4]=0x6c; src[5]=0x61; src[6]=0x75; src[7]=0x64; src[8]=0x65 // Claude
96 src[9]=0x26; src[10]=0x23; src[11]=0x78; src[12]=0x32; src[13]=0x37; src[14]=0x3b // '
97 src[15]=0x73; src[16]=0x20 // s SPACE
98 src[17]=0x43; src[18]=0x6f; src[19]=0x6e; src[20]=0x73; src[21]=0x74 // Const
99 src[22]=0x69; src[23]=0x74; src[24]=0x75; src[25]=0x74; src[26]=0x69 // ituti
100 src[27]=0x6f; src[28]=0x6e // on
101 src[29]=0x3c; src[30]=0x2f; src[31]=0x70; src[32]=0x3e // < / p >
102 let out: *u8 = sys_mmap(64)
103 let n: i64 = nx_html_to_text(src, 33, out, 64)
104 let exp: *u8 = sys_mmap(64)
105 exp[0]=0x43; exp[1]=0x6c; exp[2]=0x61; exp[3]=0x75; exp[4]=0x64; exp[5]=0x65 // Claude
106 exp[6]=0x27; exp[7]=0x73; exp[8]=0x20 // ' s SPACE
107 exp[9]=0x43; exp[10]=0x6f; exp[11]=0x6e; exp[12]=0x73; exp[13]=0x74 // Const
108 exp[14]=0x69; exp[15]=0x74; exp[16]=0x75; exp[17]=0x74; exp[18]=0x69 // ituti
109 exp[19]=0x6f; exp[20]=0x6e // on
110 exp[21]=0x0a // \n
111 if ent_eq(out, n, exp, 22) != 1 { return 66 }
112 return 0
113}
114
115// E7: "&#;" -> "&#;" (malformed numeric ref: no silent skip, no crash)
116func e7_malformed() -> i64 {
117 let src: *u8 = sys_mmap(16)
118 src[0]=0x26; src[1]=0x23; src[2]=0x3b // & # ;
119 let out: *u8 = sys_mmap(64)
120 let n: i64 = nx_html_to_text(src, 3, out, 64)
121 let exp: *u8 = sys_mmap(8); exp[0]=0x26; exp[1]=0x23; exp[2]=0x3b
122 if ent_eq(out, n, exp, 3) != 1 { return 77 }
123 return 0
124}
125
126func main() -> i64 {
127 var r: i64 = 0
128 r = e1_decimal(); if r != 0 { return r }
129 r = e2_hex_lower(); if r != 0 { return r }
130 r = e3_hex_upper(); if r != 0 { return r }
131 r = e4_utf8(); if r != 0 { return r }
132 r = e5_apos(); if r != 0 { return r }
133 r = e6_recorded(); if r != 0 { return r }
134 r = e7_malformed(); if r != 0 { return r }
135 return 0
136}