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}