code wiki / (root) / nx_html_to_text_entity_test.nx

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 "&#39;" -> "'" decimal numeric ref 6// E2 "&#x27;" -> "'" hex numeric ref (lowercase x) 7// E3 "&#X41;" -> "A" hex numeric ref (uppercase X) 8// E4 "&#8217;" -> U+2019 (E2 80 99) numeric ref >= 0x80 -> UTF-8 9// E5 "&apos;" -> "'" named entity (newly added) 10// E6 recorded snippet "<p>Claude&#x27;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: "&#39;" -> "'" 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: "&#x27;" -> "'" 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: "&#X41;" -> "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: "&#8217;" -> 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: "&apos;" -> "'" 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&#x27;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 // &#x27; 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}