#include #include #include #include #include "csv.h" #undef NDEBUG #define FMEMOPEN(f, data) \ f = fmemopen(data, sizeof(data)-1, "r"); \ assert(f != NULL) #define FMEMCLOSE(f) \ fclose(f); \ f = NULL void test1(void) { FILE *f; csv_t csv = { 0 }; char data[] = "A,B,C\r\n" "D,E,F\n"; FMEMOPEN(f, data); assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ), assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ), assert( strcmp(csv_field(&csv, 0), "D") == 0 ); assert( strcmp(csv_field(&csv, 1), "E") == 0 ); assert( strcmp(csv_field(&csv, 2), "F") == 0 ); assert( csv_read(&csv, f) == -1 ); FMEMCLOSE(f); } void test2(void) { FILE *f; csv_t csv = { 0 }; char data[] = "A,B,C\r\n" "D,E,F"; FMEMOPEN(f, data); assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ), assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ), assert( strcmp(csv_field(&csv, 0), "D") == 0 ); assert( strcmp(csv_field(&csv, 1), "E") == 0 ); assert( strcmp(csv_field(&csv, 2), "F") == 0 ); assert( csv_read(&csv, f) == -1 ); FMEMCLOSE(f); } void test3(void) { FILE *f; csv_t csv = { 0 }; char data[] = "\n" "\r" "\r\n" "\"\"\n" "\"\"\r" "\"\"\r\n" ",\n" ",\r" ",\r\n" "\"\",\"\"\n" "\"\",\"\"\r" "\"\",\"\"\r\n" ",,\n" ",,\r" ",,\r\n" "\"\",\"\",\n" "\"\",\"\",\r" "\"\",\"\",\r\n" ",,"; FMEMOPEN(f, data); // Line 1 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); // Line 2 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); // Line 3 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); // Line 4 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); // Line 5 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); // Line 6 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); // Line 7 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); // Line 8 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); // Line 9 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); // Line 10 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); // Line 11 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); // Line 12 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); // Line 13 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // Line 14 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // Line 15 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // Line 16 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // Line 17 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // Line 18 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // Line 19 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "") == 0 ); assert( strcmp(csv_field(&csv, 1), "") == 0 ); assert( strcmp(csv_field(&csv, 2), "") == 0 ); // EOF assert( csv_read(&csv, f) == -1 ); FMEMCLOSE(f); } void test4(void) { FILE *f; csv_t csv = { 0 }; char data[] = "A\n" "A\r" "A\r\n" "\"A\"\n" "\"A\"\r" "\"A\"\r\n" "A,B\n" "A,B\r" "A,B\r\n" "\"A\",\"B\"\n" "\"A\",\"B\"\r" "\"A\",\"B\"\r\n" "A,B,C\n" "A,B,C\r" "A,B,C\r\n" "\"A\",\"B\",C\n" "\"A\",\"B\",C\r" "\"A\",\"B\",C\r\n" "A,B,C"; FMEMOPEN(f, data); // Line 1 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); // Line 2 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); // Line 3 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); // Line 4 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); // Line 5 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); // Line 6 assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); // Line 7 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); // Line 8 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); // Line 9 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); // Line 10 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); // Line 11 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); // Line 12 assert( csv_read(&csv, f) == 2 ); assert( csv_nfields(&csv) == 2 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); // Line 13 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // Line 14 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // Line 15 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // Line 16 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // Line 17 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // Line 18 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // Line 19 assert( csv_read(&csv, f) == 3 ); assert( csv_nfields(&csv) == 3 ); assert( strcmp(csv_field(&csv, 0), "A") == 0 ); assert( strcmp(csv_field(&csv, 1), "B") == 0 ); assert( strcmp(csv_field(&csv, 2), "C") == 0 ); // EOF assert( csv_read(&csv, f) == -1 ); FMEMCLOSE(f); } void test5(void) { FILE *f; csv_t csv = { 0 }; char data[] = "foo \"baz\" bar,foo \"\"baz\"\" bar,\"foo \"\"baz\"\" bar\",\"foo \"baz\" bar\",\"foo \"\"baz\"\", bar\""; FMEMOPEN(f, data); assert( csv_read(&csv, f) == 5 ); assert( csv_nfields(&csv) == 5 ), assert( strcmp(csv_field(&csv, 0), "foo \"baz\" bar") == 0 ); assert( strcmp(csv_field(&csv, 1), "foo \"\"baz\"\" bar") == 0 ); assert( strcmp(csv_field(&csv, 2), "foo \"baz\" bar") == 0 ); assert( strcmp(csv_field(&csv, 3), "foo \"baz\" bar") == 0 ); assert( strcmp(csv_field(&csv, 4), "foo \"baz\", bar") == 0 ); assert( csv_read(&csv, f) == -1 ); FMEMCLOSE(f); } void test6(void) { FILE *f; csv_t csv = { 0 }; char data[] = "\"foo"; FMEMOPEN(f, data); assert( csv_read(&csv, f) == 1 ); assert( csv_nfields(&csv) == 1 ), assert( strcmp(csv_field(&csv, 0), "foo") == 0 ); assert( csv_read(&csv, f) == -1 ); FMEMCLOSE(f); } int main(void) { test1(); test2(); test3(); test4(); test5(); test6(); return EXIT_SUCCESS; }