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
10static 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
45TEST(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
59TEST(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