#define Uses_TRect
#define Uses_TTerminal
#include <tvision/tv.h>
#include <test.h>
struct TTerminalState
{
ushort queBack;
ushort queFront;
char buffer[8 + 1];
};
class TestTerminal : public TTerminal
{
public:
TestTerminal(const TTerminalState &state) :
TTerminal(TRect(0, 0, 0, 0), nullptr, nullptr, sizeof(state.buffer) - 1)
{
memcpy(buffer, state.buffer, bufSize);
queBack = state.queBack;
queFront = state.queFront;
}
};
struct PrevLinesTestInput
{
TTerminalState state;
ushort pos;
ushort lines;
};
static std::ostream &operator<<(std::ostream &os, const TTerminalState &state)
{
os << "{"
<< "queBack=" << state.queBack
<< ", queFront=" << state.queFront
<< ", buffer=" << ::testing::PrintToString((const char (&)[sizeof(state.buffer) - 1]) state.buffer)
<< "}";
return os;
}
static std::ostream &operator<<(std::ostream &os, const PrevLinesTestInput &input)
{
os << "{"
<< input.state
<< ", pos=" << input.pos
<< ", lines=" << input.lines
<< "}";
return os;
}
TEST(TTerminal, prevLinesShouldWorkProperly)
{
static constexpr TestCase<PrevLinesTestInput, ushort> testCases[] =
{
{{{0, 0, ""}, 0, 1}, 0},
{{{0, 7, "ab\ncd\ne"}, 7, 1}, 6},
{{{0, 7, "ab\ncd\ne"}, 6, 1}, 6},
{{{0, 7, "ab\ncd\ne"}, 5, 1}, 3},
{{{0, 7, "ab\ncd\ne"}, 4, 1}, 3},
{{{0, 7, "ab\ncd\ne"}, 3, 1}, 3},
{{{0, 7, "ab\ncd\ne"}, 2, 1}, 0},
{{{0, 7, "ab\ncd\ne"}, 1, 1}, 0},
{{{0, 7, "ab\ncd\ne"}, 0, 1}, 0},
{{{0, 4, "a\nb\n"}, 4, 1}, 4},
{{{0, 4, "a\nb\n"}, 4, 2}, 2},
{{{0, 4, "a\nb\n"}, 4, 3}, 0},
{{{0, 4, "a\nb\n"}, 3, 1}, 2},
{{{0, 4, "a\nb\n"}, 3, 2}, 0},
{{{0, 4, "a\nb\n"}, 3, 3}, 0},
{{{4, 3, "aaa\0aaaa"}, 3, 1}, 4},
{{{4, 3, "a\na\0aaaa"}, 5, 1}, 4},
{{{7, 0, "\0\0\0\0\0\0\0a"}, 0, 1}, 7},
};
for (auto &testCase : testCases)
{
TestTerminal terminal(testCase.input.state);
auto result = terminal.prevLines(testCase.input.pos, testCase.input.lines);
expectResultMatches(result, testCase);
}
}