You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

754 lines
24 KiB

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