#include "line.hh" #include "io_test_helper.hh" #include #include #include #include TEST(line, empty) { auto reader = line::open(io::memory("")); EXPECT_EQ(0, reader->number()); auto line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); EXPECT_EQ(0, reader->number()); } TEST(line, one_line) { auto reader = line::open(io::memory("foo")); EXPECT_EQ(0, reader->number()); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo", line.value()); EXPECT_EQ(1, reader->number()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); EXPECT_EQ(1, reader->number()); } TEST(line, many_lines) { auto reader = line::open(io::memory("foo\nbar\nfoobar\n")); EXPECT_EQ(0, reader->number()); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo", line.value()); EXPECT_EQ(1, reader->number()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("bar", line.value()); EXPECT_EQ(2, reader->number()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foobar", line.value()); EXPECT_EQ(3, reader->number()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); EXPECT_EQ(3, reader->number()); } TEST(line, many_lines_mixed) { auto reader = line::open(io::memory("foo\r\nbar\rfoobar\n")); EXPECT_EQ(0, reader->number()); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo", line.value()); EXPECT_EQ(1, reader->number()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("bar", line.value()); EXPECT_EQ(2, reader->number()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foobar", line.value()); EXPECT_EQ(3, reader->number()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); EXPECT_EQ(3, reader->number()); } TEST(line, empty_line) { auto reader = line::open(io::memory("\n")); EXPECT_EQ(0, reader->number()); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("", line.value()); EXPECT_EQ(1, reader->number()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); EXPECT_EQ(1, reader->number()); } TEST(line, max_line) { auto reader = line::open(io::memory("012345678901234567890123456789"), 10); EXPECT_EQ(0, reader->number()); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("0123456789", line.value()); EXPECT_EQ(1, reader->number()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("0123456789", line.value()); EXPECT_EQ(2, reader->number()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("0123456789", line.value()); EXPECT_EQ(3, reader->number()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); EXPECT_EQ(3, reader->number()); } TEST(line, read_error) { auto reader = line::open( io_make_breaking(io::memory("foo bar fum\nfim zam"), /* offset */ 5)); auto line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Error, line.error()); } TEST(line, read_error_newline) { auto reader = line::open( io_make_breaking(io::memory("foo bar\r\nfim zam"), /* offset */ 8)); auto line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Error, line.error()); } TEST(line, blocky) { auto reader = line::open(io_make_max_block(io::memory("foo bar\r\nfim zam"), /* max_block_size */ 1)); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo bar", line.value()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("fim zam", line.value()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); } TEST(line, blocky_newline) { auto reader = line::open(io_make_max_block(io::memory("foo bar\r\nfim zam"), /* max_block_size */ 8)); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo bar", line.value()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("fim zam", line.value()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); } TEST(line, eof_newline) { auto reader = line::open(io::memory("foo bar\r")); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo bar", line.value()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); } TEST(line, max_newline) { auto reader = line::open(io::memory("foo bar\r"), 6); auto line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("foo ba", line.value()); line = reader->read(); ASSERT_TRUE(line.has_value()); EXPECT_EQ("r", line.value()); line = reader->read(); ASSERT_FALSE(line.has_value()); EXPECT_EQ(io::ReadError::Eof, line.error()); } TEST(line, max_line_overflow) { EXPECT_DEATH_IF_SUPPORTED( { std::ignore = line::open(io::memory(""), std::numeric_limits::max()); }, ""); }