2023-10-04 09:38:14 +00:00
|
|
|
#include <catch2/catch.hpp>
|
2023-10-04 14:56:06 +00:00
|
|
|
#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() {}
|
|
|
|
|
2023-10-04 14:56:06 +00:00
|
|
|
Context get_context()
|
|
|
|
{
|
|
|
|
return Context {m_tiwiq};
|
|
|
|
}
|
|
|
|
|
2023-10-04 09:38:14 +00:00
|
|
|
protected:
|
2023-10-04 14:56:06 +00:00
|
|
|
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")
|
|
|
|
{
|
2023-10-04 14:56:06 +00:00
|
|
|
Context ctx = get_context();
|
2023-10-04 09:38:14 +00:00
|
|
|
auto cmd = std::make_shared<CommandMock>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(1 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
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")
|
|
|
|
{
|
2023-10-04 14:56:06 +00:00
|
|
|
Context ctx = get_context();
|
2023-10-04 09:38:14 +00:00
|
|
|
auto cmd = std::make_shared<CommandMock>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(0 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(1 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(1 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
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")
|
|
|
|
{
|
2023-10-04 14:56:06 +00:00
|
|
|
Context ctx = get_context();
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
auto cmd = std::make_shared<CommandMock>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(0 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"b"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(1 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(1 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
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")
|
|
|
|
{
|
2023-10-04 14:56:06 +00:00
|
|
|
Context ctx = get_context();
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
auto cmd = std::make_shared<CommandMock>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(0 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"c"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(0 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"b"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(0 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"a"});
|
2023-10-04 09:38:14 +00:00
|
|
|
REQUIRE(0 == cmd->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
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")
|
|
|
|
{
|
2023-10-04 14:56:06 +00:00
|
|
|
Context ctx = get_context();
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
auto cmd0 = std::make_shared<CommandMock>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"d"});
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
REQUIRE(0 == cmd0->execute_count);
|
|
|
|
REQUIRE(0 == cmd1->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
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")
|
|
|
|
{
|
2023-10-04 14:56:06 +00:00
|
|
|
Context ctx = get_context();
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
auto cmd0 = std::make_shared<CommandMock>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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>();
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
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);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"b"});
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
REQUIRE(1 == cmd0->execute_count);
|
|
|
|
REQUIRE(0 == cmd1->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"c"});
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
REQUIRE(1 == cmd0->execute_count);
|
|
|
|
REQUIRE(0 == cmd1->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"b"});
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
REQUIRE(1 == cmd0->execute_count);
|
|
|
|
REQUIRE(0 == cmd1->execute_count);
|
2023-10-04 14:56:06 +00:00
|
|
|
exec.update(ctx, KeyMod {L"c"});
|
2023-10-04 09:38:14 +00:00
|
|
|
|
|
|
|
REQUIRE(1 == cmd0->execute_count);
|
|
|
|
REQUIRE(1 == cmd1->execute_count);
|
|
|
|
}
|
|
|
|
}
|