jes/test/src/test_BufferView.cc

701 lines
22 KiB
C++

#include "gtest/gtest.h"
#include "BufferView.h"
#define C(x) ((uint32_t)(x))
static std::shared_ptr<Buffer> buffer1()
{
static const char data[] =
"0\n"
"1ab\n"
"2abc\n"
"3\n"
"4\n"
"5\n"
"6abcdefg\n"
"7\n"
"8\n"
"9abcdefghijklmno\n"
"10\n"
"11\n"
"12\n";
return std::make_shared<Buffer>((const uint8_t *)data, strlen(data));
}
static std::shared_ptr<Buffer> buffer_empty()
{
return std::make_shared<Buffer>(nullptr, 0u);
}
class MyCharacterWidthDeterminer : public CharacterWidthDeterminer
{
int operator()(uint32_t character)
{
if (character < 32)
{
return 2;
}
else
{
return 1;
}
}
} Cwd;
static int LineNumber(std::shared_ptr<Buffer::Iterator> iterator)
{
int line_number = 0;
auto i = std::make_shared<Buffer::Iterator>(*iterator);
i->go_start_of_line();
for (;;)
{
uint32_t c = **i;
if ((c < '0') || (c > '9'))
break;
line_number *= 10;
line_number += ((int)c - '0');
i->go_forward();
}
return line_number;
}
TEST(BufferViewTest, does_not_iterate_for_empty_buffer)
{
std::shared_ptr<Buffer> b = buffer_empty();
std::shared_ptr<Buffer::Iterator> iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(40, 8);
int iter_count = 0;
bv.update();
for (auto it = bv.vert_iter(); it.is_valid(); it++)
{
iter_count++;
}
EXPECT_EQ(0, iter_count);
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
}
TEST(BufferViewTest, iterates_through_screen_lines_with_no_wrapping)
{
std::shared_ptr<Buffer> b = buffer1();
std::shared_ptr<Buffer::Iterator> iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(40, 8);
int iter_count = 0;
bv.update();
for (auto it = bv.vert_iter(); it.is_valid(); it++)
{
EXPECT_EQ(iter_count, LineNumber(it.iterator()));
iter_count++;
}
EXPECT_EQ(8, iter_count);
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
}
TEST(BufferViewTest, iterates_through_screen_lines_with_wrapping)
{
std::shared_ptr<Buffer> b = buffer1();
std::shared_ptr<Buffer::Iterator> iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(3, 10);
int iter_count = 0;
int expected_row_offsets[] = {0, 1, 2, 4, 5, 6, 7};
bv.update();
for (auto it = bv.vert_iter(); it.is_valid(); it++)
{
EXPECT_EQ(iter_count, LineNumber(it.iterator()));
EXPECT_EQ(expected_row_offsets[iter_count], it.row_offset());
iter_count++;
}
EXPECT_EQ(7, iter_count);
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
}
TEST(BufferViewTest, fills_view_with_last_lines_of_buffer_when_cursor_warps_to_last_line)
{
std::shared_ptr<Buffer> b = buffer1();
std::shared_ptr<Buffer::Iterator> iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
while (iterator->go_next_line())
{
}
bv.resize(40, 3);
int iter_count = 0;
int expected_row_offsets[] = {0, 1, 2};
bv.update();
for (auto it = bv.vert_iter(); it.is_valid(); it++)
{
EXPECT_EQ(10 + iter_count, LineNumber(it.iterator()));
EXPECT_EQ(expected_row_offsets[iter_count], it.row_offset());
iter_count++;
}
EXPECT_EQ(3, iter_count);
EXPECT_EQ(2, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
}
TEST(BufferViewTest, adjusts_cursor_row_as_cursor_moves)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(5, 5);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 1
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 2
bv.update();
EXPECT_EQ(2, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 3
bv.update();
EXPECT_EQ(3, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 4
bv.update();
EXPECT_EQ(4, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 5
bv.update();
EXPECT_EQ(4, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 6
bv.update();
EXPECT_EQ(4, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 7
bv.update();
EXPECT_EQ(4, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 6
bv.update();
EXPECT_EQ(2, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 5
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 4
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 3
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 2
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 1
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 0
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
}
TEST(BufferViewTest, adjusts_cursor_row_as_cursor_moves_with_scroll_offset_1)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(5, 5);
bv.set_scroll_offset(1);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 1
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 2
bv.update();
EXPECT_EQ(2, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 3
bv.update();
EXPECT_EQ(3, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 4
bv.update();
EXPECT_EQ(3, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 5
bv.update();
EXPECT_EQ(3, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 6
bv.update();
EXPECT_EQ(3, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 7
bv.update();
EXPECT_EQ(3, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 6
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 5
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 4
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 3
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 2
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 1
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 0
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
}
TEST(BufferViewTest, moves_view_down_while_traversing_a_wrapped_line_right)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 10);
for (int i = 0; i < 9; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::DOWN, false));
bv.update();
}
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_EQ(C('9'), **iterator);
for (int i = 0; i < 3; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(1 + i, bv.cursor_screen_column());
EXPECT_EQ(1 + i, bv.cursor_virtual_column());
}
for (int i = 0; i < 4; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(i, bv.cursor_screen_column());
EXPECT_EQ(4 + i, bv.cursor_virtual_column());
}
for (int i = 0; i < 4; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(i, bv.cursor_screen_column());
EXPECT_EQ(8 + i, bv.cursor_virtual_column());
}
EXPECT_EQ(C('k'), **iterator);
}
TEST(BufferViewTest, moves_view_down_while_jumping_to_the_end_of_a_wrapped_line)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 10);
for (int i = 0; i < 9; i++)
{
bv.cursor_move(BufferView::CursorMovement::DOWN, false);
bv.update();
}
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_EQ(C('9'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::EOL, false));
bv.update();
EXPECT_EQ(9, bv.cursor_screen_row());
EXPECT_EQ(3, bv.cursor_screen_column());
EXPECT_EQ(15, bv.cursor_virtual_column());
EXPECT_EQ(C('o'), **iterator);
}
TEST(BufferViewTest, moves_view_up_while_traversing_a_wrapped_line_left)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(2, 3);
for (int i = 0; i < 4; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::DOWN, false));
bv.update();
}
EXPECT_EQ(2, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
for (int i = 0; i < 4; i++)
{
iterator->go_back();
}
/* Cursor at end of line 2 */
bv.set_cursor_screen_row(0);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(1, bv.cursor_screen_column());
EXPECT_EQ(3, bv.cursor_virtual_column());
EXPECT_EQ(C('c'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::LEFT, false));
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(2, bv.cursor_virtual_column());
EXPECT_EQ(C('b'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::LEFT, false));
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(1, bv.cursor_screen_column());
EXPECT_EQ(1, bv.cursor_virtual_column());
EXPECT_EQ(C('a'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::LEFT, false));
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_EQ(C('2'), **iterator);
EXPECT_FALSE(bv.cursor_move(BufferView::CursorMovement::LEFT, false));
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_EQ(C('2'), **iterator);
}
TEST(BufferViewTest, moves_view_up_while_jumping_to_start_of_a_wrapped_line)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(2, 3);
for (int i = 0; i < 4; i++)
{
bv.cursor_move(BufferView::CursorMovement::DOWN, false);
bv.update();
}
EXPECT_EQ(2, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
for (int i = 0; i < 4; i++)
{
iterator->go_back();
}
/* Cursor at end of line 2 */
bv.set_cursor_screen_row(0);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(1, bv.cursor_screen_column());
EXPECT_EQ(3, bv.cursor_virtual_column());
EXPECT_EQ(C('c'), **iterator);
bv.cursor_move(BufferView::CursorMovement::SOL, false);
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_EQ(C('2'), **iterator);
}
TEST(BufferViewTest, warps_view_when_jumping_to_beginning_and_end_of_buffer)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 4);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::LAST_LINE, false));
bv.update();
EXPECT_EQ(12, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_FALSE(bv.cursor_move(BufferView::CursorMovement::LAST_LINE, false));
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::FIRST_LINE, false));
bv.update();
EXPECT_EQ(0, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
EXPECT_EQ(0, bv.cursor_screen_column());
EXPECT_EQ(0, bv.cursor_virtual_column());
EXPECT_FALSE(bv.cursor_move(BufferView::CursorMovement::FIRST_LINE, false));
}
TEST(BufferViewTest, sets_target_column_to_eol_when_jumping_to_SOL_and_EOL)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 4);
bv.cursor_move(BufferView::CursorMovement::EOL, false);
bv.update();
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::DOWN, false));
bv.update();
EXPECT_EQ(1, bv.cursor_screen_row());
EXPECT_EQ(C('b'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::UP, false));
bv.update();
EXPECT_EQ(0, bv.cursor_screen_row());
bv.cursor_move(BufferView::CursorMovement::SOL, false);
bv.update();
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::DOWN, false));
EXPECT_EQ(C('1'), **iterator);
EXPECT_EQ(1, bv.cursor_screen_row());
}
TEST(BufferViewTest, sets_target_column_when_traversing_left_and_right)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 4);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::DOWN, false));
bv.update();
EXPECT_EQ(1, LineNumber(iterator));
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_EQ(1, LineNumber(iterator));
EXPECT_EQ(C('b'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::DOWN, false));
bv.update();
EXPECT_EQ(2, LineNumber(iterator));
EXPECT_EQ(C('b'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::LEFT, false));
bv.update();
EXPECT_EQ(2, LineNumber(iterator));
EXPECT_EQ(C('a'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::UP, false));
bv.update();
EXPECT_EQ(1, LineNumber(iterator));
EXPECT_EQ(C('a'), **iterator);
}
TEST(BufferViewTest, moves_cursor_by_screen_row)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 4);
for (int i = 0; i < 6; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_DOWN, false));
bv.update();
EXPECT_EQ(1 + i, LineNumber(iterator));
}
EXPECT_EQ(C('6'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_DOWN, false));
bv.update();
EXPECT_EQ(6, LineNumber(iterator));
EXPECT_EQ(C('d'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::RIGHT, false));
bv.update();
EXPECT_EQ(C('f'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_DOWN, false));
bv.update();
EXPECT_EQ(C('7'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_UP, false));
bv.update();
EXPECT_EQ(C('f'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_UP, false));
bv.update();
EXPECT_EQ(C('b'), **iterator);
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_UP, false));
bv.update();
EXPECT_EQ(C('5'), **iterator);
}
TEST(BufferViewTest, cursor_move_screen_row_up_and_down_returns_false_at_top_and_bottom)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(4, 4);
EXPECT_FALSE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_UP, false));
bv.update();
EXPECT_EQ(0, LineNumber(iterator));
for (int i = 0; i < 16; i++)
{
EXPECT_TRUE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_DOWN, false));
bv.update();
}
EXPECT_FALSE(bv.cursor_move(BufferView::CursorMovement::SCREEN_ROW_DOWN, false));
}
TEST(BufferViewTest, scrolls_the_view_up_and_down)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(40, 6);
bv.update();
EXPECT_EQ(0, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(1, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_down(5, false);
bv.update();
EXPECT_EQ(6, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(7, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(7, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_down(3, false);
bv.update();
EXPECT_EQ(7, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(7, LineNumber(iterator));
EXPECT_EQ(1, bv.cursor_screen_row());
bv.scroll_view_up(4, false);
bv.update();
EXPECT_EQ(7, LineNumber(iterator));
EXPECT_EQ(5, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(6, LineNumber(iterator));
EXPECT_EQ(5, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(5, LineNumber(iterator));
EXPECT_EQ(5, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(5, LineNumber(iterator));
EXPECT_EQ(5, bv.cursor_screen_row());
bv.scroll_view_up(3, false);
bv.update();
EXPECT_EQ(5, LineNumber(iterator));
EXPECT_EQ(5, bv.cursor_screen_row());
}
TEST(BufferViewTest, scrolls_the_view_up_and_down_with_nonzero_scroll_offset)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(40, 6);
bv.set_scroll_offset(2);
bv.update();
EXPECT_EQ(0, LineNumber(iterator));
EXPECT_EQ(0, bv.cursor_screen_row());
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(3, LineNumber(iterator));
EXPECT_EQ(2, bv.cursor_screen_row());
bv.scroll_view_down(5, false);
bv.update();
EXPECT_EQ(8, LineNumber(iterator));
EXPECT_EQ(2, bv.cursor_screen_row());
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(9, LineNumber(iterator));
EXPECT_EQ(2, bv.cursor_screen_row());
bv.scroll_view_down(1, false);
bv.update();
EXPECT_EQ(9, LineNumber(iterator));
EXPECT_EQ(2, bv.cursor_screen_row());
bv.scroll_view_down(3, false);
bv.update();
EXPECT_EQ(9, LineNumber(iterator));
EXPECT_EQ(2, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(9, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
bv.scroll_view_up(4, false);
bv.update();
EXPECT_EQ(5, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(4, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(3, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
bv.scroll_view_up(1, false);
bv.update();
EXPECT_EQ(3, LineNumber(iterator));
EXPECT_EQ(3, bv.cursor_screen_row());
bv.scroll_view_up(3, false);
bv.update();
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);
}
TEST(BufferViewTest, shows_only_lines_in_buffer_if_fewer_lines_in_buffer_than_view)
{
auto b = buffer1();
auto iterator = b->add_iterator();
BufferView bv(b, iterator, Cwd);
bv.resize(50, 50);
bv.update();
int count = 0;
for (auto it = bv.vert_iter(); it.is_valid(); it++)
{
EXPECT_EQ(count, it.row_offset());
count++;
}
EXPECT_EQ(13, count);
}