logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

test_tap_hold.cpp (24228B)


  1. // Copyright 2025 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "keyboard_report_util.hpp"
  15. #include "keycode.h"
  16. #include "test_common.hpp"
  17. #include "action_tapping.h"
  18. #include "test_fixture.hpp"
  19. #include "test_keymap_key.hpp"
  20. using testing::_;
  21. using testing::AnyNumber;
  22. using testing::InSequence;
  23. class FlowTapTest : public TestFixture {};
  24. // Test an input of quick distinct taps. All should be settled as tapped.
  25. TEST_F(FlowTapTest, distinct_taps) {
  26. TestDriver driver;
  27. InSequence s;
  28. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  29. auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_B));
  30. auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_C));
  31. auto mod_tap_key3 = KeymapKey(0, 3, 0, ALT_T(KC_D));
  32. set_keymap({regular_key, mod_tap_key1, mod_tap_key2, mod_tap_key3});
  33. // Tap regular key.
  34. EXPECT_REPORT(driver, (KC_A));
  35. EXPECT_EMPTY_REPORT(driver);
  36. tap_key(regular_key, FLOW_TAP_TERM + 1);
  37. VERIFY_AND_CLEAR(driver);
  38. // Tap mod-tap 1.
  39. EXPECT_REPORT(driver, (KC_B));
  40. mod_tap_key1.press();
  41. run_one_scan_loop();
  42. VERIFY_AND_CLEAR(driver);
  43. EXPECT_EMPTY_REPORT(driver);
  44. idle_for(FLOW_TAP_TERM + 1);
  45. mod_tap_key1.release();
  46. run_one_scan_loop();
  47. VERIFY_AND_CLEAR(driver);
  48. // Tap mod-tap 2.
  49. EXPECT_REPORT(driver, (KC_C));
  50. mod_tap_key2.press();
  51. run_one_scan_loop();
  52. VERIFY_AND_CLEAR(driver);
  53. EXPECT_EMPTY_REPORT(driver);
  54. idle_for(FLOW_TAP_TERM + 1);
  55. mod_tap_key2.release();
  56. run_one_scan_loop();
  57. VERIFY_AND_CLEAR(driver);
  58. // Tap mod-tap 3.
  59. EXPECT_REPORT(driver, (KC_D));
  60. mod_tap_key3.press();
  61. run_one_scan_loop();
  62. VERIFY_AND_CLEAR(driver);
  63. EXPECT_EMPTY_REPORT(driver);
  64. idle_for(FLOW_TAP_TERM + 1);
  65. mod_tap_key3.release();
  66. idle_for(FLOW_TAP_TERM + 1); // Pause between taps.
  67. VERIFY_AND_CLEAR(driver);
  68. // Tap mod-tap 1.
  69. EXPECT_NO_REPORT(driver);
  70. mod_tap_key1.press();
  71. run_one_scan_loop();
  72. VERIFY_AND_CLEAR(driver);
  73. EXPECT_REPORT(driver, (KC_B));
  74. EXPECT_EMPTY_REPORT(driver);
  75. idle_for(FLOW_TAP_TERM + 1);
  76. mod_tap_key1.release();
  77. run_one_scan_loop();
  78. VERIFY_AND_CLEAR(driver);
  79. // Tap mod-tap 2.
  80. EXPECT_REPORT(driver, (KC_C));
  81. mod_tap_key2.press();
  82. run_one_scan_loop();
  83. VERIFY_AND_CLEAR(driver);
  84. EXPECT_EMPTY_REPORT(driver);
  85. idle_for(TAPPING_TERM + 1);
  86. mod_tap_key2.release();
  87. idle_for(FLOW_TAP_TERM + 1);
  88. VERIFY_AND_CLEAR(driver);
  89. }
  90. // By default, Flow Tap is disabled when mods other than Shift and AltGr are on.
  91. TEST_F(FlowTapTest, hotkey_taps) {
  92. TestDriver driver;
  93. InSequence s;
  94. auto ctrl_key = KeymapKey(0, 0, 0, KC_LCTL);
  95. auto shft_key = KeymapKey(0, 1, 0, KC_LSFT);
  96. auto alt_key = KeymapKey(0, 2, 0, KC_LALT);
  97. auto gui_key = KeymapKey(0, 3, 0, KC_LGUI);
  98. auto regular_key = KeymapKey(0, 4, 0, KC_A);
  99. auto mod_tap_key = KeymapKey(0, 5, 0, RCTL_T(KC_B));
  100. set_keymap({ctrl_key, shft_key, alt_key, gui_key, regular_key, mod_tap_key});
  101. for (KeymapKey* mod_key : {&ctrl_key, &alt_key, &gui_key}) {
  102. // Hold mod key.
  103. EXPECT_REPORT(driver, (mod_key->code));
  104. mod_key->press();
  105. run_one_scan_loop();
  106. // Tap regular key.
  107. EXPECT_REPORT(driver, (mod_key->code, KC_A));
  108. regular_key.press();
  109. run_one_scan_loop();
  110. VERIFY_AND_CLEAR(driver);
  111. EXPECT_REPORT(driver, (mod_key->code));
  112. regular_key.release();
  113. run_one_scan_loop();
  114. VERIFY_AND_CLEAR(driver);
  115. // Press mod-tap, where Flow Tap is disabled due to the held mod.
  116. EXPECT_REPORT(driver, (mod_key->code, KC_RCTL));
  117. mod_tap_key.press();
  118. idle_for(TAPPING_TERM + 1);
  119. VERIFY_AND_CLEAR(driver);
  120. // Release mod-tap.
  121. EXPECT_REPORT(driver, (mod_key->code));
  122. mod_tap_key.release();
  123. run_one_scan_loop();
  124. // Release mod key.
  125. EXPECT_EMPTY_REPORT(driver);
  126. mod_key->release();
  127. run_one_scan_loop();
  128. VERIFY_AND_CLEAR(driver);
  129. }
  130. // Hold Shift key.
  131. EXPECT_REPORT(driver, (KC_LSFT));
  132. shft_key.press();
  133. run_one_scan_loop();
  134. // Tap regular key.
  135. EXPECT_REPORT(driver, (KC_LSFT, KC_A));
  136. regular_key.press();
  137. run_one_scan_loop();
  138. VERIFY_AND_CLEAR(driver);
  139. EXPECT_REPORT(driver, (KC_LSFT));
  140. regular_key.release();
  141. run_one_scan_loop();
  142. VERIFY_AND_CLEAR(driver);
  143. // Press mod-tap, where Flow Tap applies to settle as tapped.
  144. EXPECT_REPORT(driver, (KC_LSFT, KC_B));
  145. mod_tap_key.press();
  146. idle_for(TAPPING_TERM + 1);
  147. VERIFY_AND_CLEAR(driver);
  148. // Release mod-tap.
  149. EXPECT_REPORT(driver, (KC_LSFT));
  150. mod_tap_key.release();
  151. run_one_scan_loop();
  152. // Release Shift key.
  153. EXPECT_EMPTY_REPORT(driver);
  154. shft_key.release();
  155. run_one_scan_loop();
  156. VERIFY_AND_CLEAR(driver);
  157. }
  158. // Test input with two mod-taps in a rolled press quickly after a regular key.
  159. TEST_F(FlowTapTest, rolled_press) {
  160. TestDriver driver;
  161. InSequence s;
  162. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  163. auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_B));
  164. auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_C));
  165. set_keymap({regular_key, mod_tap_key1, mod_tap_key2});
  166. // Tap regular key.
  167. EXPECT_REPORT(driver, (KC_A));
  168. EXPECT_EMPTY_REPORT(driver);
  169. tap_key(regular_key);
  170. VERIFY_AND_CLEAR(driver);
  171. // Press mod-tap key 1 quickly after regular key. The mod-tap should settle
  172. // immediately as tapped, sending `KC_B`.
  173. EXPECT_REPORT(driver, (KC_B));
  174. mod_tap_key1.press();
  175. run_one_scan_loop();
  176. VERIFY_AND_CLEAR(driver);
  177. // Press mod-tap key 2 quickly.
  178. EXPECT_REPORT(driver, (KC_B, KC_C));
  179. mod_tap_key2.press();
  180. run_one_scan_loop();
  181. VERIFY_AND_CLEAR(driver);
  182. // Hold for longer than the tapping term.
  183. EXPECT_NO_REPORT(driver);
  184. idle_for(TAPPING_TERM + 1);
  185. VERIFY_AND_CLEAR(driver);
  186. // Release mod-tap keys.
  187. EXPECT_REPORT(driver, (KC_C));
  188. EXPECT_EMPTY_REPORT(driver);
  189. mod_tap_key1.release();
  190. run_one_scan_loop();
  191. mod_tap_key2.release();
  192. run_one_scan_loop();
  193. VERIFY_AND_CLEAR(driver);
  194. }
  195. TEST_F(FlowTapTest, long_flow_tap_settled_as_held) {
  196. TestDriver driver;
  197. InSequence s;
  198. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  199. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_B));
  200. set_keymap({regular_key, mod_tap_key});
  201. // Tap regular key.
  202. EXPECT_REPORT(driver, (KC_A));
  203. EXPECT_EMPTY_REPORT(driver);
  204. tap_key(regular_key);
  205. VERIFY_AND_CLEAR(driver);
  206. EXPECT_NO_REPORT(driver);
  207. idle_for(FLOW_TAP_TERM + 1);
  208. VERIFY_AND_CLEAR(driver);
  209. // Press mod-tap key.
  210. EXPECT_NO_REPORT(driver);
  211. mod_tap_key.press();
  212. run_one_scan_loop();
  213. VERIFY_AND_CLEAR(driver);
  214. // Hold for the tapping term.
  215. EXPECT_REPORT(driver, (KC_LSFT));
  216. idle_for(TAPPING_TERM);
  217. VERIFY_AND_CLEAR(driver);
  218. // Release mod-tap key.
  219. EXPECT_EMPTY_REPORT(driver);
  220. mod_tap_key.release();
  221. run_one_scan_loop();
  222. VERIFY_AND_CLEAR(driver);
  223. }
  224. TEST_F(FlowTapTest, holding_multiple_mod_taps) {
  225. TestDriver driver;
  226. InSequence s;
  227. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  228. auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_B));
  229. auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_C));
  230. set_keymap({regular_key, mod_tap_key1, mod_tap_key2});
  231. // Tap regular key.
  232. EXPECT_REPORT(driver, (KC_A));
  233. EXPECT_EMPTY_REPORT(driver);
  234. tap_key(regular_key);
  235. VERIFY_AND_CLEAR(driver);
  236. EXPECT_NO_REPORT(driver);
  237. idle_for(FLOW_TAP_TERM + 1);
  238. VERIFY_AND_CLEAR(driver);
  239. // Press mod-tap keys.
  240. EXPECT_NO_REPORT(driver);
  241. mod_tap_key1.press();
  242. run_one_scan_loop();
  243. mod_tap_key2.press();
  244. idle_for(TAPPING_TERM - 5); // Hold almost until tapping term.
  245. VERIFY_AND_CLEAR(driver);
  246. // Press regular key.
  247. EXPECT_REPORT(driver, (KC_LSFT));
  248. EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL));
  249. EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL, KC_A));
  250. regular_key.press();
  251. idle_for(10);
  252. VERIFY_AND_CLEAR(driver);
  253. // Release keys.
  254. EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL));
  255. EXPECT_REPORT(driver, (KC_LCTL));
  256. EXPECT_EMPTY_REPORT(driver);
  257. regular_key.release();
  258. run_one_scan_loop();
  259. mod_tap_key1.release();
  260. run_one_scan_loop();
  261. mod_tap_key2.release();
  262. run_one_scan_loop();
  263. VERIFY_AND_CLEAR(driver);
  264. }
  265. TEST_F(FlowTapTest, holding_mod_tap_with_regular_mod) {
  266. TestDriver driver;
  267. InSequence s;
  268. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  269. auto mod_key = KeymapKey(0, 1, 0, KC_LSFT);
  270. auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_C));
  271. set_keymap({regular_key, mod_key, mod_tap_key});
  272. // Tap regular key.
  273. EXPECT_REPORT(driver, (KC_A));
  274. EXPECT_EMPTY_REPORT(driver);
  275. tap_key(regular_key);
  276. VERIFY_AND_CLEAR(driver);
  277. EXPECT_NO_REPORT(driver);
  278. idle_for(FLOW_TAP_TERM + 1);
  279. VERIFY_AND_CLEAR(driver);
  280. // Press mod and mod-tap keys.
  281. EXPECT_REPORT(driver, (KC_LSFT));
  282. mod_key.press();
  283. run_one_scan_loop();
  284. mod_tap_key.press();
  285. idle_for(TAPPING_TERM - 5); // Hold almost until tapping term.
  286. VERIFY_AND_CLEAR(driver);
  287. // Press regular key.
  288. EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL));
  289. EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL, KC_A));
  290. regular_key.press();
  291. idle_for(10);
  292. VERIFY_AND_CLEAR(driver);
  293. // Release keys.
  294. EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL));
  295. EXPECT_REPORT(driver, (KC_LCTL));
  296. EXPECT_EMPTY_REPORT(driver);
  297. regular_key.release();
  298. run_one_scan_loop();
  299. mod_key.release();
  300. run_one_scan_loop();
  301. mod_tap_key.release();
  302. run_one_scan_loop();
  303. VERIFY_AND_CLEAR(driver);
  304. }
  305. TEST_F(FlowTapTest, layer_tap_key) {
  306. TestDriver driver;
  307. InSequence s;
  308. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  309. auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_B));
  310. auto regular_key2 = KeymapKey(1, 0, 0, KC_C);
  311. set_keymap({regular_key, layer_tap_key, regular_key2});
  312. // Tap regular key.
  313. EXPECT_REPORT(driver, (KC_A));
  314. EXPECT_EMPTY_REPORT(driver);
  315. tap_key(regular_key);
  316. VERIFY_AND_CLEAR(driver);
  317. // Press layer-tap key, quickly after the regular key.
  318. EXPECT_REPORT(driver, (KC_B));
  319. layer_tap_key.press();
  320. run_one_scan_loop();
  321. VERIFY_AND_CLEAR(driver);
  322. EXPECT_NO_REPORT(driver);
  323. idle_for(TAPPING_TERM + 1);
  324. VERIFY_AND_CLEAR(driver);
  325. // Release layer-tap key.
  326. EXPECT_EMPTY_REPORT(driver);
  327. layer_tap_key.release();
  328. run_one_scan_loop();
  329. // Tap regular key.
  330. EXPECT_REPORT(driver, (KC_A));
  331. EXPECT_EMPTY_REPORT(driver);
  332. tap_key(regular_key);
  333. VERIFY_AND_CLEAR(driver);
  334. EXPECT_NO_REPORT(driver);
  335. idle_for(FLOW_TAP_TERM + 1);
  336. VERIFY_AND_CLEAR(driver);
  337. // Press layer-tap key, slowly after the regular key.
  338. EXPECT_NO_REPORT(driver);
  339. layer_tap_key.press();
  340. run_one_scan_loop();
  341. VERIFY_AND_CLEAR(driver);
  342. EXPECT_NO_REPORT(driver);
  343. idle_for(TAPPING_TERM + 1);
  344. EXPECT_EQ(layer_state, 1 << 1);
  345. VERIFY_AND_CLEAR(driver);
  346. // Tap regular key2.
  347. EXPECT_REPORT(driver, (KC_C));
  348. EXPECT_EMPTY_REPORT(driver);
  349. tap_key(regular_key);
  350. VERIFY_AND_CLEAR(driver);
  351. // Release layer-tap key.
  352. EXPECT_NO_REPORT(driver);
  353. layer_tap_key.release();
  354. run_one_scan_loop();
  355. VERIFY_AND_CLEAR(driver);
  356. }
  357. TEST_F(FlowTapTest, layer_tap_ignored_with_disabled_key) {
  358. TestDriver driver;
  359. InSequence s;
  360. auto no_key = KeymapKey(0, 0, 0, KC_NO);
  361. auto regular_key = KeymapKey(1, 0, 0, KC_ESC);
  362. auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A));
  363. auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_B));
  364. set_keymap({no_key, regular_key, layer_tap_key, mod_tap_key});
  365. EXPECT_REPORT(driver, (KC_ESC));
  366. EXPECT_EMPTY_REPORT(driver);
  367. layer_tap_key.press();
  368. idle_for(TAPPING_TERM + 1);
  369. tap_key(regular_key);
  370. layer_tap_key.release();
  371. run_one_scan_loop();
  372. VERIFY_AND_CLEAR(driver);
  373. EXPECT_REPORT(driver, (KC_LCTL));
  374. mod_tap_key.press();
  375. idle_for(TAPPING_TERM + 1);
  376. VERIFY_AND_CLEAR(driver);
  377. EXPECT_EMPTY_REPORT(driver);
  378. mod_tap_key.release();
  379. run_one_scan_loop();
  380. VERIFY_AND_CLEAR(driver);
  381. }
  382. TEST_F(FlowTapTest, layer_tap_ignored_with_disabled_key_complex) {
  383. TestDriver driver;
  384. InSequence s;
  385. auto regular_key1 = KeymapKey(0, 0, 0, KC_Q);
  386. auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_SPC));
  387. auto mod_tap_key1 = KeymapKey(0, 2, 0, CTL_T(KC_T));
  388. // Place RALT_T(KC_I), where Flow Tap is enabled, in the same position on
  389. // layer 0 as KC_RGHT, where Flow Tap is disabled. This tests that Flow Tap
  390. // tracks the keycode from the correct layer.
  391. auto mod_tap_key2 = KeymapKey(0, 3, 0, RALT_T(KC_I));
  392. auto regular_key2 = KeymapKey(1, 3, 0, KC_RGHT);
  393. set_keymap({regular_key1, layer_tap_key, mod_tap_key1, mod_tap_key2, regular_key2});
  394. // Tap regular key 1.
  395. EXPECT_REPORT(driver, (KC_Q));
  396. EXPECT_EMPTY_REPORT(driver);
  397. tap_key(regular_key1);
  398. idle_for(FLOW_TAP_TERM + 1);
  399. VERIFY_AND_CLEAR(driver);
  400. // Hold layer-tap key.
  401. EXPECT_NO_REPORT(driver);
  402. layer_tap_key.press();
  403. run_one_scan_loop();
  404. // idle_for(TAPPING_TERM + 1);
  405. VERIFY_AND_CLEAR(driver);
  406. // Tap regular key 2.
  407. EXPECT_REPORT(driver, (KC_RGHT));
  408. EXPECT_EMPTY_REPORT(driver);
  409. tap_key(regular_key2);
  410. VERIFY_AND_CLEAR(driver);
  411. // Release layer-tap key.
  412. EXPECT_NO_REPORT(driver);
  413. layer_tap_key.release();
  414. run_one_scan_loop();
  415. VERIFY_AND_CLEAR(driver);
  416. // Quickly hold mod-tap key 1.
  417. EXPECT_NO_REPORT(driver);
  418. mod_tap_key1.press();
  419. run_one_scan_loop();
  420. VERIFY_AND_CLEAR(driver);
  421. EXPECT_REPORT(driver, (KC_LCTL));
  422. EXPECT_REPORT(driver, (KC_LCTL, KC_Q));
  423. EXPECT_REPORT(driver, (KC_LCTL));
  424. tap_key(regular_key1);
  425. VERIFY_AND_CLEAR(driver);
  426. EXPECT_EMPTY_REPORT(driver);
  427. mod_tap_key1.release();
  428. run_one_scan_loop();
  429. VERIFY_AND_CLEAR(driver);
  430. }
  431. TEST_F(FlowTapTest, layer_tap_ignored_with_enabled_key) {
  432. TestDriver driver;
  433. InSequence s;
  434. auto no_key = KeymapKey(0, 0, 0, KC_NO);
  435. auto regular_key = KeymapKey(1, 0, 0, KC_C);
  436. auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A));
  437. auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_B));
  438. set_keymap({no_key, regular_key, layer_tap_key, mod_tap_key});
  439. EXPECT_REPORT(driver, (KC_C));
  440. EXPECT_EMPTY_REPORT(driver);
  441. layer_tap_key.press();
  442. idle_for(TAPPING_TERM + 1);
  443. tap_key(regular_key);
  444. layer_tap_key.release();
  445. run_one_scan_loop();
  446. VERIFY_AND_CLEAR(driver);
  447. EXPECT_REPORT(driver, (KC_B));
  448. mod_tap_key.press();
  449. run_one_scan_loop();
  450. VERIFY_AND_CLEAR(driver);
  451. EXPECT_EMPTY_REPORT(driver);
  452. idle_for(TAPPING_TERM + 1);
  453. mod_tap_key.release();
  454. run_one_scan_loop();
  455. VERIFY_AND_CLEAR(driver);
  456. }
  457. TEST_F(FlowTapTest, combo_key) {
  458. TestDriver driver;
  459. InSequence s;
  460. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  461. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_X));
  462. auto layer_tap_key = KeymapKey(0, 2, 0, LT(1, KC_Y));
  463. set_keymap({regular_key, mod_tap_key, layer_tap_key});
  464. // Tap regular key.
  465. EXPECT_REPORT(driver, (KC_A));
  466. EXPECT_EMPTY_REPORT(driver);
  467. tap_key(regular_key);
  468. VERIFY_AND_CLEAR(driver);
  469. // Press combo keys quickly after regular key.
  470. EXPECT_REPORT(driver, (KC_Z));
  471. EXPECT_EMPTY_REPORT(driver);
  472. tap_combo({mod_tap_key, layer_tap_key});
  473. VERIFY_AND_CLEAR(driver);
  474. // Press mod-tap key quickly.
  475. EXPECT_REPORT(driver, (KC_X));
  476. mod_tap_key.press();
  477. idle_for(TAPPING_TERM + 1);
  478. VERIFY_AND_CLEAR(driver);
  479. // Release mod-tap key.
  480. EXPECT_EMPTY_REPORT(driver);
  481. mod_tap_key.release();
  482. run_one_scan_loop();
  483. VERIFY_AND_CLEAR(driver);
  484. }
  485. TEST_F(FlowTapTest, oneshot_mod_key) {
  486. TestDriver driver;
  487. InSequence s;
  488. auto regular_key = KeymapKey(0, 0, 0, KC_A);
  489. auto osm_key = KeymapKey(0, 1, 0, OSM(MOD_LSFT));
  490. set_keymap({regular_key, osm_key});
  491. // Tap regular key.
  492. EXPECT_REPORT(driver, (KC_A));
  493. EXPECT_EMPTY_REPORT(driver);
  494. tap_key(regular_key);
  495. VERIFY_AND_CLEAR(driver);
  496. // Tap OSM, tap regular key.
  497. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber());
  498. EXPECT_REPORT(driver, (KC_LSFT, KC_A));
  499. EXPECT_EMPTY_REPORT(driver);
  500. tap_key(osm_key);
  501. tap_key(regular_key);
  502. VERIFY_AND_CLEAR(driver);
  503. // Nested press of OSM and regular keys.
  504. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber());
  505. EXPECT_REPORT(driver, (KC_LSFT, KC_A));
  506. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber());
  507. EXPECT_EMPTY_REPORT(driver);
  508. osm_key.press();
  509. run_one_scan_loop();
  510. tap_key(regular_key);
  511. osm_key.release();
  512. run_one_scan_loop();
  513. VERIFY_AND_CLEAR(driver);
  514. }
  515. TEST_F(FlowTapTest, quick_tap) {
  516. TestDriver driver;
  517. InSequence s;
  518. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_A));
  519. set_keymap({mod_tap_key});
  520. EXPECT_REPORT(driver, (KC_A));
  521. EXPECT_EMPTY_REPORT(driver);
  522. tap_key(mod_tap_key);
  523. VERIFY_AND_CLEAR(driver);
  524. EXPECT_REPORT(driver, (KC_A));
  525. mod_tap_key.press();
  526. run_one_scan_loop();
  527. VERIFY_AND_CLEAR(driver);
  528. EXPECT_NO_REPORT(driver);
  529. idle_for(TAPPING_TERM + 1);
  530. VERIFY_AND_CLEAR(driver);
  531. // Release mod-tap key.
  532. EXPECT_EMPTY_REPORT(driver);
  533. mod_tap_key.release();
  534. run_one_scan_loop();
  535. VERIFY_AND_CLEAR(driver);
  536. }
  537. TEST_F(FlowTapTest, rolling_mt_mt) {
  538. TestDriver driver;
  539. InSequence s;
  540. auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A));
  541. auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B));
  542. set_keymap({mod_tap_key1, mod_tap_key2});
  543. EXPECT_NO_REPORT(driver);
  544. idle_for(FLOW_TAP_TERM + 1);
  545. mod_tap_key1.press();
  546. run_one_scan_loop();
  547. mod_tap_key2.press();
  548. run_one_scan_loop();
  549. VERIFY_AND_CLEAR(driver);
  550. EXPECT_REPORT(driver, (KC_A));
  551. EXPECT_REPORT(driver, (KC_A, KC_B));
  552. EXPECT_REPORT(driver, (KC_B));
  553. mod_tap_key1.release();
  554. run_one_scan_loop();
  555. VERIFY_AND_CLEAR(driver);
  556. // Hold for longer than the tapping term.
  557. EXPECT_NO_REPORT(driver);
  558. idle_for(TAPPING_TERM + 1);
  559. VERIFY_AND_CLEAR(driver);
  560. // Release mod-tap keys.
  561. EXPECT_EMPTY_REPORT(driver);
  562. mod_tap_key2.release();
  563. run_one_scan_loop();
  564. VERIFY_AND_CLEAR(driver);
  565. }
  566. TEST_F(FlowTapTest, rolling_lt_mt_regular) {
  567. TestDriver driver;
  568. InSequence s;
  569. auto layer_tap_key = KeymapKey(0, 0, 0, LT(1, KC_A));
  570. auto mod_tap_key = KeymapKey(0, 1, 0, CTL_T(KC_B));
  571. auto regular_key = KeymapKey(0, 2, 0, KC_C);
  572. set_keymap({layer_tap_key, mod_tap_key, regular_key});
  573. EXPECT_NO_REPORT(driver);
  574. idle_for(FLOW_TAP_TERM + 1);
  575. layer_tap_key.press();
  576. run_one_scan_loop();
  577. mod_tap_key.press();
  578. run_one_scan_loop();
  579. regular_key.press();
  580. run_one_scan_loop();
  581. VERIFY_AND_CLEAR(driver);
  582. EXPECT_REPORT(driver, (KC_A));
  583. EXPECT_REPORT(driver, (KC_A, KC_B));
  584. EXPECT_REPORT(driver, (KC_A, KC_B, KC_C));
  585. EXPECT_REPORT(driver, (KC_B, KC_C));
  586. layer_tap_key.release();
  587. run_one_scan_loop();
  588. VERIFY_AND_CLEAR(driver);
  589. // Hold for longer than the tapping term.
  590. EXPECT_NO_REPORT(driver);
  591. idle_for(TAPPING_TERM + 1);
  592. VERIFY_AND_CLEAR(driver);
  593. // Release mod-tap keys.
  594. EXPECT_REPORT(driver, (KC_C));
  595. EXPECT_EMPTY_REPORT(driver);
  596. mod_tap_key.release();
  597. run_one_scan_loop();
  598. regular_key.release();
  599. run_one_scan_loop();
  600. VERIFY_AND_CLEAR(driver);
  601. }
  602. TEST_F(FlowTapTest, rolling_lt_regular_mt) {
  603. TestDriver driver;
  604. InSequence s;
  605. auto layer_tap_key = KeymapKey(0, 0, 0, LT(1, KC_A));
  606. auto regular_key = KeymapKey(0, 1, 0, KC_B);
  607. auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_C));
  608. set_keymap({layer_tap_key, regular_key, mod_tap_key});
  609. EXPECT_NO_REPORT(driver);
  610. idle_for(FLOW_TAP_TERM + 1);
  611. layer_tap_key.press();
  612. run_one_scan_loop();
  613. regular_key.press();
  614. run_one_scan_loop();
  615. mod_tap_key.press();
  616. run_one_scan_loop();
  617. VERIFY_AND_CLEAR(driver);
  618. EXPECT_REPORT(driver, (KC_A));
  619. EXPECT_REPORT(driver, (KC_A, KC_B));
  620. EXPECT_REPORT(driver, (KC_A, KC_B, KC_C));
  621. EXPECT_REPORT(driver, (KC_B, KC_C));
  622. layer_tap_key.release();
  623. run_one_scan_loop();
  624. VERIFY_AND_CLEAR(driver);
  625. // Hold for longer than the tapping term.
  626. EXPECT_NO_REPORT(driver);
  627. idle_for(TAPPING_TERM + 1);
  628. VERIFY_AND_CLEAR(driver);
  629. // Release mod-tap keys.
  630. EXPECT_REPORT(driver, (KC_C));
  631. EXPECT_EMPTY_REPORT(driver);
  632. regular_key.release();
  633. run_one_scan_loop();
  634. mod_tap_key.release();
  635. run_one_scan_loop();
  636. VERIFY_AND_CLEAR(driver);
  637. }
  638. TEST_F(FlowTapTest, rolling_mt_mt_mt) {
  639. TestDriver driver;
  640. InSequence s;
  641. auto mod_tap_key1 = KeymapKey(0, 0, 0, CTL_T(KC_A));
  642. auto mod_tap_key2 = KeymapKey(0, 1, 0, GUI_T(KC_B));
  643. auto mod_tap_key3 = KeymapKey(0, 2, 0, ALT_T(KC_C));
  644. set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3});
  645. // Press mod-tap keys.
  646. EXPECT_NO_REPORT(driver);
  647. idle_for(FLOW_TAP_TERM + 1);
  648. mod_tap_key1.press();
  649. run_one_scan_loop();
  650. mod_tap_key2.press();
  651. run_one_scan_loop();
  652. mod_tap_key3.press();
  653. run_one_scan_loop();
  654. VERIFY_AND_CLEAR(driver);
  655. // Release first mod-tap key.
  656. EXPECT_REPORT(driver, (KC_A));
  657. EXPECT_REPORT(driver, (KC_A, KC_B));
  658. EXPECT_REPORT(driver, (KC_A, KC_B, KC_C));
  659. EXPECT_REPORT(driver, (KC_B, KC_C));
  660. mod_tap_key1.release();
  661. run_one_scan_loop();
  662. VERIFY_AND_CLEAR(driver);
  663. // Hold for longer than the tapping term.
  664. EXPECT_NO_REPORT(driver);
  665. idle_for(TAPPING_TERM + 1);
  666. VERIFY_AND_CLEAR(driver);
  667. // Release other mod-tap keys.
  668. EXPECT_REPORT(driver, (KC_C));
  669. EXPECT_EMPTY_REPORT(driver);
  670. mod_tap_key2.release();
  671. run_one_scan_loop();
  672. mod_tap_key3.release();
  673. run_one_scan_loop();
  674. VERIFY_AND_CLEAR(driver);
  675. }
  676. TEST_F(FlowTapTest, roll_release_132) {
  677. TestDriver driver;
  678. InSequence s;
  679. auto mod_tap_key1 = KeymapKey(0, 0, 0, CTL_T(KC_A));
  680. auto mod_tap_key2 = KeymapKey(0, 1, 0, GUI_T(KC_B));
  681. auto mod_tap_key3 = KeymapKey(0, 2, 0, ALT_T(KC_C));
  682. set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3});
  683. // Press mod-tap keys.
  684. EXPECT_NO_REPORT(driver);
  685. idle_for(FLOW_TAP_TERM + 1);
  686. mod_tap_key1.press();
  687. run_one_scan_loop();
  688. mod_tap_key2.press();
  689. idle_for(FLOW_TAP_TERM + 1);
  690. mod_tap_key3.press();
  691. run_one_scan_loop();
  692. VERIFY_AND_CLEAR(driver);
  693. // Release first mod-tap key.
  694. EXPECT_REPORT(driver, (KC_A));
  695. EXPECT_REPORT(driver, (KC_A, KC_B));
  696. EXPECT_REPORT(driver, (KC_B));
  697. mod_tap_key1.release();
  698. run_one_scan_loop();
  699. VERIFY_AND_CLEAR(driver);
  700. // Release other mod-tap keys.
  701. EXPECT_REPORT(driver, (KC_B, KC_C));
  702. EXPECT_REPORT(driver, (KC_B));
  703. EXPECT_EMPTY_REPORT(driver);
  704. mod_tap_key3.release();
  705. run_one_scan_loop();
  706. mod_tap_key2.release();
  707. run_one_scan_loop();
  708. VERIFY_AND_CLEAR(driver);
  709. }