logo

qmk_firmware

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

test_one_shot_keys.cpp (19681B)


  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 "action_util.h"
  17. #include "keyboard_report_util.hpp"
  18. #include "test_common.hpp"
  19. using testing::_;
  20. using testing::InSequence;
  21. class OneShot : public TestFixture {};
  22. class OneShotParametrizedTestFixture : public ::testing::WithParamInterface<std::pair<KeymapKey, KeymapKey>>, public OneShot {};
  23. TEST_F(OneShot, OSMWithoutAdditionalKeypressDoesNothing) {
  24. TestDriver driver;
  25. auto osm_key = KeymapKey(0, 0, 0, OSM(MOD_LSFT), KC_LSFT);
  26. set_keymap({osm_key});
  27. /* Press and release OSM key*/
  28. EXPECT_NO_REPORT(driver);
  29. tap_key(osm_key);
  30. VERIFY_AND_CLEAR(driver);
  31. /* OSM are added when an actual report is send */
  32. EXPECT_REPORT(driver, (osm_key.report_code));
  33. send_keyboard_report();
  34. VERIFY_AND_CLEAR(driver);
  35. /* Make unit-test pass */
  36. clear_oneshot_mods();
  37. }
  38. #if defined(ONESHOT_TIMEOUT)
  39. TEST_P(OneShotParametrizedTestFixture, OSMExpiredDoesNothing) {
  40. TestDriver driver;
  41. KeymapKey osm_key = GetParam().first;
  42. KeymapKey regular_key = GetParam().second;
  43. set_keymap({osm_key, regular_key});
  44. /* Press and release OSM */
  45. EXPECT_NO_REPORT(driver);
  46. osm_key.press();
  47. run_one_scan_loop();
  48. osm_key.release();
  49. idle_for(ONESHOT_TIMEOUT);
  50. VERIFY_AND_CLEAR(driver);
  51. /* Press regular key */
  52. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  53. regular_key.press();
  54. run_one_scan_loop();
  55. VERIFY_AND_CLEAR(driver);
  56. /* Release regular key */
  57. EXPECT_EMPTY_REPORT(driver);
  58. regular_key.release();
  59. run_one_scan_loop();
  60. VERIFY_AND_CLEAR(driver);
  61. }
  62. #endif
  63. TEST_P(OneShotParametrizedTestFixture, OSMWithAdditionalKeypress) {
  64. TestDriver driver;
  65. KeymapKey osm_key = GetParam().first;
  66. KeymapKey regular_key = GetParam().second;
  67. set_keymap({osm_key, regular_key});
  68. /* Press and release OSM */
  69. EXPECT_NO_REPORT(driver);
  70. tap_key(osm_key);
  71. VERIFY_AND_CLEAR(driver);
  72. /* Press regular key */
  73. EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)).Times(1);
  74. regular_key.press();
  75. run_one_scan_loop();
  76. VERIFY_AND_CLEAR(driver);
  77. /* Release regular key */
  78. EXPECT_EMPTY_REPORT(driver);
  79. regular_key.release();
  80. run_one_scan_loop();
  81. VERIFY_AND_CLEAR(driver);
  82. }
  83. TEST_P(OneShotParametrizedTestFixture, OSMAsRegularModifierWithAdditionalKeypress) {
  84. TestDriver driver;
  85. testing::InSequence s;
  86. KeymapKey osm_key = GetParam().first;
  87. KeymapKey regular_key = GetParam().second;
  88. set_keymap({osm_key, regular_key});
  89. /* Press OSM */
  90. EXPECT_NO_REPORT(driver);
  91. osm_key.press();
  92. run_one_scan_loop();
  93. VERIFY_AND_CLEAR(driver);
  94. /* Press regular key */
  95. EXPECT_NO_REPORT(driver);
  96. regular_key.press();
  97. run_one_scan_loop();
  98. VERIFY_AND_CLEAR(driver);
  99. /* Release regular key */
  100. EXPECT_NO_REPORT(driver);
  101. regular_key.release();
  102. run_one_scan_loop();
  103. VERIFY_AND_CLEAR(driver);
  104. /* Release OSM */
  105. EXPECT_REPORT(driver, (regular_key.report_code, osm_key.report_code)).Times(1);
  106. EXPECT_EMPTY_REPORT(driver);
  107. osm_key.release();
  108. run_one_scan_loop();
  109. VERIFY_AND_CLEAR(driver);
  110. }
  111. // clang-format off
  112. INSTANTIATE_TEST_CASE_P(
  113. OneShotModifierTests,
  114. OneShotParametrizedTestFixture,
  115. ::testing::Values(
  116. /* first is osm key, second is regular key. */
  117. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT}, KeymapKey{0, 1, 1, KC_A}),
  118. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LCTL), KC_LCTL}, KeymapKey{0, 1, 1, KC_A}),
  119. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LALT), KC_LALT}, KeymapKey{0, 1, 1, KC_A}),
  120. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LGUI), KC_LGUI}, KeymapKey{0, 1, 1, KC_A}),
  121. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RCTL), KC_RCTL}, KeymapKey{0, 1, 1, KC_A}),
  122. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RSFT), KC_RSFT}, KeymapKey{0, 1, 1, KC_A}),
  123. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RALT), KC_RALT}, KeymapKey{0, 1, 1, KC_A}),
  124. std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RGUI), KC_RGUI}, KeymapKey{0, 1, 1, KC_A})
  125. ));
  126. // clang-format on
  127. TEST_F(OneShot, OSMChainingTwoOSMs) {
  128. TestDriver driver;
  129. InSequence s;
  130. KeymapKey osm_key1 = KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT};
  131. KeymapKey osm_key2 = KeymapKey{0, 0, 1, OSM(MOD_LCTL), KC_LCTL};
  132. KeymapKey regular_key = KeymapKey{0, 1, 0, KC_A};
  133. set_keymap({osm_key1, osm_key2, regular_key});
  134. /* Press and release OSM1 */
  135. EXPECT_NO_REPORT(driver);
  136. tap_key(osm_key1);
  137. VERIFY_AND_CLEAR(driver);
  138. /* Press and release OSM2 */
  139. EXPECT_NO_REPORT(driver);
  140. tap_key(osm_key2);
  141. VERIFY_AND_CLEAR(driver);
  142. /* Press regular key */
  143. EXPECT_REPORT(driver, (osm_key1.report_code, osm_key2.report_code, regular_key.report_code)).Times(1);
  144. regular_key.press();
  145. run_one_scan_loop();
  146. VERIFY_AND_CLEAR(driver);
  147. /* Release regular key */
  148. EXPECT_EMPTY_REPORT(driver);
  149. regular_key.release();
  150. run_one_scan_loop();
  151. VERIFY_AND_CLEAR(driver);
  152. }
  153. TEST_F(OneShot, OSMDoubleTapNotLockingOSMs) {
  154. TestDriver driver;
  155. InSequence s;
  156. KeymapKey osm_key1 = KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT};
  157. KeymapKey osm_key2 = KeymapKey{0, 0, 1, OSM(MOD_LCTL), KC_LCTL};
  158. KeymapKey regular_key = KeymapKey{0, 1, 0, KC_A};
  159. set_keymap({osm_key1, osm_key2, regular_key});
  160. /* Press and release OSM1 */
  161. EXPECT_NO_REPORT(driver);
  162. tap_key(osm_key1);
  163. VERIFY_AND_CLEAR(driver);
  164. /* Press and release OSM2 twice */
  165. EXPECT_NO_REPORT(driver);
  166. tap_key(osm_key2);
  167. tap_key(osm_key2);
  168. VERIFY_AND_CLEAR(driver);
  169. /* Press regular key */
  170. EXPECT_REPORT(driver, (osm_key1.report_code, osm_key2.report_code, regular_key.report_code)).Times(1);
  171. regular_key.press();
  172. run_one_scan_loop();
  173. VERIFY_AND_CLEAR(driver);
  174. /* Release regular key */
  175. EXPECT_EMPTY_REPORT(driver);
  176. regular_key.release();
  177. run_one_scan_loop();
  178. VERIFY_AND_CLEAR(driver);
  179. /* Press regular key */
  180. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  181. regular_key.press();
  182. run_one_scan_loop();
  183. VERIFY_AND_CLEAR(driver);
  184. /* Release regular key */
  185. EXPECT_EMPTY_REPORT(driver);
  186. regular_key.release();
  187. run_one_scan_loop();
  188. VERIFY_AND_CLEAR(driver);
  189. }
  190. TEST_F(OneShot, OSMHoldNotLockingOSMs) {
  191. TestDriver driver;
  192. InSequence s;
  193. KeymapKey osm_key1 = KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT};
  194. KeymapKey osm_key2 = KeymapKey{0, 0, 1, OSM(MOD_LCTL), KC_LCTL};
  195. KeymapKey regular_key = KeymapKey{0, 1, 0, KC_A};
  196. set_keymap({osm_key1, osm_key2, regular_key});
  197. /* Press and release OSM1 */
  198. EXPECT_NO_REPORT(driver);
  199. tap_key(osm_key1);
  200. VERIFY_AND_CLEAR(driver);
  201. /* Press and hold OSM2 */
  202. EXPECT_REPORT(driver, (osm_key1.report_code, osm_key2.report_code)).Times(1);
  203. osm_key2.press();
  204. run_one_scan_loop();
  205. idle_for(TAPPING_TERM);
  206. VERIFY_AND_CLEAR(driver);
  207. /* Press and release regular key */
  208. EXPECT_REPORT(driver, (osm_key1.report_code, osm_key2.report_code, regular_key.report_code)).Times(1);
  209. EXPECT_REPORT(driver, (osm_key2.report_code)).Times(1);
  210. tap_key(regular_key);
  211. VERIFY_AND_CLEAR(driver);
  212. /* Release OSM2 */
  213. EXPECT_EMPTY_REPORT(driver);
  214. osm_key2.release();
  215. run_one_scan_loop();
  216. VERIFY_AND_CLEAR(driver);
  217. /* Press regular key */
  218. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  219. regular_key.press();
  220. run_one_scan_loop();
  221. VERIFY_AND_CLEAR(driver);
  222. /* Release regular key */
  223. EXPECT_EMPTY_REPORT(driver);
  224. regular_key.release();
  225. run_one_scan_loop();
  226. VERIFY_AND_CLEAR(driver);
  227. }
  228. TEST_F(OneShot, OSLWithAdditionalKeypress) {
  229. TestDriver driver;
  230. InSequence s;
  231. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  232. KeymapKey regular_key = KeymapKey{1, 1, 0, KC_A};
  233. set_keymap({osl_key, regular_key});
  234. /* Press OSL key */
  235. EXPECT_NO_REPORT(driver);
  236. osl_key.press();
  237. run_one_scan_loop();
  238. VERIFY_AND_CLEAR(driver);
  239. /* Release OSL key */
  240. EXPECT_NO_REPORT(driver);
  241. osl_key.release();
  242. run_one_scan_loop();
  243. VERIFY_AND_CLEAR(driver);
  244. /* Press regular key */
  245. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  246. EXPECT_EMPTY_REPORT(driver);
  247. regular_key.press();
  248. run_one_scan_loop();
  249. VERIFY_AND_CLEAR(driver);
  250. /* Release regular key */
  251. EXPECT_NO_REPORT(driver);
  252. regular_key.release();
  253. run_one_scan_loop();
  254. VERIFY_AND_CLEAR(driver);
  255. }
  256. TEST_F(OneShot, OSLWithOsmAndAdditionalKeypress) {
  257. TestDriver driver;
  258. InSequence s;
  259. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  260. KeymapKey osm_key = KeymapKey{1, 1, 0, OSM(MOD_LSFT), KC_LSFT};
  261. KeymapKey regular_key = KeymapKey{1, 1, 1, KC_A};
  262. set_keymap({osl_key, osm_key, regular_key});
  263. /* Press OSL key */
  264. EXPECT_NO_REPORT(driver);
  265. osl_key.press();
  266. run_one_scan_loop();
  267. VERIFY_AND_CLEAR(driver);
  268. /* Release OSL key */
  269. EXPECT_NO_REPORT(driver);
  270. osl_key.release();
  271. run_one_scan_loop();
  272. EXPECT_TRUE(layer_state_is(1));
  273. VERIFY_AND_CLEAR(driver);
  274. /* Press and release OSM */
  275. EXPECT_NO_REPORT(driver);
  276. tap_key(osm_key);
  277. EXPECT_TRUE(layer_state_is(1));
  278. VERIFY_AND_CLEAR(driver);
  279. /* Press regular key */
  280. EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)).Times(1);
  281. EXPECT_EMPTY_REPORT(driver);
  282. regular_key.press();
  283. run_one_scan_loop();
  284. EXPECT_FALSE(layer_state_is(1));
  285. VERIFY_AND_CLEAR(driver);
  286. /* Release regular key */
  287. EXPECT_NO_REPORT(driver);
  288. regular_key.release();
  289. run_one_scan_loop();
  290. VERIFY_AND_CLEAR(driver);
  291. }
  292. TEST_F(OneShot, OSLWithMoAndAdditionalKeypress) {
  293. TestDriver driver;
  294. InSequence s;
  295. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  296. KeymapKey mo_key = KeymapKey{1, 1, 0, MO(2)};
  297. KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A};
  298. set_keymap({osl_key, mo_key, regular_key});
  299. /* Press OSL key */
  300. EXPECT_NO_REPORT(driver);
  301. osl_key.press();
  302. run_one_scan_loop();
  303. VERIFY_AND_CLEAR(driver);
  304. /* Release OSL key */
  305. EXPECT_NO_REPORT(driver);
  306. osl_key.release();
  307. run_one_scan_loop();
  308. EXPECT_TRUE(layer_state_is(1));
  309. VERIFY_AND_CLEAR(driver);
  310. /* Press MO */
  311. EXPECT_NO_REPORT(driver);
  312. mo_key.press();
  313. run_one_scan_loop();
  314. EXPECT_TRUE(layer_state_is(2));
  315. VERIFY_AND_CLEAR(driver);
  316. /* Press regular key */
  317. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  318. regular_key.press();
  319. run_one_scan_loop();
  320. EXPECT_TRUE(layer_state_is(2));
  321. VERIFY_AND_CLEAR(driver);
  322. /* Release regular key */
  323. EXPECT_EMPTY_REPORT(driver);
  324. regular_key.release();
  325. run_one_scan_loop();
  326. VERIFY_AND_CLEAR(driver);
  327. /* Release MO */
  328. EXPECT_NO_REPORT(driver);
  329. mo_key.release();
  330. run_one_scan_loop();
  331. EXPECT_TRUE(layer_state_is(0));
  332. VERIFY_AND_CLEAR(driver);
  333. }
  334. class OneShotLayerParametrizedTestFixture : public ::testing::WithParamInterface<uint16_t>, public OneShot {};
  335. TEST_P(OneShotLayerParametrizedTestFixture, OSLWithActionAndAdditionalKeypress) {
  336. TestDriver driver;
  337. InSequence s;
  338. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  339. KeymapKey action_key = KeymapKey{1, 1, 0, GetParam()};
  340. KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A};
  341. set_keymap({osl_key, action_key, regular_key});
  342. /* Tap OSL key */
  343. EXPECT_NO_REPORT(driver);
  344. tap_key(osl_key);
  345. run_one_scan_loop();
  346. VERIFY_AND_CLEAR(driver);
  347. /* Tag Action key */
  348. EXPECT_NO_REPORT(driver);
  349. tap_key(action_key);
  350. run_one_scan_loop();
  351. EXPECT_TRUE(layer_state_is(2));
  352. VERIFY_AND_CLEAR(driver);
  353. /* Press regular key */
  354. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  355. regular_key.press();
  356. run_one_scan_loop();
  357. EXPECT_TRUE(layer_state_is(2));
  358. VERIFY_AND_CLEAR(driver);
  359. /* Release regular key */
  360. EXPECT_EMPTY_REPORT(driver);
  361. regular_key.release();
  362. run_one_scan_loop();
  363. VERIFY_AND_CLEAR(driver);
  364. }
  365. INSTANTIATE_TEST_CASE_P(OneShotLayerTests, OneShotLayerParametrizedTestFixture, ::testing::Values(TG(2), TO(2)));
  366. TEST_F(OneShot, OSLWithDFAndAdditionalKeypress) {
  367. TestDriver driver;
  368. InSequence s;
  369. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  370. KeymapKey df_key = KeymapKey{1, 1, 0, DF(2)};
  371. KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A};
  372. set_keymap({osl_key, df_key, regular_key});
  373. layer_state_t default_layer_state_bak = default_layer_state;
  374. /* Tap OSL key */
  375. EXPECT_NO_REPORT(driver);
  376. tap_key(osl_key);
  377. run_one_scan_loop();
  378. EXPECT_TRUE(layer_state_is(1));
  379. VERIFY_AND_CLEAR(driver);
  380. /* Press DF key */
  381. EXPECT_NO_REPORT(driver);
  382. df_key.press();
  383. run_one_scan_loop();
  384. EXPECT_EQ(default_layer_state, 0b001);
  385. VERIFY_AND_CLEAR(driver);
  386. /* Release DF key */
  387. EXPECT_NO_REPORT(driver);
  388. df_key.release();
  389. run_one_scan_loop();
  390. EXPECT_EQ(default_layer_state, 0b100);
  391. VERIFY_AND_CLEAR(driver);
  392. /* Press regular key */
  393. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  394. regular_key.press();
  395. run_one_scan_loop();
  396. VERIFY_AND_CLEAR(driver);
  397. /* Release regular key */
  398. EXPECT_EMPTY_REPORT(driver);
  399. regular_key.release();
  400. run_one_scan_loop();
  401. VERIFY_AND_CLEAR(driver);
  402. default_layer_state = default_layer_state_bak;
  403. }
  404. TEST_F(OneShot, OSLChainingTwoOSLsAndAdditionalKeypress) {
  405. TestDriver driver;
  406. InSequence s;
  407. KeymapKey osl1_key = KeymapKey{0, 0, 0, OSL(1)};
  408. KeymapKey osl2_key = KeymapKey{1, 1, 0, OSL(2)};
  409. KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A};
  410. set_keymap({osl1_key, osl2_key, regular_key});
  411. /* Press and release first OSL key */
  412. EXPECT_NO_REPORT(driver);
  413. osl1_key.press();
  414. run_one_scan_loop();
  415. osl1_key.release();
  416. run_one_scan_loop();
  417. EXPECT_TRUE(layer_state_is(1));
  418. VERIFY_AND_CLEAR(driver);
  419. /* Press and release second OSL */
  420. EXPECT_NO_REPORT(driver);
  421. osl2_key.press();
  422. run_one_scan_loop();
  423. osl2_key.release();
  424. run_one_scan_loop();
  425. EXPECT_TRUE(layer_state_is(2));
  426. VERIFY_AND_CLEAR(driver);
  427. /* Press regular key */
  428. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  429. EXPECT_EMPTY_REPORT(driver);
  430. regular_key.press();
  431. run_one_scan_loop();
  432. VERIFY_AND_CLEAR(driver);
  433. /* Release regular key */
  434. EXPECT_NO_REPORT(driver);
  435. regular_key.release();
  436. run_one_scan_loop();
  437. EXPECT_TRUE(layer_state_is(0));
  438. VERIFY_AND_CLEAR(driver);
  439. }
  440. TEST_F(OneShot, OSLWithShortLT) {
  441. TestDriver driver;
  442. InSequence s;
  443. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  444. KeymapKey lt_key = KeymapKey(1, 1, 0, LT(2, KC_A));
  445. set_keymap({osl_key, lt_key});
  446. /* Tap OSL key */
  447. EXPECT_NO_REPORT(driver);
  448. tap_key(osl_key);
  449. run_one_scan_loop();
  450. EXPECT_TRUE(layer_state_is(1));
  451. VERIFY_AND_CLEAR(driver);
  452. /* Tap LT key. */
  453. EXPECT_REPORT(driver, (lt_key.report_code)).Times(1);
  454. EXPECT_EMPTY_REPORT(driver);
  455. tap_key(lt_key);
  456. run_one_scan_loop();
  457. EXPECT_TRUE(layer_state_is(0));
  458. VERIFY_AND_CLEAR(driver);
  459. }
  460. TEST_F(OneShot, OSLWithLongLTAndRegularKey) {
  461. TestDriver driver;
  462. InSequence s;
  463. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  464. KeymapKey lt_key = KeymapKey(1, 1, 0, LT(2, KC_A));
  465. KeymapKey regular_key = KeymapKey(2, 1, 1, KC_B);
  466. set_keymap({osl_key, lt_key, regular_key});
  467. /* Tap OSL key */
  468. EXPECT_NO_REPORT(driver);
  469. tap_key(osl_key);
  470. run_one_scan_loop();
  471. EXPECT_TRUE(layer_state_is(1));
  472. VERIFY_AND_CLEAR(driver);
  473. /* Press LT key. */
  474. EXPECT_NO_REPORT(driver);
  475. lt_key.press();
  476. run_one_scan_loop();
  477. VERIFY_AND_CLEAR(driver);
  478. /* Idle for tapping term of mod tap hold key. */
  479. EXPECT_NO_REPORT(driver);
  480. idle_for(TAPPING_TERM + 1);
  481. VERIFY_AND_CLEAR(driver);
  482. EXPECT_TRUE(layer_state_is(2));
  483. /* Press regular key. */
  484. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  485. regular_key.press();
  486. run_one_scan_loop();
  487. VERIFY_AND_CLEAR(driver);
  488. /* Release regular key. */
  489. EXPECT_EMPTY_REPORT(driver);
  490. regular_key.release();
  491. run_one_scan_loop();
  492. VERIFY_AND_CLEAR(driver);
  493. }
  494. TEST_F(OneShot, OSLWithShortModTapKeyAndRegularKey) {
  495. TestDriver driver;
  496. InSequence s;
  497. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  498. KeymapKey mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_P));
  499. KeymapKey regular_key = KeymapKey(0, 2, 0, KC_A);
  500. set_keymap({osl_key, mod_tap_hold_key, regular_key});
  501. /* Tap OSL key */
  502. EXPECT_NO_REPORT(driver);
  503. tap_key(osl_key);
  504. run_one_scan_loop();
  505. EXPECT_TRUE(layer_state_is(1));
  506. VERIFY_AND_CLEAR(driver);
  507. /* Press mod-tap-hold key. */
  508. EXPECT_NO_REPORT(driver);
  509. mod_tap_hold_key.press();
  510. run_one_scan_loop();
  511. VERIFY_AND_CLEAR(driver);
  512. /* Release mod-tap-hold key. */
  513. EXPECT_REPORT(driver, (KC_P));
  514. EXPECT_EMPTY_REPORT(driver);
  515. mod_tap_hold_key.release();
  516. run_one_scan_loop();
  517. VERIFY_AND_CLEAR(driver);
  518. /* Press regular key. */
  519. EXPECT_REPORT(driver, (regular_key.report_code));
  520. regular_key.press();
  521. run_one_scan_loop();
  522. VERIFY_AND_CLEAR(driver);
  523. /* Release regular key. */
  524. EXPECT_EMPTY_REPORT(driver);
  525. regular_key.release();
  526. run_one_scan_loop();
  527. VERIFY_AND_CLEAR(driver);
  528. }
  529. TEST_F(OneShot, OSLWithLongModTapKeyAndRegularKey) {
  530. TestDriver driver;
  531. InSequence s;
  532. KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)};
  533. KeymapKey mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_P));
  534. KeymapKey regular_key = KeymapKey(1, 2, 0, KC_A);
  535. set_keymap({osl_key, mod_tap_hold_key, regular_key});
  536. /* Tap OSL key */
  537. EXPECT_NO_REPORT(driver);
  538. tap_key(osl_key);
  539. run_one_scan_loop();
  540. EXPECT_TRUE(layer_state_is(1));
  541. VERIFY_AND_CLEAR(driver);
  542. /* Press mod-tap-hold key. */
  543. EXPECT_NO_REPORT(driver);
  544. mod_tap_hold_key.press();
  545. run_one_scan_loop();
  546. VERIFY_AND_CLEAR(driver);
  547. /* Idle for tapping term of mod tap hold key. */
  548. EXPECT_REPORT(driver, (KC_LSFT));
  549. idle_for(TAPPING_TERM + 1);
  550. VERIFY_AND_CLEAR(driver);
  551. /* Release mod-tap-hold key. */
  552. EXPECT_EMPTY_REPORT(driver);
  553. mod_tap_hold_key.release();
  554. run_one_scan_loop();
  555. VERIFY_AND_CLEAR(driver);
  556. /* Press regular key. */
  557. EXPECT_REPORT(driver, (regular_key.report_code)).Times(1);
  558. EXPECT_EMPTY_REPORT(driver);
  559. regular_key.press();
  560. run_one_scan_loop();
  561. VERIFY_AND_CLEAR(driver);
  562. /* Release regular key. */
  563. EXPECT_NO_REPORT(driver);
  564. regular_key.release();
  565. run_one_scan_loop();
  566. VERIFY_AND_CLEAR(driver);
  567. }