diff options
Diffstat (limited to 'tests/basic/test_keypress.cpp')
-rw-r--r-- | tests/basic/test_keypress.cpp | 185 |
1 files changed, 54 insertions, 131 deletions
diff --git a/tests/basic/test_keypress.cpp b/tests/basic/test_keypress.cpp index 70613bbd6d..cf839f8c16 100644 --- a/tests/basic/test_keypress.cpp +++ b/tests/basic/test_keypress.cpp @@ -14,11 +14,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "keycode.h" #include "test_common.hpp" using testing::_; using testing::InSequence; +using testing::Return; class KeyPress : public TestFixture {}; @@ -30,156 +30,95 @@ TEST_F(KeyPress, SendKeyboardIsNotCalledWhenNoKeyIsPressed) { TEST_F(KeyPress, CorrectKeyIsReportedWhenPressed) { TestDriver driver; - auto key = KeymapKey(0, 0, 0, KC_A); - - set_keymap({key}); - - key.press(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key.report_code))); + press_key(0, 0); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); keyboard_task(); - - key.release(); + release_key(0, 0); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } -TEST_F(KeyPress, ANonMappedKeyDoesNothing) { - TestDriver driver; - auto key = KeymapKey(0, 0, 0, KC_NO); - - set_keymap({key}); - - key.press(); - EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0); - keyboard_task(); - keyboard_task(); -} - TEST_F(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) { TestDriver driver; - auto key_b = KeymapKey(0, 0, 0, KC_B); - auto key_c = KeymapKey(0, 1, 1, KC_C); - - set_keymap({key_b, key_c}); - - key_b.press(); - key_c.press(); + press_key(1, 0); + press_key(0, 3); // Note that QMK only processes one key at a time // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_b.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B))); keyboard_task(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_b.report_code, key_c.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B, KC_C))); keyboard_task(); - - key_b.release(); - key_c.release(); + release_key(1, 0); + release_key(0, 3); // Note that the first key released is the first one in the matrix order - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_c.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_C))); keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } -TEST_F(KeyPress, LeftShiftIsReportedCorrectly) { +TEST_F(KeyPress, ANonMappedKeyDoesNothing) { TestDriver driver; - auto key_a = KeymapKey(0, 0, 0, KC_A); - auto key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT); - - set_keymap({key_a, key_lsft}); - - key_lsft.press(); - key_a.press(); + press_key(2, 0); + EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0); + keyboard_task(); + keyboard_task(); +} +TEST_F(KeyPress, LeftShiftIsReportedCorrectly) { + TestDriver driver; + press_key(3, 0); + press_key(0, 0); // Unfortunately modifiers are also processed in the wrong order // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_a.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_a.report_code, key_lsft.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A, KC_LEFT_SHIFT))); keyboard_task(); - - key_a.release(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code))); + release_key(0, 0); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); keyboard_task(); - - key_lsft.release(); + release_key(3, 0); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } TEST_F(KeyPress, PressLeftShiftAndControl) { TestDriver driver; - auto key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT); - auto key_lctrl = KeymapKey(0, 5, 0, KC_LEFT_CTRL); - - set_keymap({key_lctrl, key_lsft}); - - key_lsft.press(); - key_lctrl.press(); - + press_key(3, 0); + press_key(5, 0); // Unfortunately modifiers are also processed in the wrong order // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code))); - keyboard_task(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code, key_lctrl.report_code))); - keyboard_task(); - - key_lsft.release(); - key_lctrl.release(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lctrl.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); keyboard_task(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_LEFT_CTRL))); keyboard_task(); } TEST_F(KeyPress, LeftAndRightShiftCanBePressedAtTheSameTime) { TestDriver driver; - auto key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT); - auto key_rsft = KeymapKey(0, 4, 0, KC_RIGHT_SHIFT); - - set_keymap({key_rsft, key_lsft}); - - key_lsft.press(); - key_rsft.press(); + press_key(3, 0); + press_key(4, 0); // Unfortunately modifiers are also processed in the wrong order // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code))); - keyboard_task(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code, key_rsft.report_code))); - keyboard_task(); - - key_lsft.release(); - key_rsft.release(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_rsft.report_code))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); keyboard_task(); - - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_RIGHT_SHIFT))); keyboard_task(); } TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) { TestDriver driver; - auto combo_key = KeymapKey(0, 0, 0, RSFT(LCTL(KC_O))); - - set_keymap({combo_key}); - + press_key(6, 0); // BUG: The press is split into two reports // BUG: It reports RSFT instead of LSFT // See issue #524 for more information // The underlying cause is that we use only one bit to represent the right hand // modifiers. - combo_key.press(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL, KC_O))); keyboard_task(); - - combo_key.release(); + release_key(6, 0); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); @@ -188,29 +127,25 @@ TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) { TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) { TestDriver driver; InSequence s; - auto key_plus = KeymapKey(0, 1, 1, KC_PLUS); - auto key_eql = KeymapKey(0, 0, 1, KC_EQL); - - set_keymap({key_plus, key_eql}); - key_plus.press(); + press_key(1, 1); // KC_PLUS EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_plus.release(); + release_key(1, 1); // KC_PLUS EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_eql.press(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_eql.report_code))); + press_key(0, 1); // KC_EQUAL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_eql.release(); + release_key(0, 1); // KC_EQUAL EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); @@ -219,31 +154,27 @@ TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) { TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) { TestDriver driver; InSequence s; - auto key_plus = KeymapKey(0, 1, 1, KC_PLUS); - auto key_eql = KeymapKey(0, 0, 1, KC_EQUAL); - - set_keymap({key_plus, key_eql}); - key_plus.press(); + press_key(1, 1); // KC_PLUS EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_eql.press(); + press_key(0, 1); // KC_EQUAL EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_plus.release(); + release_key(1, 1); // KC_PLUS // BUG: Should really still return KC_EQUAL, but this is fine too // It's also called twice for some reason EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_eql.release(); + release_key(0, 1); // KC_EQUAL EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); @@ -252,28 +183,24 @@ TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) { TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) { TestDriver driver; InSequence s; - auto key_plus = KeymapKey(0, 1, 1, KC_PLUS); - auto key_eql = KeymapKey(0, 0, 1, KC_EQUAL); - set_keymap({key_plus, key_eql}); - - key_eql.press(); + press_key(0, 1); // KC_EQUAL EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_eql.release(); + release_key(0, 1); // KC_EQUAL EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_plus.press(); + press_key(1, 1); // KC_PLUS EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_plus.release(); + release_key(1, 1); // KC_PLUS EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); @@ -283,17 +210,13 @@ TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) { TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) { TestDriver driver; InSequence s; - auto key_plus = KeymapKey(0, 1, 1, KC_PLUS); - auto key_eql = KeymapKey(0, 0, 1, KC_EQL); - - set_keymap({key_plus, key_eql}); - key_eql.press(); + press_key(0, 1); // KC_EQUAL EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_plus.press(); + press_key(1, 1); // KC_PLUS // BUG: The sequence is a bit strange, but it works, the end result is that // KC_PLUS is sent EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL))); @@ -302,16 +225,16 @@ TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) { run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_eql.release(); + release_key(0, 1); // KC_EQUAL // I guess it's fine to still report shift here EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - key_plus.release(); + release_key(1, 1); // KC_PLUS // This report is not needed EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); -}
\ No newline at end of file +} |