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