keyboard stuff
1/* Copyright 2021 Simon Arlott
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 "gtest/gtest.h"
18
19#include "debounce_test_common.h"
20
21TEST_F(DebounceTest, OneKeyShort1) {
22 addEvents({
23 /* Time, Inputs, Outputs */
24 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
25
26 {5, {}, {}},
27 /* 0ms delay (fast scan rate) */
28 {5, {{0, 1, UP}}, {{0, 1, UP}}},
29
30 {10, {}, {}},
31 });
32 runEvents();
33}
34
35TEST_F(DebounceTest, OneKeyShort2) {
36 addEvents({
37 /* Time, Inputs, Outputs */
38 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
39
40 {5, {}, {}},
41 /* 1ms delay */
42 {6, {{0, 1, UP}}, {{0, 1, UP}}},
43
44 {11, {}, {}},
45 });
46 runEvents();
47}
48
49TEST_F(DebounceTest, OneKeyShort3) {
50 addEvents({
51 /* Time, Inputs, Outputs */
52 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
53
54 {5, {}, {}},
55 /* 2ms delay */
56 {7, {{0, 1, UP}}, {{0, 1, UP}}},
57
58 {12, {}, {}},
59 });
60 runEvents();
61}
62
63TEST_F(DebounceTest, OneKeyTooQuick1) {
64 addEvents({
65 /* Time, Inputs, Outputs */
66 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
67 /* Release key exactly on the debounce time */
68 {5, {{0, 1, UP}}, {{0, 1, UP}}},
69 });
70 runEvents();
71}
72
73TEST_F(DebounceTest, OneKeyTooQuick2) {
74 addEvents({
75 /* Time, Inputs, Outputs */
76 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
77
78 {5, {}, {}},
79 {6, {{0, 1, UP}}, {{0, 1, UP}}},
80
81 /* Press key exactly on the debounce time */
82 {11, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
83 });
84 runEvents();
85}
86
87TEST_F(DebounceTest, OneKeyBouncing1) {
88 addEvents({
89 /* Time, Inputs, Outputs */
90 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
91 {1, {{0, 1, UP}}, {{0, 1, UP}}},
92 {2, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
93 {3, {{0, 1, UP}}, {{0, 1, UP}}},
94 {4, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
95 {5, {{0, 1, UP}}, {{0, 1, UP}}},
96 {6, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
97 {11, {{0, 1, UP}}, {{0, 1, UP}}}, /* 5ms after DOWN at time 7 */
98 });
99 runEvents();
100}
101
102TEST_F(DebounceTest, OneKeyBouncing2) {
103 addEvents({
104 /* Time, Inputs, Outputs */
105 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
106 {5, {}, {}},
107 {6, {{0, 1, UP}}, {{0, 1, UP}}},
108 {7, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
109 {8, {{0, 1, UP}}, {{0, 1, UP}}},
110 {9, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
111 {10, {{0, 1, UP}}, {{0, 1, UP}}},
112 {15, {}, {}}, /* 5ms after UP at time 10 */
113 });
114 runEvents();
115}
116
117TEST_F(DebounceTest, OneKeyLong) {
118 addEvents({
119 /* Time, Inputs, Outputs */
120 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
121
122 {5, {}, {}},
123
124 {25, {{0, 1, UP}}, {{0, 1, UP}}},
125
126 {30, {}, {}},
127
128 {50, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
129
130 {55, {}, {}},
131 });
132 runEvents();
133}
134
135TEST_F(DebounceTest, TwoKeysShort) {
136 addEvents({
137 /* Time, Inputs, Outputs */
138 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
139 {1, {{0, 2, DOWN}}, {{0, 2, DOWN}}},
140
141 {6, {}, {}},
142
143 {7, {{0, 1, UP}}, {{0, 1, UP}}},
144 {8, {{0, 2, UP}}, {{0, 2, UP}}},
145
146 {13, {}, {}},
147 });
148 runEvents();
149}
150
151TEST_F(DebounceTest, TwoKeysSimultaneous1) {
152 addEvents({
153 /* Time, Inputs, Outputs */
154 {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {{0, 1, DOWN}, {0, 2, DOWN}}},
155
156 {5, {}, {}},
157 {6, {{0, 1, UP}, {0, 2, UP}}, {{0, 1, UP}, {0, 2, UP}}},
158
159 {11, {}, {}},
160 });
161 runEvents();
162}
163
164TEST_F(DebounceTest, TwoKeysSimultaneous2) {
165 addEvents({
166 /* Time, Inputs, Outputs */
167 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
168 {1, {{0, 2, DOWN}}, {{0, 2, DOWN}}},
169
170 {5, {}, {}},
171 {6, {}, {}},
172 {7, {{0, 1, UP}}, {{0, 1, UP}}},
173 {8, {{0, 2, UP}}, {{0, 2, UP}}},
174
175 {13, {}, {}},
176 });
177 runEvents();
178}
179
180TEST_F(DebounceTest, OneKeyDelayedScan1) {
181 addEvents({
182 /* Time, Inputs, Outputs */
183 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
184
185 /* Processing is very late */
186 {300, {}, {}},
187 /* Immediately release key */
188 {300, {{0, 1, UP}}, {{0, 1, UP}}},
189
190 {305, {}, {}},
191 });
192 time_jumps_ = true;
193 runEvents();
194}
195
196TEST_F(DebounceTest, OneKeyDelayedScan2) {
197 addEvents({
198 /* Time, Inputs, Outputs */
199 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
200
201 /* Processing is very late */
202 {300, {}, {}},
203 /* Release key after 1ms */
204 {301, {{0, 1, UP}}, {{0, 1, UP}}},
205
206 {306, {}, {}},
207 });
208 time_jumps_ = true;
209 runEvents();
210}
211
212TEST_F(DebounceTest, OneKeyDelayedScan3) {
213 addEvents({
214 /* Time, Inputs, Outputs */
215 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
216
217 /* Release key before debounce expires */
218 {300, {{0, 1, UP}}, {{0, 1, UP}}},
219 });
220 time_jumps_ = true;
221 runEvents();
222}
223
224TEST_F(DebounceTest, OneKeyDelayedScan4) {
225 addEvents({
226 /* Time, Inputs, Outputs */
227 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
228
229 /* Processing is a bit late */
230 {50, {}, {}},
231 /* Release key after 1ms */
232 {51, {{0, 1, UP}}, {{0, 1, UP}}},
233
234 {56, {}, {}},
235 });
236 time_jumps_ = true;
237 runEvents();
238}
239
240TEST_F(DebounceTest, AsyncTickOneKeyShort1) {
241 addEvents({
242 /* Time, Inputs, Outputs */
243 {0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
244
245 {5, {}, {}},
246 /* 0ms delay (fast scan rate) */
247 {5, {{0, 1, UP}}, {{0, 1, UP}}},
248
249 {10, {}, {}},
250 });
251 /*
252 * Debounce implementations should never read the timer more than once per invocation
253 */
254 async_time_jumps_ = DEBOUNCE;
255 runEvents();
256}