aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/perf/CMakeLists.txt4
-rw-r--r--tests/perf/decperf.cxx10
-rw-r--r--tests/perf/encperf.cxx24
-rw-r--r--tests/unit/CMakeLists.txt8
-rw-r--r--tests/unit/parameters.cxx28
-rw-r--r--tests/unit/shortcuthandler.cxx607
6 files changed, 656 insertions, 25 deletions
diff --git a/tests/perf/CMakeLists.txt b/tests/perf/CMakeLists.txt
index 38f874d4..54a1ad89 100644
--- a/tests/perf/CMakeLists.txt
+++ b/tests/perf/CMakeLists.txt
@@ -27,8 +27,8 @@ if (BUILD_VIEWER)
target_sources(fbperf PRIVATE ${CMAKE_SOURCE_DIR}/vncviewer/Surface_X11.cxx)
endif()
target_include_directories(fbperf SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
- target_include_directories(fbperf SYSTEM PUBLIC ${GETTEXT_INCLUDE_DIR})
- target_link_libraries(fbperf test_util core rfb ${FLTK_LIBRARIES} ${GETTEXT_LIBRARIES})
+ target_include_directories(fbperf SYSTEM PUBLIC ${Intl_INCLUDE_DIR})
+ target_link_libraries(fbperf test_util core rfb ${FLTK_LIBRARIES} ${Intl_LIBRARIES})
if(WIN32)
target_link_libraries(fbperf msimg32)
endif()
diff --git a/tests/perf/decperf.cxx b/tests/perf/decperf.cxx
index 4d2f151a..2c7efa3b 100644
--- a/tests/perf/decperf.cxx
+++ b/tests/perf/decperf.cxx
@@ -67,8 +67,6 @@ public:
~CConn();
void initDone() override;
- void setCursor(int, int, const core::Point&, const uint8_t*) override;
- void setCursorPos(const core::Point&) override;
void framebufferUpdateStart() override;
void framebufferUpdateEnd() override;
void setColourMapEntries(int, int, uint16_t*) override;
@@ -140,14 +138,6 @@ void CConn::initDone()
server.height()));
}
-void CConn::setCursor(int, int, const core::Point&, const uint8_t*)
-{
-}
-
-void CConn::setCursorPos(const core::Point&)
-{
-}
-
void CConn::framebufferUpdateStart()
{
CConnection::framebufferUpdateStart();
diff --git a/tests/perf/encperf.cxx b/tests/perf/encperf.cxx
index 302e7eed..0da54603 100644
--- a/tests/perf/encperf.cxx
+++ b/tests/perf/encperf.cxx
@@ -98,8 +98,6 @@ public:
void initDone() override {};
void resizeFramebuffer() override;
- void setCursor(int, int, const core::Point&, const uint8_t*) override;
- void setCursorPos(const core::Point&) override;
void framebufferUpdateStart() override;
void framebufferUpdateEnd() override;
bool dataRect(const core::Rect&, int) override;
@@ -141,6 +139,10 @@ public:
void setDesktopSize(int fb_width, int fb_height,
const rfb::ScreenSet& layout) override;
+ void keyEvent(uint32_t keysym, uint32_t keycode, bool down) override;
+ void pointerEvent(const core::Point& pos,
+ uint16_t buttonMask) override;
+
protected:
DummyOutStream *out;
Manager *manager;
@@ -194,7 +196,7 @@ CConn::CConn(const char *filename)
sc = new SConn();
sc->client.setPF((bool)translate ? fbPF : pf);
- sc->setEncodings(sizeof(encodings) / sizeof(*encodings), encodings);
+ ((rfb::SMsgHandler*)sc)->setEncodings(sizeof(encodings) / sizeof(*encodings), encodings);
}
CConn::~CConn()
@@ -219,14 +221,6 @@ void CConn::resizeFramebuffer()
setFramebuffer(pb);
}
-void CConn::setCursor(int, int, const core::Point&, const uint8_t*)
-{
-}
-
-void CConn::setCursorPos(const core::Point&)
-{
-}
-
void CConn::framebufferUpdateStart()
{
CConnection::framebufferUpdateStart();
@@ -349,6 +343,14 @@ void SConn::setDesktopSize(int, int, const rfb::ScreenSet&)
{
}
+void SConn::keyEvent(uint32_t, uint32_t, bool)
+{
+}
+
+void SConn::pointerEvent(const core::Point&, uint16_t)
+{
+}
+
struct stats
{
double decodeTime;
diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt
index 0709766b..1e40a645 100644
--- a/tests/unit/CMakeLists.txt
+++ b/tests/unit/CMakeLists.txt
@@ -36,11 +36,15 @@ add_executable(pixelformat pixelformat.cxx)
target_link_libraries(pixelformat rfb GTest::gtest_main)
gtest_discover_tests(pixelformat)
+add_executable(shortcuthandler shortcuthandler.cxx ../../vncviewer/ShortcutHandler.cxx)
+target_link_libraries(shortcuthandler core ${Intl_LIBRARIES} GTest::gtest_main)
+gtest_discover_tests(shortcuthandler)
+
add_executable(unicode unicode.cxx)
target_link_libraries(unicode core GTest::gtest_main)
gtest_discover_tests(unicode)
add_executable(emulatemb emulatemb.cxx ../../vncviewer/EmulateMB.cxx)
-target_include_directories(emulatemb SYSTEM PUBLIC ${GETTEXT_INCLUDE_DIR})
-target_link_libraries(emulatemb core ${GETTEXT_LIBRARIES} GTest::gtest_main)
+target_include_directories(emulatemb SYSTEM PUBLIC ${Intl_INCLUDE_DIR})
+target_link_libraries(emulatemb core ${Intl_LIBRARIES} GTest::gtest_main)
gtest_discover_tests(emulatemb)
diff --git a/tests/unit/parameters.cxx b/tests/unit/parameters.cxx
index fb240c91..e120f988 100644
--- a/tests/unit/parameters.cxx
+++ b/tests/unit/parameters.cxx
@@ -530,6 +530,14 @@ TEST(IntListParameter, strings)
strings.setParam("9,\n10,\t11,\t12");
data = {9, 10, 11, 12};
EXPECT_EQ(strings, data);
+
+ strings.setParam("");
+ data = {};
+ EXPECT_EQ(strings, data);
+
+ strings.setParam(" ");
+ data = {};
+ EXPECT_EQ(strings, data);
}
TEST(IntListParameter, minmax)
@@ -650,6 +658,18 @@ TEST(StringListParameter, strings)
strings.setParam("9,\n10,\t11,\t12");
data = {"9", "10", "11", "12"};
EXPECT_EQ(strings, data);
+
+ strings.setParam("");
+ data = {};
+ EXPECT_EQ(strings, data);
+
+ strings.setParam(" ");
+ data = {};
+ EXPECT_EQ(strings, data);
+
+ strings.setParam("a, , b");
+ data = {"a", "", "b"};
+ EXPECT_EQ(strings, data);
}
TEST(StringListParameter, null)
@@ -733,6 +753,14 @@ TEST(EnumListParameter, strings)
strings.setParam("b,\na,\tc,\tb");
data = {"b", "a", "c", "b"};
EXPECT_EQ(strings, data);
+
+ strings.setParam("");
+ data = {};
+ EXPECT_EQ(strings, data);
+
+ strings.setParam(" ");
+ data = {};
+ EXPECT_EQ(strings, data);
}
TEST(EnumListParameter, validation)
diff --git a/tests/unit/shortcuthandler.cxx b/tests/unit/shortcuthandler.cxx
new file mode 100644
index 00000000..aa005155
--- /dev/null
+++ b/tests/unit/shortcuthandler.cxx
@@ -0,0 +1,607 @@
+/* Copyright 2021-2025 Pierre Ossman for Cendio AB
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtest/gtest.h>
+
+#define XK_LATIN1
+#define XK_MISCELLANY
+#include <rfb/keysymdef.h>
+
+#include "ShortcutHandler.h"
+
+TEST(ShortcutHandler, noModifiers)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(0);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Hyper_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, singleArmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyUnarm);
+}
+
+TEST(ShortcutHandler, singleDualArmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyUnarm);
+}
+
+TEST(ShortcutHandler, singleShortcut)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleRightShortcut)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleDualShortcut)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleShortcutReordered)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+}
+
+TEST(ShortcutHandler, singleDualShortcutReordered)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_R), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleShortcutRepeated)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleShortcutMultipleKeys)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_b), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_c), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleWedgeNormal)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_b), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, singleWedgeModifier)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, singleWedgeModifierArmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, singleWedgeModifierFiring)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, singleUnwedge)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control);
+
+ handler.handleKeyPress(1, XK_Shift_L);
+ handler.handleKeyPress(2, XK_Control_L);
+ handler.handleKeyRelease(1);
+ handler.handleKeyRelease(2);
+
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiArmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyUnarm);
+}
+
+TEST(ShortcutHandler, multiRearmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyUnarm);
+}
+
+TEST(ShortcutHandler, multiFailedArm)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, multiDualArmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyUnarm);
+}
+
+TEST(ShortcutHandler, multiShortcut)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiRightShortcut)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiDualShortcut)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Alt_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(6, XK_Shift_R), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(7, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(7), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(6), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiShortcutReordered)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+}
+
+TEST(ShortcutHandler, multiDualShortcutReordered)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(7, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_R), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Alt_R), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyPress(6, XK_Shift_R), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(6), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(7), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiShortcutRepeated)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiShortcutMultipleKeys)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_b), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(6, XK_c), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(6), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiWedgeNormal)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_b), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, multiWedgeModifier)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Super_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, multiWedgeArming)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(1, XK_b), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_a), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, multiWedgeModifierArming)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Super_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, multiWedgeModifierArmed)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Super_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyNormal);
+}
+
+TEST(ShortcutHandler, multiWedgeModifierFiring)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ EXPECT_EQ(handler.handleKeyPress(1, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_Super_L), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(1), ShortcutHandler::KeyIgnore);
+}
+
+TEST(ShortcutHandler, multiUnwedge)
+{
+ ShortcutHandler handler;
+
+ handler.setModifiers(ShortcutHandler::Control |
+ ShortcutHandler::Shift |
+ ShortcutHandler::Alt);
+
+ handler.handleKeyPress(1, XK_Super_L);
+ handler.handleKeyPress(2, XK_Control_L);
+ handler.handleKeyPress(3, XK_Alt_L);
+ handler.handleKeyPress(4, XK_Shift_L);
+ handler.handleKeyRelease(1);
+ handler.handleKeyRelease(2);
+ handler.handleKeyRelease(3);
+ handler.handleKeyRelease(4);
+
+ EXPECT_EQ(handler.handleKeyPress(2, XK_Control_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(3, XK_Alt_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(4, XK_Shift_L), ShortcutHandler::KeyNormal);
+ EXPECT_EQ(handler.handleKeyPress(5, XK_a), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(5), ShortcutHandler::KeyShortcut);
+ EXPECT_EQ(handler.handleKeyRelease(4), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(3), ShortcutHandler::KeyIgnore);
+ EXPECT_EQ(handler.handleKeyRelease(2), ShortcutHandler::KeyIgnore);
+}
+
+int main(int argc, char** argv)
+{
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}