summaryrefslogtreecommitdiff
path: root/tests/tap_dance/test_examples.cpp
diff options
context:
space:
mode:
authorJouke Witteveen <j.witteveen@gmail.com>2022-06-16 08:05:27 +0200
committerGitHub <noreply@github.com>2022-06-16 08:05:27 +0200
commit050fa9062f6a62ee2adefde17e6634edd79d92fc (patch)
tree1cb5b573ae02cc7c0054a75cb4e861f67e5cbf9c /tests/tap_dance/test_examples.cpp
parentfa9ecc431d51339dae1a4841d49b881282e14519 (diff)
tap-dance: Rename tests so that tap_dance is used consistently (#17396)
Diffstat (limited to 'tests/tap_dance/test_examples.cpp')
-rw-r--r--tests/tap_dance/test_examples.cpp319
1 files changed, 319 insertions, 0 deletions
diff --git a/tests/tap_dance/test_examples.cpp b/tests/tap_dance/test_examples.cpp
new file mode 100644
index 0000000000..e67e6cb907
--- /dev/null
+++ b/tests/tap_dance/test_examples.cpp
@@ -0,0 +1,319 @@
1/* Copyright 2022 Jouke Witteveen
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "keyboard_report_util.hpp"
18#include "keycode.h"
19#include "test_common.hpp"
20#include "action_tapping.h"
21#include "test_keymap_key.hpp"
22#include "examples.h"
23
24using testing::_;
25using testing::InSequence;
26
27class TapDance : public TestFixture {};
28
29TEST_F(TapDance, DoubleTap) {
30 TestDriver driver;
31 InSequence s;
32 auto key_esc_caps = KeymapKey{0, 1, 0, TD(TD_ESC_CAPS)};
33
34 set_keymap({key_esc_caps});
35
36 /* The tap dance key does nothing on the first press */
37 key_esc_caps.press();
38 run_one_scan_loop();
39 key_esc_caps.release();
40 EXPECT_NO_REPORT(driver);
41
42 /* We get the key press and the release on timeout */
43 idle_for(TAPPING_TERM);
44 EXPECT_REPORT(driver, (KC_ESC));
45 EXPECT_EMPTY_REPORT(driver);
46 run_one_scan_loop();
47
48 /* Double tap gets us the second key */
49 tap_key(key_esc_caps);
50 EXPECT_NO_REPORT(driver);
51 key_esc_caps.press();
52 EXPECT_REPORT(driver, (KC_CAPS));
53 run_one_scan_loop();
54 key_esc_caps.release();
55 EXPECT_EMPTY_REPORT(driver);
56 run_one_scan_loop();
57}
58
59TEST_F(TapDance, DoubleTapWithMod) {
60 TestDriver driver;
61 InSequence s;
62 auto key_esc_caps = KeymapKey{0, 1, 0, TD(TD_ESC_CAPS)};
63 auto key_shift = KeymapKey{0, 2, 0, KC_LSFT};
64
65 set_keymap({key_esc_caps, key_shift});
66
67 /* The tap dance key does nothing on the first press */
68 key_shift.press();
69 EXPECT_REPORT(driver, (KC_LSFT));
70 run_one_scan_loop();
71 key_esc_caps.press();
72 run_one_scan_loop();
73
74 key_esc_caps.release();
75 key_shift.release();
76 EXPECT_EMPTY_REPORT(driver);
77
78 /* We get the key press and the release */
79 idle_for(TAPPING_TERM);
80 EXPECT_REPORT(driver, (KC_LSFT));
81 EXPECT_REPORT(driver, (KC_LSFT, KC_ESC));
82 EXPECT_REPORT(driver, (KC_LSFT));
83 EXPECT_EMPTY_REPORT(driver);
84 run_one_scan_loop();
85
86 /* Double tap gets us the second key */
87 key_shift.press();
88 EXPECT_REPORT(driver, (KC_LSFT));
89 run_one_scan_loop();
90 tap_key(key_esc_caps);
91 EXPECT_NO_REPORT(driver);
92 key_shift.release();
93 key_esc_caps.press();
94 EXPECT_REPORT(driver, (KC_LSFT, KC_CAPS));
95 run_one_scan_loop();
96 key_esc_caps.release();
97 EXPECT_REPORT(driver, (KC_LSFT));
98 run_one_scan_loop();
99 EXPECT_EMPTY_REPORT(driver);
100 run_one_scan_loop();
101}
102
103TEST_F(TapDance, DoubleTapInterrupted) {
104 TestDriver driver;
105 InSequence s;
106 auto key_esc_caps = KeymapKey{0, 1, 0, TD(TD_ESC_CAPS)};
107 auto regular_key = KeymapKey(0, 2, 0, KC_A);
108
109 set_keymap({key_esc_caps, regular_key});
110
111 /* Interrupted double tap */
112 tap_key(key_esc_caps);
113 regular_key.press();
114 /* Immediate tap of the first key */
115 EXPECT_REPORT(driver, (KC_ESC));
116 EXPECT_EMPTY_REPORT(driver);
117 /* Followed by the interrupting key */
118 EXPECT_REPORT(driver, (KC_A));
119 run_one_scan_loop();
120 regular_key.release();
121 EXPECT_EMPTY_REPORT(driver);
122 run_one_scan_loop();
123
124 /* Second tap after being interrupted acts as a single tap */
125 key_esc_caps.press();
126 run_one_scan_loop();
127 key_esc_caps.release();
128 idle_for(TAPPING_TERM);
129 EXPECT_REPORT(driver, (KC_ESC));
130 EXPECT_EMPTY_REPORT(driver);
131 run_one_scan_loop();
132}
133
134TEST_F(TapDance, DanceFn) {
135 TestDriver driver;
136 InSequence s;
137 auto key_egg = KeymapKey(0, 1, 0, TD(CT_EGG));
138
139 set_keymap({key_egg});
140
141 /* 99 taps do nothing */
142 for (int i = 0; i < 99; i++) {
143 run_one_scan_loop();
144 key_egg.press();
145 run_one_scan_loop();
146 key_egg.release();
147 }
148 idle_for(TAPPING_TERM);
149 EXPECT_NO_REPORT(driver);
150 run_one_scan_loop();
151
152 /* 100 taps trigger the action */
153 for (int i = 0; i < 100; i++) {
154 run_one_scan_loop();
155 key_egg.press();
156 run_one_scan_loop();
157 key_egg.release();
158 }
159 idle_for(TAPPING_TERM);
160 EXPECT_REPORT(driver, (KC_C));
161 EXPECT_EMPTY_REPORT(driver);
162 run_one_scan_loop();
163
164 /* 250 taps act the same as 100 taps */
165 /* Taps are counted in an uint8_t, so the count overflows after 255 taps */
166 for (int i = 0; i < 250; i++) {
167 run_one_scan_loop();
168 key_egg.press();
169 run_one_scan_loop();
170 key_egg.release();
171 }
172 idle_for(TAPPING_TERM);
173 EXPECT_REPORT(driver, (KC_C));
174 EXPECT_EMPTY_REPORT(driver);
175 run_one_scan_loop();
176}
177
178TEST_F(TapDance, DanceFnAdvanced) {
179 TestDriver driver;
180 InSequence s;
181 auto key_flsh = KeymapKey(0, 1, 0, TD(CT_FLSH));
182
183 set_keymap({key_flsh});
184
185 /* Three taps don't trigger a reset */
186 EXPECT_REPORT(driver, (KC_3));
187 EXPECT_REPORT(driver, (KC_3, KC_2));
188 EXPECT_REPORT(driver, (KC_3, KC_2, KC_1));
189 for (int i = 0; i < 3; i++) {
190 run_one_scan_loop();
191 key_flsh.press();
192 run_one_scan_loop();
193 key_flsh.release();
194 }
195 idle_for(TAPPING_TERM);
196 EXPECT_REPORT(driver, (KC_3, KC_2));
197 EXPECT_REPORT(driver, (KC_3));
198 EXPECT_EMPTY_REPORT(driver);
199 run_one_scan_loop();
200
201 /* Four taps trigger a reset */
202 EXPECT_REPORT(driver, (KC_3));
203 EXPECT_REPORT(driver, (KC_3, KC_2));
204 EXPECT_REPORT(driver, (KC_3, KC_2, KC_1));
205 EXPECT_REPORT(driver, (KC_2, KC_1));
206 EXPECT_REPORT(driver, (KC_1));
207 EXPECT_EMPTY_REPORT(driver);
208 for (int i = 0; i < 4; i++) {
209 run_one_scan_loop();
210 key_flsh.press();
211 run_one_scan_loop();
212 key_flsh.release();
213 }
214 idle_for(TAPPING_TERM);
215 EXPECT_REPORT(driver, (KC_R));
216 EXPECT_EMPTY_REPORT(driver);
217 run_one_scan_loop();
218}
219
220TEST_F(TapDance, TapHold) {
221 TestDriver driver;
222 InSequence s;
223 auto key_cln = KeymapKey{0, 1, 0, TD(CT_CLN)};
224
225 set_keymap({key_cln});
226
227 /* Short taps fire on release */
228 key_cln.press();
229 run_one_scan_loop();
230 key_cln.release();
231 EXPECT_REPORT(driver, (KC_LSFT));
232 EXPECT_REPORT(driver, (KC_LSFT, KC_SCLN));
233 EXPECT_REPORT(driver, (KC_LSFT));
234 EXPECT_EMPTY_REPORT(driver);
235 run_one_scan_loop();
236
237 /* Holds immediate following a tap apply to the tap key */
238 key_cln.press();
239 EXPECT_REPORT(driver, (KC_LSFT));
240 EXPECT_REPORT(driver, (KC_LSFT, KC_SCLN));
241 idle_for(TAPPING_TERM * 2);
242 key_cln.release();
243 EXPECT_REPORT(driver, (KC_LSFT));
244 EXPECT_EMPTY_REPORT(driver);
245 run_one_scan_loop();
246
247 /* Holds trigger the hold key */
248 key_cln.press();
249 idle_for(TAPPING_TERM);
250 run_one_scan_loop();
251 EXPECT_REPORT(driver, (KC_SCLN));
252 run_one_scan_loop();
253 key_cln.release();
254 EXPECT_EMPTY_REPORT(driver);
255 run_one_scan_loop();
256}
257
258TEST_F(TapDance, QuadFunction) {
259 TestDriver driver;
260 InSequence s;
261 auto key_quad = KeymapKey{0, 1, 0, TD(X_CTL)};
262 auto regular_key = KeymapKey(0, 2, 0, KC_A);
263
264 set_keymap({key_quad, regular_key});
265
266 /* Single tap */
267 key_quad.press();
268 run_one_scan_loop();
269 key_quad.release();
270 idle_for(TAPPING_TERM);
271 EXPECT_REPORT(driver, (KC_X));
272 EXPECT_EMPTY_REPORT(driver);
273 run_one_scan_loop();
274
275 /* Single hold */
276 key_quad.press();
277 run_one_scan_loop();
278 idle_for(TAPPING_TERM);
279 EXPECT_REPORT(driver, (KC_LCTL));
280 run_one_scan_loop();
281 key_quad.release();
282 EXPECT_EMPTY_REPORT(driver);
283 run_one_scan_loop();
284
285 /* Double tap */
286 tap_key(key_quad);
287 key_quad.press();
288 run_one_scan_loop();
289 key_quad.release();
290 idle_for(TAPPING_TERM);
291 EXPECT_REPORT(driver, (KC_ESC));
292 EXPECT_EMPTY_REPORT(driver);
293 run_one_scan_loop();
294
295 /* Double tap and hold */
296 tap_key(key_quad);
297 key_quad.press();
298 run_one_scan_loop();
299 idle_for(TAPPING_TERM);
300 EXPECT_REPORT(driver, (KC_LALT));
301 run_one_scan_loop();
302 key_quad.release();
303 EXPECT_EMPTY_REPORT(driver);
304 run_one_scan_loop();
305
306 /* Double single tap */
307 tap_key(key_quad);
308 tap_key(key_quad);
309 regular_key.press();
310 EXPECT_REPORT(driver, (KC_X));
311 EXPECT_EMPTY_REPORT(driver);
312 EXPECT_REPORT(driver, (KC_X));
313 EXPECT_EMPTY_REPORT(driver);
314 EXPECT_REPORT(driver, (KC_A));
315 run_one_scan_loop();
316 regular_key.release();
317 EXPECT_EMPTY_REPORT(driver);
318 run_one_scan_loop();
319}