qmk_firmware

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

test_keypress.cpp (8087B)


      1 /* Copyright 2017 Fred Sundvik
      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 "keycode.h"
     18 #include "test_common.hpp"
     19 
     20 using testing::_;
     21 using testing::InSequence;
     22 
     23 class KeyPress : public TestFixture {};
     24 
     25 TEST_F(KeyPress, SendKeyboardIsNotCalledWhenNoKeyIsPressed) {
     26     TestDriver driver;
     27     EXPECT_NO_REPORT(driver);
     28     keyboard_task();
     29 }
     30 
     31 TEST_F(KeyPress, CorrectKeyIsReportedWhenPressed) {
     32     TestDriver driver;
     33     auto       key = KeymapKey(0, 0, 0, KC_A);
     34 
     35     set_keymap({key});
     36 
     37     key.press();
     38     EXPECT_REPORT(driver, (key.report_code));
     39     keyboard_task();
     40 
     41     key.release();
     42     EXPECT_EMPTY_REPORT(driver);
     43     keyboard_task();
     44 }
     45 
     46 TEST_F(KeyPress, ANonMappedKeyDoesNothing) {
     47     TestDriver driver;
     48     auto       key = KeymapKey(0, 0, 0, KC_NO);
     49 
     50     set_keymap({key});
     51 
     52     key.press();
     53     EXPECT_NO_REPORT(driver);
     54     keyboard_task();
     55     keyboard_task();
     56 }
     57 
     58 TEST_F(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) {
     59     TestDriver driver;
     60     auto       key_b = KeymapKey(0, 0, 0, KC_B);
     61     auto       key_c = KeymapKey(0, 1, 1, KC_C);
     62 
     63     set_keymap({key_b, key_c});
     64 
     65     key_b.press();
     66     key_c.press();
     67     EXPECT_REPORT(driver, (key_b.report_code));
     68     EXPECT_REPORT(driver, (key_b.report_code, key_c.report_code));
     69     keyboard_task();
     70 
     71     key_b.release();
     72     key_c.release();
     73     // Note that the first key released is the first one in the matrix order
     74     EXPECT_REPORT(driver, (key_c.report_code));
     75     EXPECT_EMPTY_REPORT(driver);
     76     keyboard_task();
     77 }
     78 
     79 TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {
     80     TestDriver driver;
     81     auto       key_a    = KeymapKey(0, 0, 0, KC_A);
     82     auto       key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);
     83 
     84     set_keymap({key_a, key_lsft});
     85 
     86     key_lsft.press();
     87     key_a.press();
     88 
     89     EXPECT_REPORT(driver, (key_a.report_code));
     90     EXPECT_REPORT(driver, (key_a.report_code, key_lsft.report_code));
     91     keyboard_task();
     92 
     93     key_a.release();
     94     EXPECT_REPORT(driver, (key_lsft.report_code));
     95     keyboard_task();
     96 
     97     key_lsft.release();
     98     EXPECT_EMPTY_REPORT(driver);
     99     keyboard_task();
    100 }
    101 
    102 TEST_F(KeyPress, PressLeftShiftAndControl) {
    103     TestDriver driver;
    104     auto       key_lsft  = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);
    105     auto       key_lctrl = KeymapKey(0, 5, 0, KC_LEFT_CTRL);
    106 
    107     set_keymap({key_lctrl, key_lsft});
    108 
    109     key_lsft.press();
    110     key_lctrl.press();
    111 
    112     EXPECT_REPORT(driver, (key_lsft.report_code));
    113     EXPECT_REPORT(driver, (key_lsft.report_code, key_lctrl.report_code));
    114     keyboard_task();
    115 
    116     key_lsft.release();
    117     key_lctrl.release();
    118 
    119     EXPECT_REPORT(driver, (key_lctrl.report_code));
    120     EXPECT_EMPTY_REPORT(driver);
    121     keyboard_task();
    122 }
    123 
    124 TEST_F(KeyPress, LeftAndRightShiftCanBePressedAtTheSameTime) {
    125     TestDriver driver;
    126     auto       key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);
    127     auto       key_rsft = KeymapKey(0, 4, 0, KC_RIGHT_SHIFT);
    128 
    129     set_keymap({key_rsft, key_lsft});
    130 
    131     key_lsft.press();
    132     key_rsft.press();
    133     EXPECT_REPORT(driver, (key_lsft.report_code));
    134     EXPECT_REPORT(driver, (key_lsft.report_code, key_rsft.report_code));
    135     keyboard_task();
    136 
    137     key_lsft.release();
    138     key_rsft.release();
    139     EXPECT_REPORT(driver, (key_rsft.report_code));
    140     EXPECT_EMPTY_REPORT(driver);
    141     keyboard_task();
    142 }
    143 
    144 TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) {
    145     TestDriver driver;
    146     auto       combo_key = KeymapKey(0, 0, 0, RSFT(LCTL(KC_O)));
    147 
    148     set_keymap({combo_key});
    149 
    150     // BUG: The press is split into two reports
    151     // BUG: It reports RSFT instead of LSFT
    152     // See issue #524 for more information
    153     // The underlying cause is that we use only one bit to represent the right hand
    154     // modifiers.
    155     combo_key.press();
    156     EXPECT_REPORT(driver, (KC_RIGHT_SHIFT, KC_RIGHT_CTRL));
    157     EXPECT_REPORT(driver, (KC_RIGHT_SHIFT, KC_RIGHT_CTRL, KC_O));
    158     keyboard_task();
    159 
    160     combo_key.release();
    161     EXPECT_REPORT(driver, (KC_RIGHT_SHIFT, KC_RIGHT_CTRL));
    162     EXPECT_EMPTY_REPORT(driver);
    163     keyboard_task();
    164 }
    165 
    166 TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) {
    167     TestDriver driver;
    168     InSequence s;
    169     auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS);
    170     auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);
    171 
    172     set_keymap({key_plus, key_eql});
    173 
    174     key_plus.press();
    175     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    176     EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_EQUAL));
    177     run_one_scan_loop();
    178     VERIFY_AND_CLEAR(driver);
    179 
    180     key_plus.release();
    181     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    182     EXPECT_EMPTY_REPORT(driver);
    183     run_one_scan_loop();
    184     VERIFY_AND_CLEAR(driver);
    185 
    186     key_eql.press();
    187     EXPECT_REPORT(driver, (key_eql.report_code));
    188     run_one_scan_loop();
    189     VERIFY_AND_CLEAR(driver);
    190 
    191     key_eql.release();
    192     EXPECT_EMPTY_REPORT(driver);
    193     run_one_scan_loop();
    194     VERIFY_AND_CLEAR(driver);
    195 }
    196 
    197 TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) {
    198     TestDriver driver;
    199     InSequence s;
    200     auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS);
    201     auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);
    202 
    203     set_keymap({key_plus, key_eql});
    204 
    205     key_plus.press();
    206     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    207     EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_EQUAL));
    208     run_one_scan_loop();
    209     VERIFY_AND_CLEAR(driver);
    210 
    211     key_eql.press();
    212     EXPECT_EMPTY_REPORT(driver);
    213     EXPECT_REPORT(driver, (KC_EQUAL));
    214     run_one_scan_loop();
    215     VERIFY_AND_CLEAR(driver);
    216 
    217     key_plus.release();
    218     // BUG: Should really still return KC_EQUAL, but this is fine too
    219     EXPECT_EMPTY_REPORT(driver);
    220     run_one_scan_loop();
    221     VERIFY_AND_CLEAR(driver);
    222 
    223     key_eql.release();
    224     EXPECT_NO_REPORT(driver);
    225     run_one_scan_loop();
    226     VERIFY_AND_CLEAR(driver);
    227 }
    228 
    229 TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) {
    230     TestDriver driver;
    231     InSequence s;
    232     auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS);
    233     auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);
    234 
    235     set_keymap({key_plus, key_eql});
    236 
    237     key_eql.press();
    238     EXPECT_REPORT(driver, (KC_EQUAL));
    239     run_one_scan_loop();
    240     VERIFY_AND_CLEAR(driver);
    241 
    242     key_eql.release();
    243     EXPECT_EMPTY_REPORT(driver);
    244     run_one_scan_loop();
    245     VERIFY_AND_CLEAR(driver);
    246 
    247     key_plus.press();
    248     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    249     EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_EQUAL));
    250     run_one_scan_loop();
    251     VERIFY_AND_CLEAR(driver);
    252 
    253     key_plus.release();
    254     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    255     EXPECT_EMPTY_REPORT(driver);
    256     run_one_scan_loop();
    257     VERIFY_AND_CLEAR(driver);
    258 }
    259 
    260 TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) {
    261     TestDriver driver;
    262     InSequence s;
    263     auto       key_plus = KeymapKey(0, 1, 1, KC_PLUS);
    264     auto       key_eql  = KeymapKey(0, 0, 1, KC_EQUAL);
    265 
    266     set_keymap({key_plus, key_eql});
    267 
    268     key_eql.press();
    269     EXPECT_REPORT(driver, (KC_EQUAL));
    270     run_one_scan_loop();
    271     VERIFY_AND_CLEAR(driver);
    272 
    273     key_plus.press();
    274     // BUG: The sequence is a bit strange, but it works, the end result is that
    275     // KC_PLUS is sent
    276     EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_EQUAL));
    277     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    278     EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_EQUAL));
    279     run_one_scan_loop();
    280     VERIFY_AND_CLEAR(driver);
    281 
    282     key_eql.release();
    283     // I guess it's fine to still report shift here
    284     EXPECT_REPORT(driver, (KC_LEFT_SHIFT));
    285     run_one_scan_loop();
    286     VERIFY_AND_CLEAR(driver);
    287 
    288     key_plus.release();
    289     EXPECT_EMPTY_REPORT(driver);
    290     run_one_scan_loop();
    291     VERIFY_AND_CLEAR(driver);
    292 }