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()
{
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;
}

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());
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);
}