123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- /*
- * Copyright (c) 2021 Stefan Strobel <stefan.strobel@shimatta.net>
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/.
- */
- /**
- * @file test_integration_optLong.cpp
- * @brief integration test implementation for the history buffer of the shellmatta
- * @author Stefan Strobel <stefan.strobel@shimatta.net>
- */
- #include "test/framework/catch.hpp"
- extern "C" {
- #include "test/framework/fff.h"
- #include "shellmatta.h"
- }
- #include <string.h>
- FAKE_VALUE_FUNC(shellmatta_retCode_t, writeFct, const char *, uint32_t)
- FAKE_VALUE_FUNC(shellmatta_retCode_t, cmdFct1, shellmatta_handle_t, const char *, uint32_t)
- FAKE_VALUE_FUNC(shellmatta_retCode_t, cmdFct2, shellmatta_handle_t, const char *, uint32_t)
- FAKE_VALUE_FUNC(shellmatta_retCode_t, cmdFct3, shellmatta_handle_t, const char *, uint32_t)
- FAKE_VALUE_FUNC(shellmatta_retCode_t, cmdFct4, shellmatta_handle_t, const char *, uint32_t)
- /* List of fakes */
- #define FFF_FAKES_LIST(FAKE) \
- FAKE(writeFct) \
- FAKE(cmdFct1) \
- FAKE(cmdFct2) \
- FAKE(cmdFct3) \
- FAKE(cmdFct4)
- #define CHECK_FOR_COMMAND(hist, idx) \
- CHECK(writeFct_fake.call_count == ((hist) + 1u)); \
- CHECK(0 == memcmp(writeFct_fake.arg0_history[(hist)], commandSequence[(idx)], strlen(commandSequence[(idx)]) - 1)); \
- CHECK((strlen(commandSequence[(idx)]) - 1) == writeFct_fake.arg1_history[(hist)]);
- #define UP "\x1b" "[A"
- #define DOWN "\x1b" "[B"
- #define PRESS_BUTTON(button) \
- CHECK(SHELLMATTA_OK == shellmatta_processData(handle, (char*)(button), 3u));
- shellmatta_cmd_t cmd1 = {(char*)"cmd1", (char*)"1", NULL, NULL, cmdFct1, NULL};
- shellmatta_cmd_t cmd2 = {(char*)"cmd2", (char*)"2", NULL, NULL, cmdFct2, NULL};
- shellmatta_cmd_t cmd3 = {(char*)"cmd3", (char*)"3", NULL, NULL, cmdFct3, NULL};
- shellmatta_cmd_t cmd4 = {(char*)"cmd4", (char*)"4", NULL, NULL, cmdFct4, NULL};
- char *commandSequence[] =
- {
- (char*)"foo\r",
- (char*)"bar\r",
- (char*)"cmd1\r",
- (char*)"2\r",
- (char*)"4\r",
- (char*)"cmd3\r"
- };
- #define CMD_SEQ_LEN (sizeof(commandSequence) / sizeof(commandSequence[0]))
- SCENARIO("Test the history buffer with a fixed sequence of commands in there")
- {
- GIVEN("An initialized Shellmatte instance with some commands already in the history buffer")
- {
- shellmatta_instance_t inst;
- shellmatta_handle_t handle;
- char buffer[1024u];
- char historyBuffer[1024u];
- CHECK(SHELLMATTA_OK == shellmatta_doInit( &inst,
- &handle,
- buffer,
- sizeof(buffer),
- historyBuffer,
- sizeof(historyBuffer),
- "shellmatta->",
- NULL,
- writeFct));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd1));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd2));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd3));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd4));
- for(uint32_t i = 0u; i < CMD_SEQ_LEN; i++)
- {
- CHECK(SHELLMATTA_OK == shellmatta_processData(handle, commandSequence[i], strlen(commandSequence[i])));
- }
- WHEN("The up button is pressed")
- {
- THEN("The shellmatta prints the most recent command")
- {
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK(writeFct_fake.call_count == 2);
- CHECK(0 == memcmp(writeFct_fake.arg0_history[0], "\x1b" "[K", 3));
- CHECK(3 == writeFct_fake.arg1_history[0]);
- CHECK(0 == memcmp(writeFct_fake.arg0_history[1], commandSequence[CMD_SEQ_LEN - 1], strlen(commandSequence[CMD_SEQ_LEN - 1]) - 1));
- CHECK((strlen(commandSequence[CMD_SEQ_LEN - 1]) - 1) == writeFct_fake.arg1_history[1]);
- for(uint32_t i = CMD_SEQ_LEN - 1; i > 0; i--)
- {
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK(writeFct_fake.call_count == 3);
- CHECK(0 == memcmp(writeFct_fake.arg0_history[1], "\x1b" "[K", 3));
- CHECK(3 == writeFct_fake.arg1_history[1]);
- CHECK(0 == memcmp(writeFct_fake.arg0_history[2], commandSequence[i - 1u], strlen(commandSequence[i - 1u]) - 1));
- CHECK((strlen(commandSequence[i - 1u]) - 1) == writeFct_fake.arg1_history[2]);
- }
- }
- }
- WHEN("The history buffer it at the oldest command yet")
- {
- for(uint32_t i = CMD_SEQ_LEN; i > 0; i--)
- {
- PRESS_BUTTON(UP)
- }
- AND_WHEN("The up button is pressed again")
- {
- THEN("The output is deleted and the oldest command is printed again")
- {
- for(uint32_t i = 0u; i < 64; i++)
- {
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, 0u)
- }
- }
- }
- AND_WHEN("The down button is pressed")
- {
- THEN("On each button press one newer command is printed")
- {
- for(uint32_t i = 1; i < CMD_SEQ_LEN; i++)
- {
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK(0 == memcmp(writeFct_fake.arg0_history[1], "\x1b" "[K", 3));
- CHECK(3 == writeFct_fake.arg1_history[1]);
- CHECK_FOR_COMMAND(2u, i)
- }
- }
- }
- }
- WHEN("The user pushes the up and down button alternatingly")
- {
- THEN("The output shall be updated with the correct command or not updated at all when at the end")
- {
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(1u, CMD_SEQ_LEN - 1u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 1u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK(writeFct_fake.call_count == 0u);
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK(writeFct_fake.call_count == 0u);
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 3u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 4u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 5u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 6u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 6u)
- /* back down again */
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 5u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 4u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 3u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 1u)
- /* end of the buffer - shellmatta shall not update */
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK(writeFct_fake.call_count == 0u);
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(DOWN)
- CHECK(writeFct_fake.call_count == 0u);
- /* up once mothe history buffer with a fixed sequence of commands in therere */
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- }
- }
- }
- }
- SCENARIO("Test how the history buffer handles more commands than fits inside the buffer")
- {
- GIVEN("An initialized Shellmatte instance with some commands already in the history buffer")
- {
- shellmatta_instance_t inst;
- shellmatta_handle_t handle;
- char buffer[1024u];
- char historyBuffer[16u];
- CHECK(SHELLMATTA_OK == shellmatta_doInit( &inst,
- &handle,
- buffer,
- sizeof(buffer),
- historyBuffer,
- sizeof(historyBuffer),
- "shellmatta->",
- NULL,
- writeFct));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd1));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd2));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd3));
- CHECK(SHELLMATTA_OK == shellmatta_addCmd(handle, &cmd4));
- for(uint32_t i = 0u; i < CMD_SEQ_LEN; i++)
- {
- CHECK(SHELLMATTA_OK == shellmatta_processData(handle, commandSequence[i], strlen(commandSequence[i])));
- }
- WHEN("The user pushes the up and down button alternatingly")
- {
- THEN("The output shall be updated with the correct commands that did fit into the buffer")
- {
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(1u, CMD_SEQ_LEN - 1u)
- FFF_FAKES_LIST(RESET_FAKE)
- PRESS_BUTTON(UP)
- CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 1u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK(writeFct_fake.call_count == 0u);
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK(writeFct_fake.call_count == 0u);
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(UP)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(UP)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 3u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(UP)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 4u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(UP)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 4u)
- // /* back down again */
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 3u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 1u)
- // /* end of the buffer - shellmatta shall not update */
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK(writeFct_fake.call_count == 0u);
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(DOWN)
- // CHECK(writeFct_fake.call_count == 0u);
- // /* up once mothe history buffer with a fixed sequence of commands in therere */
- // FFF_FAKES_LIST(RESET_FAKE)
- // PRESS_BUTTON(UP)
- // CHECK_FOR_COMMAND(2u, CMD_SEQ_LEN - 2u)
- }
- }
- }
- }
|