summaryrefslogtreecommitdiff
path: root/csv-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'csv-test.c')
-rw-r--r--csv-test.c414
1 files changed, 414 insertions, 0 deletions
diff --git a/csv-test.c b/csv-test.c
index 9491153..5fd0e15 100644
--- a/csv-test.c
+++ b/csv-test.c
@@ -1,11 +1,425 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <stdlib.h> 2#include <stdlib.h>
3#include <string.h>
3#include <assert.h> 4#include <assert.h>
4 5
5#include "csv.h" 6#include "csv.h"
6 7
8#undef NDEBUG
9
10#define FMEMOPEN(f, data) \
11 f = fmemopen(data, sizeof(data)-1, "r"); \
12 assert(f != NULL)
13
14#define FMEMCLOSE(f) \
15 fclose(f); \
16 f = NULL
17
18void
19test1(void)
20{
21 FILE *f;
22 csv_t csv = { 0 };
23
24 char data[] = "A,B,C\r\n"
25 "D,E,F\n";
26
27 FMEMOPEN(f, data);
28
29 assert( csv_read(&csv, f) == 3 );
30 assert( csv_nfields(&csv) == 3 ),
31 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
32 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
33 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
34
35 assert( csv_read(&csv, f) == 3 );
36 assert( csv_nfields(&csv) == 3 ),
37 assert( strcmp(csv_field(&csv, 0), "D") == 0 );
38 assert( strcmp(csv_field(&csv, 1), "E") == 0 );
39 assert( strcmp(csv_field(&csv, 2), "F") == 0 );
40
41 assert( csv_read(&csv, f) == -1 );
42
43 FMEMCLOSE(f);
44}
45
46void
47test2(void)
48{
49 FILE *f;
50 csv_t csv = { 0 };
51
52 char data[] = "A,B,C\r\n"
53 "D,E,F";
54
55 FMEMOPEN(f, data);
56
57 assert( csv_read(&csv, f) == 3 );
58 assert( csv_nfields(&csv) == 3 ),
59 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
60 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
61 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
62
63 assert( csv_read(&csv, f) == 3 );
64 assert( csv_nfields(&csv) == 3 ),
65 assert( strcmp(csv_field(&csv, 0), "D") == 0 );
66 assert( strcmp(csv_field(&csv, 1), "E") == 0 );
67 assert( strcmp(csv_field(&csv, 2), "F") == 0 );
68
69 assert( csv_read(&csv, f) == -1 );
70
71 FMEMCLOSE(f);
72}
73
74void
75test3(void)
76{
77 FILE *f;
78 csv_t csv = { 0 };
79
80 char data[] = "\n"
81 "\r"
82 "\r\n"
83 "\"\"\n"
84 "\"\"\r"
85 "\"\"\r\n"
86 ",\n"
87 ",\r"
88 ",\r\n"
89 "\"\",\"\"\n"
90 "\"\",\"\"\r"
91 "\"\",\"\"\r\n"
92 ",,\n"
93 ",,\r"
94 ",,\r\n"
95 "\"\",\"\",\n"
96 "\"\",\"\",\r"
97 "\"\",\"\",\r\n"
98 ",,";
99
100 FMEMOPEN(f, data);
101
102 // Line 1
103 assert( csv_read(&csv, f) == 1 );
104 assert( csv_nfields(&csv) == 1 );
105 assert( strcmp(csv_field(&csv, 0), "") == 0 );
106
107 // Line 2
108 assert( csv_read(&csv, f) == 1 );
109 assert( csv_nfields(&csv) == 1 );
110 assert( strcmp(csv_field(&csv, 0), "") == 0 );
111
112 // Line 3
113 assert( csv_read(&csv, f) == 1 );
114 assert( csv_nfields(&csv) == 1 );
115 assert( strcmp(csv_field(&csv, 0), "") == 0 );
116
117 // Line 4
118 assert( csv_read(&csv, f) == 1 );
119 assert( csv_nfields(&csv) == 1 );
120 assert( strcmp(csv_field(&csv, 0), "") == 0 );
121
122 // Line 5
123 assert( csv_read(&csv, f) == 1 );
124 assert( csv_nfields(&csv) == 1 );
125 assert( strcmp(csv_field(&csv, 0), "") == 0 );
126
127 // Line 6
128 assert( csv_read(&csv, f) == 1 );
129 assert( csv_nfields(&csv) == 1 );
130 assert( strcmp(csv_field(&csv, 0), "") == 0 );
131
132 // Line 7
133 assert( csv_read(&csv, f) == 2 );
134 assert( csv_nfields(&csv) == 2 );
135 assert( strcmp(csv_field(&csv, 0), "") == 0 );
136 assert( strcmp(csv_field(&csv, 1), "") == 0 );
137
138 // Line 8
139 assert( csv_read(&csv, f) == 2 );
140 assert( csv_nfields(&csv) == 2 );
141 assert( strcmp(csv_field(&csv, 0), "") == 0 );
142 assert( strcmp(csv_field(&csv, 1), "") == 0 );
143
144 // Line 9
145 assert( csv_read(&csv, f) == 2 );
146 assert( csv_nfields(&csv) == 2 );
147 assert( strcmp(csv_field(&csv, 0), "") == 0 );
148 assert( strcmp(csv_field(&csv, 1), "") == 0 );
149
150 // Line 10
151 assert( csv_read(&csv, f) == 2 );
152 assert( csv_nfields(&csv) == 2 );
153 assert( strcmp(csv_field(&csv, 0), "") == 0 );
154 assert( strcmp(csv_field(&csv, 1), "") == 0 );
155
156 // Line 11
157 assert( csv_read(&csv, f) == 2 );
158 assert( csv_nfields(&csv) == 2 );
159 assert( strcmp(csv_field(&csv, 0), "") == 0 );
160 assert( strcmp(csv_field(&csv, 1), "") == 0 );
161
162 // Line 12
163 assert( csv_read(&csv, f) == 2 );
164 assert( csv_nfields(&csv) == 2 );
165 assert( strcmp(csv_field(&csv, 0), "") == 0 );
166 assert( strcmp(csv_field(&csv, 1), "") == 0 );
167
168 // Line 13
169 assert( csv_read(&csv, f) == 3 );
170 assert( csv_nfields(&csv) == 3 );
171 assert( strcmp(csv_field(&csv, 0), "") == 0 );
172 assert( strcmp(csv_field(&csv, 1), "") == 0 );
173 assert( strcmp(csv_field(&csv, 2), "") == 0 );
174
175 // Line 14
176 assert( csv_read(&csv, f) == 3 );
177 assert( csv_nfields(&csv) == 3 );
178 assert( strcmp(csv_field(&csv, 0), "") == 0 );
179 assert( strcmp(csv_field(&csv, 1), "") == 0 );
180 assert( strcmp(csv_field(&csv, 2), "") == 0 );
181
182 // Line 15
183 assert( csv_read(&csv, f) == 3 );
184 assert( csv_nfields(&csv) == 3 );
185 assert( strcmp(csv_field(&csv, 0), "") == 0 );
186 assert( strcmp(csv_field(&csv, 1), "") == 0 );
187 assert( strcmp(csv_field(&csv, 2), "") == 0 );
188
189 // Line 16
190 assert( csv_read(&csv, f) == 3 );
191 assert( csv_nfields(&csv) == 3 );
192 assert( strcmp(csv_field(&csv, 0), "") == 0 );
193 assert( strcmp(csv_field(&csv, 1), "") == 0 );
194 assert( strcmp(csv_field(&csv, 2), "") == 0 );
195
196 // Line 17
197 assert( csv_read(&csv, f) == 3 );
198 assert( csv_nfields(&csv) == 3 );
199 assert( strcmp(csv_field(&csv, 0), "") == 0 );
200 assert( strcmp(csv_field(&csv, 1), "") == 0 );
201 assert( strcmp(csv_field(&csv, 2), "") == 0 );
202
203 // Line 18
204 assert( csv_read(&csv, f) == 3 );
205 assert( csv_nfields(&csv) == 3 );
206 assert( strcmp(csv_field(&csv, 0), "") == 0 );
207 assert( strcmp(csv_field(&csv, 1), "") == 0 );
208 assert( strcmp(csv_field(&csv, 2), "") == 0 );
209
210 // Line 19
211 assert( csv_read(&csv, f) == 3 );
212 assert( csv_nfields(&csv) == 3 );
213 assert( strcmp(csv_field(&csv, 0), "") == 0 );
214 assert( strcmp(csv_field(&csv, 1), "") == 0 );
215 assert( strcmp(csv_field(&csv, 2), "") == 0 );
216
217 // EOF
218 assert( csv_read(&csv, f) == -1 );
219
220 FMEMCLOSE(f);
221}
222
223void
224test4(void)
225{
226 FILE *f;
227 csv_t csv = { 0 };
228
229 char data[] = "A\n"
230 "A\r"
231 "A\r\n"
232 "\"A\"\n"
233 "\"A\"\r"
234 "\"A\"\r\n"
235 "A,B\n"
236 "A,B\r"
237 "A,B\r\n"
238 "\"A\",\"B\"\n"
239 "\"A\",\"B\"\r"
240 "\"A\",\"B\"\r\n"
241 "A,B,C\n"
242 "A,B,C\r"
243 "A,B,C\r\n"
244 "\"A\",\"B\",C\n"
245 "\"A\",\"B\",C\r"
246 "\"A\",\"B\",C\r\n"
247 "A,B,C";
248
249 FMEMOPEN(f, data);
250
251 // Line 1
252 assert( csv_read(&csv, f) == 1 );
253 assert( csv_nfields(&csv) == 1 );
254 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
255
256 // Line 2
257 assert( csv_read(&csv, f) == 1 );
258 assert( csv_nfields(&csv) == 1 );
259 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
260
261 // Line 3
262 assert( csv_read(&csv, f) == 1 );
263 assert( csv_nfields(&csv) == 1 );
264 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
265
266 // Line 4
267 assert( csv_read(&csv, f) == 1 );
268 assert( csv_nfields(&csv) == 1 );
269 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
270
271 // Line 5
272 assert( csv_read(&csv, f) == 1 );
273 assert( csv_nfields(&csv) == 1 );
274 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
275
276 // Line 6
277 assert( csv_read(&csv, f) == 1 );
278 assert( csv_nfields(&csv) == 1 );
279 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
280
281 // Line 7
282 assert( csv_read(&csv, f) == 2 );
283 assert( csv_nfields(&csv) == 2 );
284 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
285 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
286
287 // Line 8
288 assert( csv_read(&csv, f) == 2 );
289 assert( csv_nfields(&csv) == 2 );
290 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
291 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
292
293 // Line 9
294 assert( csv_read(&csv, f) == 2 );
295 assert( csv_nfields(&csv) == 2 );
296 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
297 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
298
299 // Line 10
300 assert( csv_read(&csv, f) == 2 );
301 assert( csv_nfields(&csv) == 2 );
302 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
303 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
304
305 // Line 11
306 assert( csv_read(&csv, f) == 2 );
307 assert( csv_nfields(&csv) == 2 );
308 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
309 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
310
311 // Line 12
312 assert( csv_read(&csv, f) == 2 );
313 assert( csv_nfields(&csv) == 2 );
314 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
315 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
316
317 // Line 13
318 assert( csv_read(&csv, f) == 3 );
319 assert( csv_nfields(&csv) == 3 );
320 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
321 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
322 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
323
324 // Line 14
325 assert( csv_read(&csv, f) == 3 );
326 assert( csv_nfields(&csv) == 3 );
327 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
328 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
329 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
330
331 // Line 15
332 assert( csv_read(&csv, f) == 3 );
333 assert( csv_nfields(&csv) == 3 );
334 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
335 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
336 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
337
338 // Line 16
339 assert( csv_read(&csv, f) == 3 );
340 assert( csv_nfields(&csv) == 3 );
341 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
342 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
343 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
344
345 // Line 17
346 assert( csv_read(&csv, f) == 3 );
347 assert( csv_nfields(&csv) == 3 );
348 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
349 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
350 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
351
352 // Line 18
353 assert( csv_read(&csv, f) == 3 );
354 assert( csv_nfields(&csv) == 3 );
355 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
356 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
357 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
358
359 // Line 19
360 assert( csv_read(&csv, f) == 3 );
361 assert( csv_nfields(&csv) == 3 );
362 assert( strcmp(csv_field(&csv, 0), "A") == 0 );
363 assert( strcmp(csv_field(&csv, 1), "B") == 0 );
364 assert( strcmp(csv_field(&csv, 2), "C") == 0 );
365
366 // EOF
367 assert( csv_read(&csv, f) == -1 );
368
369 FMEMCLOSE(f);
370}
371
372void
373test5(void)
374{
375 FILE *f;
376 csv_t csv = { 0 };
377
378 char data[] = "foo \"baz\" bar,foo \"\"baz\"\" bar,\"foo \"\"baz\"\" bar\",\"foo \"baz\" bar\",\"foo \"\"baz\"\", bar\"";
379
380 FMEMOPEN(f, data);
381
382 assert( csv_read(&csv, f) == 5 );
383 assert( csv_nfields(&csv) == 5 ),
384 assert( strcmp(csv_field(&csv, 0), "foo \"baz\" bar") == 0 );
385 assert( strcmp(csv_field(&csv, 1), "foo \"\"baz\"\" bar") == 0 );
386 assert( strcmp(csv_field(&csv, 2), "foo \"baz\" bar") == 0 );
387 assert( strcmp(csv_field(&csv, 3), "foo \"baz\" bar") == 0 );
388 assert( strcmp(csv_field(&csv, 4), "foo \"baz\", bar") == 0 );
389
390 assert( csv_read(&csv, f) == -1 );
391
392 FMEMCLOSE(f);
393}
394
395void
396test6(void)
397{
398 FILE *f;
399 csv_t csv = { 0 };
400
401 char data[] = "\"foo";
402
403 FMEMOPEN(f, data);
404
405 assert( csv_read(&csv, f) == 1 );
406 assert( csv_nfields(&csv) == 1 ),
407 assert( strcmp(csv_field(&csv, 0), "foo") == 0 );
408
409 assert( csv_read(&csv, f) == -1 );
410
411 FMEMCLOSE(f);
412}
413
7int 414int
8main(void) 415main(void)
9{ 416{
417 test1();
418 test2();
419 test3();
420 test4();
421 test5();
422 test6();
423
10 return EXIT_SUCCESS; 424 return EXIT_SUCCESS;
11} 425}