tiwiq/tests/Executor.cpp

219 lines
5.3 KiB
C++
Raw Permalink Normal View History

2023-10-04 09:38:14 +00:00
#include <catch2/catch.hpp>
#include "../src/core/Tiwiq.hpp"
2023-10-04 09:38:14 +00:00
#include "../src/core/Executor.hpp"
using namespace twq::core;
class ExecutorTest
{
public:
explicit ExecutorTest() {}
virtual ~ExecutorTest() {}
Context get_context()
{
return Context {m_tiwiq};
}
2023-10-04 09:38:14 +00:00
protected:
twq::core::Tiwiq m_tiwiq;
2023-10-04 09:38:14 +00:00
};
struct CommandMock: public Command
{
int execute_count = 0;
void execute(Context&) override
{
execute_count++;
}
void undo(Context&) override
{
}
};
TEST_CASE_METHOD(ExecutorTest, "Executor_one_key")
{
Context ctx = get_context();
2023-10-04 09:38:14 +00:00
auto cmd = std::make_shared<CommandMock>();
Binding b {std::make_shared<Shortcut>(L"a"), cmd};
2023-10-04 09:38:14 +00:00
Executor exec;
exec.register_binding(b);
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(2 == cmd->execute_count);
}
TEST_CASE_METHOD(ExecutorTest, "Executor_two_same_keys")
{
Context ctx = get_context();
2023-10-04 09:38:14 +00:00
auto cmd = std::make_shared<CommandMock>();
Binding b {std::make_shared<Shortcut>(L"a a"), cmd};
2023-10-04 09:38:14 +00:00
Executor exec;
exec.register_binding(b);
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(2 == cmd->execute_count);
}
TEST_CASE_METHOD(ExecutorTest, "Executor_two_keys")
{
Context ctx = get_context();
2023-10-04 09:38:14 +00:00
auto cmd = std::make_shared<CommandMock>();
Binding b {std::make_shared<Shortcut>(L"a b"), cmd};
2023-10-04 09:38:14 +00:00
Executor exec;
exec.register_binding(b);
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(2 == cmd->execute_count);
}
TEST_CASE_METHOD(ExecutorTest, "Executor_wrong_key")
{
Context ctx = get_context();
2023-10-04 09:38:14 +00:00
auto cmd = std::make_shared<CommandMock>();
Binding b {std::make_shared<Shortcut>(L"a b"), cmd};
2023-10-04 09:38:14 +00:00
Executor exec;
exec.register_binding(b);
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"c"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd->execute_count);
}
TEST_CASE_METHOD(ExecutorTest, "Executor_two_commands")
{
Context ctx = get_context();
2023-10-04 09:38:14 +00:00
auto cmd0 = std::make_shared<CommandMock>();
Binding b0 {std::make_shared<Shortcut>(L"C-a b"), cmd0};
2023-10-04 09:38:14 +00:00
auto cmd1 = std::make_shared<CommandMock>();
Binding b1 {std::make_shared<Shortcut>(L"C-a c"), cmd1};
2023-10-04 09:38:14 +00:00
Executor exec;
exec.register_binding(b0);
exec.register_binding(b1);
SECTION("execute first")
{
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"C-a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
}
SECTION("execute second")
{
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"C-a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"c"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(1 == cmd1->execute_count);
}
SECTION("fail first, try but fail second")
{
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"C-a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"d"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
}
}
TEST_CASE_METHOD(ExecutorTest, "Executor_two_sequentials_commands")
{
Context ctx = get_context();
2023-10-04 09:38:14 +00:00
auto cmd0 = std::make_shared<CommandMock>();
Binding b0 {std::make_shared<Shortcut>(L"C-a b"), cmd0};
2023-10-04 09:38:14 +00:00
auto cmd1 = std::make_shared<CommandMock>();
Binding b1 {std::make_shared<Shortcut>(L"b c"), cmd1};
2023-10-04 09:38:14 +00:00
Executor exec;
exec.register_binding(b0);
exec.register_binding(b1);
SECTION("execute sequentially")
{
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"C-a"});
2023-10-04 09:38:14 +00:00
REQUIRE(0 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"c"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"b"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd0->execute_count);
REQUIRE(0 == cmd1->execute_count);
exec.update(ctx, KeyMod {L"c"});
2023-10-04 09:38:14 +00:00
REQUIRE(1 == cmd0->execute_count);
REQUIRE(1 == cmd1->execute_count);
}
}