From 1bd89088f1bb6103a34584ae39157abf2f732742 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Tue, 18 Mar 2025 21:57:03 +0530 Subject: Add action for keymaps + test --- spec/KeymapEvaluatorSpec.cpp | 121 +++++++++++++++++++++++++++++++++++++++++++ spec/testUtils.h | 2 + 2 files changed, 123 insertions(+) create mode 100644 spec/KeymapEvaluatorSpec.cpp (limited to 'spec') diff --git a/spec/KeymapEvaluatorSpec.cpp b/spec/KeymapEvaluatorSpec.cpp new file mode 100644 index 0000000..4c19dfd --- /dev/null +++ b/spec/KeymapEvaluatorSpec.cpp @@ -0,0 +1,121 @@ +#include "testUtils.h" +#include + +#include "keymap/KeymapEvaluator.hpp" + +class KeymapEvaluatorSpec : public QObject { + Q_OBJECT + +private slots: + void testEvaluateSingleKeyChord() { + context("when the key sequence is mapped"); + it("calls mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + + QVERIFY(keymapWasCalled); + } + + context("when the key sequence is not mapped"); + it("does not call mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_K); + + QVERIFY(NOT keymapWasCalled); + } + } + + void testEvaluateMultiKeySequence() { + context("when the full key sequence is mapped"); + it("calls mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "a", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + evaluator.evaluate(Qt::NoModifier, Qt::Key_A); + + QVERIFY(keymapWasCalled); + } + + context("when only part of a mapped key sequence is entered"); + it("does not call mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "a", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + + QVERIFY(NOT keymapWasCalled); + } + + context("when the key sequence is not mapped"); + it("does not call mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "a", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_K); + + QVERIFY(NOT keymapWasCalled); + } + + context("when the key sequence is not mapped"); + it("does not call mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "a", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + evaluator.evaluate(Qt::NoModifier, Qt::Key_B); + + QVERIFY(NOT keymapWasCalled); + } + + context("when an incorrect sequence is entered before the correct one"); + it("calls mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "a", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + evaluator.evaluate(Qt::NoModifier, Qt::Key_B); + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + evaluator.evaluate(Qt::NoModifier, Qt::Key_A); + + QVERIFY(keymapWasCalled); + } + + // TODO: maybe fix this behavior + context( + "when partial mapped sequence is entered before an entire sequence"); + it("does not call mapping") { + int keymapWasCalled = false; + KeymapEvaluator evaluator; + evaluator.addKeymap(KeyMode::Normal, "a", + [&keymapWasCalled]() { keymapWasCalled = true; }); + + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + evaluator.evaluate(Qt::ControlModifier, Qt::Key_T); + evaluator.evaluate(Qt::NoModifier, Qt::Key_A); + + QVERIFY(NOT keymapWasCalled); + } + } +}; + +QTEST_REGISTER(KeymapEvaluatorSpec) +#include "KeymapEvaluatorSpec.moc" diff --git a/spec/testUtils.h b/spec/testUtils.h index 20b3ba8..fd0c30b 100644 --- a/spec/testUtils.h +++ b/spec/testUtils.h @@ -4,6 +4,8 @@ #include #include +#define NOT ! + #define ANSI_BOLD "\x1b[1m" #define COLOR_CONTEXT "\x1b[32m" ANSI_BOLD #define COLOR_IT "\x1b[36m" ANSI_BOLD -- cgit v1.3.1