logo

qmk_firmware

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

test_key_roll.cpp (11949B)


  1. /* Copyright 2024 John Rigoni
  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 "keycodes.h"
  19. #include "test_common.hpp"
  20. #include "action_tapping.h"
  21. #include "test_keymap_key.hpp"
  22. using testing::_;
  23. using testing::InSequence;
  24. class RetroTapKeyRoll : public TestFixture {};
  25. TEST_F(RetroTapKeyRoll, regular_to_left_gui_mod_over_tap_term) {
  26. TestDriver driver;
  27. InSequence s;
  28. auto mod_tap_hold_key = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  29. auto regular_key = KeymapKey(0, 2, 0, KC_B);
  30. set_keymap({mod_tap_hold_key, regular_key});
  31. EXPECT_REPORT(driver, (KC_B));
  32. regular_key.press();
  33. run_one_scan_loop();
  34. VERIFY_AND_CLEAR(driver);
  35. EXPECT_NO_REPORT(driver);
  36. mod_tap_hold_key.press();
  37. idle_for(TAPPING_TERM);
  38. VERIFY_AND_CLEAR(driver);
  39. EXPECT_REPORT(driver, (KC_B, KC_LEFT_GUI));
  40. run_one_scan_loop();
  41. VERIFY_AND_CLEAR(driver);
  42. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  43. regular_key.release();
  44. run_one_scan_loop();
  45. VERIFY_AND_CLEAR(driver);
  46. EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE));
  47. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  48. EXPECT_EMPTY_REPORT(driver);
  49. EXPECT_REPORT(driver, (KC_P));
  50. EXPECT_EMPTY_REPORT(driver);
  51. mod_tap_hold_key.release();
  52. run_one_scan_loop();
  53. VERIFY_AND_CLEAR(driver);
  54. }
  55. TEST_F(RetroTapKeyRoll, regular_to_mod_over_tap_term) {
  56. TestDriver driver;
  57. InSequence s;
  58. auto mod_tap_hold_key = KeymapKey(0, 1, 0, SFT_T(KC_A));
  59. auto regular_key = KeymapKey(0, 2, 0, KC_B);
  60. set_keymap({mod_tap_hold_key, regular_key});
  61. EXPECT_REPORT(driver, (KC_B));
  62. regular_key.press();
  63. run_one_scan_loop();
  64. VERIFY_AND_CLEAR(driver);
  65. EXPECT_REPORT(driver, (KC_B, KC_LEFT_SHIFT));
  66. mod_tap_hold_key.press();
  67. idle_for(TAPPING_TERM);
  68. run_one_scan_loop();
  69. VERIFY_AND_CLEAR(driver);
  70. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  71. regular_key.release();
  72. run_one_scan_loop();
  73. VERIFY_AND_CLEAR(driver);
  74. EXPECT_EMPTY_REPORT(driver);
  75. EXPECT_REPORT(driver, (KC_A));
  76. EXPECT_EMPTY_REPORT(driver);
  77. mod_tap_hold_key.release();
  78. run_one_scan_loop();
  79. VERIFY_AND_CLEAR(driver);
  80. }
  81. TEST_F(RetroTapKeyRoll, regular_to_mod_under_tap_term) {
  82. TestDriver driver;
  83. InSequence s;
  84. auto mod_tap_hold_key = KeymapKey(0, 1, 0, SFT_T(KC_A));
  85. auto regular_key = KeymapKey(0, 2, 0, KC_B);
  86. set_keymap({mod_tap_hold_key, regular_key});
  87. EXPECT_REPORT(driver, (KC_B));
  88. regular_key.press();
  89. run_one_scan_loop();
  90. VERIFY_AND_CLEAR(driver);
  91. EXPECT_NO_REPORT(driver);
  92. mod_tap_hold_key.press();
  93. run_one_scan_loop();
  94. VERIFY_AND_CLEAR(driver);
  95. EXPECT_EMPTY_REPORT(driver);
  96. regular_key.release();
  97. run_one_scan_loop();
  98. VERIFY_AND_CLEAR(driver);
  99. EXPECT_REPORT(driver, (KC_A));
  100. EXPECT_EMPTY_REPORT(driver);
  101. mod_tap_hold_key.release();
  102. run_one_scan_loop();
  103. VERIFY_AND_CLEAR(driver);
  104. }
  105. TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_regular) {
  106. TestDriver driver;
  107. InSequence s;
  108. auto mod_tap_hold_key = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  109. auto regular_key = KeymapKey(0, 2, 0, KC_B);
  110. set_keymap({mod_tap_hold_key, regular_key});
  111. EXPECT_NO_REPORT(driver);
  112. mod_tap_hold_key.press();
  113. run_one_scan_loop();
  114. VERIFY_AND_CLEAR(driver);
  115. EXPECT_NO_REPORT(driver);
  116. regular_key.press();
  117. run_one_scan_loop();
  118. VERIFY_AND_CLEAR(driver);
  119. EXPECT_REPORT(driver, (KC_P));
  120. EXPECT_REPORT(driver, (KC_B, KC_P));
  121. EXPECT_REPORT(driver, (KC_B));
  122. mod_tap_hold_key.release();
  123. run_one_scan_loop();
  124. VERIFY_AND_CLEAR(driver);
  125. EXPECT_EMPTY_REPORT(driver);
  126. regular_key.release();
  127. run_one_scan_loop();
  128. VERIFY_AND_CLEAR(driver);
  129. }
  130. TEST_F(RetroTapKeyRoll, mod_over_tap_term_to_regular) {
  131. TestDriver driver;
  132. InSequence s;
  133. auto mod_tap_hold_key = KeymapKey(0, 1, 0, SFT_T(KC_A));
  134. auto regular_key = KeymapKey(0, 2, 0, KC_B);
  135. set_keymap({mod_tap_hold_key, regular_key});
  136. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  137. mod_tap_hold_key.press();
  138. idle_for(TAPPING_TERM);
  139. run_one_scan_loop();
  140. VERIFY_AND_CLEAR(driver);
  141. EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B));
  142. regular_key.press();
  143. run_one_scan_loop();
  144. VERIFY_AND_CLEAR(driver);
  145. EXPECT_REPORT(driver, (KC_B));
  146. mod_tap_hold_key.release();
  147. run_one_scan_loop();
  148. VERIFY_AND_CLEAR(driver);
  149. EXPECT_EMPTY_REPORT(driver);
  150. regular_key.release();
  151. run_one_scan_loop();
  152. VERIFY_AND_CLEAR(driver);
  153. }
  154. TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_mod_under_tap_term) {
  155. TestDriver driver;
  156. InSequence s;
  157. auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  158. auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A));
  159. set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft});
  160. EXPECT_NO_REPORT(driver);
  161. mod_tap_hold_lshft.press();
  162. run_one_scan_loop();
  163. VERIFY_AND_CLEAR(driver);
  164. EXPECT_NO_REPORT(driver);
  165. mod_tap_hold_gui.press();
  166. run_one_scan_loop();
  167. VERIFY_AND_CLEAR(driver);
  168. EXPECT_REPORT(driver, (KC_A));
  169. EXPECT_EMPTY_REPORT(driver);
  170. mod_tap_hold_lshft.release();
  171. run_one_scan_loop();
  172. VERIFY_AND_CLEAR(driver);
  173. EXPECT_REPORT(driver, (KC_P));
  174. EXPECT_EMPTY_REPORT(driver);
  175. mod_tap_hold_gui.release();
  176. run_one_scan_loop();
  177. VERIFY_AND_CLEAR(driver);
  178. }
  179. TEST_F(RetroTapKeyRoll, mod_over_tap_term_to_mod_under_tap_term) {
  180. TestDriver driver;
  181. InSequence s;
  182. auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  183. auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A));
  184. set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft});
  185. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  186. mod_tap_hold_lshft.press();
  187. idle_for(TAPPING_TERM);
  188. run_one_scan_loop();
  189. VERIFY_AND_CLEAR(driver);
  190. EXPECT_NO_REPORT(driver);
  191. mod_tap_hold_gui.press();
  192. run_one_scan_loop();
  193. VERIFY_AND_CLEAR(driver);
  194. EXPECT_NO_REPORT(driver);
  195. mod_tap_hold_lshft.release();
  196. run_one_scan_loop();
  197. VERIFY_AND_CLEAR(driver);
  198. EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_P));
  199. EXPECT_REPORT(driver, (KC_P));
  200. EXPECT_EMPTY_REPORT(driver);
  201. mod_tap_hold_gui.release();
  202. run_one_scan_loop();
  203. VERIFY_AND_CLEAR(driver);
  204. }
  205. TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_mod_over_tap_term) {
  206. TestDriver driver;
  207. InSequence s;
  208. auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  209. auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A));
  210. set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft});
  211. EXPECT_NO_REPORT(driver);
  212. mod_tap_hold_lshft.press();
  213. run_one_scan_loop();
  214. VERIFY_AND_CLEAR(driver);
  215. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  216. EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_GUI));
  217. mod_tap_hold_gui.press();
  218. idle_for(TAPPING_TERM);
  219. run_one_scan_loop();
  220. VERIFY_AND_CLEAR(driver);
  221. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  222. mod_tap_hold_lshft.release();
  223. run_one_scan_loop();
  224. VERIFY_AND_CLEAR(driver);
  225. EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE));
  226. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  227. EXPECT_EMPTY_REPORT(driver);
  228. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  229. EXPECT_REPORT(driver, (KC_P, KC_LEFT_SHIFT));
  230. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  231. EXPECT_EMPTY_REPORT(driver);
  232. mod_tap_hold_gui.release();
  233. run_one_scan_loop();
  234. VERIFY_AND_CLEAR(driver);
  235. }
  236. TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_mod_over_tap_term_offset) {
  237. TestDriver driver;
  238. InSequence s;
  239. auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  240. auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A));
  241. set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft});
  242. EXPECT_NO_REPORT(driver);
  243. mod_tap_hold_lshft.press();
  244. run_one_scan_loop();
  245. VERIFY_AND_CLEAR(driver);
  246. EXPECT_NO_REPORT(driver);
  247. mod_tap_hold_gui.press();
  248. run_one_scan_loop();
  249. VERIFY_AND_CLEAR(driver);
  250. EXPECT_REPORT(driver, (KC_A));
  251. EXPECT_EMPTY_REPORT(driver);
  252. mod_tap_hold_lshft.release();
  253. run_one_scan_loop();
  254. VERIFY_AND_CLEAR(driver);
  255. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  256. EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE));
  257. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  258. EXPECT_EMPTY_REPORT(driver);
  259. EXPECT_REPORT(driver, (KC_P));
  260. EXPECT_EMPTY_REPORT(driver);
  261. idle_for(TAPPING_TERM);
  262. mod_tap_hold_gui.release();
  263. run_one_scan_loop();
  264. VERIFY_AND_CLEAR(driver);
  265. }
  266. TEST_F(RetroTapKeyRoll, mod_over_tap_term_to_mod_over_tap_term) {
  267. TestDriver driver;
  268. InSequence s;
  269. auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P));
  270. auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A));
  271. set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft});
  272. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  273. mod_tap_hold_lshft.press();
  274. idle_for(TAPPING_TERM);
  275. run_one_scan_loop();
  276. VERIFY_AND_CLEAR(driver);
  277. EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_GUI));
  278. mod_tap_hold_gui.press();
  279. idle_for(TAPPING_TERM);
  280. run_one_scan_loop();
  281. VERIFY_AND_CLEAR(driver);
  282. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  283. mod_tap_hold_lshft.release();
  284. run_one_scan_loop();
  285. VERIFY_AND_CLEAR(driver);
  286. EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE));
  287. EXPECT_REPORT(driver, (KC_LEFT_GUI));
  288. EXPECT_EMPTY_REPORT(driver);
  289. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  290. EXPECT_REPORT(driver, (KC_P, KC_LEFT_SHIFT));
  291. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  292. EXPECT_EMPTY_REPORT(driver);
  293. mod_tap_hold_gui.release();
  294. run_one_scan_loop();
  295. VERIFY_AND_CLEAR(driver);
  296. }
  297. TEST_F(RetroTapKeyRoll, mod_to_mod_to_mod) {
  298. TestDriver driver;
  299. InSequence s;
  300. auto mod_tap_hold_lalt = KeymapKey(0, 1, 0, LALT_T(KC_R));
  301. auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A));
  302. auto mod_tap_hold_lctrl = KeymapKey(0, 3, 0, LCTL_T(KC_C));
  303. set_keymap({mod_tap_hold_lalt, mod_tap_hold_lshft, mod_tap_hold_lctrl});
  304. EXPECT_REPORT(driver, (KC_LEFT_ALT));
  305. mod_tap_hold_lalt.press();
  306. idle_for(TAPPING_TERM);
  307. run_one_scan_loop();
  308. VERIFY_AND_CLEAR(driver);
  309. EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_ALT));
  310. mod_tap_hold_lshft.press();
  311. idle_for(TAPPING_TERM);
  312. run_one_scan_loop();
  313. VERIFY_AND_CLEAR(driver);
  314. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  315. mod_tap_hold_lalt.release();
  316. run_one_scan_loop();
  317. VERIFY_AND_CLEAR(driver);
  318. EXPECT_REPORT(driver, (KC_LEFT_CTRL, KC_LEFT_SHIFT));
  319. EXPECT_NO_REPORT(driver);
  320. mod_tap_hold_lctrl.press();
  321. idle_for(TAPPING_TERM);
  322. run_one_scan_loop();
  323. VERIFY_AND_CLEAR(driver);
  324. EXPECT_REPORT(driver, (KC_LEFT_CTRL));
  325. mod_tap_hold_lshft.release();
  326. run_one_scan_loop();
  327. VERIFY_AND_CLEAR(driver);
  328. EXPECT_EMPTY_REPORT(driver);
  329. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  330. EXPECT_REPORT(driver, (KC_C, KC_LEFT_SHIFT));
  331. EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
  332. EXPECT_EMPTY_REPORT(driver);
  333. mod_tap_hold_lctrl.release();
  334. run_one_scan_loop();
  335. VERIFY_AND_CLEAR(driver);
  336. }