1 // Copyright 2022 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <gtest/gtest.h>
6
7 #include "include/metrics_filter_interpreter.h"
8 #include "include/unittest_util.h"
9
10 namespace gestures {
11
12 namespace {
13
14 const HardwareProperties hwprops = {
15 .right = 100, .bottom = 100,
16 .res_x = 1, .res_y = 1,
17 .orientation_minimum = -1,
18 .orientation_maximum = 2,
19 .max_finger_cnt = 5, .max_touch_cnt = 5,
20 .supports_t5r2 = 0, .support_semi_mt = 0, .is_button_pad = 1,
21 .has_wheel = 0, .wheel_is_hi_res = 0,
22 .is_haptic_pad = 0,
23 };
24
25 } // namespace
26
27 class MetricsFilterInterpreterTest : public ::testing::Test {};
28
29 class MetricsFilterInterpreterTestInterpreter : public Interpreter {
30 public:
MetricsFilterInterpreterTestInterpreter()31 MetricsFilterInterpreterTestInterpreter()
32 : Interpreter(nullptr, nullptr, false),
33 handle_timer_called_(false) {}
34
SyncInterpret(HardwareState & hwstate,stime_t * timeout)35 virtual void SyncInterpret(HardwareState& hwstate, stime_t* timeout) {
36 EXPECT_EQ(1, hwstate.finger_cnt);
37 prev_ = hwstate.fingers[0];
38 }
39
HandleTimer(stime_t now,stime_t * timeout)40 virtual void HandleTimer(stime_t now, stime_t* timeout) {
41 handle_timer_called_ = true;
42 }
43
44 FingerState prev_;
45 bool handle_timer_called_;
46 };
47
48
TEST(MetricsFilterInterpreterTest,SimpleTestTouchpad)49 TEST(MetricsFilterInterpreterTest, SimpleTestTouchpad) {
50 MetricsFilterInterpreterTestInterpreter* base_interpreter =
51 new MetricsFilterInterpreterTestInterpreter;
52 MetricsFilterInterpreter interpreter(nullptr, base_interpreter, nullptr,
53 GESTURES_DEVCLASS_TOUCHPAD);
54
55 TestInterpreterWrapper wrapper(&interpreter, &hwprops);
56
57 EXPECT_FALSE(base_interpreter->handle_timer_called_);
58 wrapper.HandleTimer(0.0, nullptr);
59 EXPECT_TRUE(base_interpreter->handle_timer_called_);
60
61 FingerState finger_states[] = {
62 // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
63 // Consistent movement for 16 frames
64 {0, 0, 0, 0, 20, 0, 40, 20, 1, 0}, // 0
65 {0, 0, 0, 0, 20, 0, 40, 25, 1, 0}, // 1
66 {0, 0, 0, 0, 20, 0, 40, 30, 1, 0}, // 2
67 {0, 0, 0, 0, 20, 0, 40, 35, 1, 0}, // 3
68 {0, 0, 0, 0, 20, 0, 40, 40, 1, 0}, // 4
69 {0, 0, 0, 0, 20, 0, 40, 45, 1, 0}, // 5
70 {0, 0, 0, 0, 20, 0, 40, 50, 1, 0}, // 6
71 {0, 0, 0, 0, 20, 0, 40, 55, 1, 0}, // 7
72 {0, 0, 0, 0, 20, 0, 40, 60, 1, 0}, // 8
73 {0, 0, 0, 0, 20, 0, 40, 65, 1, 0}, // 9
74 {0, 0, 0, 0, 20, 0, 40, 70, 1, 0}, // 10
75 {0, 0, 0, 0, 20, 0, 40, 75, 1, 0}, // 11
76 {0, 0, 0, 0, 20, 0, 40, 80, 1, 0}, // 12
77 {0, 0, 0, 0, 20, 0, 40, 85, 1, 0}, // 13
78 {0, 0, 0, 0, 20, 0, 40, 90, 1, 0}, // 14
79 {0, 0, 0, 0, 20, 0, 40, 95, 1, 0}, // 15
80 };
81
82 HardwareState hardware_states[] = {
83 // time, buttons, finger count, touch count, finger states pointer
84 make_hwstate(1.00, 0, 1, 1, &finger_states[0]),
85 make_hwstate(1.01, 0, 1, 1, &finger_states[1]),
86 make_hwstate(1.02, 0, 1, 1, &finger_states[2]),
87 make_hwstate(1.03, 0, 1, 1, &finger_states[3]),
88 make_hwstate(1.04, 0, 1, 1, &finger_states[4]),
89 make_hwstate(1.05, 0, 1, 1, &finger_states[5]),
90 make_hwstate(1.06, 0, 1, 1, &finger_states[6]),
91 make_hwstate(1.07, 0, 1, 1, &finger_states[7]),
92 make_hwstate(1.08, 0, 1, 1, &finger_states[8]),
93 make_hwstate(1.09, 0, 1, 1, &finger_states[9]),
94 make_hwstate(1.10, 0, 1, 1, &finger_states[10]),
95 make_hwstate(1.11, 0, 1, 1, &finger_states[11]),
96 make_hwstate(1.12, 0, 1, 1, &finger_states[12]),
97 make_hwstate(1.13, 0, 1, 1, &finger_states[13]),
98 make_hwstate(1.14, 0, 1, 1, &finger_states[14]),
99 make_hwstate(1.15, 0, 1, 1, &finger_states[15]),
100 };
101
102 for (size_t i = 0; i < arraysize(hardware_states); i++) {
103 wrapper.SyncInterpret(hardware_states[i], nullptr);
104 }
105
106 EXPECT_EQ(interpreter.devclass_, GESTURES_DEVCLASS_TOUCHPAD);
107 EXPECT_EQ(interpreter.mouse_movement_session_index_, 0);
108 EXPECT_EQ(interpreter.mouse_movement_current_session_length, 0);
109 EXPECT_EQ(interpreter.mouse_movement_current_session_start, 0.0);
110 EXPECT_EQ(interpreter.mouse_movement_current_session_last, 0.0);
111 EXPECT_EQ(interpreter.mouse_movement_current_session_distance, 0.0);
112 EXPECT_EQ(interpreter.noisy_ground_distance_threshold_.val_, 10.0);
113 EXPECT_EQ(interpreter.noisy_ground_time_threshold_.val_, 0.1);
114 EXPECT_EQ(interpreter.mouse_moving_time_threshold_.val_, 0.05);
115 EXPECT_EQ(interpreter.mouse_control_warmup_sessions_.val_, 100);
116 }
117
TEST(MetricsFilterInterpreterTest,SimpleTestMultitouchMouse)118 TEST(MetricsFilterInterpreterTest, SimpleTestMultitouchMouse) {
119 MetricsFilterInterpreterTestInterpreter* base_interpreter =
120 new MetricsFilterInterpreterTestInterpreter;
121 MetricsFilterInterpreter interpreter(nullptr, base_interpreter, nullptr,
122 GESTURES_DEVCLASS_MULTITOUCH_MOUSE);
123
124 TestInterpreterWrapper wrapper(&interpreter, &hwprops);
125
126 EXPECT_FALSE(base_interpreter->handle_timer_called_);
127 wrapper.HandleTimer(0.0, nullptr);
128 EXPECT_TRUE(base_interpreter->handle_timer_called_);
129
130 FingerState finger_states[] = {
131 // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
132 // Consistent movement for 16 frames
133 {0, 0, 0, 0, 20, 0, 40, 20, 1, 0}, // 0
134 {0, 0, 0, 0, 20, 0, 40, 25, 1, 0}, // 1
135 {0, 0, 0, 0, 20, 0, 40, 30, 1, 0}, // 2
136 {0, 0, 0, 0, 20, 0, 40, 35, 1, 0}, // 3
137 {0, 0, 0, 0, 20, 0, 40, 40, 1, 0}, // 4
138 {0, 0, 0, 0, 20, 0, 40, 45, 1, 0}, // 5
139 {0, 0, 0, 0, 20, 0, 40, 50, 1, 0}, // 6
140 {0, 0, 0, 0, 20, 0, 40, 55, 1, 0}, // 7
141 {0, 0, 0, 0, 20, 0, 40, 60, 1, 0}, // 8
142 {0, 0, 0, 0, 20, 0, 40, 65, 1, 0}, // 9
143 {0, 0, 0, 0, 20, 0, 40, 70, 1, 0}, // 10
144 {0, 0, 0, 0, 20, 0, 40, 75, 1, 0}, // 11
145 {0, 0, 0, 0, 20, 0, 40, 80, 1, 0}, // 12
146 {0, 0, 0, 0, 20, 0, 40, 85, 1, 0}, // 13
147 {0, 0, 0, 0, 20, 0, 40, 90, 1, 0}, // 14
148 {0, 0, 0, 0, 20, 0, 40, 95, 1, 0}, // 15
149 };
150
151 HardwareState hardware_states[] = {
152 // time, buttons, finger count, touch count, finger states pointer
153 make_hwstate(1.00, 0, 1, 1, &finger_states[0]),
154 make_hwstate(1.01, 0, 1, 1, &finger_states[1]),
155 make_hwstate(1.02, 0, 1, 1, &finger_states[2]),
156 make_hwstate(1.03, 0, 1, 1, &finger_states[3]),
157 make_hwstate(1.04, 0, 1, 1, &finger_states[4]),
158 make_hwstate(1.05, 0, 1, 1, &finger_states[5]),
159 make_hwstate(1.06, 0, 1, 1, &finger_states[6]),
160 make_hwstate(1.07, 0, 1, 1, &finger_states[7]),
161 make_hwstate(1.08, 0, 1, 1, &finger_states[8]),
162 make_hwstate(1.09, 0, 1, 1, &finger_states[9]),
163 make_hwstate(1.10, 0, 1, 1, &finger_states[10]),
164 make_hwstate(1.11, 0, 1, 1, &finger_states[11]),
165 make_hwstate(1.12, 0, 1, 1, &finger_states[12]),
166 make_hwstate(1.13, 0, 1, 1, &finger_states[13]),
167 make_hwstate(1.14, 0, 1, 1, &finger_states[14]),
168 make_hwstate(1.15, 0, 1, 1, &finger_states[15]),
169 };
170
171 for (size_t i = 0; i < arraysize(hardware_states); i++) {
172 wrapper.SyncInterpret(hardware_states[i], nullptr);
173 }
174
175 EXPECT_EQ(interpreter.devclass_, GESTURES_DEVCLASS_MULTITOUCH_MOUSE);
176 EXPECT_EQ(interpreter.mouse_movement_session_index_, 0);
177 EXPECT_EQ(interpreter.mouse_movement_current_session_length, 0);
178 EXPECT_EQ(interpreter.mouse_movement_current_session_start, 0.0);
179 EXPECT_EQ(interpreter.mouse_movement_current_session_last, 0.0);
180 EXPECT_EQ(interpreter.mouse_movement_current_session_distance, 0.0);
181 EXPECT_EQ(interpreter.noisy_ground_distance_threshold_.val_, 10.0);
182 EXPECT_EQ(interpreter.noisy_ground_time_threshold_.val_, 0.1);
183 EXPECT_EQ(interpreter.mouse_moving_time_threshold_.val_, 0.05);
184 EXPECT_EQ(interpreter.mouse_control_warmup_sessions_.val_, 100);
185 }
186
TEST(MetricsFilterInterpreterTest,SimpleTestPointingStick)187 TEST(MetricsFilterInterpreterTest, SimpleTestPointingStick) {
188 MetricsFilterInterpreterTestInterpreter* base_interpreter =
189 new MetricsFilterInterpreterTestInterpreter;
190 MetricsFilterInterpreter interpreter(nullptr, base_interpreter, nullptr,
191 GESTURES_DEVCLASS_POINTING_STICK);
192
193 TestInterpreterWrapper wrapper(&interpreter, &hwprops);
194
195 EXPECT_FALSE(base_interpreter->handle_timer_called_);
196 wrapper.HandleTimer(0.0, nullptr);
197 EXPECT_TRUE(base_interpreter->handle_timer_called_);
198
199 EXPECT_EQ(interpreter.devclass_, GESTURES_DEVCLASS_POINTING_STICK);
200 EXPECT_EQ(interpreter.mouse_movement_session_index_, 0);
201 EXPECT_EQ(interpreter.mouse_movement_current_session_length, 0);
202 EXPECT_EQ(interpreter.mouse_movement_current_session_start, 0.0);
203 EXPECT_EQ(interpreter.mouse_movement_current_session_last, 0.0);
204 EXPECT_EQ(interpreter.mouse_movement_current_session_distance, 0.0);
205 EXPECT_EQ(interpreter.noisy_ground_distance_threshold_.val_, 10.0);
206 EXPECT_EQ(interpreter.noisy_ground_time_threshold_.val_, 0.1);
207 EXPECT_EQ(interpreter.mouse_moving_time_threshold_.val_, 0.05);
208 EXPECT_EQ(interpreter.mouse_control_warmup_sessions_.val_, 100);
209 }
210
211 } // namespace gestures
212