Add cursor movement logic to BufferView
This commit is contained in:
1 parent
7ad28ceb67
commit
fcd198b691
3 files changed
+382
-54
No files matched your search
+218
-33
@@ -1,6 +1,8 @@
|
||||
#include "gtest/gtest.h"
|
||||
#include "BufferView.h"
|
||||
|
||||
#define C(x) ((uint32_t)(x))
|
||||
|
||||
static std::shared_ptr<Buffer> buffer1()
|
||||
{
|
||||
static const char data[] =
|
||||
@@ -44,6 +46,7 @@ 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;
|
||||
@@ -146,46 +149,46 @@ TEST(BufferViewTest, adjusts_cursor_row_as_cursor_moves)
|
||||
bv.resize(5, 5);
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 1
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 1
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 2
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 2
|
||||
bv.update();
|
||||
EXPECT_EQ(2, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 3
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 3
|
||||
bv.update();
|
||||
EXPECT_EQ(3, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 4
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 4
|
||||
bv.update();
|
||||
EXPECT_EQ(4, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 5
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 5
|
||||
bv.update();
|
||||
EXPECT_EQ(4, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 6
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 6
|
||||
bv.update();
|
||||
EXPECT_EQ(4, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 7
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 7
|
||||
bv.update();
|
||||
EXPECT_EQ(4, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 6
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 6
|
||||
bv.update();
|
||||
EXPECT_EQ(2, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 5
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 5
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 4
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 4
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 3
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 3
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 2
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 2
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 1
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 1
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 0
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 0
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
}
|
||||
@@ -199,51 +202,51 @@ TEST(BufferViewTest, adjusts_cursor_row_as_cursor_moves_with_scroll_offset_1)
|
||||
bv.set_scroll_offset(1);
|
||||
bv.update();
|
||||
EXPECT_EQ(0, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 1
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 1
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 2
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 2
|
||||
bv.update();
|
||||
EXPECT_EQ(2, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 3
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 3
|
||||
bv.update();
|
||||
EXPECT_EQ(3, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 4
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 4
|
||||
bv.update();
|
||||
EXPECT_EQ(3, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 5
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 5
|
||||
bv.update();
|
||||
EXPECT_EQ(3, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 6
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 6
|
||||
bv.update();
|
||||
EXPECT_EQ(3, bv.cursor_screen_row());
|
||||
iterator->go_next_line(); // to 7
|
||||
bv.cursor_move(BufferView::CursorMovement::DOWN, false); // to 7
|
||||
bv.update();
|
||||
EXPECT_EQ(3, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 6
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 6
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 5
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 5
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 4
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 4
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 3
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 3
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 2
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 2
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 1
|
||||
bv.cursor_move(BufferView::CursorMovement::UP, false); // to 1
|
||||
bv.update();
|
||||
EXPECT_EQ(1, bv.cursor_screen_row());
|
||||
iterator->go_previous_line(); // to 0
|
||||
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)
|
||||
TEST(BufferViewTest, moves_view_down_while_traversing_a_wrapped_line_right)
|
||||
{
|
||||
auto b = buffer1();
|
||||
auto iterator = b->add_iterator();
|
||||
@@ -251,15 +254,16 @@ TEST(BufferViewTest, moves_view_down_while_traversing_a_wrapped_line)
|
||||
bv.resize(4, 10);
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
iterator->go_next_line();
|
||||
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++)
|
||||
{
|
||||
iterator->go_forward();
|
||||
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());
|
||||
@@ -267,7 +271,7 @@ TEST(BufferViewTest, moves_view_down_while_traversing_a_wrapped_line)
|
||||
}
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
iterator->go_forward();
|
||||
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());
|
||||
@@ -275,10 +279,191 @@ TEST(BufferViewTest, moves_view_down_while_traversing_a_wrapped_line)
|
||||
}
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
iterator->go_forward();
|
||||
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);
|
||||
}
|
||||
Reference in new issue
Block a user