1 | #include "test.h" |
2 | #include <gtest/gtest.h> |
3 | |
4 | #include <base/system.h> |
5 | #include <engine/shared/linereader.h> |
6 | |
7 | void 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 | |
30 | TEST(LineReader, NormalNewline) |
31 | { |
32 | TestFileLineReader(pWritten: "foo\nbar\nbaz\n" , SkipBom: false, pReads: {"foo" , "bar" , "baz" }); |
33 | } |
34 | |
35 | TEST(LineReader, CRLFNewline) |
36 | { |
37 | TestFileLineReader(pWritten: "foo\r\nbar\r\nbaz" , SkipBom: true, pReads: {"foo" , "bar" , "baz" }); |
38 | } |
39 | |
40 | TEST(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 | |