From 5c3a095aeb7e96a2681a2db687ba4949553cbcb2 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 13 Sep 2017 20:57:42 -0400 Subject: [PATCH] BufferView: test and fix scrolling through super long lines --- src/core/BufferView.cc | 1 + test/src/test_BufferView.cc | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/core/BufferView.cc b/src/core/BufferView.cc index 0d2a4d5..3ceb8ad 100644 --- a/src/core/BufferView.cc +++ b/src/core/BufferView.cc @@ -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 { diff --git a/test/src/test_BufferView.cc b/test/src/test_BufferView.cc index 456d62c..ccfa022 100644 --- a/test/src/test_BufferView.cc +++ b/test/src/test_BufferView.cc @@ -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(); + 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); +}