keyboard stuff
1// Copyright 2024 Dasky (@daskygit)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "gtest/gtest.h"
5#include "mouse_report_util.hpp"
6#include "test_common.hpp"
7#include "test_pointing_device_driver.h"
8#include "mousekey.h"
9
10using testing::_;
11
12class Pointing : public TestFixture {};
13class PointingButtonsViaMousekeysParametrized : public ::testing::WithParamInterface<std::pair<KeymapKey, uint8_t>>, public Pointing {};
14
15TEST_F(Pointing, NoMovementOnInitFailure) {
16 TestDriver driver;
17
18 pointing_device_set_status(POINTING_DEVICE_STATUS_INIT_FAILED);
19 pd_set_x(-50);
20 pd_set_y(100);
21 EXPECT_NO_MOUSE_REPORT(driver);
22 run_one_scan_loop();
23
24 pointing_device_set_status(POINTING_DEVICE_STATUS_SUCCESS);
25 EXPECT_MOUSE_REPORT(driver, (-50, 100, 0, 0, 0));
26 run_one_scan_loop();
27
28 pd_clear_movement();
29 // EXPECT_EMPTY_MOUSE_REPORT(driver);
30 run_one_scan_loop();
31
32 VERIFY_AND_CLEAR(driver);
33}
34
35TEST_F(Pointing, SendMouseIsNotCalledWithNoInput) {
36 TestDriver driver;
37 EXPECT_NO_MOUSE_REPORT(driver);
38 run_one_scan_loop();
39}
40
41TEST_F(Pointing, Xnegative) {
42 TestDriver driver;
43
44 pd_set_x(-10);
45 EXPECT_MOUSE_REPORT(driver, (-10, 0, 0, 0, 0));
46 run_one_scan_loop();
47
48 pd_clear_movement();
49 // EXPECT_EMPTY_MOUSE_REPORT(driver);
50 run_one_scan_loop();
51
52 VERIFY_AND_CLEAR(driver);
53}
54
55TEST_F(Pointing, Xpositive) {
56 TestDriver driver;
57
58 pd_set_x(10);
59 EXPECT_MOUSE_REPORT(driver, (10, 0, 0, 0, 0));
60 run_one_scan_loop();
61
62 pd_clear_movement();
63 // EXPECT_EMPTY_MOUSE_REPORT(driver);
64 run_one_scan_loop();
65
66 VERIFY_AND_CLEAR(driver);
67}
68
69TEST_F(Pointing, Ynegative) {
70 TestDriver driver;
71
72 pd_set_y(-20);
73 EXPECT_MOUSE_REPORT(driver, (0, -20, 0, 0, 0));
74 run_one_scan_loop();
75
76 pd_clear_movement();
77 // EXPECT_EMPTY_MOUSE_REPORT(driver);
78 run_one_scan_loop();
79
80 VERIFY_AND_CLEAR(driver);
81}
82
83TEST_F(Pointing, Ypositive) {
84 TestDriver driver;
85
86 pd_set_y(20);
87 EXPECT_MOUSE_REPORT(driver, (0, 20, 0, 0, 0));
88 run_one_scan_loop();
89
90 pd_clear_movement();
91 // EXPECT_EMPTY_MOUSE_REPORT(driver);
92 run_one_scan_loop();
93
94 VERIFY_AND_CLEAR(driver);
95}
96
97TEST_F(Pointing, XandY) {
98 TestDriver driver;
99
100 pd_set_x(-50);
101 pd_set_y(100);
102 EXPECT_MOUSE_REPORT(driver, (-50, 100, 0, 0, 0));
103 run_one_scan_loop();
104
105 pd_clear_movement();
106 // EXPECT_EMPTY_MOUSE_REPORT(driver);
107 run_one_scan_loop();
108
109 VERIFY_AND_CLEAR(driver);
110}
111
112TEST_F(Pointing, CorrectButtonIsReportedWhenPressed) {
113 TestDriver driver;
114
115 EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1));
116 pd_press_button(POINTING_DEVICE_BUTTON1);
117 run_one_scan_loop();
118
119 EXPECT_EMPTY_MOUSE_REPORT(driver);
120 pd_release_button(POINTING_DEVICE_BUTTON1);
121 run_one_scan_loop();
122
123 EXPECT_NO_MOUSE_REPORT(driver);
124 run_one_scan_loop();
125
126 pd_clear_all_buttons();
127 run_one_scan_loop();
128
129 VERIFY_AND_CLEAR(driver);
130}
131
132TEST_F(Pointing, CorrectButtonIsReportedWhenKeyPressed) {
133 TestDriver driver;
134 auto key = KeymapKey(0, 0, 0, QK_MOUSE_BUTTON_1);
135 set_keymap({key});
136
137 EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1));
138 key.press();
139 run_one_scan_loop();
140
141 EXPECT_EMPTY_MOUSE_REPORT(driver);
142 key.release();
143 run_one_scan_loop();
144
145 EXPECT_NO_MOUSE_REPORT(driver);
146 run_one_scan_loop();
147
148 VERIFY_AND_CLEAR(driver);
149}
150
151TEST_P(PointingButtonsViaMousekeysParametrized, MouseKeysViaPointingDriver) {
152 TestDriver driver;
153 KeymapKey mouse_key = GetParam().first;
154 uint8_t button_mask = GetParam().second;
155
156 set_keymap({mouse_key});
157
158 EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, button_mask));
159 mouse_key.press();
160 run_one_scan_loop();
161
162 EXPECT_EMPTY_MOUSE_REPORT(driver);
163 mouse_key.release();
164 run_one_scan_loop();
165
166 EXPECT_NO_MOUSE_REPORT(driver);
167 run_one_scan_loop();
168
169 VERIFY_AND_CLEAR(driver);
170}
171// clang-format off
172INSTANTIATE_TEST_CASE_P(
173 ButtonsOneToEight,
174 PointingButtonsViaMousekeysParametrized,
175 ::testing::Values(
176 // Key , Buttons Mask
177 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_1}, 1),
178 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_2}, 2),
179 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_3}, 4),
180 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_4}, 8),
181 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_5}, 16),
182 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_6}, 32),
183 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_7}, 64),
184 std::make_pair(KeymapKey{0, 0, 0, QK_MOUSE_BUTTON_8}, 128)
185 ));
186// clang-format on