qmk_firmware

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

test_combo.cpp (4336B)


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