From cd0efc431d08d4afaf4c0ce8ea279129f4c1d7c5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 15 Jan 2017 21:16:55 -0500 Subject: [PATCH] test more undo/redo change unit combinations --- test/src/test_Buffer.cc | 82 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/test/src/test_Buffer.cc b/test/src/test_Buffer.cc index b5cb554..ccba068 100644 --- a/test/src/test_Buffer.cc +++ b/test/src/test_Buffer.cc @@ -308,6 +308,55 @@ TEST(BufferTest, erases_in_uncommitted_insert_units_modify_the_insert_units) EXPECT_EQ(C('b'), **it); } +TEST(BufferTest, erases_outside_uncommitted_insert_units_start_new_units_within_the_same_operation) +{ + std::string s("abcdef\n"); + Buffer b((const uint8_t *)&s[0], s.size()); + auto it = b.add_cursor(); + + it->go_right_in_line(false); + b.enter_insert_mode(); + b.insert_code_point(*it, C('1')); + b.insert_code_point(*it, C('2')); + b.erase_code_point(*it); + b.exit_insert_mode(); + EXPECT_EQ(1u, b.m_change_operations.size()); + EXPECT_EQ(ss("a12cdef\n"), b.get_string()); + EXPECT_EQ(C('c'), **it); + + b.undo(); + EXPECT_EQ(ss("abcdef\n"), b.get_string()); + EXPECT_EQ(C('c'), **it); + + b.redo(); + EXPECT_EQ(ss("a12cdef\n"), b.get_string()); + EXPECT_EQ(C('c'), **it); + + b.enter_insert_mode(); + b.insert_code_point(*it, C('3')); + it->go_start_of_line(); + b.erase_code_point(*it); + b.exit_insert_mode(); + EXPECT_EQ("123cdef\n", b.get_string()); + EXPECT_EQ(C('1'), **it); + + b.undo(); + EXPECT_EQ("a12cdef\n", b.get_string()); + EXPECT_EQ(C('1'), **it); + + b.undo(); + EXPECT_EQ("abcdef\n", b.get_string()); + EXPECT_EQ(C('b'), **it); + + b.redo(); + EXPECT_EQ("a12cdef\n", b.get_string()); + EXPECT_EQ(C('c'), **it); + + b.redo(); + EXPECT_EQ("123cdef\n", b.get_string()); + EXPECT_EQ(C('c'), **it); +} + TEST(BufferTest, a_insert_change_unit_is_dropped_if_everything_in_it_is_erased_before_committing) { std::string s("abc\n"); @@ -355,3 +404,36 @@ TEST(BufferTest, non_adjacent_inserts_in_insert_mode_create_a_single_change_oper b.undo(); EXPECT_EQ("abc\n", b.get_string()); } + +TEST(BufferTest, erase_then_insert_creates_single_change_operation) +{ + std::string s("abc\n"); + Buffer b((const uint8_t *)&s[0], s.size()); + auto it = b.add_cursor(); + + b.enter_insert_mode(); + b.erase_code_point(*it); + b.insert_code_point(*it, C('1')); + b.exit_insert_mode(); + EXPECT_EQ("1bc\n", b.get_string()); + + b.undo(); + EXPECT_EQ("abc\n", b.get_string()); +} + +TEST(BufferTest, non_adjacent_erases_create_a_single_change_operation) +{ + std::string s("abc\n"); + Buffer b((const uint8_t *)&s[0], s.size()); + auto it = b.add_cursor(); + + b.enter_insert_mode(); + b.erase_code_point(*it); + it->go_right_in_line(false); + b.erase_code_point(*it); + b.exit_insert_mode(); + EXPECT_EQ("b\n", b.get_string()); + + b.undo(); + EXPECT_EQ(ss("abc\n"), b.get_string()); +}