logo

qmk_firmware

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

test_unicode_ucis.cpp (5450B)


  1. // Copyright 2023 QMK
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "keyboard_report_util.hpp"
  4. #include "keycode.h"
  5. #include "test_common.hpp"
  6. #include "test_keymap_key.hpp"
  7. using testing::_;
  8. // clang-format off
  9. const ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE(
  10. UCIS_SYM("qmk", 0x03A8) // Ψ
  11. );
  12. // clang-format on
  13. class UnicodeUCIS : public TestFixture {};
  14. TEST_F(UnicodeUCIS, matches_sequence) {
  15. TestDriver driver;
  16. auto key_q = KeymapKey(0, 0, 0, KC_Q);
  17. auto key_m = KeymapKey(0, 1, 0, KC_M);
  18. auto key_k = KeymapKey(0, 2, 0, KC_K);
  19. auto key_enter = KeymapKey(0, 3, 0, KC_ENTER);
  20. set_keymap({key_q, key_m, key_k, key_enter});
  21. EXPECT_UNICODE(driver, 0x2328); // ⌨
  22. ucis_start();
  23. EXPECT_EQ(ucis_active(), true);
  24. EXPECT_EQ(ucis_count(), 0);
  25. EXPECT_REPORT(driver, (KC_Q));
  26. EXPECT_EMPTY_REPORT(driver);
  27. tap_key(key_q);
  28. EXPECT_EQ(ucis_count(), 1);
  29. EXPECT_REPORT(driver, (KC_M));
  30. EXPECT_EMPTY_REPORT(driver);
  31. tap_key(key_m);
  32. EXPECT_EQ(ucis_count(), 2);
  33. EXPECT_REPORT(driver, (KC_K));
  34. EXPECT_EMPTY_REPORT(driver);
  35. tap_key(key_k);
  36. EXPECT_EQ(ucis_count(), 3);
  37. EXPECT_REPORT(driver, (KC_BACKSPACE)).Times(4);
  38. EXPECT_EMPTY_REPORT(driver).Times(4);
  39. EXPECT_UNICODE(driver, 0x03A8);
  40. tap_key(key_enter);
  41. EXPECT_EQ(ucis_active(), false);
  42. VERIFY_AND_CLEAR(driver);
  43. }
  44. TEST_F(UnicodeUCIS, cancels_sequence) {
  45. TestDriver driver;
  46. auto key_q = KeymapKey(0, 0, 0, KC_Q);
  47. auto key_m = KeymapKey(0, 1, 0, KC_M);
  48. auto key_k = KeymapKey(0, 2, 0, KC_K);
  49. auto key_escape = KeymapKey(0, 3, 0, KC_ESCAPE);
  50. set_keymap({key_q, key_m, key_k, key_escape});
  51. EXPECT_UNICODE(driver, 0x2328); // ⌨
  52. ucis_start();
  53. EXPECT_EQ(ucis_active(), true);
  54. EXPECT_EQ(ucis_count(), 0);
  55. EXPECT_REPORT(driver, (KC_Q));
  56. EXPECT_EMPTY_REPORT(driver);
  57. tap_key(key_q);
  58. EXPECT_EQ(ucis_count(), 1);
  59. EXPECT_REPORT(driver, (KC_M));
  60. EXPECT_EMPTY_REPORT(driver);
  61. tap_key(key_m);
  62. EXPECT_EQ(ucis_count(), 2);
  63. EXPECT_REPORT(driver, (KC_K));
  64. EXPECT_EMPTY_REPORT(driver);
  65. tap_key(key_k);
  66. EXPECT_EQ(ucis_count(), 3);
  67. EXPECT_NO_REPORT(driver);
  68. tap_key(key_escape);
  69. EXPECT_EQ(ucis_active(), false);
  70. VERIFY_AND_CLEAR(driver);
  71. }
  72. TEST_F(UnicodeUCIS, matches_sequence_with_corrected_typo) {
  73. TestDriver driver;
  74. auto key_q = KeymapKey(0, 0, 0, KC_Q);
  75. auto key_m = KeymapKey(0, 1, 0, KC_M);
  76. auto key_j = KeymapKey(0, 2, 0, KC_J);
  77. auto key_k = KeymapKey(0, 3, 0, KC_K);
  78. auto key_backspace = KeymapKey(0, 4, 0, KC_BACKSPACE);
  79. auto key_enter = KeymapKey(0, 5, 0, KC_ENTER);
  80. set_keymap({key_q, key_m, key_j, key_k, key_backspace, key_enter});
  81. EXPECT_UNICODE(driver, 0x2328); // ⌨
  82. ucis_start();
  83. EXPECT_EQ(ucis_active(), true);
  84. EXPECT_EQ(ucis_count(), 0);
  85. EXPECT_REPORT(driver, (KC_Q));
  86. EXPECT_EMPTY_REPORT(driver);
  87. tap_key(key_q);
  88. EXPECT_EQ(ucis_count(), 1);
  89. EXPECT_REPORT(driver, (KC_M));
  90. EXPECT_EMPTY_REPORT(driver);
  91. tap_key(key_m);
  92. EXPECT_EQ(ucis_count(), 2);
  93. EXPECT_REPORT(driver, (KC_J));
  94. EXPECT_EMPTY_REPORT(driver);
  95. tap_key(key_j);
  96. EXPECT_EQ(ucis_count(), 3);
  97. EXPECT_REPORT(driver, (KC_BACKSPACE));
  98. EXPECT_EMPTY_REPORT(driver);
  99. tap_key(key_backspace);
  100. EXPECT_EQ(ucis_count(), 2);
  101. EXPECT_REPORT(driver, (KC_K));
  102. EXPECT_EMPTY_REPORT(driver);
  103. tap_key(key_k);
  104. EXPECT_EQ(ucis_count(), 3);
  105. EXPECT_REPORT(driver, (KC_BACKSPACE)).Times(4);
  106. EXPECT_EMPTY_REPORT(driver).Times(4);
  107. EXPECT_UNICODE(driver, 0x03A8);
  108. tap_key(key_enter);
  109. EXPECT_EQ(ucis_active(), false);
  110. VERIFY_AND_CLEAR(driver);
  111. }
  112. TEST_F(UnicodeUCIS, does_not_match_longer_sequence) {
  113. TestDriver driver;
  114. auto key_q = KeymapKey(0, 0, 0, KC_Q);
  115. auto key_m = KeymapKey(0, 1, 0, KC_M);
  116. auto key_k = KeymapKey(0, 2, 0, KC_K);
  117. auto key_enter = KeymapKey(0, 3, 0, KC_ENTER);
  118. set_keymap({key_q, key_m, key_k, key_enter});
  119. EXPECT_UNICODE(driver, 0x2328); // ⌨
  120. ucis_start();
  121. EXPECT_EQ(ucis_active(), true);
  122. EXPECT_EQ(ucis_count(), 0);
  123. EXPECT_REPORT(driver, (KC_Q));
  124. EXPECT_EMPTY_REPORT(driver);
  125. tap_key(key_q);
  126. EXPECT_EQ(ucis_count(), 1);
  127. EXPECT_REPORT(driver, (KC_M));
  128. EXPECT_EMPTY_REPORT(driver);
  129. tap_key(key_m);
  130. EXPECT_EQ(ucis_count(), 2);
  131. EXPECT_REPORT(driver, (KC_K));
  132. EXPECT_EMPTY_REPORT(driver);
  133. tap_key(key_k);
  134. EXPECT_EQ(ucis_count(), 3);
  135. EXPECT_REPORT(driver, (KC_K));
  136. EXPECT_EMPTY_REPORT(driver);
  137. tap_key(key_k);
  138. EXPECT_EQ(ucis_count(), 4);
  139. EXPECT_NO_REPORT(driver);
  140. tap_key(key_enter);
  141. EXPECT_EQ(ucis_active(), false);
  142. VERIFY_AND_CLEAR(driver);
  143. }
  144. TEST_F(UnicodeUCIS, does_not_match_shorter_sequence) {
  145. TestDriver driver;
  146. auto key_q = KeymapKey(0, 0, 0, KC_Q);
  147. auto key_enter = KeymapKey(0, 1, 0, KC_ENTER);
  148. set_keymap({key_q, key_enter});
  149. EXPECT_UNICODE(driver, 0x2328); // ⌨
  150. ucis_start();
  151. EXPECT_EQ(ucis_active(), true);
  152. EXPECT_EQ(ucis_count(), 0);
  153. EXPECT_REPORT(driver, (KC_Q));
  154. EXPECT_EMPTY_REPORT(driver);
  155. tap_key(key_q);
  156. EXPECT_EQ(ucis_count(), 1);
  157. EXPECT_NO_REPORT(driver);
  158. tap_key(key_enter);
  159. EXPECT_EQ(ucis_active(), false);
  160. VERIFY_AND_CLEAR(driver);
  161. }