From 861aaed940a284342438f9d0d58084922be0b5d0 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 15 Jan 2017 20:23:27 -0500 Subject: [PATCH] add unit test for coalescing erase change units within a change operation --- src/core/Buffer.h | 2 ++ test/src/test_Buffer.cc | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 2831b90..5db8bd1 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -137,7 +137,9 @@ public: void undo(); void redo(); +#ifndef ENABLE_TESTING protected: +#endif bool m_eol_at_eof; LineEndings::Type m_line_endings; std::shared_ptr m_gap_buffer; diff --git a/test/src/test_Buffer.cc b/test/src/test_Buffer.cc index 2b6e193..96f749b 100644 --- a/test/src/test_Buffer.cc +++ b/test/src/test_Buffer.cc @@ -242,3 +242,27 @@ TEST(BufferTest, allows_undo_and_redo_of_erases) EXPECT_EQ(ss("bc\ndfghi\n"), b.get_string()); EXPECT_EQ(C('f'), **it); } + +TEST(BufferTest, erase_chunks_are_coalesced_within_a_change_operation) +{ + std::string s("abcdef\n"); + Buffer b((const uint8_t *)&s[0], s.size()); + auto it = b.add_cursor(); + + b.enter_insert_mode(); + it->go_right_in_line(false); + it->go_right_in_line(false); /* erase just after previous erase */ + b.erase_code_point(*it); + b.erase_code_point(*it); + it->go_left_in_line(); + b.erase_code_point(*it); /* erase just before previous erase */ + b.exit_insert_mode(); + EXPECT_EQ(C('e'), **it); + EXPECT_EQ(ss("aef\n"), b.get_string()); + ASSERT_EQ(1u, b.m_change_operations.size()); + ASSERT_EQ(1u, b.m_change_operations[0]->changes.size()); + + b.undo(); + EXPECT_EQ(C('e'), **it); + EXPECT_EQ(ss("abcdef\n"), b.get_string()); +}