nx_value_parse_json_test.nx source
↩ module page · 148 lines · 7070 B
1// nx_value_parse_json_test.nx -- proves the generic JSON DOM works
2// against REAL upstream data, not hand-coded toy strings.
3//
4// Reads ../nishi-library/fixtures/gbif/solanum_tuberosum.raw (a 450-byte
5// canonical GBIF /v1/species/match response captured 2026-05-17) via
6// sys_read_file, parses to NxValue tree, then walks the tree GENERICALLY
7// via nx_value_object_get_string/_int -- with NO source-specific code.
8//
9// If this PASSes, we have a substrate that can ingest ANY JSON-shaped
10// upstream into a typed tree.
11
12import "syscalls.nx"
13import "nx_value.nx"
14import "nx_value_parse_json.nx"
15
16func make_path_solanum(out: *u8) -> i64 {
17 out[0] = 0x2E; out[1] = 0x2E; out[2] = 0x2F
18 out[3] = 0x2E; out[4] = 0x2E; out[5] = 0x2F
19 out[6] = 0x6E; out[7] = 0x69; out[8] = 0x73; out[9] = 0x68
20 out[10] = 0x69; out[11] = 0x2D; out[12] = 0x6C; out[13] = 0x69
21 out[14] = 0x62; out[15] = 0x72; out[16] = 0x61; out[17] = 0x72
22 out[18] = 0x79; out[19] = 0x2F
23 out[20] = 0x66; out[21] = 0x69; out[22] = 0x78; out[23] = 0x74
24 out[24] = 0x75; out[25] = 0x72; out[26] = 0x65; out[27] = 0x73
25 out[28] = 0x2F
26 out[29] = 0x67; out[30] = 0x62; out[31] = 0x69; out[32] = 0x66
27 out[33] = 0x2F
28 out[34] = 0x73; out[35] = 0x6F; out[36] = 0x6C; out[37] = 0x61
29 out[38] = 0x6E; out[39] = 0x75; out[40] = 0x6D; out[41] = 0x5F
30 out[42] = 0x74; out[43] = 0x75; out[44] = 0x62; out[45] = 0x65
31 out[46] = 0x72; out[47] = 0x6F; out[48] = 0x73; out[49] = 0x75
32 out[50] = 0x6D; out[51] = 0x2E; out[52] = 0x72; out[53] = 0x61
33 out[54] = 0x77; out[55] = 0
34 return 55
35}
36
37func main() -> i64 {
38 // ----- Toy round-trip: parse a hand-built JSON literal --------
39 // {"a":1,"b":"x","c":[10,20],"d":true,"e":null}
40 let toy: *u8 = sys_mmap(64)
41 toy[0] = 0x7B; toy[1] = 0x22; toy[2] = 0x61; toy[3] = 0x22 // {"a"
42 toy[4] = 0x3A; toy[5] = 0x31; toy[6] = 0x2C // :1,
43 toy[7] = 0x22; toy[8] = 0x62; toy[9] = 0x22; toy[10] = 0x3A // "b":
44 toy[11] = 0x22; toy[12] = 0x78; toy[13] = 0x22; toy[14] = 0x2C // "x",
45 toy[15] = 0x22; toy[16] = 0x63; toy[17] = 0x22; toy[18] = 0x3A // "c":
46 toy[19] = 0x5B; toy[20] = 0x31; toy[21] = 0x30; toy[22] = 0x2C // [10,
47 toy[23] = 0x32; toy[24] = 0x30; toy[25] = 0x5D; toy[26] = 0x2C // 20],
48 toy[27] = 0x22; toy[28] = 0x64; toy[29] = 0x22; toy[30] = 0x3A // "d":
49 toy[31] = 0x74; toy[32] = 0x72; toy[33] = 0x75; toy[34] = 0x65 // true
50 toy[35] = 0x2C // ,
51 toy[36] = 0x22; toy[37] = 0x65; toy[38] = 0x22; toy[39] = 0x3A // "e":
52 toy[40] = 0x6E; toy[41] = 0x75; toy[42] = 0x6C; toy[43] = 0x6C // null
53 toy[44] = 0x7D // }
54
55 var v: i64 = 0
56 let root: *NxValue = nx_value_parse_json(toy, 45, &v)
57 if v != NX_VAL_PARSE_OK { return __syscall(93, 1, 0, 0, 0, 0, 0) }
58 if root == 0 as *NxValue { return __syscall(93, 2, 0, 0, 0, 0, 0) }
59 if root.kind != NX_VAL_OBJECT { return __syscall(93, 3, 0, 0, 0, 0, 0) }
60 if root.n_items != 5 { return __syscall(93, 4, 0, 0, 0, 0, 0) }
61
62 // "a" -> int 1
63 let k_a: *u8 = sys_mmap(2); k_a[0] = 0x61
64 var got_a: i64 = 0
65 if nx_value_object_get_int(root, k_a, 1, &got_a) != 1 { return __syscall(93, 5, 0, 0, 0, 0, 0) }
66 if got_a != 1 { return __syscall(93, 6, 0, 0, 0, 0, 0) }
67
68 // "b" -> string "x"
69 let k_b: *u8 = sys_mmap(2); k_b[0] = 0x62
70 var bp: *u8 = 0 as *u8
71 var bl: i64 = 0
72 if nx_value_object_get_string(root, k_b, 1, &bp, &bl) != 1 { return __syscall(93, 7, 0, 0, 0, 0, 0) }
73 if bl != 1 { return __syscall(93, 8, 0, 0, 0, 0, 0) }
74 if bp[0] != 0x78 { return __syscall(93, 9, 0, 0, 0, 0, 0) }
75
76 // "c" -> array [10, 20]
77 let k_c: *u8 = sys_mmap(2); k_c[0] = 0x63
78 let c_node: *NxValue = nx_value_object_get(root, k_c, 1)
79 if c_node == 0 as *NxValue { return __syscall(93, 10, 0, 0, 0, 0, 0) }
80 if c_node.kind != NX_VAL_ARRAY { return __syscall(93, 11, 0, 0, 0, 0, 0) }
81 if nx_value_array_len(c_node) != 2 { return __syscall(93, 12, 0, 0, 0, 0, 0) }
82 let c0: *NxValue = nx_value_array_get(c_node, 0)
83 if c0.int_value != 10 { return __syscall(93, 13, 0, 0, 0, 0, 0) }
84 let c1: *NxValue = nx_value_array_get(c_node, 1)
85 if c1.int_value != 20 { return __syscall(93, 14, 0, 0, 0, 0, 0) }
86
87 // "d" -> bool true
88 let k_d: *u8 = sys_mmap(2); k_d[0] = 0x64
89 let d_node: *NxValue = nx_value_object_get(root, k_d, 1)
90 if d_node.kind != NX_VAL_BOOL { return __syscall(93, 15, 0, 0, 0, 0, 0) }
91 if d_node.int_value != 1 { return __syscall(93, 16, 0, 0, 0, 0, 0) }
92
93 // "e" -> null
94 let k_e: *u8 = sys_mmap(2); k_e[0] = 0x65
95 let e_node: *NxValue = nx_value_object_get(root, k_e, 1)
96 if e_node.kind != NX_VAL_NULL { return __syscall(93, 17, 0, 0, 0, 0, 0) }
97
98 // ----- REAL GBIF fixture round-trip --------------------------
99 let path: *u8 = sys_mmap(64)
100 make_path_solanum(path)
101 let lenbox: *u8 = sys_mmap(8)
102 let lp: *i64 = lenbox as *i64
103 let bytes: *u8 = sys_read_file(path, lp)
104 if bytes == 0 as *u8 { return __syscall(93, 20, 0, 0, 0, 0, 0) }
105
106 var v2: i64 = 0
107 let gbif_root: *NxValue = nx_value_parse_json(bytes, *lp, &v2)
108 if v2 != NX_VAL_PARSE_OK { return __syscall(93, 21, 0, 0, 0, 0, 0) }
109 if gbif_root.kind != NX_VAL_OBJECT { return __syscall(93, 22, 0, 0, 0, 0, 0) }
110 // GBIF species/match response has many keys; ensure at least 10
111 if gbif_root.n_items < 10 { return __syscall(93, 23, 0, 0, 0, 0, 0) }
112
113 // Get canonicalName
114 let kn_cn: *u8 = sys_mmap(16)
115 kn_cn[0] = 0x63; kn_cn[1] = 0x61; kn_cn[2] = 0x6E; kn_cn[3] = 0x6F
116 kn_cn[4] = 0x6E; kn_cn[5] = 0x69; kn_cn[6] = 0x63; kn_cn[7] = 0x61
117 kn_cn[8] = 0x6C; kn_cn[9] = 0x4E; kn_cn[10] = 0x61; kn_cn[11] = 0x6D
118 kn_cn[12] = 0x65 // "canonicalName"
119 var cnp: *u8 = 0 as *u8
120 var cnl: i64 = 0
121 if nx_value_object_get_string(gbif_root, kn_cn, 13, &cnp, &cnl) != 1 {
122 return __syscall(93, 24, 0, 0, 0, 0, 0)
123 }
124 if cnl != 17 { return __syscall(93, 25, 0, 0, 0, 0, 0) } // "Solanum tuberosum"
125
126 // Get usageKey
127 let kn_uk: *u8 = sys_mmap(16)
128 kn_uk[0] = 0x75; kn_uk[1] = 0x73; kn_uk[2] = 0x61; kn_uk[3] = 0x67
129 kn_uk[4] = 0x65; kn_uk[5] = 0x4B; kn_uk[6] = 0x65; kn_uk[7] = 0x79
130 var uk: i64 = 0
131 if nx_value_object_get_int(gbif_root, kn_uk, 8, &uk) != 1 {
132 return __syscall(93, 26, 0, 0, 0, 0, 0)
133 }
134 if uk != 2930262 { return __syscall(93, 27, 0, 0, 0, 0, 0) }
135
136 // Get kingdom
137 let kn_kg: *u8 = sys_mmap(16)
138 kn_kg[0] = 0x6B; kn_kg[1] = 0x69; kn_kg[2] = 0x6E; kn_kg[3] = 0x67
139 kn_kg[4] = 0x64; kn_kg[5] = 0x6F; kn_kg[6] = 0x6D
140 var kgp: *u8 = 0 as *u8
141 var kgl: i64 = 0
142 if nx_value_object_get_string(gbif_root, kn_kg, 7, &kgp, &kgl) != 1 {
143 return __syscall(93, 28, 0, 0, 0, 0, 0)
144 }
145 if kgl != 7 { return __syscall(93, 29, 0, 0, 0, 0, 0) } // "Plantae"
146
147 return 0
148}