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