code wiki / (root) / nx_scene_demo_test.nx

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}