blob: 3e699139da0bbf37e0f6c62514df86f808b04a05 [file] [log] [blame]
/** @file
*
* A brief file description
*
* @section license License
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string_view>
#include "tscore/History.h"
#include "tscore/BufferWriter.h"
#include "catch.hpp"
using std::string_view;
#define REMEMBER(e, r) history.push_back(MakeSourceLocation(), e, r)
#define SM_REMEMBER(sm, e, r) sm->history.push_back(MakeSourceLocation(), e, r)
// State Machine mock
template <unsigned Count> class SM
{
public:
History<Count> history;
};
TEST_CASE("History", "[libts][History]")
{
char buf[128];
History<HISTORY_DEFAULT_SIZE> history;
REMEMBER(1, 1);
REMEMBER(2, 2);
REMEMBER(3, NO_REENTRANT);
REQUIRE(history[0].event == 1);
REQUIRE(history[0].reentrancy == 1);
REQUIRE(history[1].event == 2);
REQUIRE(history[1].reentrancy == 2);
REQUIRE(history[2].event == 3);
REQUIRE(history[2].reentrancy == static_cast<short>(NO_REENTRANT));
history[0].location.str(buf, sizeof(buf));
REQUIRE(string_view{buf} == "test_History.cc:48 (____C_A_T_C_H____T_E_S_T____0)");
history[1].location.str(buf, sizeof(buf));
REQUIRE(string_view{buf} == "test_History.cc:49 (____C_A_T_C_H____T_E_S_T____0)");
ts::LocalBufferWriter<128> w;
SM<HISTORY_DEFAULT_SIZE> *sm = new SM<HISTORY_DEFAULT_SIZE>;
SM_REMEMBER(sm, 1, 1);
SM_REMEMBER(sm, 2, 2);
SM_REMEMBER(sm, 3, NO_REENTRANT);
w.print("{}", sm->history[0].location);
REQUIRE(w.view() == "test_History.cc:69 (____C_A_T_C_H____T_E_S_T____0)");
w.reset().print("{}", sm->history[1].location);
REQUIRE(w.view() == "test_History.cc:70 (____C_A_T_C_H____T_E_S_T____0)");
REQUIRE(sm->history[0].event == 1);
REQUIRE(sm->history[0].reentrancy == 1);
REQUIRE(sm->history[1].event == 2);
REQUIRE(sm->history[1].reentrancy == 2);
REQUIRE(sm->history[2].event == 3);
REQUIRE(sm->history[2].reentrancy == static_cast<short>(NO_REENTRANT));
SM<2> *sm2 = new SM<2>;
REQUIRE(sm2->history.size() == 0);
REQUIRE(sm2->history.overflowed() == false);
SM_REMEMBER(sm2, 1, 1);
REQUIRE(sm2->history.size() == 1);
REQUIRE(sm2->history.overflowed() == false);
SM_REMEMBER(sm2, 2, 2);
REQUIRE(sm2->history.size() == 2);
REQUIRE(sm2->history.overflowed() == true);
SM_REMEMBER(sm2, 3, NO_REENTRANT);
REQUIRE(sm2->history.size() == 2);
REQUIRE(sm2->history.overflowed() == true);
w.reset().print("{}", sm2->history[0].location);
REQUIRE(w.view() == "test_History.cc:103 (____C_A_T_C_H____T_E_S_T____0)");
w.reset().print("{}", sm2->history[1].location);
REQUIRE(w.view() == "test_History.cc:98 (____C_A_T_C_H____T_E_S_T____0)");
sm2->history.clear();
REQUIRE(sm2->history.size() == 0);
delete sm;
delete sm2;
}