add unit tests for buffer insert/erase character

This commit is contained in:
Josh Holtrop 2017-01-15 19:46:33 -05:00
parent 21ba393c45
commit e98454c771
3 changed files with 68 additions and 24 deletions

View File

@ -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<GapBuffer>();
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<GapBuffer>();
m_operation_level = 0;
m_current_change_operation_index = INVALID_CHANGE_OPERATION_INDEX;
}
void Buffer::load_empty_buffer()

View File

@ -154,7 +154,8 @@ protected:
size_t m_current_change_operation_index;
std::vector<std::shared_ptr<ChangeOperation>> 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);

View File

@ -2,6 +2,10 @@
#include "Buffer.h"
#include "TestSupport.h"
#include "Path.h"
#include <string>
#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);
}