add initial passing combo tests

This commit is contained in:
John Wilmes
2025-07-19 22:11:35 -05:00
parent 7098252252
commit 952f532592
3 changed files with 85 additions and 2 deletions

View File

@@ -6,3 +6,5 @@
#include "test_common.h"
#define TAPPING_TERM 200
#define COMBO_TERM 40
#define COMBO_STRICT_TIMER

View File

@@ -14,6 +14,83 @@ using testing::InSequence;
class Combo : public TestFixture {};
TEST_F(Combo, combo_basic) {
TestDriver driver;
KeymapKey key_a(0, 0, 0, KC_A);
KeymapKey key_b(0, 1, 0, KC_B);
set_keymap({key_a, key_b});
EXPECT_REPORT(driver, (KC_1));
EXPECT_EMPTY_REPORT(driver);
// Press key A, wait for less than COMBO_TERM, then press key B
run_one_scan_loop(); // Ensure that combo timer is > 0
key_a.press();
idle_for(COMBO_TERM-2);
key_b.press();
run_one_scan_loop();
key_a.release();
run_one_scan_loop();
key_b.release();
run_one_scan_loop();
VERIFY_AND_CLEAR(driver);
}
TEST_F(Combo, combo_too_slow) {
TestDriver driver;
KeymapKey key_a(0, 0, 0, KC_A);
KeymapKey key_b(0, 1, 0, KC_B);
set_keymap({key_a, key_b});
EXPECT_REPORT(driver, (KC_A));
EXPECT_REPORT(driver, (KC_A, KC_B));
EXPECT_REPORT(driver, (KC_B));
EXPECT_EMPTY_REPORT(driver);
// Press key A, wait for more than COMBO_TERM, then press key B
run_one_scan_loop(); // Ensure that combo timer is > 0
key_a.press();
idle_for(COMBO_TERM + 1);
key_b.press();
run_one_scan_loop();
key_a.release();
run_one_scan_loop();
key_b.release();
run_one_scan_loop();
VERIFY_AND_CLEAR(driver);
}
TEST_F(Combo, combo_disjoint) {
TestDriver driver;
KeymapKey key_a(0, 0, 0, KC_A);
KeymapKey key_b(0, 1, 0, KC_B);
KeymapKey key_c(0, 2, 0, KC_C);
KeymapKey key_d(0, 3, 0, KC_D);
set_keymap({key_a, key_b, key_c, key_d});
EXPECT_REPORT(driver, (KC_1));
EXPECT_REPORT(driver, (KC_1, KC_2));
EXPECT_REPORT(driver, (KC_2));
EXPECT_EMPTY_REPORT(driver);
// Press A, C, B, D in that order; trigger combos for A+B and C+D
run_one_scan_loop();
key_a.press();
run_one_scan_loop();
key_c.press();
run_one_scan_loop();
key_b.press();
run_one_scan_loop();
key_d.press();
run_one_scan_loop();
key_a.release();
run_one_scan_loop();
key_b.release();
run_one_scan_loop();
key_c.release();
run_one_scan_loop();
key_d.release();
run_one_scan_loop();
VERIFY_AND_CLEAR(driver);
}
TEST_F(Combo, combo_modtest_tapped) {
TestDriver driver;
KeymapKey key_y(0, 0, 1, KC_Y);

View File

@@ -4,14 +4,18 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
enum combos { modtest, osmshift };
enum combos { modtest, osmshift, ab_1, cd_2 };
uint16_t const modtest_combo[] = {KC_Y, KC_U, COMBO_END};
uint16_t const osmshift_combo[] = {KC_Z, KC_X, COMBO_END};
uint16_t const ab_1_combo[] = {KC_A, KC_B, COMBO_END};
uint16_t const cd_2_combo[] = {KC_C, KC_D, COMBO_END};
// clang-format off
combo_t key_combos[] = {
[modtest] = COMBO(modtest_combo, RSFT_T(KC_SPACE)),
[osmshift] = COMBO(osmshift_combo, OSM(MOD_LSFT))
[osmshift] = COMBO(osmshift_combo, OSM(MOD_LSFT)),
[ab_1] = COMBO(ab_1_combo, KC_1),
[cd_2] = COMBO(cd_2_combo, KC_2)
};
// clang-format on