From 1862d867f6439f6146c46a00a6b3f34d6c404574 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 24 Dec 2016 14:41:25 -0500 Subject: [PATCH] Fix Buffer::Iterator::go_previous_line() --- src/core/Buffer-Iterator.cc | 18 ++++++++---------- test/files/blank_lines.txt | 5 +++++ test/src/test_Buffer.cc | 25 +++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 test/files/blank_lines.txt diff --git a/src/core/Buffer-Iterator.cc b/src/core/Buffer-Iterator.cc index 23ff99f..2a0b901 100644 --- a/src/core/Buffer-Iterator.cc +++ b/src/core/Buffer-Iterator.cc @@ -153,18 +153,16 @@ bool Buffer::Iterator::go_right_in_line(bool allow_eol) bool Buffer::Iterator::go_previous_line() { Iterator i2 = *this; - i2.go_back(); - while (i2.valid() && (*i2 != '\n')) + while (i2.valid()) { i2.go_back(); - } - i2.go_back(); - if (i2.valid()) - { - m_line--; - m_offset = i2.m_offset; - go_start_of_line(); - return true; + if (*i2 == '\n') + { + i2.go_start_of_line(); + m_line--; + m_offset = i2.m_offset; + return true; + } } return false; } diff --git a/test/files/blank_lines.txt b/test/files/blank_lines.txt new file mode 100644 index 0000000..7af78dc --- /dev/null +++ b/test/files/blank_lines.txt @@ -0,0 +1,5 @@ +abc + +def + +end diff --git a/test/src/test_Buffer.cc b/test/src/test_Buffer.cc index 7ee5ad5..1fd5c1a 100644 --- a/test/src/test_Buffer.cc +++ b/test/src/test_Buffer.cc @@ -67,3 +67,28 @@ TEST(BufferTest, allows_navigating_using_iterators) EXPECT_EQ(0u, iterator->line()); ASSERT_EQ((uint32_t)'H', **iterator); } + +TEST(BufferTest, allows_navigating_using_iterators2) +{ + Buffer b("test/files/blank_lines.txt"); + auto iterator = b.add_iterator(); + + EXPECT_EQ(0u, iterator->line()); + EXPECT_EQ((uint32_t)'a', **iterator); + + EXPECT_TRUE(iterator->go_next_line()); + EXPECT_EQ(1u, iterator->line()); + EXPECT_EQ((uint32_t)'\n', **iterator); + + EXPECT_TRUE(iterator->go_next_line()); + EXPECT_EQ(2u, iterator->line()); + EXPECT_EQ((uint32_t)'d', **iterator); + + EXPECT_TRUE(iterator->go_previous_line()); + EXPECT_EQ(1u, iterator->line()); + EXPECT_EQ((uint32_t)'\n', **iterator); + + EXPECT_TRUE(iterator->go_previous_line()); + EXPECT_EQ(0u, iterator->line()); + EXPECT_EQ((uint32_t)'a', **iterator); +}