v / vlib / encoding / csv / reader_test.v
307 lines · 291 sloc · 7.24 KB · ef5be22f81005b2237311a79b6383138084b0c53
Raw
1import encoding.csv
2
3fn test_encoding_csv_reader() {
4 data := 'name,email,phone,other\njoe,[email protected],0400000000,test\nsam,[email protected],0433000000,"test quoted field"\n#chris,[email protected],94444444,"commented row"\n'
5 mut csv_reader := csv.new_reader(data)
6 mut row_count := 0
7 for {
8 row := csv_reader.read() or { break }
9 row_count++
10 if row_count == 1 {
11 assert row[0] == 'name'
12 assert row[1] == 'email'
13 assert row[2] == 'phone'
14 assert row[3] == 'other'
15 } else if row_count == 2 {
16 assert row[0] == 'joe'
17 assert row[1] == '[email protected]'
18 assert row[2] == '0400000000'
19 assert row[3] == 'test'
20 } else if row_count == 3 {
21 assert row[0] == 'sam'
22 assert row[1] == '[email protected]'
23 assert row[2] == '0433000000'
24 // quoted field
25 assert row[3] == 'test quoted field'
26 }
27 }
28 assert row_count == 3
29}
30
31fn test_encoding_csv_reader_with_custom_delimiter() {
32 data := 'name|email|phone|other\njoe|[email protected]|0400000000|test\nsam|[email protected]|0433000000|"test quoted field"\n#chris|[email protected]|94444444|"commented row"\n'
33 mut csv_reader := csv.new_reader(data, delimiter: `|`)
34 mut row_count := 0
35 for {
36 row := csv_reader.read() or { break }
37 row_count++
38 if row_count == 1 {
39 assert row[0] == 'name'
40 assert row[1] == 'email'
41 assert row[2] == 'phone'
42 assert row[3] == 'other'
43 } else if row_count == 2 {
44 assert row[0] == 'joe'
45 assert row[1] == '[email protected]'
46 assert row[2] == '0400000000'
47 assert row[3] == 'test'
48 } else if row_count == 3 {
49 assert row[0] == 'sam'
50 assert row[1] == '[email protected]'
51 assert row[2] == '0433000000'
52 // quoted field
53 assert row[3] == 'test quoted field'
54 }
55 }
56 assert row_count == 3
57}
58
59fn test_line_break_lf() {
60 lf_data := 'name,email\njoe,[email protected]\n'
61 mut csv_reader := csv.new_reader(lf_data)
62 mut row_count := 0
63 for {
64 row := csv_reader.read() or { break }
65 row_count++
66 if row_count == 1 {
67 assert row[0] == 'name'
68 assert row[1] == 'email'
69 } else if row_count == 2 {
70 assert row[0] == 'joe'
71 assert row[1] == '[email protected]'
72 }
73 }
74 assert row_count == 2
75}
76
77fn test_line_break_cr() {
78 cr_data := 'name,email\rjoe,[email protected]\r'
79 mut csv_reader := csv.new_reader(cr_data)
80 mut row_count := 0
81 for {
82 row := csv_reader.read() or { break }
83 row_count++
84 if row_count == 1 {
85 assert row[0] == 'name'
86 assert row[1] == 'email'
87 } else if row_count == 2 {
88 assert row[0] == 'joe'
89 assert row[1] == '[email protected]'
90 }
91 }
92 assert row_count == 2
93}
94
95fn test_line_break_crlf() {
96 crlf_data := 'name,email\r\njoe,[email protected]\r\n'
97 mut csv_reader := csv.new_reader(crlf_data)
98 mut row_count := 0
99 for {
100 row := csv_reader.read() or { break }
101 row_count++
102 if row_count == 1 {
103 assert row[0] == 'name'
104 assert row[1] == 'email'
105 } else if row_count == 2 {
106 assert row[0] == 'joe'
107 assert row[1] == '[email protected]'
108 }
109 }
110 assert row_count == 2
111}
112
113fn test_no_line_ending() {
114 data := 'name,email,phone,other\njoe,[email protected],0400000000,test'
115 mut csv_reader := csv.new_reader(data)
116 mut row_count := 0
117 for {
118 csv_reader.read() or { break }
119 row_count++
120 }
121 assert row_count == 2
122}
123
124fn test_last_field_empty() {
125 data := '"name","description","value"\n"one","first","1"\n"two","second",\n'
126 mut csv_reader := csv.new_reader(data)
127 mut row_count := 0
128 for {
129 row := csv_reader.read() or { break }
130 row_count++
131 if row_count == 1 {
132 assert row[0] == 'name'
133 assert row[1] == 'description'
134 assert row[2] == 'value'
135 } else if row_count == 2 {
136 assert row[0] == 'one'
137 assert row[1] == 'first'
138 assert row[2] == '1'
139 } else if row_count == 3 {
140 assert row[0] == 'two'
141 assert row[1] == 'second'
142 assert row[2] == ''
143 }
144 }
145 assert row_count == 3
146}
147
148fn test_empty_fields_no_quotes() {
149 data := '1,2,3,4\n,6,7,8\n9,,11,12\n13,14,,16\n17,18,19,\n'
150
151 mut csv_reader := csv.new_reader(data)
152 mut row_count := 0
153 for {
154 row := csv_reader.read() or { break }
155 row_count++
156 if row_count == 1 {
157 assert row[0] == '1'
158 assert row[1] == '2'
159 assert row[2] == '3'
160 assert row[3] == '4'
161 } else if row_count == 2 {
162 assert row[0] == ''
163 assert row[1] == '6'
164 assert row[2] == '7'
165 assert row[3] == '8'
166 } else if row_count == 3 {
167 assert row[0] == '9'
168 assert row[1] == ''
169 assert row[2] == '11'
170 assert row[3] == '12'
171 } else if row_count == 4 {
172 assert row[0] == '13'
173 assert row[1] == '14'
174 assert row[2] == ''
175 assert row[3] == '16'
176 } else if row_count == 5 {
177 assert row[0] == '17'
178 assert row[1] == '18'
179 assert row[2] == '19'
180 assert row[3] == ''
181 }
182 }
183 assert row_count == 5
184}
185
186fn test_empty_line() {
187 data := '"name","description","value"\n\n\n"one","first","1"\n\n"two","second",\n'
188 mut csv_reader := csv.new_reader(data)
189 mut row_count := 0
190 for {
191 row := csv_reader.read() or { break }
192 row_count++
193 if row_count == 1 {
194 assert row[0] == 'name'
195 assert row[1] == 'description'
196 assert row[2] == 'value'
197 } else if row_count == 2 {
198 assert row[0] == 'one'
199 assert row[1] == 'first'
200 assert row[2] == '1'
201 } else if row_count == 3 {
202 assert row[0] == 'two'
203 assert row[1] == 'second'
204 }
205 }
206 assert row_count == 3
207}
208
209fn test_field_multiple_line() {
210 data := '"name","multiple
211
212 line","value"\n"one","first","1"\n'
213 mut csv_reader := csv.new_reader(data)
214 mut row_count := 0
215 for {
216 row := csv_reader.read() or { break }
217 row_count++
218 if row_count == 1 {
219 assert row[0] == 'name'
220 assert row[1] == 'multiple\n\n line'
221 assert row[2] == 'value'
222 } else if row_count == 2 {
223 assert row[0] == 'one'
224 assert row[1] == 'first'
225 assert row[2] == '1'
226 }
227 }
228 assert row_count == 2
229}
230
231fn test_field_quotes_for_parts() {
232 data := 'a1,"b1",c1\n"a2",b2,c2\na3,b3,"c3"\na4,b4,c4\n'
233 mut csv_reader := csv.new_reader(data)
234 mut row_count := 0
235 for {
236 row := csv_reader.read() or { break }
237 row_count++
238 if row_count == 1 {
239 assert row[0] == 'a1'
240 assert row[1] == 'b1'
241 assert row[2] == 'c1'
242 } else if row_count == 2 {
243 assert row[0] == 'a2'
244 assert row[1] == 'b2'
245 assert row[2] == 'c2'
246 } else if row_count == 3 {
247 assert row[0] == 'a3'
248 assert row[1] == 'b3'
249 assert row[2] == 'c3'
250 } else if row_count == 4 {
251 assert row[0] == 'a4'
252 assert row[1] == 'b4'
253 assert row[2] == 'c4'
254 }
255 }
256 assert row_count == 4
257}
258
259fn test_field_double_quotes() {
260 row1 := '11,"12\n13"\n'
261 row2 := '21,"2""2""\n23"\n'
262 row3 := '"3""1""",32\n'
263 data := row1 + row2 + row3
264 mut csv_reader := csv.new_reader(data)
265 mut row_count := 0
266 for {
267 row := csv_reader.read() or { break }
268 row_count++
269 if row_count == 1 {
270 assert row[0] == '11'
271 assert row[1] == '12\n13'
272 } else if row_count == 2 {
273 assert row[0] == '21'
274 assert row[1] == '2"2"\n23'
275 } else if row_count == 3 {
276 assert row[0] == '3"1"'
277 assert row[1] == '32'
278 }
279 }
280 assert row_count == 3
281}
282
283struct Test {
284mut:
285 id int
286 bonus string
287 amount int
288 yes bool
289}
290
291fn test_decode_to_struct() {
292 text := 'id,bonus,amount,yes\r\n1,bomb,1,true\r\n2,rocket,1,false,\r\n3,lightning,2,2\r\n'
293 arr := csv.decode[Test](text)
294 assert arr[0].id == 1
295 assert arr[0].bonus == 'bomb'
296 assert arr[0].amount == 1
297 assert arr[0].yes == true
298 assert arr[1].id == 2
299 assert arr[1].bonus == 'rocket'
300 assert arr[1].amount == 1
301 assert arr[1].yes == false
302 assert arr[2].id == 3
303 assert arr[2].bonus == 'lightning'
304 assert arr[2].amount == 2
305 assert arr[2].yes == true
306 assert arr.len == 3
307}
308