|
|
@ -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); |
|
|
|
} |