keyboard stuff
1/* Copyright 2021 Balz Guenat
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#include "gmock/gmock.h"
19#include <vector>
20#include <algorithm>
21#include <stdio.h>
22
23extern "C" {
24#include "encoder.h"
25#include "keyboard.h"
26#include "encoder/tests/mock_split.h"
27}
28
29struct update {
30 int8_t index;
31 bool clockwise;
32};
33
34uint8_t num_updates = 0;
35
36bool isMaster;
37bool isLeftHand;
38
39bool is_keyboard_master(void) {
40 return isMaster;
41}
42
43bool encoder_update_kb(uint8_t index, bool clockwise) {
44 if (!isMaster) {
45 ADD_FAILURE() << "We shouldn't get here.";
46 }
47 num_updates++;
48 return true;
49}
50
51bool setAndRead(pin_t pin, bool val) {
52 setPin(pin, val);
53 return encoder_task();
54}
55
56class EncoderSplitTestRole : public ::testing::Test {
57 protected:
58 void SetUp() override {
59 num_updates = 0;
60 for (int i = 0; i < 32; i++) {
61 pinIsInputHigh[i] = 0;
62 pins[i] = 0;
63 }
64 }
65};
66
67TEST_F(EncoderSplitTestRole, TestPrimaryLeft) {
68 isMaster = true;
69 isLeftHand = true;
70 encoder_init();
71 // send 4 pulses. with resolution 4, that's one step and we should get 1 update.
72 setAndRead(0, false);
73 setAndRead(1, false);
74 setAndRead(0, true);
75 setAndRead(1, true);
76
77 EXPECT_EQ(num_updates, 1); // one update received
78}
79
80TEST_F(EncoderSplitTestRole, TestPrimaryRight) {
81 isMaster = true;
82 isLeftHand = false;
83 encoder_init();
84 // send 4 pulses. with resolution 4, that's one step and we should get 1 update.
85 setAndRead(6, false);
86 setAndRead(7, false);
87 setAndRead(6, true);
88 setAndRead(7, true);
89
90 EXPECT_EQ(num_updates, 1); // one update received
91}
92
93TEST_F(EncoderSplitTestRole, TestNotPrimaryLeft) {
94 isMaster = false;
95 isLeftHand = true;
96 encoder_init();
97 // send 4 pulses. with resolution 4, that's one step and we should get 1 update.
98 setAndRead(0, false);
99 setAndRead(1, false);
100 setAndRead(0, true);
101 setAndRead(1, true);
102
103 EXPECT_EQ(num_updates, 0); // zero updates received
104}
105
106TEST_F(EncoderSplitTestRole, TestNotPrimaryRight) {
107 isMaster = false;
108 isLeftHand = false;
109 encoder_init();
110 // send 4 pulses. with resolution 4, that's one step and we should get 1 update.
111 setAndRead(6, false);
112 setAndRead(7, false);
113 setAndRead(6, true);
114 setAndRead(7, true);
115
116 EXPECT_EQ(num_updates, 0); // zero updates received
117}