1#include "test.h"
2#include <gtest/gtest.h>
3
4#include <base/system.h>
5#include <engine/shared/linereader.h>
6
7void TestFileLineReader(const char *pWritten, bool SkipBom, std::initializer_list<const char *> pReads)
8{
9 CTestInfo Info;
10 IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
11 ASSERT_TRUE(File);
12 EXPECT_EQ(io_write(File, pWritten, str_length(pWritten)), str_length(pWritten));
13 EXPECT_FALSE(io_close(File));
14 File = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ | (SkipBom ? IOFLAG_SKIP_BOM : 0));
15 ASSERT_TRUE(File);
16 CLineReader LineReader;
17 LineReader.Init(File);
18 for(const char *pRead : pReads)
19 {
20 const char *pReadLine = LineReader.Get();
21 ASSERT_TRUE(pReadLine);
22 EXPECT_STREQ(pReadLine, pRead);
23 }
24 EXPECT_FALSE(LineReader.Get());
25 EXPECT_FALSE(io_close(File));
26
27 fs_remove(filename: Info.m_aFilename);
28}
29
30TEST(LineReader, NormalNewline)
31{
32 TestFileLineReader(pWritten: "foo\nbar\nbaz\n", SkipBom: false, pReads: {"foo", "bar", "baz"});
33}
34
35TEST(LineReader, CRLFNewline)
36{
37 TestFileLineReader(pWritten: "foo\r\nbar\r\nbaz", SkipBom: true, pReads: {"foo", "bar", "baz"});
38}
39
40TEST(LineReader, Invalid)
41{
42 // Lines containing invalid UTF-8 are skipped
43 TestFileLineReader(pWritten: "foo\xff\nbar\xff\nbaz\xff\n", SkipBom: false, pReads: {});
44 TestFileLineReader(pWritten: "foo\xff\nbar\nbaz\n", SkipBom: false, pReads: {"bar", "baz"});
45 TestFileLineReader(pWritten: "foo\nbar\xff\nbaz\n", SkipBom: false, pReads: {"foo", "baz"});
46 TestFileLineReader(pWritten: "foo\nbar\nbaz\xff\n", SkipBom: false, pReads: {"foo", "bar"});
47 TestFileLineReader(pWritten: "foo\nbar1\xff\nbar2\xff\nfoobar\nbar3\xff\nbaz\n", SkipBom: false, pReads: {"foo", "foobar", "baz"});
48}
49