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}