logo

qmk_firmware

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

test_quick_tap.cpp (5695B)


  1. /* Copyright 2021 Stefan Kerkmann
  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. #include "config.h"
  17. #include "keyboard_report_util.hpp"
  18. #include "keycode.h"
  19. #include "test_common.hpp"
  20. #include "action_tapping.h"
  21. #include "test_fixture.hpp"
  22. #include "test_keymap_key.hpp"
  23. using testing::_;
  24. using testing::InSequence;
  25. class QuickTap : public TestFixture {};
  26. TEST_F(QuickTap, tap_regular_key_while_layer_tap_key_is_held) {
  27. TestDriver driver;
  28. InSequence s;
  29. auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_P));
  30. auto regular_key = KeymapKey(0, 2, 0, KC_A);
  31. auto layer_key = KeymapKey(1, 2, 0, KC_B);
  32. set_keymap({layer_tap_key, regular_key, layer_key});
  33. /* Press layer-tap key */
  34. EXPECT_NO_REPORT(driver);
  35. layer_tap_key.press();
  36. run_one_scan_loop();
  37. VERIFY_AND_CLEAR(driver);
  38. /* Press regular key */
  39. EXPECT_NO_REPORT(driver);
  40. regular_key.press();
  41. run_one_scan_loop();
  42. VERIFY_AND_CLEAR(driver);
  43. /* Release regular key */
  44. EXPECT_NO_REPORT(driver);
  45. regular_key.release();
  46. run_one_scan_loop();
  47. VERIFY_AND_CLEAR(driver);
  48. /* Release layer-tap key */
  49. EXPECT_REPORT(driver, (KC_P));
  50. EXPECT_REPORT(driver, (KC_A, KC_P));
  51. EXPECT_REPORT(driver, (KC_P));
  52. EXPECT_EMPTY_REPORT(driver);
  53. layer_tap_key.release();
  54. run_one_scan_loop();
  55. VERIFY_AND_CLEAR(driver);
  56. }
  57. TEST_F(QuickTap, tap_key_and_tap_again_before_quick_tap_term) {
  58. TestDriver driver;
  59. InSequence s;
  60. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P));
  61. set_keymap({mod_tap_key});
  62. /* Press mod-tap key. */
  63. EXPECT_NO_REPORT(driver);
  64. mod_tap_key.press();
  65. run_one_scan_loop();
  66. VERIFY_AND_CLEAR(driver);
  67. /* Release mod-tap key. */
  68. EXPECT_REPORT(driver, (KC_P));
  69. EXPECT_EMPTY_REPORT(driver);
  70. mod_tap_key.release();
  71. idle_for(QUICK_TAP_TERM - 10);
  72. run_one_scan_loop();
  73. VERIFY_AND_CLEAR(driver);
  74. /* Press and tap mod-tap key again. */
  75. EXPECT_REPORT(driver, (KC_P));
  76. mod_tap_key.press();
  77. run_one_scan_loop();
  78. VERIFY_AND_CLEAR(driver);
  79. /* Release mod-tap key. */
  80. EXPECT_EMPTY_REPORT(driver);
  81. mod_tap_key.release();
  82. run_one_scan_loop();
  83. VERIFY_AND_CLEAR(driver);
  84. }
  85. TEST_F(QuickTap, tap_key_and_hold_again_before_quick_tap_term) {
  86. TestDriver driver;
  87. InSequence s;
  88. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P));
  89. set_keymap({mod_tap_key});
  90. /* Press mod-tap key. */
  91. EXPECT_NO_REPORT(driver);
  92. mod_tap_key.press();
  93. run_one_scan_loop();
  94. VERIFY_AND_CLEAR(driver);
  95. /* Release mod-tap key. */
  96. EXPECT_REPORT(driver, (KC_P));
  97. EXPECT_EMPTY_REPORT(driver);
  98. mod_tap_key.release();
  99. idle_for(QUICK_TAP_TERM - 10);
  100. VERIFY_AND_CLEAR(driver);
  101. /* Press and hold mod-tap key again. */
  102. EXPECT_REPORT(driver, (KC_P));
  103. mod_tap_key.press();
  104. run_one_scan_loop();
  105. VERIFY_AND_CLEAR(driver);
  106. /* Wait until tapping term expired */
  107. EXPECT_NO_REPORT(driver);
  108. idle_for(TAPPING_TERM);
  109. VERIFY_AND_CLEAR(driver);
  110. /* Release mod-tap key. */
  111. EXPECT_EMPTY_REPORT(driver);
  112. mod_tap_key.release();
  113. run_one_scan_loop();
  114. VERIFY_AND_CLEAR(driver);
  115. }
  116. TEST_F(QuickTap, tap_key_and_tap_again_after_quick_tap_term) {
  117. TestDriver driver;
  118. InSequence s;
  119. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P));
  120. set_keymap({mod_tap_key});
  121. /* Press mod-tap key. */
  122. EXPECT_NO_REPORT(driver);
  123. mod_tap_key.press();
  124. run_one_scan_loop();
  125. VERIFY_AND_CLEAR(driver);
  126. /* Release mod-tap key. */
  127. EXPECT_REPORT(driver, (KC_P));
  128. EXPECT_EMPTY_REPORT(driver);
  129. mod_tap_key.release();
  130. idle_for(QUICK_TAP_TERM + 10);
  131. run_one_scan_loop();
  132. VERIFY_AND_CLEAR(driver);
  133. /* Press mod-tap key again. */
  134. EXPECT_NO_REPORT(driver);
  135. mod_tap_key.press();
  136. run_one_scan_loop();
  137. VERIFY_AND_CLEAR(driver);
  138. /* Release mod-tap key. */
  139. EXPECT_REPORT(driver, (KC_P));
  140. EXPECT_EMPTY_REPORT(driver);
  141. mod_tap_key.release();
  142. run_one_scan_loop();
  143. VERIFY_AND_CLEAR(driver);
  144. }
  145. TEST_F(QuickTap, tap_key_and_hold_again_after_quick_tap_term) {
  146. TestDriver driver;
  147. InSequence s;
  148. auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P));
  149. set_keymap({mod_tap_key});
  150. /* Press mod-tap key. */
  151. EXPECT_NO_REPORT(driver);
  152. mod_tap_key.press();
  153. run_one_scan_loop();
  154. VERIFY_AND_CLEAR(driver);
  155. /* Release mod-tap key. */
  156. EXPECT_REPORT(driver, (KC_P));
  157. EXPECT_EMPTY_REPORT(driver);
  158. mod_tap_key.release();
  159. idle_for(QUICK_TAP_TERM + 10);
  160. VERIFY_AND_CLEAR(driver);
  161. /* Press and hold mod-tap key again. */
  162. EXPECT_NO_REPORT(driver);
  163. mod_tap_key.press();
  164. run_one_scan_loop();
  165. VERIFY_AND_CLEAR(driver);
  166. /* Wait until tapping term expired */
  167. EXPECT_REPORT(driver, (KC_LSFT));
  168. idle_for(TAPPING_TERM);
  169. VERIFY_AND_CLEAR(driver);
  170. /* Release mod-tap key. */
  171. EXPECT_EMPTY_REPORT(driver);
  172. mod_tap_key.release();
  173. run_one_scan_loop();
  174. VERIFY_AND_CLEAR(driver);
  175. }