keyboard stuff
at master 256 lines 6.0 kB view raw
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}