diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/perf/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/perf/decperf.cxx | 10 | ||||
-rw-r--r-- | tests/perf/encperf.cxx | 24 | ||||
-rw-r--r-- | tests/unit/CMakeLists.txt | 8 | ||||
-rw-r--r-- | tests/unit/parameters.cxx | 28 | ||||
-rw-r--r-- | tests/unit/shortcuthandler.cxx | 607 |
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(); +} |