From e98454c771b6d28a2573fa36d00b4f77920b951c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 15 Jan 2017 19:46:33 -0500 Subject: [PATCH] add unit tests for buffer insert/erase character --- src/core/Buffer.cc | 22 +++++++++----- src/core/Buffer.h | 3 +- test/src/test_Buffer.cc | 67 +++++++++++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 6c163a2..1b2b215 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -8,39 +8,47 @@ Buffer::Buffer() { + common_pre_load_initialization(); load_empty_buffer(); - common_initialization(); + common_post_load_initialization(); } Buffer::Buffer(const char * filename) { + common_pre_load_initialization(); if (!load_from_file(filename)) { load_empty_buffer(); } - common_initialization(); + common_post_load_initialization(); } Buffer::Buffer(const uint8_t * data, size_t data_length) { + common_pre_load_initialization(); if (!load_from_memory(data, data_length)) { load_empty_buffer(); } - common_initialization(); + common_post_load_initialization(); } -void Buffer::common_initialization() +void Buffer::common_pre_load_initialization() { m_tabstop = 4u; + m_change_buffer = std::make_shared(); + m_operation_level = 0; + m_current_change_operation_index = INVALID_CHANGE_OPERATION_INDEX; + m_encoding = Encoding::UTF_8; +} + +void Buffer::common_post_load_initialization() +{ m_eof_iterator = add_iterator(); while (m_eof_iterator->valid()) { m_eof_iterator->go_forward(); } - m_change_buffer = std::make_shared(); - m_operation_level = 0; - m_current_change_operation_index = INVALID_CHANGE_OPERATION_INDEX; } void Buffer::load_empty_buffer() diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 68b41e7..2831b90 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -154,7 +154,8 @@ protected: size_t m_current_change_operation_index; std::vector> m_change_operations; - void common_initialization(); + void common_pre_load_initialization(); + void common_post_load_initialization(); bool load_from_file(const char * filename); void load_empty_buffer(); bool load_from_memory(const uint8_t * data, size_t data_length); diff --git a/test/src/test_Buffer.cc b/test/src/test_Buffer.cc index 6dc0f1f..0a379d5 100644 --- a/test/src/test_Buffer.cc +++ b/test/src/test_Buffer.cc @@ -2,6 +2,10 @@ #include "Buffer.h" #include "TestSupport.h" #include "Path.h" +#include + +#define C(x) ((uint32_t)(x)) +#define ss(s) std::string(s) TEST(BufferTest, writes_an_identical_file_to_what_is_loaded_if_no_changes_were_performed) { @@ -37,35 +41,35 @@ TEST(BufferTest, allows_navigating_using_iterators) auto iterator = b.add_cursor(); EXPECT_EQ(0u, iterator->line()); - ASSERT_EQ((uint32_t)'H', **iterator); + ASSERT_EQ(C('H'), **iterator); EXPECT_FALSE(iterator->go_previous_line()); EXPECT_EQ(0u, iterator->line()); - ASSERT_EQ((uint32_t)'H', **iterator); + ASSERT_EQ(C('H'), **iterator); EXPECT_TRUE(iterator->go_right_in_line(false)); EXPECT_EQ(0u, iterator->line()); - ASSERT_EQ((uint32_t)'e', **iterator); + ASSERT_EQ(C('e'), **iterator); EXPECT_TRUE(iterator->go_next_line()); EXPECT_EQ(1u, iterator->line()); - ASSERT_EQ((uint32_t)'T', **iterator); + ASSERT_EQ(C('T'), **iterator); EXPECT_FALSE(iterator->go_left_in_line()); EXPECT_EQ(1u, iterator->line()); - ASSERT_EQ((uint32_t)'T', **iterator); + ASSERT_EQ(C('T'), **iterator); EXPECT_TRUE(iterator->go_right_in_line(true)); EXPECT_EQ(1u, iterator->line()); - ASSERT_EQ((uint32_t)'h', **iterator); + ASSERT_EQ(C('h'), **iterator); EXPECT_FALSE(iterator->go_next_line()); EXPECT_EQ(1u, iterator->line()); - ASSERT_EQ((uint32_t)'h', **iterator); + ASSERT_EQ(C('h'), **iterator); EXPECT_TRUE(iterator->go_previous_line()); EXPECT_EQ(0u, iterator->line()); - ASSERT_EQ((uint32_t)'H', **iterator); + ASSERT_EQ(C('H'), **iterator); } TEST(BufferTest, allows_navigating_using_iterators2) @@ -74,33 +78,64 @@ TEST(BufferTest, allows_navigating_using_iterators2) auto iterator = b.add_cursor(); EXPECT_EQ(0u, iterator->line()); - EXPECT_EQ((uint32_t)'a', **iterator); + EXPECT_EQ(C('a'), **iterator); EXPECT_TRUE(iterator->go_next_line()); EXPECT_EQ(1u, iterator->line()); - EXPECT_EQ((uint32_t)'\n', **iterator); + EXPECT_EQ(C('\n'), **iterator); EXPECT_FALSE(iterator->go_start_of_line()); EXPECT_EQ(1u, iterator->line()); - EXPECT_EQ((uint32_t)'\n', **iterator); + EXPECT_EQ(C('\n'), **iterator); EXPECT_FALSE(iterator->go_end_of_line(false)); EXPECT_EQ(1u, iterator->line()); - EXPECT_EQ((uint32_t)'\n', **iterator); + EXPECT_EQ(C('\n'), **iterator); EXPECT_FALSE(iterator->go_end_of_line(true)); EXPECT_EQ(1u, iterator->line()); - EXPECT_EQ((uint32_t)'\n', **iterator); + EXPECT_EQ(C('\n'), **iterator); EXPECT_TRUE(iterator->go_next_line()); EXPECT_EQ(2u, iterator->line()); - EXPECT_EQ((uint32_t)'d', **iterator); + EXPECT_EQ(C('d'), **iterator); EXPECT_TRUE(iterator->go_previous_line()); EXPECT_EQ(1u, iterator->line()); - EXPECT_EQ((uint32_t)'\n', **iterator); + EXPECT_EQ(C('\n'), **iterator); EXPECT_TRUE(iterator->go_previous_line()); EXPECT_EQ(0u, iterator->line()); - EXPECT_EQ((uint32_t)'a', **iterator); + EXPECT_EQ(C('a'), **iterator); +} + +TEST(BufferTest, allows_inserting_and_erasing_characters) +{ + std::string s("abc\ndef\nghi\n"); + Buffer b((const uint8_t *)&s[0], s.size()); + auto it = b.add_cursor(); + + b.insert_code_point(*it, C('1')); + EXPECT_EQ(ss("1abc\ndef\nghi\n"), b.get_string()); + EXPECT_EQ(C('a'), **it); + + it->go_end_of_line(true); + b.insert_code_point(*it, C('$')); + EXPECT_EQ(ss("1abc$\ndef\nghi\n"), b.get_string()); + EXPECT_EQ(C('\n'), **it); + + b.erase_code_point(*it); + EXPECT_EQ(ss("1abc$def\nghi\n"), b.get_string()); + EXPECT_EQ(C('d'), **it); +} + +TEST(BufferTest, adds_a_newline_after_inserted_character_when_inserting_in_an_empty_buffer) +{ + Buffer b; + auto it = b.add_cursor(); + EXPECT_EQ(0u, it->offset()); + + b.insert_code_point(*it, C('J')); + EXPECT_EQ(ss("J\n"), b.get_string()); + EXPECT_EQ(C('\n'), **it); }