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