nx_gltf_preserve_canonical_gate_t145.nx source
↩ module page · 49 lines · 5191 B
1import "nx_gltf_load.nx"
2import "nx_gate_verdict.nx"
3func gp_test(src:*u8,want:i64,ctr:*i64,label:*u8)->i64 {
4 let n:i64=gll_slen(src);let out:*u8=sys_mmap(n+64)
5 if (out as i64)<=0{return 1}
6 let got:i64=gltf_json_to_glb(src,n,out,n+64)
7 gv_puts(label);gv_puts(" result=" as *u8);gv_num(got);gv_puts("\n" as *u8)
8 var ok:i64=(got==want) as i64
9 if want==1 {ok=(got>0) as i64}
10 gv_check(label,ok,ctr);sys_munmap(out,n+64);return ok
11}
12func gp_file(path:*u8,dest:*u8,n:i64,ctr:*i64)->i64 {
13 let src:*u8=sys_mmap(n+1);let out:*u8=sys_mmap(n+64)
14 if (src as i64)<=0{return 1};if (out as i64)<=0{return 1}
15 let read:i64=cgo_read(path,src,n+1)
16 gv_check(path,(read==n) as i64,ctr)
17 var result:i64=-1
18 if read==n {result=gltf_json_to_glb(src,n,out,n+64)}
19 gv_puts(path);gv_puts(" glb_bytes=" as *u8);gv_num(result);gv_puts("\n" as *u8)
20 gv_check("actual JSON normalized" as *u8,(result>0) as i64,ctr)
21 if result>0 {
22 let fd:i64=sys_openat_wr(dest,420)
23 var wrote:i64=0
24 if fd>=0 {while wrote<result {let k:i64=sys_write(fd,(out as i64+wrote) as *u8,result-wrote);if k<=0{break};wrote=wrote+k};sys_close(fd)}
25 gv_check(dest,(wrote==result) as i64,ctr)
26 }
27 sys_munmap(src,n+1);sys_munmap(out,n+64);return result
28}
29func main()->i64 {
30 let ctr:*i64=gv_ctr()
31 gv_head("GLTF preserved JSON/BIN container qualification; no renderer acceptance" as *u8)
32 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,1,ctr,"preserved positive" as *u8)
33 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"uri\":\"data:application/octet-stream;base64,AQID\",\"byteLength\":3}]}" as *u8,1,ctr,"uri first" as *u8)
34 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\",\"name\":\"b\"}]}" as *u8,1,ctr,"uri middle" as *u8)
35 gp_test("{\"asset\":{\"version\":\"1.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-12,ctr,"legacy version" as *u8)
36 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"},{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-14,ctr,"multiple buffers" as *u8)
37 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"result.bin\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-18,ctr,"external URI" as *u8)
38 gp_test("{\"asset\":,}" as *u8,-10,ctr,"invalid JSON" as *u8)
39 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}{}" as *u8,-10,ctr,"trailing JSON" as *u8)
40 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-15,ctr,"duplicate buffer property" as *u8)
41 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQ=Z\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-19,ctr,"bad Base64 padding" as *u8)
42 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":2,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-19,ctr,"incorrect byteLength" as *u8)
43 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":1,\"uri\":\"data:application/octet-stream;base64,AR==\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,-19,ctr,"noncanonical pad bits" as *u8)
44 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":1,\"uri\":\"data:application/octet-stream;base64,AQ==\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1e-20}}}" as *u8,1,ctr,"valid padded" as *u8)
45 gp_test("{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":3,\"uri\":\"data:application/octet-stream;base64,AQID\"}],\"nodes\":[{\"rotation\":[0.123456789012345,0,0,1]}],\"extensions\":{\"unknown\":{\"value\":1E+20}}}" as *u8,1,ctr,"number exponent preserved" as *u8)
46 gp_file("/tmp/supplied-phase4-t144.gltf" as *u8,"/tmp/supplied-phase4-preserved-t145.glb" as *u8,12862598,ctr)
47 gp_file("/tmp/supplied-dancing-t144.gltf" as *u8,"/tmp/supplied-dancing-preserved-t145.glb" as *u8,28022043,ctr)
48 return gv_verdict("GLTF-PRESERVE" as *u8,ctr,"container preservation only; independent semantic comparison pending" as *u8)
49}