code wiki / _hdl_build / nx_manga_shelf_gate.nx
nx_manga_shelf_gate.nx source
↩ module page · 107 lines · 5772 B
1// nx_manga_shelf_gate.nx -- prove the LOCAL shelf catalog lib (nx_manga_shelf_lib) in ISOLATION on synthetic
2// fixtures: admission (cbz always; allowlisted-author epub; PROVEN comic via extracted cbx.json; prose OUT),
3// marker grouping + volume numbers (" vol1", ", Vol. 1_", bare "volume3"), multi-format dedupe (epub beats
4// pdf), first-token one-shot grouping, ci-alpha order + JSON tail sanity. RUN IN A SCRATCH DIR -- it writes
5// fixture files under ./knowledge/staging/media/. expect_exit: 0 license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_manga_shelf_lib.nx"
8
9func gw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
10func gnum(v: i64) -> i64 { let b: *u8 = sys_mmap(32); let o: i64 = msl_catn(b, 0, v); sys_write(1, b, o); return 0 }
11func gput(path: *u8, body: *u8) -> i64 {
12 let fd: i64 = sys_openat_wr(path, 420)
13 if fd < 0 { gw("FIXTURE WRITE FAIL: " as *u8); gw(path); gw("\n" as *u8); return 0 - 1 }
14 var n: i64 = 0
15 while body[n] != (0 as u8) { n = n + 1 }
16 sys_write(fd, body, n)
17 sys_close(fd)
18 return 0
19}
20func ghas(j: *u8, jn: i64, s: *u8) -> i64 {
21 var sl: i64 = 0
22 while s[sl] != (0 as u8) { sl = sl + 1 }
23 if sl == 0 { return 0 - 1 }
24 var i: i64 = 0
25 while i + sl <= jn {
26 var k: i64 = 0
27 var hit: i64 = 1
28 while k < sl { if j[i + k] != s[k] { hit = 0; k = sl } else { k = k + 1 } }
29 if hit == 1 { return i }
30 i = i + 1
31 }
32 return 0 - 1
33}
34func tooth(name: *u8, ok: i64, fails: *i64) -> i64 {
35 if ok == 1 { gw(" GREEN " as *u8) } else { gw(" RED " as *u8); fails[0] = fails[0] + 1 }
36 gw(name)
37 gw("\n" as *u8)
38 return 0
39}
40
41func main() -> i64 {
42 gw("nx_manga_shelf_gate\n" as *u8)
43 sys_mkdir("knowledge" as *u8, 0x1ed)
44 sys_mkdir("knowledge/staging" as *u8, 0x1ed)
45 sys_mkdir("knowledge/staging/media" as *u8, 0x1ed)
46 sys_mkdir("knowledge/staging/media/reader" as *u8, 0x1ed)
47 gput("knowledge/staging/media/idx_book.wsl" as *u8, "/x/books/Unknown/dlance vol1 aa (10)/dlance vol1 aa - Unknown.cbz\n/x/books/Unknown/dlance vol2 bb (11)/dlance vol2 bb - Unknown.cbz\n/x/books/Kubo, Tite/Bleach, Vol. 1_ Straw (7540)/Bleach 1 - Kubo.epub\n/x/books/Kubo, Tite/Bleach, Vol. 2_ Soul (7541)/Bleach 2 - Kubo.pdf\n/x/books/Kubo, Tite/Bleach, Vol. 2_ Soul (7541)/Bleach 2 - Kubo.epub\n/x/books/Prose, Guy/Some Novel (99)/novel.epub\n/x/books/Prose, Guy/Hidden Comic (98)/hidden.epub\n/x/books/Unknown/samuraivolume3 xx (12)/f.cbz\n/x/books/Unknown/swordsx alpha (13)/f.cbz\n/x/books/Unknown/swordsx beta (14)/f.cbz\n" as *u8)
48 gput("knowledge/staging/media/shelf_authors.txt" as *u8, "Kubo, Tite\n" as *u8)
49 gput("knowledge/staging/media/shelf_markers.txt" as *u8, ", vol\n vol\nvolume\n issue\n chapter\n ch.\n #\n" as *u8)
50 // PROVEN-comic fixture: reader/<slug-of-hidden.epub>/cbx.json
51 let hp: *u8 = "/x/books/Prose, Guy/Hidden Comic (98)/hidden.epub" as *u8
52 let hn: i64 = msl_slen(hp)
53 let slug: *u8 = sys_mmap(32)
54 msl_pathslug(hp, 0, hn, slug)
55 let dir: *u8 = sys_mmap(256)
56 var o: i64 = msl_cats(dir, 0, "knowledge/staging/media/reader/" as *u8)
57 var si: i64 = 0
58 while slug[si] != (0 as u8) { dir[o] = slug[si]; o = o + 1; si = si + 1 }
59 dir[o] = 0 as u8
60 sys_mkdir(dir, 0x1ed)
61 let o2: i64 = msl_cats(dir, o, "/cbx.json" as *u8)
62 dir[o2] = 0 as u8
63 gput(dir, "{\"kind\":\"cbx\",\"cfix\":2,\"pages\":[{\"file\":\"page000.jpg\"}]}" as *u8)
64 // run the lib exactly as /api/shelf will
65 let out: *u8 = sys_mmap(262144)
66 let n: i64 = msl_shelf_json(out, 262144)
67 gw("json bytes=" as *u8)
68 gnum(n)
69 gw("\n" as *u8)
70 let fails: *i64 = sys_mmap(8) as *i64
71 fails[0] = 0
72 var t1: i64 = 0
73 if ghas(out, n, "{\"t\":\"dlance\",\"a\":\"Unknown\",\"n\":2" as *u8) >= 0 { t1 = 1 }
74 tooth("T1 cbz admission + marker series (dlance n=2)" as *u8, t1, fails)
75 var t2: i64 = 0
76 let p1: i64 = ghas(out, n, "dlance vol1 aa\"" as *u8)
77 let p2: i64 = ghas(out, n, "dlance vol2 bb\"" as *u8)
78 if p1 >= 0 { if p2 > p1 { t2 = 1 } }
79 tooth("T2 volumes ordered v1 before v2" as *u8, t2, fails)
80 var t3: i64 = 0
81 if ghas(out, n, "Some Novel" as *u8) < 0 { t3 = 1 }
82 tooth("T3 prose novel excluded" as *u8, t3, fails)
83 var t4: i64 = 0
84 if ghas(out, n, "{\"t\":\"Bleach\",\"a\":\"Kubo, Tite\",\"n\":2" as *u8) >= 0 { t4 = 1 }
85 tooth("T4 allowlisted author admitted + , Vol. cut (Bleach n=2)" as *u8, t4, fails)
86 var t5: i64 = 0
87 if ghas(out, n, "Bleach 2 - Kubo.epub" as *u8) >= 0 { if ghas(out, n, "Bleach 2 - Kubo.pdf" as *u8) < 0 { t5 = 1 } }
88 tooth("T5 multi-format dedupe keeps epub over pdf" as *u8, t5, fails)
89 var t6: i64 = 0
90 if ghas(out, n, "{\"t\":\"Hidden Comic\",\"p\":\"/x/books/Prose, Guy/Hidden Comic (98)/hidden.epub\",\"v\":0,\"x\":1}" as *u8) >= 0 { t6 = 1 }
91 tooth("T6 PROVEN comic admitted via extracted cbx.json (x=1)" as *u8, t6, fails)
92 var t7: i64 = 0
93 if ghas(out, n, "{\"t\":\"samurai\",\"a\":\"Unknown\",\"n\":1" as *u8) >= 0 { if ghas(out, n, "\"v\":3" as *u8) >= 0 { t7 = 1 } }
94 tooth("T7 bare volume marker inside mashed token (samurai v3)" as *u8, t7, fails)
95 var t8: i64 = 0
96 if ghas(out, n, "{\"t\":\"swordsx\",\"a\":\"Unknown\",\"n\":2" as *u8) >= 0 { t8 = 1 }
97 tooth("T8 first-token one-shot grouping (swordsx n=2)" as *u8, t8, fails)
98 var t9: i64 = 0
99 if ghas(out, n, "\"total\":5}" as *u8) >= 0 { if out[n - 1] == (125 as u8) { t9 = 1 } }
100 tooth("T9 five series total + JSON tail" as *u8, t9, fails)
101 if fails[0] == 0 { gw("GATE nx_manga_shelf 9/9 GREEN\n" as *u8); sys_exit(0); return 0 }
102 gw("GATE nx_manga_shelf RED fails=" as *u8)
103 gnum(fails[0])
104 gw("\n" as *u8)
105 sys_exit(1)
106 return 1
107}