logo

qmk_firmware

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

test_neutralization.cpp (5809B)


  1. /* Copyright 2023 Vladislav Kucheriavykh
  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 3 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 "keyboard_report_util.hpp"
  17. #include "keycode.h"
  18. #include "test_common.hpp"
  19. #include "action_tapping.h"
  20. #include "test_keymap_key.hpp"
  21. using testing::_;
  22. using testing::InSequence;
  23. class RetroTapNeutralization : public TestFixture {};
  24. TEST_F(RetroTapNeutralization, neutralize_retro_tapped_left_gui_mod_tap) {
  25. TestDriver driver;
  26. InSequence s;
  27. auto mod_tap_hold_key = KeymapKey(0, 7, 0, LGUI_T(KC_P));
  28. set_keymap({mod_tap_hold_key});
  29. EXPECT_NO_REPORT(driver);
  30. mod_tap_hold_key.press();
  31. idle_for(TAPPING_TERM);
  32. VERIFY_AND_CLEAR(driver);
  33. EXPECT_REPORT(driver, (KC_LGUI));
  34. run_one_scan_loop();
  35. VERIFY_AND_CLEAR(driver);
  36. EXPECT_REPORT(driver, (DUMMY_MOD_NEUTRALIZER_KEYCODE, KC_LGUI));
  37. EXPECT_REPORT(driver, (KC_LGUI));
  38. EXPECT_EMPTY_REPORT(driver);
  39. EXPECT_REPORT(driver, (KC_P));
  40. EXPECT_EMPTY_REPORT(driver);
  41. mod_tap_hold_key.release();
  42. run_one_scan_loop();
  43. VERIFY_AND_CLEAR(driver);
  44. }
  45. TEST_F(RetroTapNeutralization, do_not_neutralize_retro_tapped_left_shift_mod_tap) {
  46. TestDriver driver;
  47. InSequence s;
  48. auto mod_tap_hold_key = KeymapKey(0, 7, 0, LSFT_T(KC_P));
  49. set_keymap({mod_tap_hold_key});
  50. EXPECT_NO_REPORT(driver);
  51. mod_tap_hold_key.press();
  52. idle_for(TAPPING_TERM);
  53. VERIFY_AND_CLEAR(driver);
  54. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  55. run_one_scan_loop();
  56. VERIFY_AND_CLEAR(driver);
  57. EXPECT_EMPTY_REPORT(driver);
  58. EXPECT_REPORT(driver, (KC_P));
  59. EXPECT_EMPTY_REPORT(driver);
  60. mod_tap_hold_key.release();
  61. run_one_scan_loop();
  62. VERIFY_AND_CLEAR(driver);
  63. }
  64. TEST_F(RetroTapNeutralization, do_not_neutralize_retro_tapped_right_gui_mod_tap) {
  65. TestDriver driver;
  66. InSequence s;
  67. auto mod_tap_hold_key = KeymapKey(0, 7, 0, RGUI_T(KC_P));
  68. set_keymap({mod_tap_hold_key});
  69. EXPECT_NO_REPORT(driver);
  70. mod_tap_hold_key.press();
  71. idle_for(TAPPING_TERM);
  72. VERIFY_AND_CLEAR(driver);
  73. EXPECT_REPORT(driver, (KC_RGUI));
  74. run_one_scan_loop();
  75. VERIFY_AND_CLEAR(driver);
  76. EXPECT_EMPTY_REPORT(driver);
  77. EXPECT_REPORT(driver, (KC_P));
  78. EXPECT_EMPTY_REPORT(driver);
  79. mod_tap_hold_key.release();
  80. run_one_scan_loop();
  81. VERIFY_AND_CLEAR(driver);
  82. }
  83. TEST_F(RetroTapNeutralization, do_not_neutralize_retro_tapped_left_gui_shift_mod_tap) {
  84. TestDriver driver;
  85. InSequence s;
  86. auto mod_tap_hold_key = KeymapKey(0, 7, 0, MT(MOD_LGUI | MOD_LSFT, KC_P));
  87. set_keymap({mod_tap_hold_key});
  88. EXPECT_NO_REPORT(driver);
  89. mod_tap_hold_key.press();
  90. idle_for(TAPPING_TERM);
  91. VERIFY_AND_CLEAR(driver);
  92. EXPECT_REPORT(driver, (KC_LSFT, KC_LGUI));
  93. run_one_scan_loop();
  94. VERIFY_AND_CLEAR(driver);
  95. EXPECT_EMPTY_REPORT(driver);
  96. EXPECT_REPORT(driver, (KC_P));
  97. EXPECT_EMPTY_REPORT(driver);
  98. mod_tap_hold_key.release();
  99. run_one_scan_loop();
  100. VERIFY_AND_CLEAR(driver);
  101. }
  102. TEST_F(RetroTapNeutralization, do_not_neutralize_roll_of_regular_and_mod_tap_keys) {
  103. TestDriver driver;
  104. InSequence s;
  105. auto mod_tap_hold_key = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  106. auto regular_key = KeymapKey(0, 2, 0, KC_A);
  107. set_keymap({mod_tap_hold_key, regular_key});
  108. /* Press mod-tap-hold key. */
  109. EXPECT_NO_REPORT(driver);
  110. mod_tap_hold_key.press();
  111. run_one_scan_loop();
  112. VERIFY_AND_CLEAR(driver);
  113. /* Press regular key. */
  114. EXPECT_NO_REPORT(driver);
  115. regular_key.press();
  116. run_one_scan_loop();
  117. VERIFY_AND_CLEAR(driver);
  118. /* Release regular key. */
  119. EXPECT_NO_REPORT(driver);
  120. regular_key.release();
  121. run_one_scan_loop();
  122. VERIFY_AND_CLEAR(driver);
  123. /* Release mod-tap-hold key. */
  124. EXPECT_REPORT(driver, (KC_P));
  125. EXPECT_REPORT(driver, (KC_P, KC_A));
  126. EXPECT_REPORT(driver, (KC_P));
  127. EXPECT_EMPTY_REPORT(driver);
  128. mod_tap_hold_key.release();
  129. run_one_scan_loop();
  130. VERIFY_AND_CLEAR(driver);
  131. /* Idle for tapping term of mod tap hold key. */
  132. idle_for(TAPPING_TERM - 3);
  133. VERIFY_AND_CLEAR(driver);
  134. }
  135. TEST_F(RetroTapNeutralization, do_not_neutralize_tap_regular_key_while_mod_tap_is_held) {
  136. TestDriver driver;
  137. InSequence s;
  138. auto mod_tap_hold_key = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  139. auto regular_key = KeymapKey(0, 2, 0, KC_A);
  140. set_keymap({mod_tap_hold_key, regular_key});
  141. /* Press and hold mod-tap key. */
  142. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  143. mod_tap_hold_key.press();
  144. idle_for(TAPPING_TERM + 1);
  145. VERIFY_AND_CLEAR(driver);
  146. /* Press regular key. */
  147. EXPECT_REPORT(driver, (KC_A, KC_LEFT_GUI));
  148. regular_key.press();
  149. run_one_scan_loop();
  150. VERIFY_AND_CLEAR(driver);
  151. /* Release regular key. */
  152. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  153. regular_key.release();
  154. run_one_scan_loop();
  155. VERIFY_AND_CLEAR(driver);
  156. /* Release mod-tap-hold key. */
  157. EXPECT_EMPTY_REPORT(driver);
  158. mod_tap_hold_key.release();
  159. run_one_scan_loop();
  160. VERIFY_AND_CLEAR(driver);
  161. /* Idle for tapping term of mod tap hold key. */
  162. idle_for(TAPPING_TERM - 3);
  163. VERIFY_AND_CLEAR(driver);
  164. }