diff --git a/src/core/Buffer.h b/src/core/Buffer.h index edc51e9..cb7d41d 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -12,6 +12,7 @@ class Buffer public: Buffer(const char * filename = nullptr); bool write_to_file(const char * filename); + auto add_cursor() { return m_gap_buffer->add_cursor(); } protected: bool m_eol_at_eof; diff --git a/src/core/GapBuffer.cc b/src/core/GapBuffer.cc index 7199d20..fe13f52 100644 --- a/src/core/GapBuffer.cc +++ b/src/core/GapBuffer.cc @@ -223,6 +223,7 @@ bool GapBuffer::Cursor::go_up(size_t target_column) c2.go_start_of_line(); *this = c2; m_line--; + m_column = 0u; forward_to_column(target_column); return true; } @@ -237,6 +238,7 @@ bool GapBuffer::Cursor::go_down(size_t target_column) } *this = c2; m_line++; + m_column = 0u; forward_to_column(target_column); return true; } diff --git a/src/core/GapBuffer.h b/src/core/GapBuffer.h index 6df18a2..3e86bc5 100644 --- a/src/core/GapBuffer.h +++ b/src/core/GapBuffer.h @@ -76,6 +76,8 @@ public: uint32_t operator*() const { return *m_iterator; } uint8_t * address() const { return m_iterator.address(); } bool valid() const { return m_iterator.valid(); } + size_t line() const { return m_line; } + size_t column() const { return m_column; } protected: Iterator m_iterator; diff --git a/test/src/test_Buffer.cc b/test/src/test_Buffer.cc index 544569d..61c81e7 100644 --- a/test/src/test_Buffer.cc +++ b/test/src/test_Buffer.cc @@ -28,24 +28,42 @@ TEST(BufferTest, writes_an_empty_file_for_an_empty_buffer) TestSupport::compare_files("test/files/empty.txt", "test/tmp/f"); } -#if 0 TEST(BufferTest, allows_navigating_using_cursors) { - Buffer b; - ASSERT_TRUE(b.load_from_file("test/files/line_endings/lf_format.txt")); - std::shared_ptr cursor = b.piece_table->add_cursor(); + Buffer b("test/files/line_endings/lf_format.txt"); + auto cursor = b.add_cursor(); + + EXPECT_EQ(0u, cursor->column()); + EXPECT_EQ(0u, cursor->line()); ASSERT_EQ((uint32_t)'H', **cursor); - EXPECT_FALSE(cursor->check_go_up(1, cursor->column)); + + EXPECT_FALSE(cursor->go_up(cursor->column())); + EXPECT_EQ(0u, cursor->column()); + EXPECT_EQ(0u, cursor->line()); ASSERT_EQ((uint32_t)'H', **cursor); - EXPECT_TRUE(cursor->check_go_right(1, false)); + + EXPECT_TRUE(cursor->go_right(false)); + EXPECT_EQ(1u, cursor->column()); + EXPECT_EQ(0u, cursor->line()); ASSERT_EQ((uint32_t)'e', **cursor); - EXPECT_TRUE(cursor->check_go_down(1, cursor->column)); + + EXPECT_TRUE(cursor->go_down(cursor->column())); + EXPECT_EQ(1u, cursor->column()); + EXPECT_EQ(1u, cursor->line()); ASSERT_EQ((uint32_t)'h', **cursor); - EXPECT_TRUE(cursor->check_go_left(1)); + + EXPECT_TRUE(cursor->go_left()); + EXPECT_EQ(0u, cursor->column()); + EXPECT_EQ(1u, cursor->line()); ASSERT_EQ((uint32_t)'T', **cursor); - EXPECT_FALSE(cursor->check_go_left(1)); + + EXPECT_FALSE(cursor->go_left()); + EXPECT_EQ(0u, cursor->column()); + EXPECT_EQ(1u, cursor->line()); ASSERT_EQ((uint32_t)'T', **cursor); - EXPECT_FALSE(cursor->check_go_down(1, cursor->column)); + + EXPECT_FALSE(cursor->go_down(cursor->column())); + EXPECT_EQ(0u, cursor->column()); + EXPECT_EQ(1u, cursor->line()); ASSERT_EQ((uint32_t)'T', **cursor); } -#endif