nx_doc_to_urf_test.nx source
↩ module page · 54 lines · 2191 B
1// nx_doc_to_urf_test.nx -- gate for the multi-page document->URF encoder. Unique exit codes per invariant:
2// 1x 6 explicit lines on a tiny page (~4 lines/page) -> 2 pages
3// 2x URF file header valid: "UNIRAST\0" + pageCount BE == 2
4// 3x page-1 header has correct width (BE) at the right offset
5// 4x page-1 RLE decodes back to W*H pixels (valid raster)
6// expect_exit: 0 license_tier: ORIGINAL
7
8import "nx_syscalls.nx"
9import "nx_font8x8.nx"
10import "nx_doc_layout.nx"
11import "nx_pwg_rle.nx"
12import "nx_urf.nx"
13import "nx_doc_to_urf.nx"
14
15func t_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
16func be32(d: *u8, o: i64) -> i64 {
17 return ((d[o] as i64) << 24) | ((d[o + 1] as i64) << 16) | ((d[o + 2] as i64) << 8) | (d[o + 3] as i64)
18}
19
20func main() -> i64 {
21 let table: *u8 = font8x8_table()
22 let W: i64 = 80
23 let H: i64 = 40
24 let bm: *u8 = sys_mmap(W * H)
25 let out: *u8 = sys_mmap(65536)
26 let pages: *i64 = sys_mmap(8) as *i64
27 let covsum: *i64 = sys_mmap(8) as *i64
28
29 // 6 short lines; tiny page fits ~4 -> 2 pages
30 let txt: *u8 = "LINE ONE\nLINE TWO\nLINE 3X\nLINE 4X\nLINE 5X\nLINE 6X\n"
31 let total: i64 = nx_doc_to_urf(out, bm, W, H, table, txt, 1, 2, 2, 2, 2, 1, 300, NX_URF_DUP_LONG, NX_URF_Q_NORMAL, pages, covsum)
32
33 if pages[0] != 2 { return 1 }
34 if covsum[0] <= 0 { return 2 }
35
36 // file header "UNIRAST\0"
37 if (out[0] as i64) != 0x55 { return 20 }
38 if (out[1] as i64) != 0x4E { return 21 }
39 if (out[6] as i64) != 0x54 { return 22 }
40 if (out[7] as i64) != 0x00 { return 23 }
41 if be32(out, 8) != 2 { return 24 } // pageCount
42
43 // page-1 header at offset 12; width at +12 (=offset 24), height at +16 (=offset 28)
44 if be32(out, 24) != W { return 30 }
45 if be32(out, 28) != H { return 31 }
46
47 // page-1 RLE starts at offset 44 -> decodes to W*H pixels
48 let dec: *u8 = sys_mmap(W * H)
49 let px: i64 = nx_rle_decode(((out as i64) + 44) as *u8, total - 44, W, H, 1, dec, W * H)
50 if px != W * H { return 40 }
51
52 t_puts("nx_doc_to_urf: 4/4 KAT PASS (2 pages + UNIRAST header + pageCount + page-1 decodes)\n")
53 return 0
54}