code wiki / (root) / nx_value_parse_csv_test.nx

nx_value_parse_csv_test.nx source

↩ module page · 87 lines · 4242 B

1// nx_value_parse_csv_test.nx -- smoke for CSV/TSV DOM parser. 2// 3// Strategy: report the verdict number as the exit code on failure so 4// we can bisect. 5 6import "syscalls.nx" 7import "nx_value.nx" 8import "nx_value_parse_csv.nx" 9 10func main() -> i64 { 11 // ===== Stage 1: simple CSV, no quotes ========================= 12 // a,b,c 13 // 1,2,3 14 let s1: *u8 = sys_mmap(32) 15 s1[0] = 0x61; s1[1] = 0x2C; s1[2] = 0x62; s1[3] = 0x2C; s1[4] = 0x63; s1[5] = 0x0A 16 s1[6] = 0x31; s1[7] = 0x2C; s1[8] = 0x32; s1[9] = 0x2C; s1[10] = 0x33 17 var v1: i64 = 0 18 let r1: *NxValue = nx_value_parse_csv(s1, 11, 0 as *NxCsvOpts, &v1) 19 if v1 != NX_CSV_OK { return __syscall(93, 10 + v1, 0, 0, 0, 0, 0) } 20 if r1 == 0 as *NxValue { return __syscall(93, 1, 0, 0, 0, 0, 0) } 21 if r1.kind != NX_VAL_ARRAY { return __syscall(93, 2, 0, 0, 0, 0, 0) } 22 if nx_value_array_len(r1) != 1 { return __syscall(93, 3, 0, 0, 0, 0, 0) } 23 let row1: *NxValue = nx_value_array_get(r1, 0) 24 if row1.kind != NX_VAL_OBJECT { return __syscall(93, 4, 0, 0, 0, 0, 0) } 25 if row1.n_items != 3 { return __syscall(93, 5, 0, 0, 0, 0, 0) } 26 let k_a: *u8 = sys_mmap(4); k_a[0] = 0x61 27 var pa: *u8 = 0 as *u8 28 var la: i64 = 0 29 if nx_value_object_get_string(row1, k_a, 1, &pa, &la) != 1 { return __syscall(93, 6, 0, 0, 0, 0, 0) } 30 if la != 1 { return __syscall(93, 7, 0, 0, 0, 0, 0) } 31 if pa[0] != 0x31 { return __syscall(93, 8, 0, 0, 0, 0, 0) } // '1' 32 33 // ===== Stage 2: quoted field with embedded comma ============== 34 // k,v 35 // x,"a,b" 36 let s2: *u8 = sys_mmap(32) 37 s2[0] = 0x6B; s2[1] = 0x2C; s2[2] = 0x76; s2[3] = 0x0A // k,v\n 38 s2[4] = 0x78; s2[5] = 0x2C // x, 39 s2[6] = 0x22; s2[7] = 0x61; s2[8] = 0x2C; s2[9] = 0x62; s2[10] = 0x22 // "a,b" 40 var v2: i64 = 0 41 let r2: *NxValue = nx_value_parse_csv(s2, 11, 0 as *NxCsvOpts, &v2) 42 if v2 != NX_CSV_OK { return __syscall(93, 30 + v2, 0, 0, 0, 0, 0) } 43 if nx_value_array_len(r2) != 1 { return __syscall(93, 20, 0, 0, 0, 0, 0) } 44 let row2: *NxValue = nx_value_array_get(r2, 0) 45 let k_v: *u8 = sys_mmap(4); k_v[0] = 0x76 46 var pv: *u8 = 0 as *u8 47 var lv: i64 = 0 48 if nx_value_object_get_string(row2, k_v, 1, &pv, &lv) != 1 { return __syscall(93, 21, 0, 0, 0, 0, 0) } 49 if lv != 3 { return __syscall(93, 22, 0, 0, 0, 0, 0) } // "a,b" content = 3 bytes 50 if pv[0] != 0x61 { return __syscall(93, 23, 0, 0, 0, 0, 0) } 51 if pv[1] != 0x2C { return __syscall(93, 24, 0, 0, 0, 0, 0) } 52 if pv[2] != 0x62 { return __syscall(93, 25, 0, 0, 0, 0, 0) } 53 54 // ===== Stage 3: quoted field with "" escape =================== 55 // k,v 56 // x,"a""b" 57 let s3: *u8 = sys_mmap(32) 58 s3[0] = 0x6B; s3[1] = 0x2C; s3[2] = 0x76; s3[3] = 0x0A // k,v\n 59 s3[4] = 0x78; s3[5] = 0x2C // x, 60 s3[6] = 0x22; s3[7] = 0x61; s3[8] = 0x22; s3[9] = 0x22; s3[10] = 0x62; s3[11] = 0x22 // "a""b" 61 var v3: i64 = 0 62 let r3: *NxValue = nx_value_parse_csv(s3, 12, 0 as *NxCsvOpts, &v3) 63 if v3 != NX_CSV_OK { return __syscall(93, 50 + v3, 0, 0, 0, 0, 0) } 64 let row3: *NxValue = nx_value_array_get(r3, 0) 65 var pv3: *u8 = 0 as *u8 66 var lv3: i64 = 0 67 if nx_value_object_get_string(row3, k_v, 1, &pv3, &lv3) != 1 { return __syscall(93, 40, 0, 0, 0, 0, 0) } 68 if lv3 != 3 { return __syscall(93, 41, 0, 0, 0, 0, 0) } // "a\"b" decoded = 3 bytes 69 if pv3[0] != 0x61 { return __syscall(93, 42, 0, 0, 0, 0, 0) } 70 if pv3[1] != 0x22 { return __syscall(93, 43, 0, 0, 0, 0, 0) } 71 if pv3[2] != 0x62 { return __syscall(93, 44, 0, 0, 0, 0, 0) } 72 73 // ===== Stage 4: TSV =========================================== 74 // a\tb\nx\ty 75 let s4: *u8 = sys_mmap(16) 76 s4[0] = 0x61; s4[1] = 0x09; s4[2] = 0x62; s4[3] = 0x0A 77 s4[4] = 0x78; s4[5] = 0x09; s4[6] = 0x79 78 let opts_raw: *u8 = sys_mmap(NX_CSV_OPTS_BYTES) 79 let opts: *NxCsvOpts = opts_raw as *NxCsvOpts 80 nx_csv_opts_tsv(opts) 81 var v4: i64 = 0 82 let r4: *NxValue = nx_value_parse_csv(s4, 7, opts, &v4) 83 if v4 != NX_CSV_OK { return __syscall(93, 70 + v4, 0, 0, 0, 0, 0) } 84 if nx_value_array_len(r4) != 1 { return __syscall(93, 60, 0, 0, 0, 0, 0) } 85 86 return 0 87}