BufferView: test and fix scrolling through super long lines

This commit is contained in:
Josh Holtrop 2017-09-13 20:57:42 -04:00
parent 70aba6e2d4
commit 5c3a095aeb
2 changed files with 50 additions and 0 deletions

View File

@ -407,6 +407,7 @@ void BufferView::move_forward_to_screen_position(
(it.screen_column() <= m_target_screen_column)))
{
*m_iterator = *it.iterator();
m_cursor_row_offset = it.row_offset();
}
else
{

View File

@ -633,3 +633,52 @@ TEST(BufferViewTest, scrolls_the_view_up_and_down_with_nonzero_scroll_offset)
EXPECT_EQ(3, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
}
TEST(BufferViewTest, scrolls_window_through_a_very_long_single_line_file)
{
auto b = std::make_shared<Buffer>();
auto iterator = b->add_cursor();
for (int row = 0; row < 120; row++)
{
for (int col = 0; col < 10; col++)
{
b->insert_code_point(*iterator, (uint32_t)(row + 1000));
}
}
iterator->go_start_of_line();
BufferView bv(b, iterator, Cwd);
bv.resize(10, 10);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(1000u, **iterator);
for (uint32_t i = 0u; i < 100u; i++)
{
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(i + 1001u, **iterator);
}
bv.scroll_view_down(20, false);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(1110u, **iterator);
for (int i = 0; i < 9; i++)
{
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(i + 1, bv.cursor_screen_row());
EXPECT_EQ(1110u, **iterator);
}
for (uint32_t i = 0; i < 50; i++)
{
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(1109u - i, **iterator);
}
bv.scroll_view_up(1000u, false);
bv.update();
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(1009u, **iterator);
}