xref: /aosp_15_r20/external/libchrome-gestures/src/mouse_interpreter_unittest.cc (revision aed3e5085e770be5b69ce25295ecf6ddf906af95)
1*aed3e508SAndroid Build Coastguard Worker // Copyright 2012 The ChromiumOS Authors
2*aed3e508SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*aed3e508SAndroid Build Coastguard Worker // found in the LICENSE file.
4*aed3e508SAndroid Build Coastguard Worker 
5*aed3e508SAndroid Build Coastguard Worker #include <gtest/gtest.h>
6*aed3e508SAndroid Build Coastguard Worker 
7*aed3e508SAndroid Build Coastguard Worker #include "include/gestures.h"
8*aed3e508SAndroid Build Coastguard Worker #include "include/mouse_interpreter.h"
9*aed3e508SAndroid Build Coastguard Worker #include "include/unittest_util.h"
10*aed3e508SAndroid Build Coastguard Worker #include "include/util.h"
11*aed3e508SAndroid Build Coastguard Worker 
12*aed3e508SAndroid Build Coastguard Worker namespace gestures {
13*aed3e508SAndroid Build Coastguard Worker 
make_hwprops_for_mouse(unsigned has_wheel,unsigned wheel_is_hi_res)14*aed3e508SAndroid Build Coastguard Worker HardwareProperties make_hwprops_for_mouse(
15*aed3e508SAndroid Build Coastguard Worker     unsigned has_wheel, unsigned wheel_is_hi_res) {
16*aed3e508SAndroid Build Coastguard Worker   return {
17*aed3e508SAndroid Build Coastguard Worker     .right = 0,
18*aed3e508SAndroid Build Coastguard Worker     .bottom = 0,
19*aed3e508SAndroid Build Coastguard Worker     .res_x = 0,
20*aed3e508SAndroid Build Coastguard Worker     .res_y = 0,
21*aed3e508SAndroid Build Coastguard Worker     .orientation_minimum = 0,
22*aed3e508SAndroid Build Coastguard Worker     .orientation_maximum = 0,
23*aed3e508SAndroid Build Coastguard Worker     .max_finger_cnt = 0,
24*aed3e508SAndroid Build Coastguard Worker     .max_touch_cnt = 0,
25*aed3e508SAndroid Build Coastguard Worker     .supports_t5r2 = 0,
26*aed3e508SAndroid Build Coastguard Worker     .support_semi_mt = 0,
27*aed3e508SAndroid Build Coastguard Worker     .is_button_pad = 0,
28*aed3e508SAndroid Build Coastguard Worker     .has_wheel = has_wheel,
29*aed3e508SAndroid Build Coastguard Worker     .wheel_is_hi_res = wheel_is_hi_res,
30*aed3e508SAndroid Build Coastguard Worker     .is_haptic_pad = 0,
31*aed3e508SAndroid Build Coastguard Worker   };
32*aed3e508SAndroid Build Coastguard Worker }
33*aed3e508SAndroid Build Coastguard Worker 
34*aed3e508SAndroid Build Coastguard Worker class MouseInterpreterTest : public ::testing::Test {};
35*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,SimpleTest)36*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, SimpleTest) {
37*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(1, 0);
38*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
39*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
40*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
41*aed3e508SAndroid Build Coastguard Worker 
42*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
43*aed3e508SAndroid Build Coastguard Worker     { 200000, 0, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
44*aed3e508SAndroid Build Coastguard Worker     { 210000, 0, 0, 0, nullptr, 9, -7, 0, 0, 0, 0.0 },
45*aed3e508SAndroid Build Coastguard Worker     { 220000, 1, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
46*aed3e508SAndroid Build Coastguard Worker     { 230000, 0, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
47*aed3e508SAndroid Build Coastguard Worker     { 240000, 0, 0, 0, nullptr, 0, 0, -3, -360, 4, 0.0 },
48*aed3e508SAndroid Build Coastguard Worker   };
49*aed3e508SAndroid Build Coastguard Worker 
50*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
51*aed3e508SAndroid Build Coastguard Worker 
52*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
53*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, gs);
54*aed3e508SAndroid Build Coastguard Worker 
55*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
56*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
57*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMove, gs->type);
58*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(9, gs->details.move.dx);
59*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(-7, gs->details.move.dy);
60*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(200000, gs->start_time);
61*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(210000, gs->end_time);
62*aed3e508SAndroid Build Coastguard Worker 
63*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[2], nullptr);
64*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
65*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeButtonsChange, gs->type);
66*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(1, gs->details.buttons.down);
67*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.buttons.up);
68*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(210000, gs->start_time);
69*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(220000, gs->end_time);
70*aed3e508SAndroid Build Coastguard Worker 
71*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[3], nullptr);
72*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
73*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeButtonsChange, gs->type);
74*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.buttons.down);
75*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(1, gs->details.buttons.up);
76*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(220000, gs->start_time);
77*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(230000, gs->end_time);
78*aed3e508SAndroid Build Coastguard Worker 
79*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[4], nullptr);
80*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
81*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
82*aed3e508SAndroid Build Coastguard Worker   EXPECT_LT(-1, gs->details.wheel.dx);
83*aed3e508SAndroid Build Coastguard Worker   EXPECT_GT(1, gs->details.wheel.dy);
84*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(240000, gs->start_time);
85*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(240000, gs->end_time);
86*aed3e508SAndroid Build Coastguard Worker }
87*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,HighResolutionVerticalScrollTest)88*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, HighResolutionVerticalScrollTest) {
89*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(1, 1);
90*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
91*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
92*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
93*aed3e508SAndroid Build Coastguard Worker 
94*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
95*aed3e508SAndroid Build Coastguard Worker     { 200000, 0, 0, 0, nullptr, 0, 0,  0,   0, 0, 0.0 },
96*aed3e508SAndroid Build Coastguard Worker     { 210000, 0, 0, 0, nullptr, 0, 0,  0, -15, 0, 0.0 },
97*aed3e508SAndroid Build Coastguard Worker     { 220000, 0, 0, 0, nullptr, 0, 0, -1, -15, 0, 0.0 },
98*aed3e508SAndroid Build Coastguard Worker     { 230000, 0, 0, 0, nullptr, 0, 0,  0,-120, 0, 0.0 },
99*aed3e508SAndroid Build Coastguard Worker     { 240000, 0, 0, 0, nullptr, 0, 0, -1,   0, 0, 0.0 },
100*aed3e508SAndroid Build Coastguard Worker   };
101*aed3e508SAndroid Build Coastguard Worker 
102*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
103*aed3e508SAndroid Build Coastguard Worker   mi.hi_res_scrolling_.val_ = 1;
104*aed3e508SAndroid Build Coastguard Worker   mi.scroll_velocity_buffer_size_.val_ = 1;
105*aed3e508SAndroid Build Coastguard Worker 
106*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
107*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, gs);
108*aed3e508SAndroid Build Coastguard Worker 
109*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
110*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
111*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
112*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
113*aed3e508SAndroid Build Coastguard Worker   float offset_of_8th_notch_scroll = gs->details.wheel.dy;
114*aed3e508SAndroid Build Coastguard Worker   EXPECT_LT(1, offset_of_8th_notch_scroll);
115*aed3e508SAndroid Build Coastguard Worker 
116*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[2], nullptr);
117*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
118*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
119*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
120*aed3e508SAndroid Build Coastguard Worker   // Having a low-res scroll event as well as the high-resolution one shouldn't
121*aed3e508SAndroid Build Coastguard Worker   // change the output value.
122*aed3e508SAndroid Build Coastguard Worker   EXPECT_NEAR(offset_of_8th_notch_scroll, gs->details.wheel.dy, 0.1);
123*aed3e508SAndroid Build Coastguard Worker 
124*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[3], nullptr);
125*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
126*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
127*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
128*aed3e508SAndroid Build Coastguard Worker   float offset_of_high_res_scroll = gs->details.wheel.dy;
129*aed3e508SAndroid Build Coastguard Worker 
130*aed3e508SAndroid Build Coastguard Worker   mi.hi_res_scrolling_.val_ = 0;
131*aed3e508SAndroid Build Coastguard Worker 
132*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[4], nullptr);
133*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
134*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
135*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
136*aed3e508SAndroid Build Coastguard Worker   // A high-res scroll should yield the same offset as a low-res one with
137*aed3e508SAndroid Build Coastguard Worker   // proper unit conversion.
138*aed3e508SAndroid Build Coastguard Worker   EXPECT_NEAR(offset_of_high_res_scroll, gs->details.wheel.dy, 0.1);
139*aed3e508SAndroid Build Coastguard Worker }
140*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,ScrollAccelerationOnAndOffTest)141*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, ScrollAccelerationOnAndOffTest) {
142*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(1, 1);
143*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
144*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
145*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
146*aed3e508SAndroid Build Coastguard Worker 
147*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
148*aed3e508SAndroid Build Coastguard Worker     { 200000, 0, 0, 0, nullptr, 0, 0,  0, 0, 0, 0.0 },
149*aed3e508SAndroid Build Coastguard Worker     { 210000, 0, 0, 0, nullptr, 0, 0,  5, 0, 0, 0.0 },
150*aed3e508SAndroid Build Coastguard Worker     { 220000, 0, 0, 0, nullptr, 0, 0,  5, 0, 0, 0.0 },
151*aed3e508SAndroid Build Coastguard Worker     { 230000, 0, 0, 0, nullptr, 0, 0, 10, 0, 0, 0.0 },
152*aed3e508SAndroid Build Coastguard Worker     { 240000, 0, 0, 0, nullptr, 0, 0, 10, 0, 0, 0.0 },
153*aed3e508SAndroid Build Coastguard Worker   };
154*aed3e508SAndroid Build Coastguard Worker 
155*aed3e508SAndroid Build Coastguard Worker   // Scroll acceleration is on.
156*aed3e508SAndroid Build Coastguard Worker   mi.scroll_acceleration_.val_ = true;
157*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
158*aed3e508SAndroid Build Coastguard Worker   mi.hi_res_scrolling_.val_ = false;
159*aed3e508SAndroid Build Coastguard Worker   mi.scroll_velocity_buffer_size_.val_ = 1;
160*aed3e508SAndroid Build Coastguard Worker 
161*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
162*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, gs);
163*aed3e508SAndroid Build Coastguard Worker 
164*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
165*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
166*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
167*aed3e508SAndroid Build Coastguard Worker   EXPECT_NE(0, gs->details.scroll.dy);
168*aed3e508SAndroid Build Coastguard Worker 
169*aed3e508SAndroid Build Coastguard Worker   float offset_when_acceleration_on = gs->details.scroll.dy;
170*aed3e508SAndroid Build Coastguard Worker 
171*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[2], nullptr);
172*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
173*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
174*aed3e508SAndroid Build Coastguard Worker   EXPECT_NE(0, gs->details.scroll.dy);
175*aed3e508SAndroid Build Coastguard Worker   // When acceleration is on, the offset is related to scroll speed. Though
176*aed3e508SAndroid Build Coastguard Worker   // the wheel displacement are both 5, since the scroll speeds are different,
177*aed3e508SAndroid Build Coastguard Worker   // the offset are different.
178*aed3e508SAndroid Build Coastguard Worker   EXPECT_NE(offset_when_acceleration_on, gs->details.scroll.dy);
179*aed3e508SAndroid Build Coastguard Worker 
180*aed3e508SAndroid Build Coastguard Worker   // Turn scroll acceleration off.
181*aed3e508SAndroid Build Coastguard Worker   mi.scroll_acceleration_.val_ = false;
182*aed3e508SAndroid Build Coastguard Worker 
183*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[3], nullptr);
184*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
185*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
186*aed3e508SAndroid Build Coastguard Worker   EXPECT_NE(0, gs->details.scroll.dy);
187*aed3e508SAndroid Build Coastguard Worker 
188*aed3e508SAndroid Build Coastguard Worker   float offset_when_acceleration_off = gs->details.scroll.dy;
189*aed3e508SAndroid Build Coastguard Worker 
190*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[4], nullptr);
191*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
192*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
193*aed3e508SAndroid Build Coastguard Worker   EXPECT_NE(0, gs->details.scroll.dy);
194*aed3e508SAndroid Build Coastguard Worker   // When acceleration is off, the offset is not related to scroll speed.
195*aed3e508SAndroid Build Coastguard Worker   // Same wheel displacement yields to same offset.
196*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(offset_when_acceleration_off, gs->details.scroll.dy);
197*aed3e508SAndroid Build Coastguard Worker }
198*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,JankyScrollTest)199*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, JankyScrollTest) {
200*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(1, 0);
201*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
202*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
203*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
204*aed3e508SAndroid Build Coastguard Worker 
205*aed3e508SAndroid Build Coastguard Worker   // Because we do not allow time deltas less than 8ms when calculating scroll
206*aed3e508SAndroid Build Coastguard Worker   // acceleration, the last two scroll events should give the same dy
207*aed3e508SAndroid Build Coastguard Worker   // (timestamp is in units of seconds)
208*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
209*aed3e508SAndroid Build Coastguard Worker     { 200000,      0, 0, 0, nullptr, 0, 0, -1, 0, 0, 0.0 },
210*aed3e508SAndroid Build Coastguard Worker     { 200000.008,  0, 0, 0, nullptr, 0, 0, -1, 0, 0, 0.0 },
211*aed3e508SAndroid Build Coastguard Worker     { 200000.0085, 0, 0, 0, nullptr, 0, 0, -1, 0, 0, 0.0 },
212*aed3e508SAndroid Build Coastguard Worker   };
213*aed3e508SAndroid Build Coastguard Worker 
214*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
215*aed3e508SAndroid Build Coastguard Worker   mi.scroll_velocity_buffer_size_.val_ = 1;
216*aed3e508SAndroid Build Coastguard Worker 
217*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
218*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
219*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
220*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
221*aed3e508SAndroid Build Coastguard Worker   // Ignore the dy from the first scroll event, as the gesture interpreter
222*aed3e508SAndroid Build Coastguard Worker   // hardcodes that time delta to 1 second, making it invalid for this test.
223*aed3e508SAndroid Build Coastguard Worker 
224*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
225*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
226*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
227*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
228*aed3e508SAndroid Build Coastguard Worker   float scroll_offset = gs->details.wheel.dy;
229*aed3e508SAndroid Build Coastguard Worker 
230*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[2], nullptr);
231*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
232*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
233*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.wheel.dx);
234*aed3e508SAndroid Build Coastguard Worker 
235*aed3e508SAndroid Build Coastguard Worker   EXPECT_NEAR(scroll_offset, gs->details.wheel.dy, 0.1);
236*aed3e508SAndroid Build Coastguard Worker }
237*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,WheelTickReportingHighResTest)238*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, WheelTickReportingHighResTest) {
239*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(1, 1);
240*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
241*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
242*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
243*aed3e508SAndroid Build Coastguard Worker 
244*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
245*aed3e508SAndroid Build Coastguard Worker     { 200000, 0, 0, 0, nullptr, 0, 0, 0,   0, 0, 0.0 },
246*aed3e508SAndroid Build Coastguard Worker     { 210000, 0, 0, 0, nullptr, 0, 0, 0, -30, 0, 0.0 },
247*aed3e508SAndroid Build Coastguard Worker   };
248*aed3e508SAndroid Build Coastguard Worker 
249*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
250*aed3e508SAndroid Build Coastguard Worker   mi.hi_res_scrolling_.val_ = true;
251*aed3e508SAndroid Build Coastguard Worker 
252*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
253*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, gs);
254*aed3e508SAndroid Build Coastguard Worker 
255*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
256*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
257*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
258*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ( 0, gs->details.wheel.tick_120ths_dx);
259*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(30, gs->details.wheel.tick_120ths_dy);
260*aed3e508SAndroid Build Coastguard Worker }
261*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,WheelTickReportingLowResTest)262*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, WheelTickReportingLowResTest) {
263*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(1, 0);
264*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
265*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
266*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
267*aed3e508SAndroid Build Coastguard Worker 
268*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
269*aed3e508SAndroid Build Coastguard Worker     { 200000, 0, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
270*aed3e508SAndroid Build Coastguard Worker     { 210000, 0, 0, 0, nullptr, 0, 0, 1, 0, 0, 0.0 },
271*aed3e508SAndroid Build Coastguard Worker     { 210000, 0, 0, 0, nullptr, 0, 0, 0, 0, 1, 0.0 },
272*aed3e508SAndroid Build Coastguard Worker   };
273*aed3e508SAndroid Build Coastguard Worker 
274*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
275*aed3e508SAndroid Build Coastguard Worker   mi.hi_res_scrolling_.val_ = false;
276*aed3e508SAndroid Build Coastguard Worker 
277*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
278*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, gs);
279*aed3e508SAndroid Build Coastguard Worker 
280*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
281*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
282*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
283*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(   0, gs->details.wheel.tick_120ths_dx);
284*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(-120, gs->details.wheel.tick_120ths_dy);
285*aed3e508SAndroid Build Coastguard Worker 
286*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[2], nullptr);
287*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
288*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMouseWheel, gs->type);
289*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(120, gs->details.wheel.tick_120ths_dx);
290*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(  0, gs->details.wheel.tick_120ths_dy);
291*aed3e508SAndroid Build Coastguard Worker }
292*aed3e508SAndroid Build Coastguard Worker 
TEST(MouseInterpreterTest,EmulateScrollWheelTest)293*aed3e508SAndroid Build Coastguard Worker TEST(MouseInterpreterTest, EmulateScrollWheelTest) {
294*aed3e508SAndroid Build Coastguard Worker   HardwareProperties hwprops = make_hwprops_for_mouse(0, 0);
295*aed3e508SAndroid Build Coastguard Worker   MouseInterpreter mi(nullptr, nullptr);
296*aed3e508SAndroid Build Coastguard Worker   TestInterpreterWrapper wrapper(&mi, &hwprops);
297*aed3e508SAndroid Build Coastguard Worker   Gesture* gs;
298*aed3e508SAndroid Build Coastguard Worker 
299*aed3e508SAndroid Build Coastguard Worker   HardwareState hwstates[] = {
300*aed3e508SAndroid Build Coastguard Worker     { 200000, GESTURES_BUTTON_NONE, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
301*aed3e508SAndroid Build Coastguard Worker     { 210000, GESTURES_BUTTON_NONE, 0, 0, nullptr, 9, -7, 0, 0, 0, 0.0 },
302*aed3e508SAndroid Build Coastguard Worker     { 220000, GESTURES_BUTTON_LEFT, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
303*aed3e508SAndroid Build Coastguard Worker     { 230000, GESTURES_BUTTON_LEFT + GESTURES_BUTTON_RIGHT, 0, 0, nullptr,
304*aed3e508SAndroid Build Coastguard Worker       0, 0, 0, 0, 0, 0.0 },
305*aed3e508SAndroid Build Coastguard Worker     { 240000, GESTURES_BUTTON_LEFT + GESTURES_BUTTON_RIGHT, 0, 0, nullptr,
306*aed3e508SAndroid Build Coastguard Worker       2, 2, 0, 0, 0, 0.0 },
307*aed3e508SAndroid Build Coastguard Worker     { 250000, GESTURES_BUTTON_NONE, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
308*aed3e508SAndroid Build Coastguard Worker     { 260000, GESTURES_BUTTON_NONE, 0, 0, nullptr, 9, -7, 0, 0, 0, 0.0 },
309*aed3e508SAndroid Build Coastguard Worker     { 270000, GESTURES_BUTTON_MIDDLE, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
310*aed3e508SAndroid Build Coastguard Worker     { 280000, GESTURES_BUTTON_MIDDLE, 0, 0, nullptr, 0, 0, 0, 0, 0, 0.0 },
311*aed3e508SAndroid Build Coastguard Worker     { 290000, GESTURES_BUTTON_NONE, 0, 0, nullptr, 0, 0, -3, -360, 4, 0.0 },
312*aed3e508SAndroid Build Coastguard Worker   };
313*aed3e508SAndroid Build Coastguard Worker 
314*aed3e508SAndroid Build Coastguard Worker   mi.output_mouse_wheel_gestures_.val_ = true;
315*aed3e508SAndroid Build Coastguard Worker 
316*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[0], nullptr);
317*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, gs);
318*aed3e508SAndroid Build Coastguard Worker 
319*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[1], nullptr);
320*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
321*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMove, gs->type);
322*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(9, gs->details.move.dx);
323*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(-7, gs->details.move.dy);
324*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(200000, gs->start_time);
325*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(210000, gs->end_time);
326*aed3e508SAndroid Build Coastguard Worker 
327*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[2], nullptr);
328*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
329*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeButtonsChange, gs->type);
330*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(1, gs->details.buttons.down);
331*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.buttons.up);
332*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(210000, gs->start_time);
333*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(220000, gs->end_time);
334*aed3e508SAndroid Build Coastguard Worker 
335*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[3], nullptr);
336*aed3e508SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, gs);
337*aed3e508SAndroid Build Coastguard Worker 
338*aed3e508SAndroid Build Coastguard Worker   // Temporarily adjust the threshold to force wheel_emulation_active_
339*aed3e508SAndroid Build Coastguard Worker   auto thresh = mi.scroll_wheel_emulation_thresh_.val_;
340*aed3e508SAndroid Build Coastguard Worker   mi.scroll_wheel_emulation_thresh_.val_ = 0.1;
341*aed3e508SAndroid Build Coastguard Worker   EXPECT_FALSE(mi.wheel_emulation_active_);
342*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[4], nullptr);
343*aed3e508SAndroid Build Coastguard Worker   EXPECT_TRUE(mi.wheel_emulation_active_);
344*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
345*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeScroll, gs->type);
346*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(200, gs->details.scroll.dx);
347*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(200, gs->details.scroll.dy);
348*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(240000, gs->start_time);
349*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(240000, gs->end_time);
350*aed3e508SAndroid Build Coastguard Worker   mi.scroll_wheel_emulation_thresh_.val_ = thresh;
351*aed3e508SAndroid Build Coastguard Worker 
352*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[5], nullptr);
353*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
354*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeButtonsChange, gs->type);
355*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.buttons.down);
356*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(5, gs->details.buttons.up);
357*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(240000, gs->start_time);
358*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(250000, gs->end_time);
359*aed3e508SAndroid Build Coastguard Worker 
360*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[6], nullptr);
361*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
362*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeMove, gs->type);
363*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(9, gs->details.move.dx);
364*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(-7, gs->details.move.dy);
365*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(250000, gs->start_time);
366*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(260000, gs->end_time);
367*aed3e508SAndroid Build Coastguard Worker 
368*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[7], nullptr);
369*aed3e508SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, gs);
370*aed3e508SAndroid Build Coastguard Worker 
371*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[8], nullptr);
372*aed3e508SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, gs);
373*aed3e508SAndroid Build Coastguard Worker 
374*aed3e508SAndroid Build Coastguard Worker   gs = wrapper.SyncInterpret(hwstates[9], nullptr);
375*aed3e508SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, gs);
376*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(kGestureTypeButtonsChange, gs->type);
377*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(0, gs->details.buttons.down);
378*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(2, gs->details.buttons.up);
379*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(280000, gs->start_time);
380*aed3e508SAndroid Build Coastguard Worker   EXPECT_EQ(290000, gs->end_time);
381*aed3e508SAndroid Build Coastguard Worker }
382*aed3e508SAndroid Build Coastguard Worker 
383*aed3e508SAndroid Build Coastguard Worker }  // namespace gestures
384