summaryrefslogtreecommitdiff
path: root/tests/tap_hold_configurations/default_mod_tap
diff options
context:
space:
mode:
authorDavid Kosorin <david@kosorin.net>2023-01-02 11:16:24 +0100
committerGitHub <noreply@github.com>2023-01-02 11:16:24 +0100
commit0f5500182ca00907045bcb1cd870616b5a3bee11 (patch)
treee39753711ca9e207a08bfe3f1cc2b80a14ddec9c /tests/tap_hold_configurations/default_mod_tap
parent24adecd9227931ebaec16115e05055e0b580d351 (diff)
Allow mod-tap hold action on one shot layer (#19214)
Diffstat (limited to 'tests/tap_hold_configurations/default_mod_tap')
-rw-r--r--tests/tap_hold_configurations/default_mod_tap/test_one_shot_layer.cpp248
1 files changed, 248 insertions, 0 deletions
diff --git a/tests/tap_hold_configurations/default_mod_tap/test_one_shot_layer.cpp b/tests/tap_hold_configurations/default_mod_tap/test_one_shot_layer.cpp
new file mode 100644
index 0000000000..8cbb57f33e
--- /dev/null
+++ b/tests/tap_hold_configurations/default_mod_tap/test_one_shot_layer.cpp
@@ -0,0 +1,248 @@
+#include "keyboard_report_util.hpp"
+#include "keycode.h"
+#include "test_common.hpp"
+#include "action_tapping.h"
+#include "test_fixture.hpp"
+#include "test_keymap_key.hpp"
+
+using testing::_;
+using testing::InSequence;
+
+class OneShotLayerModTap : public TestFixture {};
+
+TEST_F(OneShotLayerModTap, tap_mod_tap_hold_key) {
+ TestDriver driver;
+ InSequence s;
+ auto osl_key = KeymapKey{0, 0, 0, OSL(1)};
+ auto mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_A));
+
+ set_keymap({osl_key, mod_tap_hold_key});
+
+ /* Set one shot layer */
+ tap_key(osl_key);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press mod-tap-hold key */
+ EXPECT_NO_REPORT(driver);
+ mod_tap_hold_key.press();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release mod-tap-hold key */
+ EXPECT_REPORT(driver, (KC_A));
+ EXPECT_EMPTY_REPORT(driver);
+ mod_tap_hold_key.release();
+ run_one_scan_loop();
+ expect_layer_state(0);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+}
+
+TEST_F(OneShotLayerModTap, tap_and_hold_mod_tap_hold_key_tapping_term) {
+ TestDriver driver;
+ InSequence s;
+ auto osl_key = KeymapKey{0, 0, 0, OSL(1)};
+ auto mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_A));
+
+ set_keymap({osl_key, mod_tap_hold_key});
+
+ /* Set one shot layer */
+ tap_key(osl_key);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press mod-tap-hold key */
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
+ mod_tap_hold_key.press();
+ idle_for(TAPPING_TERM + 1);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release mod-tap-hold key */
+ EXPECT_EMPTY_REPORT(driver);
+ mod_tap_hold_key.release();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+}
+
+TEST_F(OneShotLayerModTap, tap_regular_key_while_mod_tap_key_is_held_tapping_term) {
+ TestDriver driver;
+ InSequence s;
+ auto osl_key = KeymapKey{0, 0, 0, OSL(1)};
+ auto mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_A));
+ auto regular_key1 = KeymapKey(1, 2, 0, KC_1);
+
+ set_keymap({osl_key, mod_tap_hold_key, regular_key1});
+
+ /* Set one shot layer */
+ tap_key(osl_key);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press mod-tap-hold key */
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
+ mod_tap_hold_key.press();
+ idle_for(TAPPING_TERM + 1);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press regular key */
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_1));
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
+ regular_key1.press();
+ run_one_scan_loop();
+ expect_layer_state(0);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release regular key */
+ EXPECT_NO_REPORT(driver);
+ regular_key1.release();
+ run_one_scan_loop();
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release mod-tap-hold key */
+ EXPECT_EMPTY_REPORT(driver);
+ mod_tap_hold_key.release();
+ run_one_scan_loop();
+ testing::Mock::VerifyAndClearExpectations(&driver);
+}
+
+TEST_F(OneShotLayerModTap, tap_a_mod_tap_key_while_another_mod_tap_key_is_held_tapping_term) {
+ TestDriver driver;
+ InSequence s;
+ auto osl_key = KeymapKey{0, 0, 0, OSL(1)};
+ auto regular_key0 = KeymapKey(0, 2, 0, KC_0);
+ auto first_mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_A));
+ auto second_mod_tap_hold_key = KeymapKey(1, 2, 0, CTL_T(KC_B));
+
+ set_keymap({osl_key, regular_key0, first_mod_tap_hold_key, second_mod_tap_hold_key});
+
+ /* Set one shot layer */
+ tap_key(osl_key);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press first mod-tap-hold key */
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
+ first_mod_tap_hold_key.press();
+ idle_for(TAPPING_TERM + 1);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press second tap-hold key */
+ EXPECT_NO_REPORT(driver);
+ second_mod_tap_hold_key.press();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release second tap-hold key */
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B));
+ EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
+ second_mod_tap_hold_key.release();
+ run_one_scan_loop();
+ expect_layer_state(0);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release first mod-tap-hold key */
+ EXPECT_EMPTY_REPORT(driver);
+ first_mod_tap_hold_key.release();
+ run_one_scan_loop();
+ testing::Mock::VerifyAndClearExpectations(&driver);
+}
+
+TEST_F(OneShotLayerModTap, tap_regular_key_while_mod_tap_key_is_held) {
+ TestDriver driver;
+ InSequence s;
+ auto osl_key = KeymapKey{0, 0, 0, OSL(1)};
+ auto mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_A));
+ auto regular_key0 = KeymapKey(0, 2, 0, KC_0);
+ auto regular_key1 = KeymapKey(1, 2, 0, KC_1);
+
+ set_keymap({osl_key, mod_tap_hold_key, regular_key0, regular_key1});
+
+ /* Set one shot layer */
+ tap_key(osl_key);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press mod-tap-hold key */
+ EXPECT_NO_REPORT(driver);
+ mod_tap_hold_key.press();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press regular key */
+ EXPECT_NO_REPORT(driver);
+ regular_key1.press();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release regular key */
+ EXPECT_NO_REPORT(driver);
+ regular_key1.release();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release mod-tap-hold key */
+ EXPECT_REPORT(driver, (KC_A));
+ EXPECT_EMPTY_REPORT(driver);
+ EXPECT_REPORT(driver, (KC_0));
+ EXPECT_EMPTY_REPORT(driver);
+ mod_tap_hold_key.release();
+ run_one_scan_loop();
+ expect_layer_state(0);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+}
+
+TEST_F(OneShotLayerModTap, tap_a_mod_tap_key_while_another_mod_tap_key_is_held) {
+ TestDriver driver;
+ InSequence s;
+ auto osl_key = KeymapKey{0, 0, 0, OSL(1)};
+ auto regular_key0 = KeymapKey(0, 2, 0, KC_0);
+ auto first_mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_A));
+ auto second_mod_tap_hold_key = KeymapKey(1, 2, 0, CTL_T(KC_B));
+
+ set_keymap({osl_key, regular_key0, first_mod_tap_hold_key, second_mod_tap_hold_key});
+
+ /* Set one shot layer */
+ tap_key(osl_key);
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press first mod-tap-hold key */
+ EXPECT_NO_REPORT(driver);
+ first_mod_tap_hold_key.press();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Press second tap-hold key */
+ EXPECT_NO_REPORT(driver);
+ second_mod_tap_hold_key.press();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release second tap-hold key */
+ EXPECT_NO_REPORT(driver);
+ second_mod_tap_hold_key.release();
+ run_one_scan_loop();
+ expect_layer_state(1);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+
+ /* Release first mod-tap-hold key */
+ EXPECT_REPORT(driver, (KC_A));
+ EXPECT_EMPTY_REPORT(driver);
+ EXPECT_REPORT(driver, (KC_0));
+ EXPECT_EMPTY_REPORT(driver);
+ first_mod_tap_hold_key.release();
+ run_one_scan_loop();
+ expect_layer_state(0);
+ testing::Mock::VerifyAndClearExpectations(&driver);
+}