nx_toner_liberate_test.nx source
↩ module page · 70 lines · 3286 B
1// nx_toner_liberate_test.nx -- gate for the toner-liberation classifier. Unique exit codes per invariant:
2// 1x idle + accepting + toner-low-warning (the REAL Brother) -> PRINTS_NOW, toner_flag=1
3// 2x stopped + toner-empty-error -> NEEDS_CONTINUE, toner_flag=1
4// 3x idle + NOT accepting + marker-supply-low-warning -> NEEDS_RESET, toner_flag=1
5// 4x healthy idle + accepting + none -> PRINTS_NOW, toner_flag=0
6// 5x malformed response -> UNKNOWN
7// expect_exit: 0 license_tier: ORIGINAL
8
9import "nx_syscalls.nx"
10import "nx_ipp_codec.nx"
11import "nx_toner_liberate.nx"
12
13func 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 }
14
15func base(buf: *u8, state: i64, accepting: i64) -> i64 {
16 var o: i64 = nx_ipp_begin(buf, 1, 1, NX_IPP_STATUS_OK, 1)
17 o = nx_ipp_group(buf, o, NX_IPP_GRP_PRINTER)
18 o = nx_ipp_attr_int(buf, o, NX_IPP_VT_ENUM, "printer-state", 13, state)
19 o = nx_ipp_attr_bool(buf, o, "printer-is-accepting-jobs", 25, accepting)
20 return o
21}
22
23func main() -> i64 {
24 let sc: *i64 = sys_mmap(128) as *i64
25 let tf: *i64 = sys_mmap(16) as *i64
26
27 // KAT 1: the real Brother -- idle, accepting, toner-low-warning
28 let a: *u8 = sys_mmap(2048)
29 var oa: i64 = base(a, NX_IPP_PSTATE_IDLE, 1)
30 oa = nx_ipp_attr(a, oa, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "toner-low-warning", 17)
31 oa = nx_ipp_end(a, oa)
32 if nx_toner_liberate(a, oa, sc, tf) != NX_TL_PRINTS_NOW { return 1 }
33 if tf[0] != 1 { return 2 }
34
35 // KAT 2: stopped + toner-empty-error -> NEEDS_CONTINUE
36 let b: *u8 = sys_mmap(2048)
37 var ob: i64 = base(b, NX_IPP_PSTATE_STOPPED, 1)
38 ob = nx_ipp_attr(b, ob, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "toner-empty-error", 17)
39 ob = nx_ipp_end(b, ob)
40 if nx_toner_liberate(b, ob, sc, tf) != NX_TL_NEEDS_CONTINUE { return 10 }
41 if tf[0] != 1 { return 11 }
42
43 // KAT 3: idle + NOT accepting + marker-supply-low-warning -> NEEDS_RESET
44 let c: *u8 = sys_mmap(2048)
45 var oc: i64 = base(c, NX_IPP_PSTATE_IDLE, 0)
46 oc = nx_ipp_attr(c, oc, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "marker-supply-low-warning", 25)
47 oc = nx_ipp_end(c, oc)
48 if nx_toner_liberate(c, oc, sc, tf) != NX_TL_NEEDS_RESET { return 20 }
49
50 // KAT 4: healthy -> PRINTS_NOW, no toner flag
51 let d: *u8 = sys_mmap(2048)
52 var od: i64 = base(d, NX_IPP_PSTATE_IDLE, 1)
53 od = nx_ipp_attr(d, od, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "none", 4)
54 od = nx_ipp_end(d, od)
55 if nx_toner_liberate(d, od, sc, tf) != NX_TL_PRINTS_NOW { return 30 }
56 if tf[0] != 0 { return 31 }
57
58 // KAT 5: malformed (value-length overrun) -> UNKNOWN
59 let e: *u8 = sys_mmap(2048)
60 var oe: i64 = base(e, NX_IPP_PSTATE_IDLE, 1)
61 e[oe] = NX_IPP_VT_ENUM as u8
62 oe = oe + 1
63 oe = nx_ipp_put_u16(e, oe, 13)
64 oe = nx_ipp_memcpy(e, oe, "printer-state", 13)
65 oe = nx_ipp_put_u16(e, oe, 0x7fff) // lying length
66 if nx_toner_liberate(e, oe, sc, tf) != NX_TL_UNKNOWN { return 40 }
67
68 t_puts("nx_toner_liberate: 5/5 KAT groups PASS (prints-now + needs-continue + needs-reset + healthy + malformed->unknown)\n")
69 return 0
70}