Parent directory

test_leader.cpp

5370 bytes
  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
  9using testing::_;
 10
 11class Leader : public TestFixture {};
 12
 13TEST_F(Leader, triggers_one_key_sequence) {
 14    TestDriver driver;
 15
 16    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
 17    auto key_a      = KeymapKey(0, 1, 0, KC_A);
 18
 19    set_keymap({key_leader, key_a});
 20
 21    EXPECT_EQ(leader_sequence_active(), false);
 22
 23    EXPECT_NO_REPORT(driver);
 24    tap_key(key_leader);
 25
 26    EXPECT_EQ(leader_sequence_active(), true);
 27
 28    EXPECT_REPORT(driver, (KC_1));
 29    EXPECT_EMPTY_REPORT(driver);
 30    tap_key(key_a);
 31
 32    EXPECT_EQ(leader_sequence_timed_out(), false);
 33
 34    idle_for(300);
 35
 36    EXPECT_EQ(leader_sequence_active(), false);
 37    EXPECT_EQ(leader_sequence_timed_out(), true);
 38
 39    EXPECT_REPORT(driver, (KC_A));
 40    EXPECT_EMPTY_REPORT(driver);
 41    tap_key(key_a);
 42}
 43
 44TEST_F(Leader, triggers_two_key_sequence) {
 45    TestDriver driver;
 46
 47    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
 48    auto key_a      = KeymapKey(0, 1, 0, KC_A);
 49    auto key_b      = KeymapKey(0, 2, 0, KC_B);
 50
 51    set_keymap({key_leader, key_a, key_b});
 52
 53    EXPECT_EQ(leader_sequence_active(), false);
 54
 55    EXPECT_NO_REPORT(driver);
 56    tap_key(key_leader);
 57
 58    EXPECT_EQ(leader_sequence_active(), true);
 59
 60    EXPECT_REPORT(driver, (KC_2));
 61    EXPECT_EMPTY_REPORT(driver);
 62    tap_key(key_a);
 63    tap_key(key_b);
 64
 65    EXPECT_EQ(leader_sequence_timed_out(), false);
 66
 67    idle_for(300);
 68
 69    EXPECT_EQ(leader_sequence_active(), false);
 70    EXPECT_EQ(leader_sequence_timed_out(), true);
 71
 72    EXPECT_REPORT(driver, (KC_A));
 73    EXPECT_EMPTY_REPORT(driver);
 74    tap_key(key_a);
 75}
 76
 77TEST_F(Leader, triggers_three_key_sequence) {
 78    TestDriver driver;
 79
 80    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
 81    auto key_a      = KeymapKey(0, 1, 0, KC_A);
 82    auto key_b      = KeymapKey(0, 2, 0, KC_B);
 83    auto key_c      = KeymapKey(0, 3, 0, KC_C);
 84
 85    set_keymap({key_leader, key_a, key_b, key_c});
 86
 87    EXPECT_EQ(leader_sequence_active(), false);
 88
 89    EXPECT_NO_REPORT(driver);
 90    tap_key(key_leader);
 91
 92    EXPECT_EQ(leader_sequence_active(), true);
 93
 94    EXPECT_REPORT(driver, (KC_3));
 95    EXPECT_EMPTY_REPORT(driver);
 96    tap_key(key_a);
 97    tap_key(key_b);
 98    tap_key(key_c);
 99
100    EXPECT_EQ(leader_sequence_timed_out(), false);
101
102    idle_for(300);
103
104    EXPECT_EQ(leader_sequence_active(), false);
105    EXPECT_EQ(leader_sequence_timed_out(), true);
106
107    EXPECT_REPORT(driver, (KC_A));
108    EXPECT_EMPTY_REPORT(driver);
109    tap_key(key_a);
110}
111
112TEST_F(Leader, triggers_four_key_sequence) {
113    TestDriver driver;
114
115    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
116    auto key_a      = KeymapKey(0, 1, 0, KC_A);
117    auto key_b      = KeymapKey(0, 2, 0, KC_B);
118    auto key_c      = KeymapKey(0, 3, 0, KC_C);
119    auto key_d      = KeymapKey(0, 4, 0, KC_D);
120
121    set_keymap({key_leader, key_a, key_b, key_c, key_d});
122
123    EXPECT_EQ(leader_sequence_active(), false);
124
125    EXPECT_NO_REPORT(driver);
126    tap_key(key_leader);
127
128    EXPECT_EQ(leader_sequence_active(), true);
129
130    EXPECT_REPORT(driver, (KC_4));
131    EXPECT_EMPTY_REPORT(driver);
132    tap_key(key_a);
133    tap_key(key_b);
134    tap_key(key_c);
135    tap_key(key_d);
136
137    EXPECT_EQ(leader_sequence_timed_out(), false);
138
139    idle_for(300);
140
141    EXPECT_EQ(leader_sequence_active(), false);
142    EXPECT_EQ(leader_sequence_timed_out(), true);
143
144    EXPECT_REPORT(driver, (KC_A));
145    EXPECT_EMPTY_REPORT(driver);
146    tap_key(key_a);
147}
148
149TEST_F(Leader, triggers_five_key_sequence) {
150    TestDriver driver;
151
152    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
153    auto key_a      = KeymapKey(0, 1, 0, KC_A);
154    auto key_b      = KeymapKey(0, 2, 0, KC_B);
155    auto key_c      = KeymapKey(0, 3, 0, KC_C);
156    auto key_d      = KeymapKey(0, 4, 0, KC_D);
157    auto key_e      = KeymapKey(0, 5, 0, KC_E);
158
159    set_keymap({key_leader, key_a, key_b, key_c, key_d, key_e});
160
161    EXPECT_EQ(leader_sequence_active(), false);
162
163    EXPECT_NO_REPORT(driver);
164    tap_key(key_leader);
165
166    EXPECT_EQ(leader_sequence_active(), true);
167
168    EXPECT_REPORT(driver, (KC_5));
169    EXPECT_EMPTY_REPORT(driver);
170    tap_key(key_a);
171    tap_key(key_b);
172    tap_key(key_c);
173    tap_key(key_d);
174    tap_key(key_e);
175
176    EXPECT_EQ(leader_sequence_timed_out(), false);
177
178    idle_for(300);
179
180    EXPECT_EQ(leader_sequence_active(), false);
181    EXPECT_EQ(leader_sequence_timed_out(), true);
182
183    EXPECT_REPORT(driver, (KC_A));
184    EXPECT_EMPTY_REPORT(driver);
185    tap_key(key_a);
186}
187
188TEST_F(Leader, extracts_mod_tap_keycode) {
189    TestDriver driver;
190
191    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
192    auto key_mt     = KeymapKey(0, 1, 0, LSFT_T(KC_A));
193
194    set_keymap({key_leader, key_mt});
195
196    tap_key(key_leader);
197
198    EXPECT_REPORT(driver, (KC_1));
199    EXPECT_EMPTY_REPORT(driver);
200    tap_key(key_mt);
201
202    EXPECT_EQ(leader_sequence_one_key(KC_A), true);
203
204    idle_for(300);
205}
206
207TEST_F(Leader, extracts_layer_tap_keycode) {
208    TestDriver driver;
209
210    auto key_leader = KeymapKey(0, 0, 0, QK_LEADER);
211    auto key_lt     = KeymapKey(0, 1, 0, LT(1, KC_A));
212
213    set_keymap({key_leader, key_lt});
214
215    tap_key(key_leader);
216
217    EXPECT_REPORT(driver, (KC_1));
218    EXPECT_EMPTY_REPORT(driver);
219    tap_key(key_lt);
220
221    EXPECT_EQ(leader_sequence_one_key(KC_A), true);
222
223    idle_for(300);
224}