qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

test_unicode_ucis.cpp (5450B)


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