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