test_repeat_key.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. // Copyright 2023 Google LLC
  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. #include <functional>
  16. #include "keyboard_report_util.hpp"
  17. #include "keycode.h"
  18. #include "test_common.hpp"
  19. #include "test_fixture.hpp"
  20. #include "test_keymap_key.hpp"
  21. using ::testing::AnyNumber;
  22. using ::testing::AnyOf;
  23. using ::testing::InSequence;
  24. #define FOO_MACRO SAFE_RANGE
  25. namespace {
  26. bool process_record_user_default(uint16_t keycode, keyrecord_t* record) {
  27. return true;
  28. }
  29. bool remember_last_key_user_default(uint16_t keycode, keyrecord_t* record, uint8_t* remembered_mods) {
  30. return true;
  31. }
  32. // Indirection so that process_record_user() and remember_last_key_user()
  33. // can be replaced with other functions in the test cases below.
  34. std::function<bool(uint16_t, keyrecord_t*)> process_record_user_fun = process_record_user_default;
  35. std::function<bool(uint16_t, keyrecord_t*, uint8_t*)> remember_last_key_user_fun = remember_last_key_user_default;
  36. extern "C" bool process_record_user(uint16_t keycode, keyrecord_t* record) {
  37. return process_record_user_fun(keycode, record);
  38. }
  39. extern "C" bool remember_last_key_user(uint16_t keycode, keyrecord_t* record, uint8_t* remembered_mods) {
  40. return remember_last_key_user_fun(keycode, record, remembered_mods);
  41. }
  42. class RepeatKey : public TestFixture {
  43. public:
  44. bool process_record_user_was_called_;
  45. void SetUp() override {
  46. reset_repeat_key_state();
  47. autoshift_disable();
  48. process_record_user_fun = process_record_user_default;
  49. remember_last_key_user_fun = remember_last_key_user_default;
  50. }
  51. void ExpectProcessRecordUserCalledWith(bool expected_press, uint16_t expected_keycode, int8_t expected_repeat_key_count) {
  52. process_record_user_was_called_ = false;
  53. process_record_user_fun = [=](uint16_t keycode, keyrecord_t* record) {
  54. EXPECT_EQ(record->event.pressed, expected_press);
  55. EXPECT_KEYCODE_EQ(keycode, expected_keycode);
  56. EXPECT_EQ(get_repeat_key_count(), expected_repeat_key_count);
  57. // Tests below use this to verify process_record_user() was called.
  58. process_record_user_was_called_ = true;
  59. return true;
  60. };
  61. }
  62. // Expects that the characters of `s` are sent.
  63. // NOTE: This implementation is limited to chars a-z, A-Z.
  64. void ExpectString(TestDriver& driver, const std::string& s) {
  65. InSequence seq;
  66. for (int c : s) {
  67. switch (c) {
  68. case 'a' ... 'z': { // Lowercase letter.
  69. uint16_t keycode = c - ('a' - KC_A);
  70. EXPECT_REPORT(driver, (keycode));
  71. } break;
  72. case 'A' ... 'Z': { // Capital letter = KC_LSFT + letter key.
  73. uint16_t keycode = c - ('A' - KC_A);
  74. EXPECT_REPORT(driver, (KC_LSFT, keycode));
  75. } break;
  76. }
  77. }
  78. }
  79. };
  80. // Tests that "A, Repeat, Repeat, B, Repeat" produces "aaabb".
  81. TEST_F(RepeatKey, Basic) {
  82. TestDriver driver;
  83. KeymapKey key_a(0, 0, 0, KC_A);
  84. KeymapKey key_b(0, 1, 0, KC_B);
  85. KeymapKey key_repeat(0, 2, 0, QK_REP);
  86. set_keymap({key_a, key_b, key_repeat});
  87. // Allow any number of empty reports.
  88. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  89. ExpectString(driver, "aaabb");
  90. // When KC_A is pressed, process_record_user() should be called
  91. // with a press event with keycode == KC_A and repeat_key_count() == 0.
  92. ExpectProcessRecordUserCalledWith(true, KC_A, 0);
  93. key_a.press();
  94. run_one_scan_loop();
  95. EXPECT_TRUE(process_record_user_was_called_);
  96. // After pressing A, the keycode of the key to be repeated is KC_A.
  97. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A);
  98. EXPECT_EQ(get_last_mods(), 0);
  99. // Expect the corresponding release event when A is released.
  100. ExpectProcessRecordUserCalledWith(false, KC_A, 0);
  101. key_a.release();
  102. run_one_scan_loop();
  103. for (int n = 1; n <= 2; ++n) { // Tap the Repeat Key twice.
  104. // When Repeat is pressed, process_record_user() should be called with a
  105. // press event with keycode == KC_A and repeat_key_count() == n.
  106. ExpectProcessRecordUserCalledWith(true, KC_A, n);
  107. key_repeat.press(); // Press the Repeat Key.
  108. run_one_scan_loop();
  109. EXPECT_TRUE(process_record_user_was_called_);
  110. // Expect the corresponding release event.
  111. ExpectProcessRecordUserCalledWith(false, KC_A, n);
  112. key_repeat.release(); // Release the Repeat Key.
  113. run_one_scan_loop();
  114. EXPECT_TRUE(process_record_user_was_called_);
  115. }
  116. process_record_user_fun = process_record_user_default;
  117. tap_key(key_b);
  118. // Then after tapping key_b, the keycode to be repeated becomes KC_B.
  119. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_B);
  120. tap_key(key_repeat);
  121. testing::Mock::VerifyAndClearExpectations(&driver);
  122. }
  123. // Tests repeating a macro. The keycode FOO_MACRO sends "foo" when pressed. The
  124. // test taps "FOO_MACRO, Repeat, Repeat", producing "foofoofoo".
  125. TEST_F(RepeatKey, Macro) {
  126. TestDriver driver;
  127. KeymapKey key_foo(0, 0, 0, FOO_MACRO);
  128. KeymapKey key_repeat(0, 1, 0, QK_REP);
  129. set_keymap({key_foo, key_repeat});
  130. // Define process_record_user() to handle FOO_MACRO.
  131. process_record_user_fun = [](uint16_t keycode, keyrecord_t* record) {
  132. switch (keycode) {
  133. case FOO_MACRO:
  134. if (record->event.pressed) {
  135. SEND_STRING("foo");
  136. }
  137. break;
  138. }
  139. return true;
  140. };
  141. // Allow any number of empty reports.
  142. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  143. ExpectString(driver, "foofoofoo");
  144. tap_key(key_foo);
  145. EXPECT_KEYCODE_EQ(get_last_keycode(), FOO_MACRO);
  146. tap_keys(key_repeat, key_repeat);
  147. testing::Mock::VerifyAndClearExpectations(&driver);
  148. }
  149. // Tests a macro with customized repeat behavior: "foo" is sent normally, "bar"
  150. // on the first repeat, and "baz" on subsequent repeats. The test taps
  151. // "FOO_MACRO, Repeat, Repeat, FOO_MACRO, Repeat", producing "foobarbazfoobar".
  152. TEST_F(RepeatKey, MacroCustomRepeat) {
  153. TestDriver driver;
  154. KeymapKey key_foo(0, 0, 0, FOO_MACRO);
  155. KeymapKey key_repeat(0, 1, 0, QK_REP);
  156. set_keymap({key_foo, key_repeat});
  157. process_record_user_fun = [](uint16_t keycode, keyrecord_t* record) {
  158. switch (keycode) {
  159. case FOO_MACRO:
  160. if (record->event.pressed) {
  161. switch (get_repeat_key_count()) {
  162. case 0: // When pressed normally.
  163. SEND_STRING("foo");
  164. break;
  165. case 1: // On first repeat.
  166. SEND_STRING("bar");
  167. break;
  168. default: // On subsequent repeats.
  169. SEND_STRING("baz");
  170. break;
  171. }
  172. }
  173. break;
  174. }
  175. return true;
  176. };
  177. // Allow any number of empty reports.
  178. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  179. ExpectString(driver, "foobarbazfoobar");
  180. tap_key(key_foo);
  181. EXPECT_KEYCODE_EQ(get_last_keycode(), FOO_MACRO);
  182. tap_keys(key_repeat, key_repeat, key_foo, key_repeat);
  183. testing::Mock::VerifyAndClearExpectations(&driver);
  184. }
  185. // Tests repeating keys on different layers. A 2-layer keymap is defined:
  186. // Layer 0: QK_REP , MO(1) , KC_A
  187. // Layer 1: KC_TRNS, KC_TRNS, KC_B
  188. // The test does the following, which should produce "bbbaaa":
  189. // 1. Hold MO(1), switching to layer 1.
  190. // 2. Tap KC_B on layer 1.
  191. // 3. Release MO(1), switching back to layer 0.
  192. // 4. Tap Repeat twice.
  193. // 5. Tap KC_A on layer 0.
  194. // 6. Hold MO(1), switching to layer 1.
  195. // 7. Tap Repeat twice.
  196. TEST_F(RepeatKey, AcrossLayers) {
  197. TestDriver driver;
  198. KeymapKey key_repeat(0, 0, 0, QK_REP);
  199. KeymapKey key_mo_1(0, 1, 0, MO(1));
  200. KeymapKey regular_key(0, 2, 0, KC_A);
  201. set_keymap({// Layer 0.
  202. key_repeat, key_mo_1, regular_key,
  203. // Layer 1.
  204. KeymapKey{1, 0, 0, KC_TRNS}, KeymapKey{1, 1, 0, KC_TRNS}, KeymapKey{1, 2, 0, KC_B}});
  205. // Allow any number of empty reports.
  206. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  207. ExpectString(driver, "bbbaaa");
  208. key_mo_1.press(); // Hold the MO(1) layer key.
  209. run_one_scan_loop();
  210. tap_key(regular_key); // Taps the KC_B key on layer 1.
  211. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_B);
  212. key_mo_1.release(); // Release the layer key.
  213. run_one_scan_loop();
  214. tap_keys(key_repeat, key_repeat);
  215. tap_key(regular_key); // Taps the KC_A key on layer 0.
  216. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A);
  217. key_mo_1.press(); // Hold the layer key.
  218. run_one_scan_loop();
  219. tap_keys(key_repeat, key_repeat);
  220. testing::Mock::VerifyAndClearExpectations(&driver);
  221. }
  222. // Tests "A(down), Repeat(down), A(up), Repeat(up), Repeat" produces "aaa".
  223. TEST_F(RepeatKey, RollingToRepeat) {
  224. TestDriver driver;
  225. KeymapKey key_a(0, 0, 0, KC_A);
  226. KeymapKey key_repeat(0, 1, 0, QK_REP);
  227. set_keymap({key_a, key_repeat});
  228. {
  229. InSequence seq;
  230. EXPECT_REPORT(driver, (KC_A));
  231. EXPECT_EMPTY_REPORT(driver);
  232. EXPECT_REPORT(driver, (KC_A));
  233. EXPECT_EMPTY_REPORT(driver);
  234. EXPECT_REPORT(driver, (KC_A));
  235. EXPECT_EMPTY_REPORT(driver);
  236. }
  237. // Perform a rolled press from A to Repeat.
  238. ExpectProcessRecordUserCalledWith(true, KC_A, 0);
  239. key_a.press();
  240. run_one_scan_loop();
  241. EXPECT_TRUE(process_record_user_was_called_);
  242. ExpectProcessRecordUserCalledWith(true, KC_A, 1);
  243. key_repeat.press(); // Press the Repeat Key.
  244. run_one_scan_loop();
  245. EXPECT_TRUE(process_record_user_was_called_);
  246. ExpectProcessRecordUserCalledWith(false, KC_A, 0);
  247. key_a.release();
  248. run_one_scan_loop();
  249. EXPECT_TRUE(process_record_user_was_called_);
  250. ExpectProcessRecordUserCalledWith(false, KC_A, 1);
  251. key_repeat.release(); // Release the Repeat Key.
  252. run_one_scan_loop();
  253. EXPECT_TRUE(process_record_user_was_called_);
  254. process_record_user_fun = process_record_user_default;
  255. tap_key(key_repeat);
  256. testing::Mock::VerifyAndClearExpectations(&driver);
  257. }
  258. // Tests "A, Repeat(down), B(down), Repeat(up), B(up), Repeat" produces "aabb".
  259. TEST_F(RepeatKey, RollingFromRepeat) {
  260. TestDriver driver;
  261. KeymapKey key_a(0, 0, 0, KC_A);
  262. KeymapKey key_b(0, 1, 0, KC_B);
  263. KeymapKey key_repeat(0, 2, 0, QK_REP);
  264. set_keymap({key_a, key_b, key_repeat});
  265. {
  266. InSequence seq;
  267. EXPECT_REPORT(driver, (KC_A));
  268. EXPECT_EMPTY_REPORT(driver);
  269. EXPECT_REPORT(driver, (KC_A));
  270. EXPECT_REPORT(driver, (KC_A, KC_B));
  271. EXPECT_REPORT(driver, (KC_B));
  272. EXPECT_EMPTY_REPORT(driver);
  273. EXPECT_REPORT(driver, (KC_B));
  274. EXPECT_EMPTY_REPORT(driver);
  275. }
  276. tap_key(key_a);
  277. // Perform a rolled press from Repeat to B.
  278. ExpectProcessRecordUserCalledWith(true, KC_A, 1);
  279. key_repeat.press(); // Press the Repeat Key.
  280. run_one_scan_loop();
  281. EXPECT_TRUE(process_record_user_was_called_);
  282. ExpectProcessRecordUserCalledWith(true, KC_B, 0);
  283. key_b.press();
  284. run_one_scan_loop();
  285. EXPECT_TRUE(process_record_user_was_called_);
  286. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_B);
  287. ExpectProcessRecordUserCalledWith(false, KC_A, 1);
  288. key_repeat.release(); // Release the Repeat Key.
  289. run_one_scan_loop();
  290. EXPECT_TRUE(process_record_user_was_called_);
  291. ExpectProcessRecordUserCalledWith(false, KC_B, 0);
  292. key_b.release();
  293. run_one_scan_loop();
  294. EXPECT_TRUE(process_record_user_was_called_);
  295. process_record_user_fun = process_record_user_default;
  296. tap_key(key_repeat);
  297. testing::Mock::VerifyAndClearExpectations(&driver);
  298. }
  299. // Tests Repeat Key with a modifier, types "AltGr+C, Repeat, Repeat, C".
  300. TEST_F(RepeatKey, RecallMods) {
  301. TestDriver driver;
  302. KeymapKey key_c(0, 0, 0, KC_C);
  303. KeymapKey key_altgr(0, 1, 0, KC_RALT);
  304. KeymapKey key_repeat(0, 2, 0, QK_REP);
  305. set_keymap({key_c, key_altgr, key_repeat});
  306. // Allow any number of reports with no keys or only KC_RALT.
  307. // clang-format off
  308. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  309. KeyboardReport(),
  310. KeyboardReport(KC_RALT))))
  311. .Times(AnyNumber());
  312. // clang-format on
  313. { // Expect: "AltGr+C, AltGr+C, AltGr+C, C".
  314. InSequence seq;
  315. EXPECT_REPORT(driver, (KC_RALT, KC_C));
  316. EXPECT_REPORT(driver, (KC_RALT, KC_C));
  317. EXPECT_REPORT(driver, (KC_RALT, KC_C));
  318. EXPECT_REPORT(driver, (KC_C));
  319. }
  320. key_altgr.press();
  321. run_one_scan_loop();
  322. tap_key(key_c);
  323. key_altgr.release();
  324. run_one_scan_loop();
  325. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_C);
  326. EXPECT_EQ(get_last_mods(), MOD_BIT(KC_RALT));
  327. tap_keys(key_repeat, key_repeat, key_c);
  328. testing::Mock::VerifyAndClearExpectations(&driver);
  329. }
  330. // Tests that Repeat Key stacks mods, types
  331. // "Ctrl+Left, Repeat, Shift+Repeat, Shift+Repeat, Repeat, Left".
  332. TEST_F(RepeatKey, StackMods) {
  333. TestDriver driver;
  334. KeymapKey key_left(0, 0, 0, KC_LEFT);
  335. KeymapKey key_shift(0, 1, 0, KC_LSFT);
  336. KeymapKey key_ctrl(0, 2, 0, KC_LCTL);
  337. KeymapKey key_repeat(0, 3, 0, QK_REP);
  338. set_keymap({key_left, key_shift, key_ctrl, key_repeat});
  339. // Allow any number of reports with no keys or only mods.
  340. // clang-format off
  341. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  342. KeyboardReport(),
  343. KeyboardReport(KC_LCTL),
  344. KeyboardReport(KC_LSFT),
  345. KeyboardReport(KC_LCTL, KC_LSFT))))
  346. .Times(AnyNumber());
  347. // clang-format on
  348. { // Expect: "Ctrl+Left, Ctrl+Shift+Left".
  349. InSequence seq;
  350. EXPECT_REPORT(driver, (KC_LCTL, KC_LEFT));
  351. EXPECT_REPORT(driver, (KC_LCTL, KC_LEFT));
  352. EXPECT_REPORT(driver, (KC_LCTL, KC_LSFT, KC_LEFT));
  353. EXPECT_REPORT(driver, (KC_LCTL, KC_LSFT, KC_LEFT));
  354. EXPECT_REPORT(driver, (KC_LCTL, KC_LEFT));
  355. EXPECT_REPORT(driver, (KC_LEFT));
  356. }
  357. key_ctrl.press();
  358. run_one_scan_loop();
  359. tap_key(key_left);
  360. run_one_scan_loop();
  361. key_ctrl.release();
  362. run_one_scan_loop();
  363. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_LEFT);
  364. EXPECT_EQ(get_last_mods(), MOD_BIT(KC_LCTL));
  365. tap_key(key_repeat);
  366. key_shift.press();
  367. run_one_scan_loop();
  368. tap_keys(key_repeat, key_repeat);
  369. key_shift.release();
  370. run_one_scan_loop();
  371. EXPECT_EQ(get_last_mods(), MOD_BIT(KC_LCTL));
  372. tap_keys(key_repeat, key_left);
  373. testing::Mock::VerifyAndClearExpectations(&driver);
  374. }
  375. // Types: "S(KC_1), Repeat, Ctrl+Repeat, Ctrl+Repeat, Repeat, KC_2".
  376. TEST_F(RepeatKey, ShiftedKeycode) {
  377. TestDriver driver;
  378. KeymapKey key_exlm(0, 0, 0, S(KC_1));
  379. KeymapKey key_2(0, 1, 0, KC_2);
  380. KeymapKey key_ctrl(0, 2, 0, KC_LCTL);
  381. KeymapKey key_repeat(0, 3, 0, QK_REP);
  382. set_keymap({key_exlm, key_2, key_ctrl, key_repeat});
  383. // Allow any number of reports with no keys or only mods.
  384. // clang-format off
  385. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  386. KeyboardReport(),
  387. KeyboardReport(KC_LCTL),
  388. KeyboardReport(KC_LSFT),
  389. KeyboardReport(KC_LCTL, KC_LSFT))))
  390. .Times(AnyNumber());
  391. // clang-format on
  392. { // Expect: "Shift+1, Shift+1, Ctrl+Shift+1, Ctrl+Shift+1, Shift+1, 2".
  393. InSequence seq;
  394. EXPECT_REPORT(driver, (KC_LSFT, KC_1));
  395. EXPECT_REPORT(driver, (KC_LSFT, KC_1));
  396. EXPECT_REPORT(driver, (KC_LCTL, KC_LSFT, KC_1));
  397. EXPECT_REPORT(driver, (KC_LCTL, KC_LSFT, KC_1));
  398. EXPECT_REPORT(driver, (KC_LSFT, KC_1));
  399. EXPECT_REPORT(driver, (KC_2));
  400. }
  401. tap_key(key_exlm);
  402. EXPECT_KEYCODE_EQ(get_last_keycode(), S(KC_1));
  403. tap_key(key_repeat);
  404. key_ctrl.press();
  405. run_one_scan_loop();
  406. tap_keys(key_repeat, key_repeat);
  407. key_ctrl.release();
  408. run_one_scan_loop();
  409. tap_keys(key_repeat, key_2);
  410. testing::Mock::VerifyAndClearExpectations(&driver);
  411. }
  412. // Tests Repeat Key with a one-shot Shift, types
  413. // "A, OSM(MOD_LSFT), Repeat, Repeat".
  414. TEST_F(RepeatKey, WithOneShotShift) {
  415. TestDriver driver;
  416. KeymapKey key_a(0, 0, 0, KC_A);
  417. KeymapKey key_oneshot_shift(0, 1, 0, OSM(MOD_LSFT));
  418. KeymapKey key_repeat(0, 2, 0, QK_REP);
  419. set_keymap({key_a, key_oneshot_shift, key_repeat});
  420. // Allow any number of reports with no keys or only KC_RALT.
  421. // clang-format off
  422. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  423. KeyboardReport(),
  424. KeyboardReport(KC_LSFT))))
  425. .Times(AnyNumber());
  426. // clang-format on
  427. ExpectString(driver, "aAa");
  428. tap_keys(key_a, key_oneshot_shift, key_repeat, key_repeat);
  429. testing::Mock::VerifyAndClearExpectations(&driver);
  430. }
  431. // Tests Repeat Key with a mod-tap key, types
  432. // "A, Repeat, Repeat, A(down), Repeat, Repeat, A(up), Repeat".
  433. TEST_F(RepeatKey, ModTap) {
  434. TestDriver driver;
  435. KeymapKey key_mt_a(0, 0, 0, LSFT_T(KC_A));
  436. KeymapKey key_repeat(0, 1, 0, QK_REP);
  437. set_keymap({key_mt_a, key_repeat});
  438. // Allow any number of reports with no keys or only KC_LSFT.
  439. // clang-format off
  440. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  441. KeyboardReport(),
  442. KeyboardReport(KC_LSFT))))
  443. .Times(AnyNumber());
  444. // clang-format on
  445. ExpectString(driver, "aaaAAa");
  446. tap_key(key_mt_a);
  447. EXPECT_KEYCODE_EQ(get_last_keycode(), LSFT_T(KC_A));
  448. tap_keys(key_repeat, key_repeat);
  449. key_mt_a.press();
  450. run_one_scan_loop();
  451. tap_key(key_repeat, TAPPING_TERM + 1);
  452. tap_key(key_repeat);
  453. key_mt_a.release();
  454. run_one_scan_loop();
  455. tap_key(key_repeat);
  456. testing::Mock::VerifyAndClearExpectations(&driver);
  457. }
  458. // Tests with Auto Shift. When repeating an autoshiftable key, it does not
  459. // matter how long the original key was held, rather, quickly tapping vs.
  460. // long-pressing the Repeat Key determines whether the shifted key is repeated.
  461. //
  462. // The test does the following, which should produce "aaABbB":
  463. // 1. Tap KC_A quickly.
  464. // 2. Tap Repeat Key quickly.
  465. // 3. Long-press Repeat Key.
  466. // 4. Long-press KC_B.
  467. // 5. Tap Repeat Key quickly.
  468. // 6. Long-press Repeat Key.
  469. TEST_F(RepeatKey, AutoShift) {
  470. TestDriver driver;
  471. KeymapKey key_a(0, 0, 0, KC_A);
  472. KeymapKey key_b(0, 1, 0, KC_B);
  473. KeymapKey key_repeat(0, 2, 0, QK_REP);
  474. set_keymap({key_a, key_b, key_repeat});
  475. autoshift_enable();
  476. // Allow any number of reports with no keys or only KC_LSFT.
  477. // clang-format off
  478. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  479. KeyboardReport(),
  480. KeyboardReport(KC_LSFT))))
  481. .Times(AnyNumber());
  482. // clang-format on
  483. ExpectString(driver, "aaABbB");
  484. tap_key(key_a); // Tap A quickly.
  485. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A);
  486. EXPECT_EQ(get_last_mods(), 0);
  487. tap_key(key_repeat);
  488. tap_key(key_repeat, AUTO_SHIFT_TIMEOUT + 1);
  489. tap_key(key_b, AUTO_SHIFT_TIMEOUT + 1); // Long press B.
  490. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_B);
  491. EXPECT_EQ(get_last_mods(), 0);
  492. tap_key(key_repeat);
  493. tap_key(key_repeat, AUTO_SHIFT_TIMEOUT + 1);
  494. testing::Mock::VerifyAndClearExpectations(&driver);
  495. }
  496. // Defines `remember_last_key_user()` to forget the Shift mod and types:
  497. // "Ctrl+A, Repeat, Shift+A, Repeat, Shift+Repeat".
  498. TEST_F(RepeatKey, FilterRememberedMods) {
  499. TestDriver driver;
  500. KeymapKey key_a(0, 0, 0, KC_A);
  501. KeymapKey key_ctrl(0, 1, 0, KC_LCTL);
  502. KeymapKey key_shift(0, 2, 0, KC_LSFT);
  503. KeymapKey key_repeat(0, 3, 0, QK_REP);
  504. set_keymap({key_a, key_ctrl, key_shift, key_repeat});
  505. remember_last_key_user_fun = [](uint16_t keycode, keyrecord_t* record, uint8_t* remembered_mods) {
  506. *remembered_mods &= ~MOD_MASK_SHIFT;
  507. return true;
  508. };
  509. // Allow any number of reports with no keys or only mods.
  510. // clang-format off
  511. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  512. KeyboardReport(),
  513. KeyboardReport(KC_LCTL),
  514. KeyboardReport(KC_LSFT),
  515. KeyboardReport(KC_LCTL, KC_LSFT))))
  516. .Times(AnyNumber());
  517. // clang-format on
  518. { // Expect: "Ctrl+A, Ctrl+A, Shift+A, A, Shift+A".
  519. InSequence seq;
  520. EXPECT_REPORT(driver, (KC_LCTL, KC_A));
  521. EXPECT_REPORT(driver, (KC_LCTL, KC_A));
  522. EXPECT_REPORT(driver, (KC_LSFT, KC_A));
  523. EXPECT_REPORT(driver, (KC_A));
  524. EXPECT_REPORT(driver, (KC_LSFT, KC_A));
  525. }
  526. key_ctrl.press();
  527. run_one_scan_loop();
  528. tap_key(key_a);
  529. EXPECT_EQ(get_last_mods(), MOD_BIT(KC_LCTL));
  530. key_ctrl.release();
  531. run_one_scan_loop();
  532. tap_key(key_repeat);
  533. key_shift.press();
  534. run_one_scan_loop();
  535. tap_key(key_a);
  536. EXPECT_EQ(get_last_mods(), 0); // Shift should be forgotten.
  537. key_shift.release();
  538. run_one_scan_loop();
  539. tap_key(key_repeat);
  540. key_shift.press();
  541. run_one_scan_loop();
  542. tap_key(key_repeat);
  543. key_shift.release();
  544. run_one_scan_loop();
  545. testing::Mock::VerifyAndClearExpectations(&driver);
  546. }
  547. // Tests set_last_keycode() and set_last_mods().
  548. TEST_F(RepeatKey, SetRepeatKeyKeycode) {
  549. TestDriver driver;
  550. KeymapKey key_repeat(0, 0, 0, QK_REP);
  551. set_keymap({key_repeat});
  552. // Allow any number of reports with no keys or only KC_LSFT.
  553. // clang-format off
  554. EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
  555. KeyboardReport(),
  556. KeyboardReport(KC_LSFT))))
  557. .Times(AnyNumber());
  558. // clang-format on
  559. ExpectString(driver, "aaBB");
  560. set_last_keycode(KC_A);
  561. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A);
  562. for (int n = 1; n <= 2; ++n) { // Tap the Repeat Key twice.
  563. // When Repeat is pressed, process_record_user() should be called with a
  564. // press event with keycode == KC_A and repeat_key_count() == n.
  565. ExpectProcessRecordUserCalledWith(true, KC_A, n);
  566. key_repeat.press(); // Press the Repeat Key.
  567. run_one_scan_loop();
  568. EXPECT_TRUE(process_record_user_was_called_);
  569. // Expect the corresponding release event.
  570. ExpectProcessRecordUserCalledWith(false, KC_A, n);
  571. key_repeat.release(); // Release the Repeat Key.
  572. run_one_scan_loop();
  573. EXPECT_TRUE(process_record_user_was_called_);
  574. }
  575. process_record_user_fun = process_record_user_default;
  576. set_last_keycode(KC_B);
  577. set_last_mods(MOD_BIT(KC_LSFT));
  578. tap_keys(key_repeat, key_repeat);
  579. set_last_keycode(KC_NO);
  580. tap_keys(key_repeat, key_repeat); // Has no effect.
  581. testing::Mock::VerifyAndClearExpectations(&driver);
  582. }
  583. // Tests the `repeat_key_invoke()` function.
  584. TEST_F(RepeatKey, RepeatKeyInvoke) {
  585. TestDriver driver;
  586. KeymapKey key_s(0, 0, 0, KC_S);
  587. set_keymap({key_s});
  588. // Allow any number of empty reports.
  589. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  590. ExpectString(driver, "ss");
  591. tap_key(key_s);
  592. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_S);
  593. // Calling repeat_key_invoke() should result in process_record_user()
  594. // getting a press event with keycode KC_S.
  595. ExpectProcessRecordUserCalledWith(true, KC_S, 1);
  596. keyevent_t event;
  597. event.key = {0, 0};
  598. event.pressed = true;
  599. event.time = timer_read();
  600. event.type = KEY_EVENT;
  601. repeat_key_invoke(&event);
  602. run_one_scan_loop();
  603. EXPECT_TRUE(process_record_user_was_called_);
  604. // Make the release event.
  605. ExpectProcessRecordUserCalledWith(false, KC_S, 1);
  606. event.pressed = false;
  607. event.time = timer_read();
  608. repeat_key_invoke(&event);
  609. run_one_scan_loop();
  610. EXPECT_TRUE(process_record_user_was_called_);
  611. testing::Mock::VerifyAndClearExpectations(&driver);
  612. }
  613. // Check that mods and Layer Lock are not remembered.
  614. TEST_F(RepeatKey, IgnoredKeys) {
  615. TestDriver driver;
  616. KeymapKey regular_key(0, 0, 0, KC_A);
  617. KeymapKey key_repeat(0, 1, 0, QK_REP);
  618. KeymapKey key_lsft(0, 2, 0, KC_LSFT);
  619. KeymapKey key_lctl(0, 3, 0, KC_LCTL);
  620. KeymapKey key_llck(0, 4, 0, QK_LAYER_LOCK);
  621. set_keymap({regular_key, key_repeat, key_lsft, key_lctl, key_llck});
  622. // Allow any number of empty reports.
  623. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  624. {
  625. InSequence seq;
  626. EXPECT_REPORT(driver, (KC_A));
  627. EXPECT_REPORT(driver, (KC_LSFT));
  628. EXPECT_REPORT(driver, (KC_LCTL));
  629. EXPECT_REPORT(driver, (KC_A));
  630. EXPECT_REPORT(driver, (KC_A));
  631. }
  632. tap_key(regular_key); // Taps the KC_A key.
  633. // Tap Shift, Ctrl, and Layer Lock keys, which should not be remembered.
  634. tap_keys(key_lsft, key_lctl, key_llck);
  635. EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A);
  636. // Tapping the Repeat Key should still reproduce KC_A.
  637. tap_keys(key_repeat, key_repeat);
  638. testing::Mock::VerifyAndClearExpectations(&driver);
  639. }
  640. // Check that on fresh boot, repeat press, another key, repeat release doesn't hang
  641. TEST_F(RepeatKey, RepeatKeyHeldAfterBoot) {
  642. TestDriver driver;
  643. KeymapKey key_a(0, 1, 0, KC_A);
  644. KeymapKey key_repeat(0, 2, 0, QK_REP);
  645. set_keymap({key_a, key_repeat});
  646. EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
  647. ExpectString(driver, "a");
  648. // Press and hold repeat key, then press and release 'a' key, then release repeat key
  649. key_repeat.press();
  650. run_one_scan_loop();
  651. key_a.press();
  652. run_one_scan_loop();
  653. key_a.release();
  654. run_one_scan_loop();
  655. key_repeat.release();
  656. run_one_scan_loop();
  657. testing::Mock::VerifyAndClearExpectations(&driver);
  658. }
  659. } // namespace