qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

sym_defer_g_tests.cpp (6045B)


      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 
     21 TEST_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 
     35 TEST_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 
     49 TEST_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 
     63 TEST_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 
     73 TEST_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 
     87 TEST_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 
    102 TEST_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 
    117 TEST_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 
    135 TEST_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 
    151 TEST_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 
    164 TEST_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 
    180 TEST_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 
    196 TEST_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 
    212 TEST_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 
    224 TEST_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 
    240 TEST_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 }