diff options
author | Stefan Kerkmann <karlk90@pm.me> | 2021-11-22 22:15:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-23 08:15:04 +1100 |
commit | b6054c0206609f3755f71d819643644d250288b0 (patch) | |
tree | 4f6f33040bb5184d47144090058eb089d2782b6c /tests/basic/test_keypress.cpp | |
parent | f4966a19d69a7f3bbefeea0537071d7d7c2abbdd (diff) |
[Tests] Increase QMK test coverage (#13789)
* Add per-test keymaps
* Add better trace and info logs for failed unit-tests
* Add layer state assertion with tracing message
* Use individual test binaries configuration options
* Add basic qmk functionality tests
* Add tap hold configurations tests
* Add auto shift tests
* `qmk format-c
* Fix tests
Co-authored-by: Nick Brassel <nick@tzarc.org>
Diffstat (limited to 'tests/basic/test_keypress.cpp')
-rw-r--r-- | tests/basic/test_keypress.cpp | 185 |
1 files changed, 131 insertions, 54 deletions
diff --git a/tests/basic/test_keypress.cpp b/tests/basic/test_keypress.cpp index cf839f8c16..70613bbd6d 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,95 +30,156 @@ TEST_F(KeyPress, SendKeyboardIsNotCalledWhenNoKeyIsPressed) { TEST_F(KeyPress, CorrectKeyIsReportedWhenPressed) { TestDriver driver; - press_key(0, 0); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); + auto key = KeymapKey(0, 0, 0, KC_A); + + set_keymap({key}); + + key.press(); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key.report_code))); keyboard_task(); - release_key(0, 0); + + key.release(); 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; - press_key(1, 0); - press_key(0, 3); + 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(); // Note that QMK only processes one key at a time // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_b.report_code))); keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B, KC_C))); + + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_b.report_code, key_c.report_code))); keyboard_task(); - release_key(1, 0); - release_key(0, 3); + + key_b.release(); + key_c.release(); // Note that the first key released is the first one in the matrix order - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_C))); - keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_c.report_code))); keyboard_task(); -} -TEST_F(KeyPress, ANonMappedKeyDoesNothing) { - TestDriver driver; - press_key(2, 0); - EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0); - keyboard_task(); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } TEST_F(KeyPress, LeftShiftIsReportedCorrectly) { TestDriver driver; - press_key(3, 0); - press_key(0, 0); + 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(); + // Unfortunately modifiers are also processed in the wrong order // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_a.report_code))); keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A, KC_LEFT_SHIFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_a.report_code, key_lsft.report_code))); keyboard_task(); - release_key(0, 0); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); + + key_a.release(); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code))); keyboard_task(); - release_key(3, 0); + + key_lsft.release(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } TEST_F(KeyPress, PressLeftShiftAndControl) { TestDriver driver; - press_key(3, 0); - press_key(5, 0); + 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(); + // Unfortunately modifiers are also processed in the wrong order // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code))); keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_LEFT_CTRL))); + + 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))); + keyboard_task(); + + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } TEST_F(KeyPress, LeftAndRightShiftCanBePressedAtTheSameTime) { TestDriver driver; - press_key(3, 0); - press_key(4, 0); + 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(); // Unfortunately modifiers are also processed in the wrong order // See issue #1476 for more information - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); + 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))); keyboard_task(); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_RIGHT_SHIFT))); + + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); } TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) { TestDriver driver; - press_key(6, 0); + auto combo_key = KeymapKey(0, 0, 0, RSFT(LCTL(KC_O))); + + set_keymap({combo_key}); + // 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(); - release_key(6, 0); + + combo_key.release(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); @@ -127,25 +188,29 @@ 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}); - press_key(1, 1); // KC_PLUS + key_plus.press(); 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); - release_key(1, 1); // KC_PLUS + key_plus.release(); 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); - press_key(0, 1); // KC_EQUAL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); + key_eql.press(); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_eql.report_code))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); // KC_EQUAL + key_eql.release(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); @@ -154,27 +219,31 @@ 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}); - press_key(1, 1); // KC_PLUS + key_plus.press(); 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); - press_key(0, 1); // KC_EQUAL + key_eql.press(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - release_key(1, 1); // KC_PLUS + key_plus.release(); // 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); - release_key(0, 1); // KC_EQUAL + key_eql.release(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); @@ -183,24 +252,28 @@ 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); - press_key(0, 1); // KC_EQUAL + set_keymap({key_plus, key_eql}); + + key_eql.press(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); // KC_EQUAL + key_eql.release(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - press_key(1, 1); // KC_PLUS + key_plus.press(); 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); - release_key(1, 1); // KC_PLUS + key_plus.release(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); run_one_scan_loop(); @@ -210,13 +283,17 @@ 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}); - press_key(0, 1); // KC_EQUAL + key_eql.press(); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL))); run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - press_key(1, 1); // KC_PLUS + key_plus.press(); // 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))); @@ -225,16 +302,16 @@ TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) { run_one_scan_loop(); testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); // KC_EQUAL + key_eql.release(); // 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); - release_key(1, 1); // KC_PLUS + key_plus.release(); // 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 |