summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorleep-frog <66687468+leep-frog@users.noreply.github.com>2023-07-27 00:04:35 -0400
committerGitHub <noreply@github.com>2023-07-26 21:04:35 -0700
commit2c70d3891002337ef981a478b95c621f68dfd777 (patch)
tree537fdd4df00101b3a6a446383254363613af538b /tests
parent821db155f20f441c2d3aa6ff4e10878bfccdf45c (diff)
On-each-release tap dance function (#20255)
Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/tap_dance/examples.c24
-rw-r--r--tests/tap_dance/examples.h2
-rw-r--r--tests/tap_dance/test_examples.cpp116
3 files changed, 141 insertions, 1 deletions
diff --git a/tests/tap_dance/examples.c b/tests/tap_dance/examples.c
index af74388209..13086bbb4b 100644
--- a/tests/tap_dance/examples.c
+++ b/tests/tap_dance/examples.c
@@ -187,13 +187,35 @@ void x_reset(tap_dance_state_t *state, void *user_data) {
     xtap_state.state = TD_NONE;
 }
 
+static void release_press(tap_dance_state_t *state, void *user_data) {
+    tap_code16(KC_P);
+}
+
+static void release_unpress(tap_dance_state_t *state, void *user_data) {
+    tap_code16(KC_U);
+}
+
+static void release_unpress_mark_finished(tap_dance_state_t *state, void *user_data) {
+    tap_code16(KC_U);
+    state->finished = true;
+}
+
+static void release_finished(tap_dance_state_t *state, void *user_data) {
+    tap_code16(KC_F);
+}
+
+static void release_reset(tap_dance_state_t *state, void *user_data) {
+    tap_code16(KC_R);
+}
 
 tap_dance_action_t tap_dance_actions[] = {
     [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
     [CT_EGG]      = ACTION_TAP_DANCE_FN(dance_egg),
     [CT_FLSH]     = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset),
     [CT_CLN]      = ACTION_TAP_DANCE_TAP_HOLD(KC_COLN, KC_SCLN),
-    [X_CTL]       = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset)
+    [X_CTL]       = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset),
+    [TD_RELEASE]  = ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(release_press, release_unpress, release_finished, release_reset),
+    [TD_RELEASE_AND_FINISH]  = ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(release_press, release_unpress_mark_finished, release_finished, release_reset),
 };
 
 // clang-format on
diff --git a/tests/tap_dance/examples.h b/tests/tap_dance/examples.h
index 2622af6b2f..6118188dd1 100644
--- a/tests/tap_dance/examples.h
+++ b/tests/tap_dance/examples.h
@@ -26,6 +26,8 @@ enum {
     CT_FLSH,
     CT_CLN,
     X_CTL,
+    TD_RELEASE,
+    TD_RELEASE_AND_FINISH,
 };
 
 #ifdef __cplusplus
diff --git a/tests/tap_dance/test_examples.cpp b/tests/tap_dance/test_examples.cpp
index 6dabc45513..7858dab92b 100644
--- a/tests/tap_dance/test_examples.cpp
+++ b/tests/tap_dance/test_examples.cpp
@@ -316,3 +316,119 @@ TEST_F(TapDance, QuadFunction) {
     EXPECT_EMPTY_REPORT(driver);
     run_one_scan_loop();
 }
+
+TEST_F(TapDance, DanceFnAdvancedWithRelease) {
+    TestDriver driver;
+    InSequence s;
+    auto       key_rls = KeymapKey(0, 1, 0, TD(TD_RELEASE));
+
+    set_keymap({key_rls});
+
+    /* Single press and unpress */
+    key_rls.press();
+    EXPECT_REPORT(driver, (KC_P));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    key_rls.release();
+    EXPECT_REPORT(driver, (KC_U));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    EXPECT_REPORT(driver, (KC_F));
+    EXPECT_EMPTY_REPORT(driver);
+    EXPECT_REPORT(driver, (KC_R));
+    EXPECT_EMPTY_REPORT(driver);
+    idle_for(TAPPING_TERM);
+    run_one_scan_loop();
+
+    /* Double press and unpress */
+    key_rls.press();
+    EXPECT_REPORT(driver, (KC_P));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    key_rls.release();
+    EXPECT_REPORT(driver, (KC_U));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    key_rls.press();
+    EXPECT_REPORT(driver, (KC_P));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    key_rls.release();
+    EXPECT_REPORT(driver, (KC_U));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    EXPECT_REPORT(driver, (KC_F));
+    EXPECT_EMPTY_REPORT(driver);
+    EXPECT_REPORT(driver, (KC_R));
+    EXPECT_EMPTY_REPORT(driver);
+    idle_for(TAPPING_TERM);
+    run_one_scan_loop();
+
+    /* Unpress after tapping term has elapsed (key is registered as held) */
+    key_rls.press();
+    EXPECT_REPORT(driver, (KC_P));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    EXPECT_REPORT(driver, (KC_F));
+    EXPECT_EMPTY_REPORT(driver);
+    idle_for(TAPPING_TERM);
+    run_one_scan_loop();
+
+    key_rls.release();
+    EXPECT_REPORT(driver, (KC_U));
+    EXPECT_EMPTY_REPORT(driver);
+    EXPECT_REPORT(driver, (KC_R));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+}
+
+TEST_F(TapDance, DanceFnAdvancedWithReleaseAndFinish) {
+    TestDriver driver;
+    InSequence s;
+    auto       key_rls = KeymapKey(0, 1, 0, TD(TD_RELEASE_AND_FINISH));
+
+    set_keymap({key_rls});
+
+    /* Single press and unpress */
+    key_rls.press();
+    EXPECT_REPORT(driver, (KC_P));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    key_rls.release();
+    EXPECT_REPORT(driver, (KC_U));
+    EXPECT_EMPTY_REPORT(driver);
+    EXPECT_REPORT(driver, (KC_R));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    // Verify the finished and/or reset functions aren't called
+    // after the tapping term elapses
+    idle_for(TAPPING_TERM);
+    run_one_scan_loop();
+
+    /* Unpress after tapping term has elapsed (key is registered as held) */
+    key_rls.press();
+    EXPECT_REPORT(driver, (KC_P));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+
+    EXPECT_REPORT(driver, (KC_F));
+    EXPECT_EMPTY_REPORT(driver);
+    idle_for(TAPPING_TERM);
+    run_one_scan_loop();
+
+    key_rls.release();
+    EXPECT_REPORT(driver, (KC_U));
+    EXPECT_EMPTY_REPORT(driver);
+    EXPECT_REPORT(driver, (KC_R));
+    EXPECT_EMPTY_REPORT(driver);
+    run_one_scan_loop();
+}