Fix Buffer::Iterator::go_previous_line()

This commit is contained in:
Josh Holtrop 2016-12-24 14:41:25 -05:00
parent 3c73b9ae97
commit 1862d867f6
3 changed files with 38 additions and 10 deletions

View File

@ -153,18 +153,16 @@ bool Buffer::Iterator::go_right_in_line(bool allow_eol)
bool Buffer::Iterator::go_previous_line() bool Buffer::Iterator::go_previous_line()
{ {
Iterator i2 = *this; Iterator i2 = *this;
i2.go_back(); while (i2.valid())
while (i2.valid() && (*i2 != '\n'))
{ {
i2.go_back(); i2.go_back();
} if (*i2 == '\n')
i2.go_back(); {
if (i2.valid()) i2.go_start_of_line();
{ m_line--;
m_line--; m_offset = i2.m_offset;
m_offset = i2.m_offset; return true;
go_start_of_line(); }
return true;
} }
return false; return false;
} }

View File

@ -0,0 +1,5 @@
abc
def
end

View File

@ -67,3 +67,28 @@ TEST(BufferTest, allows_navigating_using_iterators)
EXPECT_EQ(0u, iterator->line()); EXPECT_EQ(0u, iterator->line());
ASSERT_EQ((uint32_t)'H', **iterator); 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);
}