diff --git a/makefile b/makefile index c4a43eb..d96c36f 100644 --- a/makefile +++ b/makefile @@ -33,6 +33,7 @@ UNITTEST_SOURCES := test/unittest/test_main.cpp test/unittest/shellmatta_utils/test_utils_clearInput.cpp \ test/unittest/shellmatta_utils/test_utils_insertChars.cpp \ test/unittest/shellmatta_utils/test_utils_terminateInput.cpp \ + test/unittest/shellmatta_utils/test_utils_removeChars.cpp \ test/unittest/shellmatta_autocomplete/test_autocomplete_run.cpp \ test/unittest/shellmatta_escape/test_escape_processArrowKeys.cpp \ test/unittest/shellmatta_history/test_appendHistoryByte.cpp \ diff --git a/src/shellmatta_utils.c b/src/shellmatta_utils.c index da18af6..e67fda6 100644 --- a/src/shellmatta_utils.c +++ b/src/shellmatta_utils.c @@ -215,13 +215,14 @@ void utils_insertChars( shellmatta_instance_t *inst, * position * @param[in] inst pointer to a shellmatta instance * @param[in] length number of characters to remove - * @param[in] backspace remove characters left of the cursor + * @param[in] backspace true ==> remove characters left of the cursor + * false ==> remove characters right of the cursor */ void utils_removeChars( shellmatta_instance_t *inst, uint32_t length, bool backspace) { - if(0u != length) + if((0u != length) && (inst->inputCount >= inst->cursor)) { /** -# rewind the cursor in case of backspace */ if(true == backspace) diff --git a/test/unittest/shellmatta_utils/test_utils_removeChars.cpp b/test/unittest/shellmatta_utils/test_utils_removeChars.cpp new file mode 100644 index 0000000..49f08a7 --- /dev/null +++ b/test/unittest/shellmatta_utils/test_utils_removeChars.cpp @@ -0,0 +1,200 @@ +#include "test/framework/catch.hpp" +#include "src/shellmatta_utils.h" +#include + +static uint32_t write_callCnt = 0u; +static char write_data[20]; +static uint32_t write_idx; + +static shellmatta_retCode_t writeFct(const char* data, uint32_t length) +{ + write_callCnt ++; + strncpy(&write_data[write_idx], data, length); + write_idx += length; + return SHELLMATTA_OK; +} + +TEST_CASE("shellmatta_utils_removeChars_nothing_removed"){ + shellmatta_instance_t inst; + memset(&inst, 0, sizeof(inst)); + uint32_t length = 0u; + bool backspace = true; + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + inst.cursor = 20u; + inst.inputCount = 20u; + + char buffer[20] = "abcdefghijklmnopqr"; + inst.buffer = buffer; + inst.bufferSize = 20u; + + utils_removeChars( &inst, length, backspace); + + CHECK( inst.cursor == 20u); + CHECK( inst.inputCount == 20); + REQUIRE(strncmp("abcdefghijklmnopqr", buffer, sizeof(buffer)) == 0); +} + +TEST_CASE("shellmatta_utils_removeChars_backspace_false"){ + shellmatta_instance_t inst; + char buffer[20] = "abcdefghijklmnopqr"; + memset(&inst, 0, sizeof(inst)); + uint32_t length = 5u; + bool backspace = false; + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + inst.cursor = 20; + inst.inputCount = 20u; + + inst.buffer = buffer; + inst.bufferSize = 20u; + + utils_removeChars(&inst, length, backspace); + + CHECK( inst.cursor == 20u); + CHECK( inst.inputCount == 20); + REQUIRE(strncmp("abcdefghijklmnopqr", buffer, sizeof(buffer)) == 0); +} + +TEST_CASE("shellmatta_utils_removeChars_remove_five"){ + shellmatta_instance_t inst; + char buffer[20] = "abcdefghijklmnopqr"; + + memset(&inst, 0, sizeof(inst)); + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + uint32_t length = 5u; + bool backspace = true; + + inst.cursor = 10u; + inst.inputCount = 20u; + + inst.bufferSize = 20u; + inst.buffer = buffer; + + utils_removeChars(&inst, length, backspace); + + CHECK( inst.cursor == 5u); + CHECK( inst.inputCount == 15u); + REQUIRE(strncmp("abcdeklmnopqr", buffer, sizeof(buffer)) == 0); +} + +TEST_CASE("shellmatta_utils_removeChars_length_greater_than_CursorPos"){ + shellmatta_instance_t inst; + char buffer[20] = "abcdefghijklmnopqr"; + + memset(&inst, 0, sizeof(inst)); + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + uint32_t length = 15u; + bool backspace = true; + + inst.cursor = 10u; + inst.inputCount = 20u; + + inst.bufferSize = 20u; + inst.buffer = buffer; + + utils_removeChars(&inst, length, backspace); + + CHECK( inst.cursor == 0u); + CHECK( inst.inputCount == 10u); + REQUIRE(strncmp("klmnopqr", buffer, sizeof(buffer)) == 0); +} + +TEST_CASE("shellmatta_utils_removeChars_remove_chars_in_the_middle_of_the_buffer_backspace_false"){ + shellmatta_instance_t inst; + char buffer[20] = "abcdefghijklmnopqr"; + + memset(&inst, 0, sizeof(inst)); + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + uint32_t length = 5u; + bool backspace = false; + + inst.cursor = 10u; + inst.inputCount = 20u; + + inst.bufferSize = 20u; + inst.buffer = buffer; + + utils_removeChars(&inst, length, backspace); + + CHECK( inst.cursor == 10u); + CHECK( inst.inputCount == 15u); + REQUIRE(strncmp("abcdefghijpqr", buffer, sizeof(buffer)) == 0); +} + +TEST_CASE("shellmatta_utils_removeChars_remove_more_chars_in_middle_of_buffer_than_are_present_backspace_false"){ + shellmatta_instance_t inst; + char buffer[20] = "abcdefghijklmnopqr"; + + memset(&inst, 0, sizeof(inst)); + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + uint32_t length = 15u; + bool backspace = false; + + inst.cursor = 10u; + inst.inputCount = 20u; + + inst.bufferSize = 20u; + inst.buffer = buffer; + + utils_removeChars(&inst, length, backspace); + + CHECK( inst.cursor == 10u); + CHECK( inst.inputCount == 10u); + REQUIRE(strncmp("abcdefghij", buffer, 10u) == 0); +} + +TEST_CASE("shellmatta_utils_removeChars_curser_outside_buffer"){ + shellmatta_instance_t inst; + char buffer[20] = "abcdefghijklmnopqr"; + + memset(&inst, 0, sizeof(inst)); + + inst.write = writeFct; + write_callCnt = 0u; + memset(write_data, 0, sizeof(write_data)); + write_idx = 0u; + + uint32_t length = 15u; + bool backspace = false; + + inst.cursor = 21u; + inst.inputCount = 20u; + + inst.bufferSize = 20u; + inst.buffer = buffer; + + utils_removeChars(&inst, length, backspace); + + CHECK( inst.cursor == 21u); + CHECK( inst.inputCount == 20u); + REQUIRE(strncmp("abcdefghijklmnopqr", buffer, sizeof(buffer)) == 0); +}