xref: /aosp_15_r20/external/libchrome-gestures/src/metrics_filter_interpreter_unittest.cc (revision aed3e5085e770be5b69ce25295ecf6ddf906af95)
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