| 1 | #include "test.h" |
| 2 | |
| 3 | #include <base/fs.h> |
| 4 | #include <base/io.h> |
| 5 | |
| 6 | #include <engine/shared/csv.h> |
| 7 | |
| 8 | #include <gtest/gtest.h> |
| 9 | |
| 10 | static void Expect(int NumColumns, const char *const *ppColumns, const char *pExpected) |
| 11 | { |
| 12 | CTestInfo Info; |
| 13 | |
| 14 | IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE); |
| 15 | ASSERT_TRUE(File); |
| 16 | CsvWrite(File, NumColumns, ppColumns); |
| 17 | io_close(io: File); |
| 18 | |
| 19 | char aBuf[1024]; |
| 20 | File = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ); |
| 21 | ASSERT_TRUE(File); |
| 22 | int Read = io_read(io: File, buffer: aBuf, size: sizeof(aBuf)); |
| 23 | io_close(io: File); |
| 24 | fs_remove(filename: Info.m_aFilename); |
| 25 | |
| 26 | ASSERT_TRUE(Read >= 1); |
| 27 | Read -= 1; |
| 28 | ASSERT_EQ(aBuf[Read], '\n'); |
| 29 | aBuf[Read] = 0; |
| 30 | |
| 31 | #if defined(CONF_FAMILY_WINDOWS) |
| 32 | ASSERT_TRUE(Read >= 1); |
| 33 | Read -= 1; |
| 34 | ASSERT_EQ(aBuf[Read], '\r'); |
| 35 | aBuf[Read] = 0; |
| 36 | #endif |
| 37 | |
| 38 | for(int i = 0; i < Read; i++) |
| 39 | { |
| 40 | EXPECT_NE(aBuf[i], 0); |
| 41 | } |
| 42 | EXPECT_STREQ(aBuf, pExpected); |
| 43 | } |
| 44 | |
| 45 | TEST(Csv, Simple) |
| 46 | { |
| 47 | const char *apCols1[] = {"a" , "b" }; |
| 48 | Expect(NumColumns: 2, ppColumns: apCols1, pExpected: "a,b" ); |
| 49 | const char *apCols2[] = {"こんにちは" }; |
| 50 | Expect(NumColumns: 1, ppColumns: apCols2, pExpected: "こんにちは" ); |
| 51 | const char *apCols3[] = {"я" , "" , "й" }; |
| 52 | Expect(NumColumns: 3, ppColumns: apCols3, pExpected: "я,,й" ); |
| 53 | const char *apCols4[] = {"" }; |
| 54 | Expect(NumColumns: 1, ppColumns: apCols4, pExpected: "" ); |
| 55 | const char *apCols5[] = {nullptr}; |
| 56 | Expect(NumColumns: 0, ppColumns: apCols5, pExpected: "" ); |
| 57 | } |
| 58 | |
| 59 | TEST(Csv, LetTheQuotingBegin) |
| 60 | { |
| 61 | const char *apCols1[] = {"\"" }; |
| 62 | Expect(NumColumns: 1, ppColumns: apCols1, pExpected: "\"\"\"\"" ); |
| 63 | const char *apCols2[] = {"," }; |
| 64 | Expect(NumColumns: 1, ppColumns: apCols2, pExpected: "\",\"" ); |
| 65 | const char *apCols3[] = {",," , ",\"\"\"" }; |
| 66 | Expect(NumColumns: 2, ppColumns: apCols3, pExpected: "\",,\",\",\"\"\"\"\"\"\"" ); |
| 67 | const char *apCols4[] = {"\"," , " " }; |
| 68 | Expect(NumColumns: 2, ppColumns: apCols4, pExpected: "\"\"\",\", " ); |
| 69 | } |
| 70 | |