nx_scene_demo_test.nx source
↩ module page · 70 lines · 3391 B
1// nx_scene_demo_test.nx -- KAT gate for the sovereign scene + canvas bridge.
2// Verifies rendered pixels (sky/grass/coin) + the emitted canvas page; saves
3// /tmp/scene.html (open it to SEE the sprites). expect_exit: 0.
4
5import "nx_syscalls.nx"
6import "nx_image.nx"
7import "nx_base64.nx"
8import "nx_scene_demo.nx"
9
10func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func wn(v: i64) -> i64 {
12 let b: *u8 = sys_mmap(28); var m: i64 = v
13 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
14 let t: *u8 = sys_mmap(28); var k: i64 = 0
15 if m == 0 { t[0] = 48 as u8; k = 1 }
16 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
17 var i: i64 = 0; while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
18 sys_write(1, b, k); return 0
19}
20func contains(hay: *u8, hn: i64, ndl: *u8) -> i64 {
21 var m: i64 = 0; while ndl[m] != (0 as u8) { m = m + 1 }
22 if m == 0 { return 1 }
23 var i: i64 = 0
24 while i + m <= hn { var j: i64 = 0; var ok: i64 = 1; while j < m { if hay[i + j] != ndl[j] { ok = 0; j = m } else { j = j + 1 } } if ok == 1 { return 1 } i = i + 1 }
25 return 0
26}
27func chk(cond: i64, pass: *i64, fail: *i64, label: *u8) -> i64 {
28 if cond == 1 { pass[0] = pass[0] + 1; w(" ok " as *u8); w(label); w("\n" as *u8) }
29 else { fail[0] = fail[0] + 1; w(" XX " as *u8); w(label); w("\n" as *u8) }
30 return 0
31}
32func px_is(img: *Image, x: i64, y: i64, r: i64, g: i64, b: i64) -> i64 {
33 if nx_image_get(img, x, y, 0) != r { return 0 }
34 if nx_image_get(img, x, y, 1) != g { return 0 }
35 if nx_image_get(img, x, y, 2) != b { return 0 }
36 return 1
37}
38
39func main() -> i64 {
40 let pass: *i64 = (sys_mmap(8)) as *i64
41 let fail: *i64 = (sys_mmap(8)) as *i64
42 pass[0] = 0
43 fail[0] = 0
44 w("=== nx_scene_demo KAT (sovereign sprites + canvas) ===\n" as *u8)
45
46 let img: *Image = nx_scene_build()
47 chk(px_is(img, 0, 0, 135, 206, 235), pass, fail, "sky pixel = blue" as *u8)
48 chk(px_is(img, 0, 40, 92, 160, 74), pass, fail, "grass pixel = green" as *u8)
49 chk(px_is(img, 12, 22, 200, 230, 255), pass, fail, "factory window = light" as *u8)
50 chk(px_is(img, 36, 37, 255, 200, 40), pass, fail, "coin sprite pixel = gold" as *u8)
51 // a transparent corner of the coin grid should NOT be gold (shows grass under it)
52 chk(px_is(img, 33, 34, 92, 160, 74), pass, fail, "coin corner transparent (grass shows)" as *u8)
53
54 let out: *u8 = sys_mmap(262144)
55 let len: i64 = nx_img_canvas_page(img, 8, out, 262144)
56 w(" canvas page bytes=" as *u8); wn(len); w("\n" as *u8)
57 chk(len > 5000, pass, fail, "canvas page non-trivial" as *u8)
58 chk(contains(out, len, "<canvas id=c" as *u8) == 1, pass, fail, "has <canvas>" as *u8)
59 chk(contains(out, len, "createImageData" as *u8) == 1, pass, fail, "uses ImageData" as *u8)
60 chk(contains(out, len, "putImageData" as *u8) == 1, pass, fail, "blits pixels" as *u8)
61 chk(contains(out, len, "image-rendering:pixelated" as *u8) == 1, pass, fail, "pixel-perfect scaling" as *u8)
62
63 let wr: i64 = nx_scene_save("/tmp/scene.html" as *u8, 8)
64 w(" wrote /tmp/scene.html bytes=" as *u8); wn(wr); w("\n" as *u8)
65 chk(wr > 5000, pass, fail, "/tmp/scene.html saved" as *u8)
66
67 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8)
68 if fail[0] == 0 { return 0 }
69 return 1
70}