nx_value_test.nx source
↩ module page · 128 lines · 6016 B
1// nx_value_test.nx -- end-to-end smoke for nx_value tagged tree.
2//
3// Builds the tree representation of:
4// {"name":"potato","kingdom":"Plantae","key":42,"children":[1,2,3]}
5// manually via constructors, then exercises every accessor + lookup.
6
7import "syscalls.nx"
8import "nx_value.nx"
9
10func main() -> i64 {
11 // ----- Scalars ------------------------------------------------
12 let vnull: *NxValue = nx_value_new_null()
13 if nx_value_kind(vnull) != NX_VAL_NULL { return __syscall(93, 1, 0, 0, 0, 0, 0) }
14 if nx_value_is_null(vnull) != 1 { return __syscall(93, 2, 0, 0, 0, 0, 0) }
15
16 let vbool: *NxValue = nx_value_new_bool(1)
17 if nx_value_kind(vbool) != NX_VAL_BOOL { return __syscall(93, 3, 0, 0, 0, 0, 0) }
18 if vbool.int_value != 1 { return __syscall(93, 4, 0, 0, 0, 0, 0) }
19
20 let vint: *NxValue = nx_value_new_int(42)
21 if vint.int_value != 42 { return __syscall(93, 5, 0, 0, 0, 0, 0) }
22
23 // ----- String -------------------------------------------------
24 let s_potato: *u8 = sys_mmap(16)
25 s_potato[0] = 0x70; s_potato[1] = 0x6f; s_potato[2] = 0x74
26 s_potato[3] = 0x61; s_potato[4] = 0x74; s_potato[5] = 0x6f
27 let vstr: *NxValue = nx_value_new_string(s_potato, 6)
28 if vstr.kind != NX_VAL_STRING { return __syscall(93, 6, 0, 0, 0, 0, 0) }
29 if vstr.str_len != 6 { return __syscall(93, 7, 0, 0, 0, 0, 0) }
30 if nx_value_bytes_equal(vstr.str_ptr, vstr.str_len, s_potato, 6) != 1 {
31 return __syscall(93, 8, 0, 0, 0, 0, 0)
32 }
33
34 // ----- Array of 3 ints ---------------------------------------
35 let items: **NxValue = sys_mmap(3 * 8) as **NxValue
36 items[0] = nx_value_new_int(10)
37 items[1] = nx_value_new_int(20)
38 items[2] = nx_value_new_int(30)
39 let varr: *NxValue = nx_value_new_array(items, 3)
40 if varr.kind != NX_VAL_ARRAY { return __syscall(93, 10, 0, 0, 0, 0, 0) }
41 if nx_value_array_len(varr) != 3 { return __syscall(93, 11, 0, 0, 0, 0, 0) }
42 let it0: *NxValue = nx_value_array_get(varr, 0)
43 let it1: *NxValue = nx_value_array_get(varr, 1)
44 let it2: *NxValue = nx_value_array_get(varr, 2)
45 if it0.int_value != 10 { return __syscall(93, 12, 0, 0, 0, 0, 0) }
46 if it1.int_value != 20 { return __syscall(93, 13, 0, 0, 0, 0, 0) }
47 if it2.int_value != 30 { return __syscall(93, 14, 0, 0, 0, 0, 0) }
48 if nx_value_array_get(varr, 5) != 0 as *NxValue { return __syscall(93, 15, 0, 0, 0, 0, 0) }
49
50 // ----- Object with 4 keys ------------------------------------
51 let keys: **u8 = sys_mmap(4 * 8) as **u8
52 let klens: *i64 = sys_mmap(4 * 8) as *i64
53 let vals: **NxValue = sys_mmap(4 * 8) as **NxValue
54
55 let k_name: *u8 = sys_mmap(8)
56 k_name[0] = 0x6e; k_name[1] = 0x61; k_name[2] = 0x6d; k_name[3] = 0x65 // "name"
57 keys[0] = k_name; klens[0] = 4
58 vals[0] = vstr // value for "name"
59
60 let k_kingdom: *u8 = sys_mmap(8)
61 k_kingdom[0] = 0x6b; k_kingdom[1] = 0x69; k_kingdom[2] = 0x6e; k_kingdom[3] = 0x67
62 k_kingdom[4] = 0x64; k_kingdom[5] = 0x6f; k_kingdom[6] = 0x6d // "kingdom"
63 keys[1] = k_kingdom; klens[1] = 7
64 let s_plantae: *u8 = sys_mmap(8)
65 s_plantae[0] = 0x50; s_plantae[1] = 0x6c; s_plantae[2] = 0x61
66 s_plantae[3] = 0x6e; s_plantae[4] = 0x74; s_plantae[5] = 0x61; s_plantae[6] = 0x65
67 vals[1] = nx_value_new_string(s_plantae, 7)
68
69 let k_key: *u8 = sys_mmap(8)
70 k_key[0] = 0x6b; k_key[1] = 0x65; k_key[2] = 0x79 // "key"
71 keys[2] = k_key; klens[2] = 3
72 vals[2] = vint // value 42
73
74 let k_children: *u8 = sys_mmap(16)
75 k_children[0] = 0x63; k_children[1] = 0x68; k_children[2] = 0x69; k_children[3] = 0x6c
76 k_children[4] = 0x64; k_children[5] = 0x72; k_children[6] = 0x65; k_children[7] = 0x6e // "children"
77 keys[3] = k_children; klens[3] = 8
78 vals[3] = varr
79
80 let vobj: *NxValue = nx_value_new_object(keys, klens, vals, 4)
81 if vobj.kind != NX_VAL_OBJECT { return __syscall(93, 20, 0, 0, 0, 0, 0) }
82 if vobj.n_items != 4 { return __syscall(93, 21, 0, 0, 0, 0, 0) }
83
84 // Lookup "name" -> the potato string
85 let got_name: *NxValue = nx_value_object_get(vobj, k_name, 4)
86 if got_name == 0 as *NxValue { return __syscall(93, 22, 0, 0, 0, 0, 0) }
87 if got_name.kind != NX_VAL_STRING { return __syscall(93, 23, 0, 0, 0, 0, 0) }
88 if nx_value_bytes_equal(got_name.str_ptr, got_name.str_len, s_potato, 6) != 1 {
89 return __syscall(93, 24, 0, 0, 0, 0, 0)
90 }
91
92 // Lookup "kingdom" via convenience helper -> "Plantae"
93 var got_p: *u8 = 0 as *u8
94 var got_l: i64 = 0
95 let okkd: i64 = nx_value_object_get_string(vobj, k_kingdom, 7, &got_p, &got_l)
96 if okkd != 1 { return __syscall(93, 25, 0, 0, 0, 0, 0) }
97 if got_l != 7 { return __syscall(93, 26, 0, 0, 0, 0, 0) }
98 if nx_value_bytes_equal(got_p, got_l, s_plantae, 7) != 1 { return __syscall(93, 27, 0, 0, 0, 0, 0) }
99
100 // Lookup "key" via int helper -> 42
101 var got_i: i64 = 0
102 let oki: i64 = nx_value_object_get_int(vobj, k_key, 3, &got_i)
103 if oki != 1 { return __syscall(93, 28, 0, 0, 0, 0, 0) }
104 if got_i != 42 { return __syscall(93, 29, 0, 0, 0, 0, 0) }
105
106 // Lookup "children" -> array of 3
107 let got_arr: *NxValue = nx_value_object_get(vobj, k_children, 8)
108 if got_arr == 0 as *NxValue { return __syscall(93, 30, 0, 0, 0, 0, 0) }
109 if got_arr.kind != NX_VAL_ARRAY { return __syscall(93, 31, 0, 0, 0, 0, 0) }
110 if nx_value_array_len(got_arr) != 3 { return __syscall(93, 32, 0, 0, 0, 0, 0) }
111
112 // Lookup MISSING key -> NULL pointer (not a NX_VAL_NULL node)
113 let k_missing: *u8 = sys_mmap(8)
114 k_missing[0] = 0x7a; k_missing[1] = 0x7a; k_missing[2] = 0x7a // "zzz"
115 if nx_value_object_get(vobj, k_missing, 3) != 0 as *NxValue {
116 return __syscall(93, 40, 0, 0, 0, 0, 0)
117 }
118 if nx_value_object_index_of(vobj, k_missing, 3) != -1 {
119 return __syscall(93, 41, 0, 0, 0, 0, 0)
120 }
121
122 // Index-of present
123 if nx_value_object_index_of(vobj, k_key, 3) != 2 {
124 return __syscall(93, 42, 0, 0, 0, 0, 0)
125 }
126
127 return 0
128}