logo

qmk_firmware

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

test_combo.cpp (4336B)


  1. // Copyright 2024 @Filios92
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "keyboard_report_util.hpp"
  4. #include "keycode.h"
  5. #include "test_common.h"
  6. #include "test_common.hpp"
  7. #include "test_driver.hpp"
  8. #include "test_fixture.hpp"
  9. #include "test_keymap_key.hpp"
  10. using testing::_;
  11. using testing::InSequence;
  12. class ComboRepress : public TestFixture {};
  13. TEST_F(ComboRepress, combo_repress_tapped) {
  14. TestDriver driver;
  15. KeymapKey key_f(0, 0, 0, KC_F);
  16. KeymapKey key_g(0, 0, 1, KC_G);
  17. set_keymap({key_f, key_g});
  18. EXPECT_REPORT(driver, (KC_LEFT_ALT)).Times(2);
  19. EXPECT_REPORT(driver, (KC_TAB, KC_LEFT_ALT));
  20. EXPECT_EMPTY_REPORT(driver);
  21. tap_combo({key_f, key_g}, 20);
  22. VERIFY_AND_CLEAR(driver);
  23. }
  24. TEST_F(ComboRepress, combo_repress_held_released_one_key_and_repressed) {
  25. TestDriver driver;
  26. KeymapKey key_f(0, 0, 0, KC_F);
  27. KeymapKey key_g(0, 0, 1, KC_G);
  28. KeymapKey key_h(0, 0, 2, KC_H);
  29. KeymapKey key_j(0, 0, 3, KC_J);
  30. set_keymap({key_f, key_g, key_h, key_j});
  31. /* Press combo F+G */
  32. EXPECT_REPORT(driver, (KC_LEFT_ALT)).Times(2);
  33. EXPECT_REPORT(driver, (KC_TAB, KC_LEFT_ALT));
  34. key_f.press();
  35. run_one_scan_loop();
  36. key_g.press();
  37. run_one_scan_loop();
  38. idle_for(COMBO_TERM + 1);
  39. VERIFY_AND_CLEAR(driver);
  40. /* Release G */
  41. EXPECT_NO_REPORT(driver);
  42. key_g.release();
  43. idle_for(80);
  44. VERIFY_AND_CLEAR(driver);
  45. /* Tap G */
  46. EXPECT_REPORT(driver, (KC_TAB, KC_LEFT_ALT));
  47. EXPECT_REPORT(driver, (KC_LEFT_ALT));
  48. tap_key(key_g, TAPPING_TERM + 1);
  49. VERIFY_AND_CLEAR(driver);
  50. /* Tap G, but hold for longer */
  51. EXPECT_REPORT(driver, (KC_TAB, KC_LEFT_ALT));
  52. EXPECT_REPORT(driver, (KC_LEFT_ALT));
  53. tap_key(key_g, TAPPING_TERM * 2);
  54. VERIFY_AND_CLEAR(driver);
  55. idle_for(500);
  56. /* Tap other combo while holding F */
  57. EXPECT_REPORT(driver, (KC_ESCAPE, KC_LEFT_ALT));
  58. EXPECT_REPORT(driver, (KC_LEFT_ALT));
  59. tap_combo({key_h, key_j}, TAPPING_TERM + 1);
  60. VERIFY_AND_CLEAR(driver);
  61. /* G press and hold */
  62. EXPECT_REPORT(driver, (KC_TAB, KC_LEFT_ALT));
  63. EXPECT_REPORT(driver, (KC_LEFT_ALT));
  64. key_g.press();
  65. run_one_scan_loop();
  66. VERIFY_AND_CLEAR(driver);
  67. /* F release and tap */
  68. EXPECT_REPORT(driver, (KC_LEFT_ALT, KC_LEFT_SHIFT)).Times(2);
  69. EXPECT_REPORT(driver, (KC_TAB, KC_LEFT_ALT, KC_LEFT_SHIFT));
  70. EXPECT_REPORT(driver, (KC_LEFT_ALT));
  71. key_f.release();
  72. run_one_scan_loop();
  73. tap_key(key_f);
  74. VERIFY_AND_CLEAR(driver);
  75. /* Release G */
  76. EXPECT_EMPTY_REPORT(driver);
  77. key_g.release();
  78. run_one_scan_loop();
  79. VERIFY_AND_CLEAR(driver);
  80. }
  81. TEST_F(ComboRepress, combo_repress_normal_combo) {
  82. TestDriver driver;
  83. KeymapKey key_f(0, 0, 0, KC_F);
  84. KeymapKey key_g(0, 0, 1, KC_G);
  85. KeymapKey key_h(0, 0, 2, KC_H);
  86. KeymapKey key_j(0, 0, 3, KC_J);
  87. set_keymap({key_f, key_g, key_h, key_j});
  88. /* Press combo H+J */
  89. EXPECT_REPORT(driver, (KC_ESCAPE));
  90. key_h.press();
  91. run_one_scan_loop();
  92. key_j.press();
  93. run_one_scan_loop();
  94. idle_for(COMBO_TERM + 10);
  95. VERIFY_AND_CLEAR(driver);
  96. /* Release H */
  97. EXPECT_NO_REPORT(driver);
  98. key_h.release();
  99. idle_for(80);
  100. VERIFY_AND_CLEAR(driver);
  101. /* Tap H */
  102. EXPECT_REPORT(driver, (KC_H, KC_ESCAPE));
  103. EXPECT_REPORT(driver, (KC_ESCAPE));
  104. tap_key(key_h);
  105. VERIFY_AND_CLEAR(driver);
  106. /* Tap H, but hold for longer */
  107. EXPECT_REPORT(driver, (KC_H, KC_ESCAPE));
  108. EXPECT_REPORT(driver, (KC_ESCAPE));
  109. tap_key(key_h, TAPPING_TERM + 1);
  110. VERIFY_AND_CLEAR(driver);
  111. idle_for(500);
  112. /* Tap other combo while holding K */
  113. EXPECT_REPORT(driver, (KC_ESCAPE, KC_LEFT_ALT)).Times(2);
  114. EXPECT_REPORT(driver, (KC_ESCAPE, KC_TAB, KC_LEFT_ALT));
  115. EXPECT_REPORT(driver, (KC_ESCAPE));
  116. tap_combo({key_f, key_g}, TAPPING_TERM + 1);
  117. VERIFY_AND_CLEAR(driver);
  118. /* H press and hold */
  119. EXPECT_REPORT(driver, (KC_H, KC_ESCAPE));
  120. key_h.press();
  121. run_one_scan_loop();
  122. VERIFY_AND_CLEAR(driver);
  123. /* J release and tap */
  124. EXPECT_REPORT(driver, (KC_H));
  125. key_j.release();
  126. run_one_scan_loop();
  127. VERIFY_AND_CLEAR(driver);
  128. /* Release G */
  129. EXPECT_EMPTY_REPORT(driver);
  130. key_h.release();
  131. run_one_scan_loop();
  132. VERIFY_AND_CLEAR(driver);
  133. }