code wiki / (root) / nx_value_test.nx

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}