code wiki / (root) / nx_deflate_byte_diff_test.nx

nx_deflate_byte_diff_test.nx source

↩ module page · 113 lines · 3692 B

1// nx_deflate_byte_diff_test.nx -- byte-by-byte compare nx_deflate output 2// against the EXPECTED 7550-byte raw bytes for the 50x50 PNG case. 3// 4// Returns 0 on full byte-match. 5// On mismatch, returns 1 + (mismatch_index % 250) so we can localize 6// which region of the output diverges. (Exit codes are mod 256, so 7// for indices >= 250 we shift modulus; first call gives the band.) 8 9import "nx_syscalls.nx" 10import "nx_deflate.nx" 11 12func main() -> i64 { 13 // 61-byte raw dynamic-Huffman DEFLATE stream (same as in 14 // nx_deflate_huffman_test.nx Test 3). 15 let dyn_in: *u8 = (sys_mmap(64)) as *u8 16 dyn_in[0] = 0xed as u8 17 dyn_in[1] = 0xce as u8 18 dyn_in[2] = 0x41 as u8 19 dyn_in[3] = 0x0d as u8 20 dyn_in[4] = 0x00 as u8 21 dyn_in[5] = 0x20 as u8 22 dyn_in[6] = 0x0c as u8 23 dyn_in[7] = 0x00 as u8 24 dyn_in[8] = 0xb1 as u8 25 dyn_in[9] = 0xf9 as u8 26 dyn_in[10] = 0x17 as u8 27 dyn_in[11] = 0x80 as u8 28 dyn_in[12] = 0x08 as u8 29 dyn_in[13] = 0x94 as u8 30 dyn_in[14] = 0x4c as u8 31 dyn_in[15] = 0x16 as u8 32 dyn_in[16] = 0x32 as u8 33 dyn_in[17] = 0xb8 as u8 34 dyn_in[18] = 0x47 as u8 35 dyn_in[19] = 0x93 as u8 36 dyn_in[20] = 0x0a as u8 37 dyn_in[21] = 0xe8 as u8 38 dyn_in[22] = 0xec as u8 39 dyn_in[23] = 0x3d as u8 40 dyn_in[24] = 0x41 as u8 41 dyn_in[25] = 0xf3 as u8 42 dyn_in[26] = 0x7d as u8 43 dyn_in[27] = 0xa0 as u8 44 dyn_in[28] = 0xa5 as u8 45 dyn_in[29] = 0xa5 as u8 46 dyn_in[30] = 0xa5 as u8 47 dyn_in[31] = 0xa5 as u8 48 dyn_in[32] = 0xa5 as u8 49 dyn_in[33] = 0xd5 as u8 50 dyn_in[34] = 0xa0 as u8 51 dyn_in[35] = 0xa5 as u8 52 dyn_in[36] = 0xa5 as u8 53 dyn_in[37] = 0x55 as u8 54 dyn_in[38] = 0xa0 as u8 55 dyn_in[39] = 0xa5 as u8 56 dyn_in[40] = 0xa5 as u8 57 dyn_in[41] = 0x55 as u8 58 dyn_in[42] = 0xa0 as u8 59 dyn_in[43] = 0xa5 as u8 60 dyn_in[44] = 0xa5 as u8 61 dyn_in[45] = 0x55 as u8 62 dyn_in[46] = 0xa0 as u8 63 dyn_in[47] = 0xa5 as u8 64 dyn_in[48] = 0xa5 as u8 65 dyn_in[49] = 0x55 as u8 66 dyn_in[50] = 0xa0 as u8 67 dyn_in[51] = 0xa5 as u8 68 dyn_in[52] = 0xa5 as u8 69 dyn_in[53] = 0x55 as u8 70 dyn_in[54] = 0xa0 as u8 71 dyn_in[55] = 0xa5 as u8 72 dyn_in[56] = 0xa5 as u8 73 dyn_in[57] = 0x55 as u8 74 dyn_in[58] = 0x10 as u8 75 dyn_in[59] = 0x6d as u8 76 dyn_in[60] = 0x3d as u8 77 78 let r: *NxDeflateResult = nx_deflate_inflate(dyn_in, 61, 8192) 79 if r == (0 as *NxDeflateResult) { return 250 } 80 if r.error_code != NX_DEF_OK { return 251 } 81 if r.output_size != 7550 { return 252 } 82 83 // Build expected: 50 scanlines, each = filter(0x00) + 50*(0xc8 0xaa 0x96) 84 let stride: i64 = 1 + 50 * 3 85 var first_bad: i64 = -1 86 var y: i64 = 0 87 while y < 50 { 88 let row_off: i64 = y * stride 89 // filter byte 90 let got_f: i64 = (r.output_data[row_off] as i64) & 255 91 if got_f != 0 { 92 if first_bad < 0 { first_bad = row_off } 93 } 94 var x: i64 = 0 95 while x < 50 { 96 let p: i64 = row_off + 1 + x * 3 97 let g_r: i64 = (r.output_data[p] as i64) & 255 98 let g_g: i64 = (r.output_data[p + 1] as i64) & 255 99 let g_b: i64 = (r.output_data[p + 2] as i64) & 255 100 if g_r != 200 { if first_bad < 0 { first_bad = p } } 101 if g_g != 170 { if first_bad < 0 { first_bad = p + 1 } } 102 if g_b != 150 { if first_bad < 0 { first_bad = p + 2 } } 103 x = x + 1 104 } 105 y = y + 1 106 } 107 108 if first_bad < 0 { return 0 } 109 // Encode first mismatch index into the exit code. 110 // 7550 / 250 = 30 bands. Return 1..30 = band index (band of 250 bytes). 111 let band: i64 = (first_bad / 250) + 1 112 return band 113}