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 <stdio.h>
6*aed3e508SAndroid Build Coastguard Worker #include <string>
7*aed3e508SAndroid Build Coastguard Worker #include <vector>
8*aed3e508SAndroid Build Coastguard Worker
9*aed3e508SAndroid Build Coastguard Worker #include <gtest/gtest.h>
10*aed3e508SAndroid Build Coastguard Worker
11*aed3e508SAndroid Build Coastguard Worker #include "include/gestures.h"
12*aed3e508SAndroid Build Coastguard Worker #include "include/immediate_interpreter.h"
13*aed3e508SAndroid Build Coastguard Worker #include "include/string_util.h"
14*aed3e508SAndroid Build Coastguard Worker #include "include/unittest_util.h"
15*aed3e508SAndroid Build Coastguard Worker #include "include/util.h"
16*aed3e508SAndroid Build Coastguard Worker
17*aed3e508SAndroid Build Coastguard Worker namespace gestures {
18*aed3e508SAndroid Build Coastguard Worker
19*aed3e508SAndroid Build Coastguard Worker using std::string;
20*aed3e508SAndroid Build Coastguard Worker
21*aed3e508SAndroid Build Coastguard Worker class ImmediateInterpreterTest : public ::testing::Test {};
22*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ScrollEventTest)23*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ScrollEventTest) {
24*aed3e508SAndroid Build Coastguard Worker ScrollEvent ev1 = {1.0, 2.0, 3.0};
25*aed3e508SAndroid Build Coastguard Worker ScrollEvent ev2 = {10.0, 20.0, 30.0};
26*aed3e508SAndroid Build Coastguard Worker ScrollEvent ev3 = ScrollEvent::Add(ev1, ev2);
27*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(11.0, ev3.dx);
28*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(22.0, ev3.dy);
29*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(33.0, ev3.dt);
30*aed3e508SAndroid Build Coastguard Worker
31*aed3e508SAndroid Build Coastguard Worker ScrollEventBuffer evbuf(2);
32*aed3e508SAndroid Build Coastguard Worker evbuf.Insert(1.0, 2.0, 3.0, 0.0);
33*aed3e508SAndroid Build Coastguard Worker ev1 = evbuf.Get(0);
34*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(1.0, ev1.dx);
35*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(2.0, ev1.dy);
36*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(3.0, ev1.dt);
37*aed3e508SAndroid Build Coastguard Worker ev1 = evbuf.Get(3);
38*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.0, ev1.dx);
39*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.0, ev1.dy);
40*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.0, ev1.dt);
41*aed3e508SAndroid Build Coastguard Worker }
42*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,HardwareStateBufferTest)43*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, HardwareStateBufferTest) {
44*aed3e508SAndroid Build Coastguard Worker HardwareStateBuffer hsb(10);
45*aed3e508SAndroid Build Coastguard Worker hsb.Reset(0);
46*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(hsb.Size(), 10);
47*aed3e508SAndroid Build Coastguard Worker }
48*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ScrollManagerTest)49*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ScrollManagerTest) {
50*aed3e508SAndroid Build Coastguard Worker PropRegistry my_prop_reg;
51*aed3e508SAndroid Build Coastguard Worker ScrollManager sm(&my_prop_reg);
52*aed3e508SAndroid Build Coastguard Worker ScrollEventBuffer scroll_buffer(2);
53*aed3e508SAndroid Build Coastguard Worker ScrollEvent ev;
54*aed3e508SAndroid Build Coastguard Worker
55*aed3e508SAndroid Build Coastguard Worker sm.RegressScrollVelocity(scroll_buffer, 1, &ev);
56*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.0, ev.dx);
57*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.0, ev.dy);
58*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(1.0, ev.dt);
59*aed3e508SAndroid Build Coastguard Worker }
60*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,MoveDownTest)61*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, MoveDownTest) {
62*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
63*aed3e508SAndroid Build Coastguard Worker
64*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
65*aed3e508SAndroid Build Coastguard Worker .right = 1000,
66*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
67*aed3e508SAndroid Build Coastguard Worker .res_x = 500,
68*aed3e508SAndroid Build Coastguard Worker .res_y = 500,
69*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
70*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
71*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
72*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
73*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
74*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
75*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
76*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
77*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
78*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
79*aed3e508SAndroid Build Coastguard Worker };
80*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
81*aed3e508SAndroid Build Coastguard Worker
82*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
83*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
84*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 10, 10, 1, 0},
85*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 10, 20, 1, 0},
86*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 20, 20, 1, 0}
87*aed3e508SAndroid Build Coastguard Worker };
88*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
89*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, finger states pointer
90*aed3e508SAndroid Build Coastguard Worker make_hwstate(200000, 0, 1, 1, &finger_states[0]),
91*aed3e508SAndroid Build Coastguard Worker make_hwstate(210000, 0, 1, 1, &finger_states[1]),
92*aed3e508SAndroid Build Coastguard Worker make_hwstate(220000, 0, 1, 1, &finger_states[2]),
93*aed3e508SAndroid Build Coastguard Worker make_hwstate(230000, 0, 0, 0, nullptr),
94*aed3e508SAndroid Build Coastguard Worker make_hwstate(240000, 0, 0, 0, nullptr),
95*aed3e508SAndroid Build Coastguard Worker };
96*aed3e508SAndroid Build Coastguard Worker
97*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[0], nullptr));
98*aed3e508SAndroid Build Coastguard Worker
99*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[1], nullptr);
100*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
101*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
102*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dx);
103*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(10, gs->details.move.dy);
104*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(200000, gs->start_time);
105*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(210000, gs->end_time);
106*aed3e508SAndroid Build Coastguard Worker
107*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[2], nullptr);
108*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(nullptr, gs);
109*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
110*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(10, gs->details.move.dx);
111*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dy);
112*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(210000, gs->start_time);
113*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(220000, gs->end_time);
114*aed3e508SAndroid Build Coastguard Worker
115*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr,
116*aed3e508SAndroid Build Coastguard Worker wrapper.SyncInterpret(hardware_states[3], nullptr));
117*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr,
118*aed3e508SAndroid Build Coastguard Worker wrapper.SyncInterpret(hardware_states[4], nullptr));
119*aed3e508SAndroid Build Coastguard Worker }
120*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,MoveUpWithRestingThumbTest)121*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, MoveUpWithRestingThumbTest) {
122*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
123*aed3e508SAndroid Build Coastguard Worker
124*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
125*aed3e508SAndroid Build Coastguard Worker .right = 1000,
126*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
127*aed3e508SAndroid Build Coastguard Worker .res_x = 50,
128*aed3e508SAndroid Build Coastguard Worker .res_y = 50,
129*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
130*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
131*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
132*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
133*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
134*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
135*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
136*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
137*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
138*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
139*aed3e508SAndroid Build Coastguard Worker };
140*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
141*aed3e508SAndroid Build Coastguard Worker
142*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
143*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
144*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 500, 999, 1, 0},
145*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 500, 950, 2, 0},
146*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 500, 999, 1, 0},
147*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 500, 940, 2, 0},
148*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 500, 999, 1, 0},
149*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 500, 930, 2, 0}
150*aed3e508SAndroid Build Coastguard Worker };
151*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
152*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, finger states pointer
153*aed3e508SAndroid Build Coastguard Worker make_hwstate(200000, 0, 2, 2, &finger_states[0]),
154*aed3e508SAndroid Build Coastguard Worker make_hwstate(210000, 0, 2, 2, &finger_states[2]),
155*aed3e508SAndroid Build Coastguard Worker make_hwstate(220000, 0, 2, 2, &finger_states[4]),
156*aed3e508SAndroid Build Coastguard Worker make_hwstate(230000, 0, 0, 0, nullptr),
157*aed3e508SAndroid Build Coastguard Worker make_hwstate(240000, 0, 0, 0, nullptr),
158*aed3e508SAndroid Build Coastguard Worker };
159*aed3e508SAndroid Build Coastguard Worker
160*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[0], nullptr));
161*aed3e508SAndroid Build Coastguard Worker
162*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[1], nullptr);
163*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
164*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
165*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dx);
166*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(-10, gs->details.move.dy);
167*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(200000, gs->start_time);
168*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(210000, gs->end_time);
169*aed3e508SAndroid Build Coastguard Worker
170*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[2], nullptr);
171*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(nullptr, gs);
172*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
173*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dx);
174*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(-10, gs->details.move.dy);
175*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(210000, gs->start_time);
176*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(220000, gs->end_time);
177*aed3e508SAndroid Build Coastguard Worker
178*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr,
179*aed3e508SAndroid Build Coastguard Worker wrapper.SyncInterpret(hardware_states[3], nullptr));
180*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr,
181*aed3e508SAndroid Build Coastguard Worker wrapper.SyncInterpret(hardware_states[4], nullptr));
182*aed3e508SAndroid Build Coastguard Worker }
183*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,SemiMtScrollUpWithRestingThumbTest)184*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, SemiMtScrollUpWithRestingThumbTest) {
185*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
186*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
187*aed3e508SAndroid Build Coastguard Worker .right = 1000,
188*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
189*aed3e508SAndroid Build Coastguard Worker .res_x = 20,
190*aed3e508SAndroid Build Coastguard Worker .res_y = 20,
191*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
192*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
193*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
194*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 3,
195*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
196*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 1,
197*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
198*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
199*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
200*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
201*aed3e508SAndroid Build Coastguard Worker };
202*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
203*aed3e508SAndroid Build Coastguard Worker
204*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
205*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
206*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 100, 0, 50, 950, 1, 0},
207*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 100, 0, 415, 900, 2, 0},
208*aed3e508SAndroid Build Coastguard Worker
209*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 100, 0, 50, 950, 1, 0},
210*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 100, 0, 415, 800, 2, 0},
211*aed3e508SAndroid Build Coastguard Worker
212*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 100, 0, 50, 950, 1, 0},
213*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 100, 0, 415, 700, 2, 0},
214*aed3e508SAndroid Build Coastguard Worker };
215*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
216*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
217*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.200000, 0, 2, 3, &finger_states[0]),
218*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.250000, 0, 2, 3, &finger_states[2]),
219*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.300000, 0, 2, 3, &finger_states[4]),
220*aed3e508SAndroid Build Coastguard Worker };
221*aed3e508SAndroid Build Coastguard Worker
222*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[0], nullptr));
223*aed3e508SAndroid Build Coastguard Worker
224*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[1], nullptr);
225*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
226*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
227*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, gs->details.move.dx);
228*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-100, gs->details.move.dy);
229*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.200000, gs->start_time);
230*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.250000, gs->end_time);
231*aed3e508SAndroid Build Coastguard Worker
232*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[2], nullptr);
233*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
234*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
235*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, gs->details.move.dx);
236*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-100, gs->details.move.dy);
237*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.250000, gs->start_time);
238*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.300000, gs->end_time);
239*aed3e508SAndroid Build Coastguard Worker }
240*aed3e508SAndroid Build Coastguard Worker
ScrollUpTest(float pressure_a,float pressure_b)241*aed3e508SAndroid Build Coastguard Worker void ScrollUpTest(float pressure_a, float pressure_b) {
242*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
243*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
244*aed3e508SAndroid Build Coastguard Worker .right = 1000,
245*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
246*aed3e508SAndroid Build Coastguard Worker .res_x = 20,
247*aed3e508SAndroid Build Coastguard Worker .res_y = 20,
248*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
249*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
250*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
251*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
252*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
253*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
254*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
255*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
256*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
257*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
258*aed3e508SAndroid Build Coastguard Worker };
259*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
260*aed3e508SAndroid Build Coastguard Worker
261*aed3e508SAndroid Build Coastguard Worker float p_a = pressure_a;
262*aed3e508SAndroid Build Coastguard Worker float p_b = pressure_b;
263*aed3e508SAndroid Build Coastguard Worker
264*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
265*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
266*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, p_a, 0, 400, 900, 1, 0},
267*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, p_b, 0, 415, 900, 2, 0},
268*aed3e508SAndroid Build Coastguard Worker
269*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, p_a, 0, 400, 800, 1, 0},
270*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, p_b, 0, 415, 800, 2, 0},
271*aed3e508SAndroid Build Coastguard Worker
272*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, p_a, 0, 400, 700, 1, 0},
273*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, p_b, 0, 415, 700, 2, 0},
274*aed3e508SAndroid Build Coastguard Worker };
275*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
276*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
277*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.200000, 0, 2, 2, &finger_states[0]),
278*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.250000, 0, 2, 2, &finger_states[2]),
279*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.300000, 0, 2, 2, &finger_states[4]),
280*aed3e508SAndroid Build Coastguard Worker };
281*aed3e508SAndroid Build Coastguard Worker
282*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[0], nullptr));
283*aed3e508SAndroid Build Coastguard Worker
284*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[1], nullptr);
285*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
286*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
287*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, gs->details.move.dx);
288*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-100, gs->details.move.dy);
289*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.200000, gs->start_time);
290*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.250000, gs->end_time);
291*aed3e508SAndroid Build Coastguard Worker
292*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[2], nullptr);
293*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
294*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
295*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, gs->details.move.dx);
296*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(-100, gs->details.move.dy);
297*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.250000, gs->start_time);
298*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.300000, gs->end_time);
299*aed3e508SAndroid Build Coastguard Worker }
300*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ScrollUpTest)301*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ScrollUpTest) {
302*aed3e508SAndroid Build Coastguard Worker ScrollUpTest(24, 92);
303*aed3e508SAndroid Build Coastguard Worker }
304*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,FatFingerScrollUpTest)305*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, FatFingerScrollUpTest) {
306*aed3e508SAndroid Build Coastguard Worker ScrollUpTest(125, 185);
307*aed3e508SAndroid Build Coastguard Worker }
308*aed3e508SAndroid Build Coastguard Worker
309*aed3e508SAndroid Build Coastguard Worker // Tests that a tap immediately after a scroll doesn't generate a click.
310*aed3e508SAndroid Build Coastguard Worker // Such a tap would be unrealistic to come from a human.
TEST(ImmediateInterpreterTest,ScrollThenFalseTapTest)311*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ScrollThenFalseTapTest) {
312*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
313*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
314*aed3e508SAndroid Build Coastguard Worker .right = 1000,
315*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
316*aed3e508SAndroid Build Coastguard Worker .res_x = 20,
317*aed3e508SAndroid Build Coastguard Worker .res_y = 20,
318*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
319*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
320*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
321*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
322*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
323*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
324*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
325*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
326*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
327*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
328*aed3e508SAndroid Build Coastguard Worker };
329*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
330*aed3e508SAndroid Build Coastguard Worker
331*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
332*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
333*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 400, 900, 1, 0},
334*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 415, 900, 2, 0},
335*aed3e508SAndroid Build Coastguard Worker
336*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 400, 800, 1, 0},
337*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 415, 800, 2, 0},
338*aed3e508SAndroid Build Coastguard Worker
339*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 400, 700, 1, 0},
340*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 415, 700, 2, 0},
341*aed3e508SAndroid Build Coastguard Worker
342*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 400, 600, 3, 0},
343*aed3e508SAndroid Build Coastguard Worker };
344*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
345*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
346*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.200000, 0, 2, 2, &finger_states[0]),
347*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.250000, 0, 2, 2, &finger_states[2]),
348*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.300000, 0, 2, 2, &finger_states[4]),
349*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.310000, 0, 0, 0, nullptr),
350*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.320000, 0, 1, 1, &finger_states[6]),
351*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.330000, 0, 0, 0, nullptr),
352*aed3e508SAndroid Build Coastguard Worker };
353*aed3e508SAndroid Build Coastguard Worker
354*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 1;
355*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[0], nullptr));
356*aed3e508SAndroid Build Coastguard Worker
357*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[1], nullptr);
358*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
359*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
360*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[2], nullptr);
361*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
362*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
363*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[3], nullptr);
364*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
365*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeFling, gs->type);
366*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[4], nullptr);
367*aed3e508SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, gs);
368*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
369*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[5], &timeout);
370*aed3e508SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, gs);
371*aed3e508SAndroid Build Coastguard Worker // If it were a tap, timeout would be > 0, but this shouldn't be a tap,
372*aed3e508SAndroid Build Coastguard Worker // so timeout should be negative still.
373*aed3e508SAndroid Build Coastguard Worker EXPECT_LT(timeout, 0.0);
374*aed3e508SAndroid Build Coastguard Worker }
375*aed3e508SAndroid Build Coastguard Worker
376*aed3e508SAndroid Build Coastguard Worker // Tests that a consistent scroll has predictable fling, and that increasing
377*aed3e508SAndroid Build Coastguard Worker // scrolls have a fling as least as fast the second to last scroll.
TEST(ImmediateInterpreterTest,FlingTest)378*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, FlingTest) {
379*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
380*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
381*aed3e508SAndroid Build Coastguard Worker .right = 100,
382*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
383*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
384*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
385*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
386*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
387*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
388*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
389*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
390*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
391*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
392*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
393*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
394*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
395*aed3e508SAndroid Build Coastguard Worker };
396*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
397*aed3e508SAndroid Build Coastguard Worker
398*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
399*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
400*aed3e508SAndroid Build Coastguard Worker // Consistent movement for 4 frames
401*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 20, 1, 0},
402*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 20, 2, 0},
403*aed3e508SAndroid Build Coastguard Worker
404*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 30, 1, 0},
405*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 30, 2, 0},
406*aed3e508SAndroid Build Coastguard Worker
407*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 40, 1, 0},
408*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 40, 2, 0},
409*aed3e508SAndroid Build Coastguard Worker
410*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 50, 1, 0},
411*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 50, 2, 0},
412*aed3e508SAndroid Build Coastguard Worker
413*aed3e508SAndroid Build Coastguard Worker // Increasing movement for 4 frames
414*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 20, 3, 0},
415*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 20, 4, 0},
416*aed3e508SAndroid Build Coastguard Worker
417*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 25, 3, 0},
418*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 25, 4, 0},
419*aed3e508SAndroid Build Coastguard Worker
420*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 35, 3, 0},
421*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 35, 4, 0},
422*aed3e508SAndroid Build Coastguard Worker
423*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 50, 3, 0},
424*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 50, 4, 0},
425*aed3e508SAndroid Build Coastguard Worker };
426*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
427*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
428*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.00, 0, 2, 2, &finger_states[0]),
429*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.00, 0, 2, 2, &finger_states[0]),
430*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.01, 0, 2, 2, &finger_states[2]),
431*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.02, 0, 2, 2, &finger_states[4]),
432*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.03, 0, 2, 2, &finger_states[6]),
433*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.04, 0, 0, 0, nullptr),
434*aed3e508SAndroid Build Coastguard Worker
435*aed3e508SAndroid Build Coastguard Worker make_hwstate(3.00, 0, 2, 2, &finger_states[8]),
436*aed3e508SAndroid Build Coastguard Worker make_hwstate(4.00, 0, 2, 2, &finger_states[8]),
437*aed3e508SAndroid Build Coastguard Worker make_hwstate(4.01, 0, 2, 2, &finger_states[10]),
438*aed3e508SAndroid Build Coastguard Worker make_hwstate(4.02, 0, 2, 2, &finger_states[12]),
439*aed3e508SAndroid Build Coastguard Worker make_hwstate(4.03, 0, 2, 2, &finger_states[14]),
440*aed3e508SAndroid Build Coastguard Worker make_hwstate(4.04, 0, 0, 0, nullptr),
441*aed3e508SAndroid Build Coastguard Worker };
442*aed3e508SAndroid Build Coastguard Worker
443*aed3e508SAndroid Build Coastguard Worker size_t idx = 0;
444*aed3e508SAndroid Build Coastguard Worker
445*aed3e508SAndroid Build Coastguard Worker // Consistent movement
446*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
447*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
448*aed3e508SAndroid Build Coastguard Worker
449*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
450*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
451*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
452*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
453*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
454*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
455*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
456*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
457*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
458*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
459*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
460*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeFling, gs->type);
461*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, gs->details.fling.vx);
462*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(10 / 0.01, gs->details.fling.vy);
463*aed3e508SAndroid Build Coastguard Worker
464*aed3e508SAndroid Build Coastguard Worker // Increasing speed movement
465*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
466*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs) << gs->String();
467*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
468*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs) << gs->String();
469*aed3e508SAndroid Build Coastguard Worker
470*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
471*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
472*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
473*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
474*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
475*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
476*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
477*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
478*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
479*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
480*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
481*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeFling, gs->type);
482*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0, gs->details.fling.vx);
483*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(1250, gs->details.fling.vy);
484*aed3e508SAndroid Build Coastguard Worker }
485*aed3e508SAndroid Build Coastguard Worker
486*aed3e508SAndroid Build Coastguard Worker // Tests that fingers that have been present a while, but are stationary,
487*aed3e508SAndroid Build Coastguard Worker // can be evaluated multiple times when they start moving.
TEST(ImmediateInterpreterTest,DelayedStartScrollTest)488*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, DelayedStartScrollTest) {
489*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
490*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
491*aed3e508SAndroid Build Coastguard Worker .right = 100,
492*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
493*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
494*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
495*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
496*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
497*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
498*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
499*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
500*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
501*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
502*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
503*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
504*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
505*aed3e508SAndroid Build Coastguard Worker };
506*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
507*aed3e508SAndroid Build Coastguard Worker
508*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
509*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
510*aed3e508SAndroid Build Coastguard Worker // Consistent movement for 4 frames
511*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 95, 1, 0},
512*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 95, 2, 0},
513*aed3e508SAndroid Build Coastguard Worker
514*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 95, 1, 0},
515*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 85, 2, 0},
516*aed3e508SAndroid Build Coastguard Worker
517*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 80, 1, 0},
518*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 75, 2, 0},
519*aed3e508SAndroid Build Coastguard Worker };
520*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
521*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
522*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.00, 0, 2, 2, &finger_states[0]),
523*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.00, 0, 2, 2, &finger_states[0]),
524*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.01, 0, 2, 2, &finger_states[2]),
525*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.02, 0, 2, 2, &finger_states[4]),
526*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.03, 0, 0, 0, nullptr),
527*aed3e508SAndroid Build Coastguard Worker };
528*aed3e508SAndroid Build Coastguard Worker
529*aed3e508SAndroid Build Coastguard Worker size_t idx = 0;
530*aed3e508SAndroid Build Coastguard Worker
531*aed3e508SAndroid Build Coastguard Worker // Consistent movement
532*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
533*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
534*aed3e508SAndroid Build Coastguard Worker
535*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
536*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
537*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
538*aed3e508SAndroid Build Coastguard Worker
539*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
540*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
541*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
542*aed3e508SAndroid Build Coastguard Worker }
543*aed3e508SAndroid Build Coastguard Worker
544*aed3e508SAndroid Build Coastguard Worker // Tests that after a scroll is happening, if a finger lets go, scrolling stops.
TEST(ImmediateInterpreterTest,ScrollReevaluateTest)545*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ScrollReevaluateTest) {
546*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
547*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
548*aed3e508SAndroid Build Coastguard Worker .right = 100,
549*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
550*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
551*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
552*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
553*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
554*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
555*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
556*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
557*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
558*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
559*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
560*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
561*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
562*aed3e508SAndroid Build Coastguard Worker };
563*aed3e508SAndroid Build Coastguard Worker
564*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
565*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
566*aed3e508SAndroid Build Coastguard Worker // Consistent movement for 4 frames
567*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 10, 95, 1, 0},
568*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 59, 95, 2, 0},
569*aed3e508SAndroid Build Coastguard Worker
570*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 10, 85, 1, 0},
571*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 59, 85, 2, 0},
572*aed3e508SAndroid Build Coastguard Worker
573*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 10, 75, 1, 0},
574*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 59, 75, 2, 0},
575*aed3e508SAndroid Build Coastguard Worker
576*aed3e508SAndroid Build Coastguard Worker // Just too far apart to be scrolling
577*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 10, 65, 1, 0},
578*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 61, 65, 2, 0},
579*aed3e508SAndroid Build Coastguard Worker };
580*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
581*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
582*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.00, 0, 2, 2, &finger_states[0]),
583*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.00, 0, 2, 2, &finger_states[0]),
584*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.01, 0, 2, 2, &finger_states[2]),
585*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.02, 0, 2, 2, &finger_states[4]),
586*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.03, 0, 2, 2, &finger_states[6]),
587*aed3e508SAndroid Build Coastguard Worker };
588*aed3e508SAndroid Build Coastguard Worker
589*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
590*aed3e508SAndroid Build Coastguard Worker
591*aed3e508SAndroid Build Coastguard Worker size_t idx = 0;
592*aed3e508SAndroid Build Coastguard Worker
593*aed3e508SAndroid Build Coastguard Worker // Consistent movement
594*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
595*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
596*aed3e508SAndroid Build Coastguard Worker
597*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
598*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
599*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
600*aed3e508SAndroid Build Coastguard Worker
601*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
602*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
603*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
604*aed3e508SAndroid Build Coastguard Worker
605*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
606*aed3e508SAndroid Build Coastguard Worker if (gs) {
607*aed3e508SAndroid Build Coastguard Worker fprintf(stderr, "gs:%si=%zd\n", gs->String().c_str(), idx);
608*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(kGestureTypeScroll, gs->type);
609*aed3e508SAndroid Build Coastguard Worker }
610*aed3e508SAndroid Build Coastguard Worker }
611*aed3e508SAndroid Build Coastguard Worker
612*aed3e508SAndroid Build Coastguard Worker
613*aed3e508SAndroid Build Coastguard Worker // This is based on a log from Dave Moore. He put one finger down, which put
614*aed3e508SAndroid Build Coastguard Worker // it into move mode, then put a second finger down a bit later, but it was
615*aed3e508SAndroid Build Coastguard Worker // stuck in move mode. This tests that it does switch to scroll mode.
TEST(ImmediateInterpreterTest,OneFingerThenTwoDelayedStartScrollTest)616*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, OneFingerThenTwoDelayedStartScrollTest) {
617*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
618*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
619*aed3e508SAndroid Build Coastguard Worker .right = 100,
620*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
621*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
622*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
623*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
624*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
625*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
626*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
627*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
628*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
629*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
630*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
631*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
632*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
633*aed3e508SAndroid Build Coastguard Worker };
634*aed3e508SAndroid Build Coastguard Worker
635*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
636*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
637*aed3e508SAndroid Build Coastguard Worker // Consistent movement for 4 frames
638*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 85, 2, 0},
639*aed3e508SAndroid Build Coastguard Worker
640*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 85, 1, 0},
641*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 83, 2, 0},
642*aed3e508SAndroid Build Coastguard Worker
643*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 77, 1, 0},
644*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 75, 2, 0},
645*aed3e508SAndroid Build Coastguard Worker
646*aed3e508SAndroid Build Coastguard Worker };
647*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
648*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
649*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.00, 0, 1, 1, &finger_states[0]),
650*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.20, 0, 2, 2, &finger_states[1]),
651*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.00, 0, 2, 2, &finger_states[1]),
652*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.01, 0, 2, 2, &finger_states[3]),
653*aed3e508SAndroid Build Coastguard Worker make_hwstate(2.03, 0, 0, 0, nullptr),
654*aed3e508SAndroid Build Coastguard Worker };
655*aed3e508SAndroid Build Coastguard Worker
656*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
657*aed3e508SAndroid Build Coastguard Worker
658*aed3e508SAndroid Build Coastguard Worker size_t idx = 0;
659*aed3e508SAndroid Build Coastguard Worker
660*aed3e508SAndroid Build Coastguard Worker // Consistent movement
661*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
662*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[idx++], nullptr));
663*aed3e508SAndroid Build Coastguard Worker
664*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
665*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs);
666*aed3e508SAndroid Build Coastguard Worker
667*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[idx++], nullptr);
668*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
669*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
670*aed3e508SAndroid Build Coastguard Worker }
671*aed3e508SAndroid Build Coastguard Worker
672*aed3e508SAndroid Build Coastguard Worker namespace {
673*aed3e508SAndroid Build Coastguard Worker
674*aed3e508SAndroid Build Coastguard Worker enum TestCaseStartOrContinueFlag {
675*aed3e508SAndroid Build Coastguard Worker kS, // start
676*aed3e508SAndroid Build Coastguard Worker kC // continue
677*aed3e508SAndroid Build Coastguard Worker };
678*aed3e508SAndroid Build Coastguard Worker
679*aed3e508SAndroid Build Coastguard Worker enum OneFatFingerScrollTestExpectation {
680*aed3e508SAndroid Build Coastguard Worker kAnything,
681*aed3e508SAndroid Build Coastguard Worker kScroll
682*aed3e508SAndroid Build Coastguard Worker };
683*aed3e508SAndroid Build Coastguard Worker
684*aed3e508SAndroid Build Coastguard Worker struct OneFatFingerScrollTestInputs {
685*aed3e508SAndroid Build Coastguard Worker TestCaseStartOrContinueFlag start;
686*aed3e508SAndroid Build Coastguard Worker stime_t now;
687*aed3e508SAndroid Build Coastguard Worker float x0, y0, p0, x1, y1, p1; // (x, y) coordinate and pressure
688*aed3e508SAndroid Build Coastguard Worker OneFatFingerScrollTestExpectation expectation;
689*aed3e508SAndroid Build Coastguard Worker };
690*aed3e508SAndroid Build Coastguard Worker
691*aed3e508SAndroid Build Coastguard Worker } // namespace {}
692*aed3e508SAndroid Build Coastguard Worker
693*aed3e508SAndroid Build Coastguard Worker // Tests two scroll operations with data from actual logs from Ryan Tabone.
TEST(ImmediateInterpreterTest,OneFatFingerScrollTest)694*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, OneFatFingerScrollTest) {
695*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
696*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
697*aed3e508SAndroid Build Coastguard Worker .right = 106.666672,
698*aed3e508SAndroid Build Coastguard Worker .bottom = 68.000000,
699*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
700*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
701*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
702*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
703*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 15,
704*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
705*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
706*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
707*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
708*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
709*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
710*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
711*aed3e508SAndroid Build Coastguard Worker };
712*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
713*aed3e508SAndroid Build Coastguard Worker // 4 runs that were failing, but now pass:
714*aed3e508SAndroid Build Coastguard Worker OneFatFingerScrollTestInputs inputs[] = {
715*aed3e508SAndroid Build Coastguard Worker { kS, 54.6787, 49.83, 33.20, 3.71, 73.25, 22.80, 32.82, kAnything },
716*aed3e508SAndroid Build Coastguard Worker { kC, 54.6904, 49.83, 33.20, 61.93, 73.25, 22.80, 40.58, kAnything },
717*aed3e508SAndroid Build Coastguard Worker { kC, 54.7022, 49.83, 33.20, 67.75, 73.25, 22.90, 40.58, kAnything },
718*aed3e508SAndroid Build Coastguard Worker { kC, 54.7140, 49.83, 33.20, 67.75, 73.25, 22.90, 42.52, kAnything },
719*aed3e508SAndroid Build Coastguard Worker { kC, 54.7256, 49.66, 33.20, 71.63, 73.25, 21.90, 38.64, kAnything },
720*aed3e508SAndroid Build Coastguard Worker { kC, 54.7373, 49.00, 32.90, 75.51, 72.91, 20.80, 40.58, kAnything },
721*aed3e508SAndroid Build Coastguard Worker { kC, 54.7492, 48.50, 31.70, 77.45, 72.75, 19.90, 40.58, kScroll },
722*aed3e508SAndroid Build Coastguard Worker { kC, 54.7613, 47.91, 30.30, 77.45, 73.08, 17.90, 44.46, kScroll },
723*aed3e508SAndroid Build Coastguard Worker { kC, 54.7734, 47.58, 26.80, 79.39, 73.08, 16.10, 46.40, kScroll },
724*aed3e508SAndroid Build Coastguard Worker { kC, 54.7855, 47.33, 24.30, 85.21, 73.08, 13.40, 42.52, kScroll },
725*aed3e508SAndroid Build Coastguard Worker { kC, 54.7976, 47.08, 21.30, 83.27, 73.25, 11.00, 46.40, kScroll },
726*aed3e508SAndroid Build Coastguard Worker { kC, 54.8099, 47.08, 18.30, 87.15, 73.16, 9.00, 44.46, kScroll },
727*aed3e508SAndroid Build Coastguard Worker { kC, 54.8222, 46.75, 15.90, 83.27, 73.16, 6.80, 42.52, kScroll },
728*aed3e508SAndroid Build Coastguard Worker { kC, 54.8344, 46.66, 13.50, 85.21, 73.33, 4.80, 46.40, kScroll },
729*aed3e508SAndroid Build Coastguard Worker { kC, 54.8469, 46.50, 11.80, 83.27, 73.33, 3.70, 44.46, kScroll },
730*aed3e508SAndroid Build Coastguard Worker { kC, 54.8598, 46.41, 10.80, 85.21, 73.33, 3.00, 46.40, kScroll },
731*aed3e508SAndroid Build Coastguard Worker { kC, 54.8726, 46.00, 9.50, 79.39, 73.33, 1.70, 40.58, kScroll },
732*aed3e508SAndroid Build Coastguard Worker { kC, 54.8851, 46.00, 8.60, 81.33, 73.33, 1.50, 40.58, kScroll },
733*aed3e508SAndroid Build Coastguard Worker { kC, 54.8975, 46.00, 7.90, 83.27, 73.33, 1.20, 38.64, kScroll },
734*aed3e508SAndroid Build Coastguard Worker { kC, 54.9099, 46.00, 7.20, 85.21, 73.33, 1.20, 38.64, kScroll },
735*aed3e508SAndroid Build Coastguard Worker { kC, 54.9224, 46.00, 7.00, 81.33, 73.33, 1.00, 34.76, kScroll },
736*aed3e508SAndroid Build Coastguard Worker { kC, 54.9350, 46.00, 7.00, 81.33, 73.66, 0.90, 34.76, kScroll },
737*aed3e508SAndroid Build Coastguard Worker { kC, 54.9473, 46.00, 6.80, 83.27, 73.66, 0.50, 34.76, kScroll },
738*aed3e508SAndroid Build Coastguard Worker { kC, 54.9597, 46.00, 6.70, 77.45, 73.66, 0.40, 32.82, kScroll },
739*aed3e508SAndroid Build Coastguard Worker { kC, 54.9721, 46.00, 6.60, 56.10, 73.50, 0.40, 28.94, kScroll },
740*aed3e508SAndroid Build Coastguard Worker { kC, 54.9844, 46.41, 6.20, 32.82, 73.16, 0.40, 19.24, kScroll },
741*aed3e508SAndroid Build Coastguard Worker { kC, 54.9967, 46.08, 6.20, 17.30, 72.41, 0.40, 7.60, kScroll },
742*aed3e508SAndroid Build Coastguard Worker { kC, 55.0067, 47.16, 6.30, 3.71, 0.00, 0.00, 0.00, kAnything },
743*aed3e508SAndroid Build Coastguard Worker
744*aed3e508SAndroid Build Coastguard Worker { kS, 91.6606, 48.08, 31.20, 9.54, 0.00, 0.00, 0.00, kAnything },
745*aed3e508SAndroid Build Coastguard Worker { kC, 91.6701, 48.08, 31.20, 23.12, 0.00, 0.00, 0.00, kAnything },
746*aed3e508SAndroid Build Coastguard Worker { kC, 91.6821, 48.25, 31.20, 38.64, 69.50, 23.20, 7.60, kAnything },
747*aed3e508SAndroid Build Coastguard Worker { kC, 91.6943, 48.25, 31.20, 50.28, 69.50, 23.20, 19.24, kAnything },
748*aed3e508SAndroid Build Coastguard Worker { kC, 91.7062, 48.25, 31.20, 58.04, 69.41, 23.00, 23.12, kAnything },
749*aed3e508SAndroid Build Coastguard Worker { kC, 91.7182, 48.25, 31.20, 63.87, 69.41, 23.00, 27.00, kAnything },
750*aed3e508SAndroid Build Coastguard Worker { kC, 91.7303, 48.25, 31.20, 65.81, 69.16, 23.00, 30.88, kAnything },
751*aed3e508SAndroid Build Coastguard Worker { kC, 91.7423, 48.25, 31.20, 65.81, 69.08, 23.00, 30.88, kAnything },
752*aed3e508SAndroid Build Coastguard Worker { kC, 91.7541, 48.25, 31.20, 67.75, 69.83, 21.90, 25.06, kAnything },
753*aed3e508SAndroid Build Coastguard Worker { kC, 91.7660, 48.25, 30.80, 67.75, 69.75, 21.90, 27.00, kAnything },
754*aed3e508SAndroid Build Coastguard Worker { kC, 91.7778, 48.25, 30.00, 63.87, 69.75, 21.60, 30.88, kAnything },
755*aed3e508SAndroid Build Coastguard Worker { kC, 91.7895, 48.25, 29.00, 63.87, 69.75, 21.30, 30.88, kAnything },
756*aed3e508SAndroid Build Coastguard Worker { kC, 91.8016, 48.25, 27.60, 65.81, 69.50, 19.90, 34.76, kAnything },
757*aed3e508SAndroid Build Coastguard Worker { kC, 91.8138, 48.16, 26.00, 67.75, 69.41, 18.70, 36.70, kScroll },
758*aed3e508SAndroid Build Coastguard Worker { kC, 91.8259, 47.83, 24.30, 69.69, 69.16, 17.50, 40.58, kScroll },
759*aed3e508SAndroid Build Coastguard Worker { kC, 91.8382, 47.66, 22.50, 69.69, 69.16, 15.50, 36.70, kScroll },
760*aed3e508SAndroid Build Coastguard Worker { kC, 91.8503, 47.58, 19.20, 71.63, 69.16, 13.20, 34.76, kScroll },
761*aed3e508SAndroid Build Coastguard Worker { kC, 91.8630, 47.41, 17.10, 71.63, 69.16, 10.80, 40.58, kScroll },
762*aed3e508SAndroid Build Coastguard Worker { kC, 91.8751, 47.16, 14.70, 73.57, 69.16, 8.40, 34.76, kScroll },
763*aed3e508SAndroid Build Coastguard Worker { kC, 91.8871, 47.16, 12.70, 73.57, 69.50, 7.10, 36.70, kScroll },
764*aed3e508SAndroid Build Coastguard Worker { kC, 91.8994, 47.16, 11.30, 71.63, 69.75, 5.90, 36.70, kScroll },
765*aed3e508SAndroid Build Coastguard Worker { kC, 91.9119, 47.16, 10.10, 67.75, 69.75, 4.40, 40.58, kScroll },
766*aed3e508SAndroid Build Coastguard Worker { kC, 91.9243, 47.58, 8.70, 69.69, 69.75, 3.50, 42.52, kScroll },
767*aed3e508SAndroid Build Coastguard Worker { kC, 91.9367, 48.00, 7.80, 63.87, 70.08, 2.70, 38.64, kScroll },
768*aed3e508SAndroid Build Coastguard Worker { kC, 91.9491, 48.33, 6.90, 59.99, 70.58, 2.10, 34.76, kScroll },
769*aed3e508SAndroid Build Coastguard Worker { kC, 91.9613, 48.66, 6.50, 56.10, 70.58, 1.50, 32.82, kScroll },
770*aed3e508SAndroid Build Coastguard Worker { kC, 91.9732, 48.91, 6.00, 48.34, 70.66, 1.10, 28.94, kScroll },
771*aed3e508SAndroid Build Coastguard Worker { kC, 91.9854, 49.00, 5.90, 38.64, 71.00, 1.10, 23.12, kScroll },
772*aed3e508SAndroid Build Coastguard Worker { kC, 91.9975, 49.41, 5.60, 27.00, 71.33, 1.10, 15.36, kScroll },
773*aed3e508SAndroid Build Coastguard Worker { kC, 92.0094, 49.41, 5.30, 13.42, 71.33, 0.90, 9.54, kScroll },
774*aed3e508SAndroid Build Coastguard Worker { kC, 92.0215, 49.33, 4.20, 7.60, 71.33, 0.50, 3.71, kScroll },
775*aed3e508SAndroid Build Coastguard Worker
776*aed3e508SAndroid Build Coastguard Worker { kS, 93.3635, 43.58, 31.40, 36.70, 60.75, 19.00, 11.48, kAnything },
777*aed3e508SAndroid Build Coastguard Worker { kC, 93.3757, 43.58, 31.40, 73.57, 60.58, 18.80, 27.00, kAnything },
778*aed3e508SAndroid Build Coastguard Worker { kC, 93.3880, 43.58, 31.40, 75.51, 60.41, 17.90, 32.82, kAnything },
779*aed3e508SAndroid Build Coastguard Worker { kC, 93.4004, 43.33, 31.20, 77.45, 60.33, 17.40, 38.64, kAnything },
780*aed3e508SAndroid Build Coastguard Worker { kC, 93.4126, 43.00, 30.70, 79.39, 60.33, 16.50, 42.52, kAnything },
781*aed3e508SAndroid Build Coastguard Worker { kC, 93.4245, 42.75, 28.90, 81.33, 60.33, 15.70, 46.40, kScroll },
782*aed3e508SAndroid Build Coastguard Worker { kC, 93.4364, 42.41, 27.00, 79.39, 60.33, 14.30, 48.34, kScroll },
783*aed3e508SAndroid Build Coastguard Worker { kC, 93.4485, 42.16, 25.80, 87.15, 60.33, 12.50, 50.28, kScroll },
784*aed3e508SAndroid Build Coastguard Worker { kC, 93.4609, 42.08, 24.20, 89.09, 60.33, 11.10, 56.10, kScroll },
785*aed3e508SAndroid Build Coastguard Worker { kC, 93.4733, 41.66, 21.70, 81.33, 60.33, 9.70, 52.22, kScroll },
786*aed3e508SAndroid Build Coastguard Worker { kC, 93.4855, 41.66, 18.50, 85.21, 60.33, 7.80, 52.22, kScroll },
787*aed3e508SAndroid Build Coastguard Worker { kC, 93.4978, 41.66, 16.29, 85.21, 60.66, 5.40, 54.16, kScroll },
788*aed3e508SAndroid Build Coastguard Worker { kC, 93.5104, 41.66, 13.20, 79.39, 60.75, 3.80, 54.16, kScroll },
789*aed3e508SAndroid Build Coastguard Worker { kC, 93.5227, 41.66, 11.80, 79.39, 62.33, 2.00, 42.52, kScroll },
790*aed3e508SAndroid Build Coastguard Worker { kC, 93.5350, 41.91, 10.60, 71.63, 61.58, 1.80, 42.52, kScroll },
791*aed3e508SAndroid Build Coastguard Worker { kC, 93.5476, 42.00, 9.10, 67.75, 61.83, 1.20, 38.64, kScroll },
792*aed3e508SAndroid Build Coastguard Worker { kC, 93.5597, 42.41, 7.70, 58.04, 61.83, 0.80, 32.82, kScroll },
793*aed3e508SAndroid Build Coastguard Worker { kC, 93.5718, 42.41, 7.20, 48.34, 61.83, 0.80, 27.00, kScroll },
794*aed3e508SAndroid Build Coastguard Worker { kC, 93.5837, 42.33, 6.80, 34.76, 62.08, 0.50, 19.24, kScroll },
795*aed3e508SAndroid Build Coastguard Worker { kC, 93.5957, 42.00, 6.10, 19.24, 62.08, 0.50, 15.36, kScroll },
796*aed3e508SAndroid Build Coastguard Worker { kC, 93.6078, 41.91, 6.30, 7.60, 62.08, 0.50, 5.65, kAnything },
797*aed3e508SAndroid Build Coastguard Worker
798*aed3e508SAndroid Build Coastguard Worker { kS, 95.4803, 65.66, 34.90, 13.42, 0.00, 0.00, 0.00, kAnything },
799*aed3e508SAndroid Build Coastguard Worker { kC, 95.4901, 66.00, 35.00, 36.70, 0.00, 0.00, 0.00, kAnything },
800*aed3e508SAndroid Build Coastguard Worker { kC, 95.5024, 66.00, 35.10, 40.58, 44.66, 45.29, 59.99, kAnything },
801*aed3e508SAndroid Build Coastguard Worker { kC, 95.5144, 66.00, 35.40, 38.64, 44.66, 45.29, 81.33, kAnything },
802*aed3e508SAndroid Build Coastguard Worker { kC, 95.5267, 66.00, 35.40, 38.64, 44.50, 45.29, 87.15, kAnything },
803*aed3e508SAndroid Build Coastguard Worker { kC, 95.5388, 66.00, 35.40, 40.58, 44.50, 45.29, 87.15, kAnything },
804*aed3e508SAndroid Build Coastguard Worker { kC, 95.5507, 66.00, 33.60, 38.64, 44.50, 45.29, 91.03, kAnything },
805*aed3e508SAndroid Build Coastguard Worker { kC, 95.5625, 65.75, 32.00, 34.76, 44.08, 43.60, 91.03, kScroll },
806*aed3e508SAndroid Build Coastguard Worker { kC, 95.5747, 66.75, 30.00, 42.52, 43.83, 42.00, 89.09, kScroll },
807*aed3e508SAndroid Build Coastguard Worker { kC, 95.5866, 66.75, 27.50, 38.64, 43.58, 38.90, 87.15, kScroll },
808*aed3e508SAndroid Build Coastguard Worker { kC, 95.5986, 66.75, 25.00, 44.46, 43.58, 36.50, 92.97, kScroll },
809*aed3e508SAndroid Build Coastguard Worker { kC, 95.6111, 66.75, 22.70, 42.52, 43.33, 33.70, 89.09, kScroll },
810*aed3e508SAndroid Build Coastguard Worker { kC, 95.6230, 67.16, 20.40, 42.52, 43.33, 31.30, 94.91, kScroll },
811*aed3e508SAndroid Build Coastguard Worker { kC, 95.6351, 67.33, 18.70, 44.46, 43.33, 28.90, 96.85, kScroll },
812*aed3e508SAndroid Build Coastguard Worker { kC, 95.6476, 67.50, 17.30, 48.34, 43.33, 26.10, 92.97, kScroll },
813*aed3e508SAndroid Build Coastguard Worker { kC, 95.6596, 67.83, 16.20, 46.40, 43.33, 25.00, 92.97, kScroll },
814*aed3e508SAndroid Build Coastguard Worker { kC, 95.6717, 67.83, 15.60, 42.52, 43.33, 24.20, 94.91, kScroll },
815*aed3e508SAndroid Build Coastguard Worker { kC, 95.6837, 68.00, 13.80, 46.40, 43.33, 23.90, 92.97, kScroll },
816*aed3e508SAndroid Build Coastguard Worker { kC, 95.6959, 68.00, 13.80, 44.46, 43.33, 23.70, 92.97, kScroll },
817*aed3e508SAndroid Build Coastguard Worker { kC, 95.7080, 68.00, 13.80, 44.46, 43.33, 23.50, 94.91, kScroll },
818*aed3e508SAndroid Build Coastguard Worker { kC, 95.7199, 68.00, 13.60, 44.46, 43.33, 23.10, 96.85, kScroll },
819*aed3e508SAndroid Build Coastguard Worker { kC, 95.7321, 68.00, 13.60, 44.46, 43.33, 23.00, 98.79, kScroll },
820*aed3e508SAndroid Build Coastguard Worker { kC, 95.7443, 68.25, 13.60, 44.46, 43.25, 23.00, 98.79, kScroll },
821*aed3e508SAndroid Build Coastguard Worker };
822*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(inputs); i++) {
823*aed3e508SAndroid Build Coastguard Worker if (inputs[i].start == kS) {
824*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
825*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get());
826*aed3e508SAndroid Build Coastguard Worker }
827*aed3e508SAndroid Build Coastguard Worker
828*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
829*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, inputs[i].p0, 0.0, inputs[i].x0, inputs[i].y0, 1, 0 },
830*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, inputs[i].p1, 0.0, inputs[i].x1, inputs[i].y1, 2, 0 },
831*aed3e508SAndroid Build Coastguard Worker };
832*aed3e508SAndroid Build Coastguard Worker unsigned short finger_cnt = inputs[i].p1 == 0.0 ? 1 : 2;
833*aed3e508SAndroid Build Coastguard Worker HardwareState hs =
834*aed3e508SAndroid Build Coastguard Worker make_hwstate(inputs[i].now, 0, finger_cnt, finger_cnt, fs);
835*aed3e508SAndroid Build Coastguard Worker
836*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
837*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hs, &timeout);
838*aed3e508SAndroid Build Coastguard Worker switch (inputs[i].expectation) {
839*aed3e508SAndroid Build Coastguard Worker case kAnything:
840*aed3e508SAndroid Build Coastguard Worker // Anything goes
841*aed3e508SAndroid Build Coastguard Worker break;
842*aed3e508SAndroid Build Coastguard Worker case kScroll:
843*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(nullptr, gs) << "i=" << i;
844*aed3e508SAndroid Build Coastguard Worker if (!gs)
845*aed3e508SAndroid Build Coastguard Worker break;
846*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
847*aed3e508SAndroid Build Coastguard Worker break;
848*aed3e508SAndroid Build Coastguard Worker }
849*aed3e508SAndroid Build Coastguard Worker }
850*aed3e508SAndroid Build Coastguard Worker };
851*aed3e508SAndroid Build Coastguard Worker
852*aed3e508SAndroid Build Coastguard Worker struct NoLiftoffScrollTestInputs {
853*aed3e508SAndroid Build Coastguard Worker bool reset;
854*aed3e508SAndroid Build Coastguard Worker stime_t now;
855*aed3e508SAndroid Build Coastguard Worker float x0, y0, p0, x1, y1, p1; // (x, y) coordinate and pressure per finger
856*aed3e508SAndroid Build Coastguard Worker };
857*aed3e508SAndroid Build Coastguard Worker
858*aed3e508SAndroid Build Coastguard Worker // Tests that if one scrolls backwards a bit before lifting fingers off, we
859*aed3e508SAndroid Build Coastguard Worker // don't scroll backwards. Based on an actual log
TEST(ImmediateInterpreterTest,NoLiftoffScrollTest)860*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, NoLiftoffScrollTest) {
861*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
862*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
863*aed3e508SAndroid Build Coastguard Worker .right = 106.666672,
864*aed3e508SAndroid Build Coastguard Worker .bottom = 68.000000,
865*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
866*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
867*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
868*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
869*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 15,
870*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
871*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
872*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
873*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
874*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
875*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
876*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
877*aed3e508SAndroid Build Coastguard Worker };
878*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
879*aed3e508SAndroid Build Coastguard Worker
880*aed3e508SAndroid Build Coastguard Worker NoLiftoffScrollTestInputs inputs[] = {
881*aed3e508SAndroid Build Coastguard Worker // These logs are examples of scrolling up that may have some accidental
882*aed3e508SAndroid Build Coastguard Worker // reverse-scroll when fingers lift-off
883*aed3e508SAndroid Build Coastguard Worker { true, 4.9621, 59.5, 55.9, 17.30, 43.2, 62.5, 19.24 },
884*aed3e508SAndroid Build Coastguard Worker { false, 4.9745, 59.5, 55.9, 30.88, 43.2, 62.5, 25.06 },
885*aed3e508SAndroid Build Coastguard Worker { false, 4.9862, 59.3, 55.9, 34.76, 43.3, 61.7, 28.94 },
886*aed3e508SAndroid Build Coastguard Worker { false, 4.9974, 59.3, 55.4, 36.70, 43.0, 60.7, 32.82 },
887*aed3e508SAndroid Build Coastguard Worker { false, 5.0085, 59.0, 54.4, 40.58, 43.0, 58.7, 36.70 },
888*aed3e508SAndroid Build Coastguard Worker { false, 5.0194, 59.0, 50.9, 44.46, 42.5, 55.7, 42.52 },
889*aed3e508SAndroid Build Coastguard Worker { false, 5.0299, 59.0, 48.2, 46.40, 42.2, 52.7, 44.46 },
890*aed3e508SAndroid Build Coastguard Worker { false, 5.0412, 58.7, 44.5, 46.40, 41.6, 49.7, 48.34 },
891*aed3e508SAndroid Build Coastguard Worker { false, 5.0518, 57.3, 39.6, 48.34, 41.2, 45.7, 54.16 },
892*aed3e508SAndroid Build Coastguard Worker { false, 5.0626, 57.1, 35.2, 48.34, 41.0, 42.0, 61.93 },
893*aed3e508SAndroid Build Coastguard Worker { false, 5.0739, 56.7, 30.8, 56.10, 41.1, 36.6, 69.69 },
894*aed3e508SAndroid Build Coastguard Worker { false, 5.0848, 56.3, 26.4, 58.04, 39.7, 32.3, 63.87 },
895*aed3e508SAndroid Build Coastguard Worker { false, 5.0957, 56.3, 23.4, 61.93, 39.7, 27.8, 67.75 },
896*aed3e508SAndroid Build Coastguard Worker { false, 5.1068, 56.3, 19.9, 67.75, 39.7, 24.1, 71.63 },
897*aed3e508SAndroid Build Coastguard Worker { false, 5.1177, 56.7, 18.1, 71.63, 39.7, 20.4, 75.51 },
898*aed3e508SAndroid Build Coastguard Worker { false, 5.1287, 57.1, 15.9, 71.63, 39.7, 18.7, 75.51 },
899*aed3e508SAndroid Build Coastguard Worker { false, 5.1398, 57.5, 14.2, 77.45, 39.7, 17.3, 79.39 },
900*aed3e508SAndroid Build Coastguard Worker { false, 5.1508, 57.6, 13.3, 75.51, 39.7, 16.1, 77.45 },
901*aed3e508SAndroid Build Coastguard Worker { false, 5.1619, 57.7, 12.9, 79.39, 40.0, 15.5, 83.27 },
902*aed3e508SAndroid Build Coastguard Worker { false, 5.1734, 58.1, 12.8, 79.39, 40.0, 15.4, 83.27 },
903*aed3e508SAndroid Build Coastguard Worker { false, 5.1847, 58.1, 12.7, 79.39, 40.0, 15.3, 83.27 },
904*aed3e508SAndroid Build Coastguard Worker { false, 5.1963, 58.1, 12.7, 78.42, 40.0, 15.3, 83.27 },
905*aed3e508SAndroid Build Coastguard Worker { false, 5.2078, 58.1, 12.7, 77.45, 40.0, 15.3, 83.27 },
906*aed3e508SAndroid Build Coastguard Worker { false, 5.2191, 58.1, 12.7, 79.39, 40.0, 15.3, 83.27 },
907*aed3e508SAndroid Build Coastguard Worker { false, 5.2306, 58.1, 12.7, 78.42, 40.0, 15.3, 82.30 },
908*aed3e508SAndroid Build Coastguard Worker { false, 5.2421, 58.1, 12.7, 77.45, 40.0, 15.3, 81.33 },
909*aed3e508SAndroid Build Coastguard Worker { false, 5.2533, 58.1, 12.7, 77.45, 40.0, 15.3, 77.45 },
910*aed3e508SAndroid Build Coastguard Worker { false, 5.2642, 58.1, 12.7, 63.87, 40.0, 15.4, 58.04 },
911*aed3e508SAndroid Build Coastguard Worker { false, 5.2752, 57.9, 12.7, 34.76, 40.0, 15.8, 25.06 },
912*aed3e508SAndroid Build Coastguard Worker
913*aed3e508SAndroid Build Coastguard Worker { true, 4.1501, 66.25, 19.10, 46.40, 83.50, 15.10, 46.40 },
914*aed3e508SAndroid Build Coastguard Worker { false, 4.1610, 66.25, 19.00, 48.34, 83.58, 15.10, 46.40 },
915*aed3e508SAndroid Build Coastguard Worker { false, 4.1721, 66.58, 18.50, 48.34, 83.58, 15.00, 44.46 },
916*aed3e508SAndroid Build Coastguard Worker { false, 4.1830, 67.00, 18.50, 48.34, 83.66, 14.90, 44.46 },
917*aed3e508SAndroid Build Coastguard Worker { false, 4.1943, 67.08, 18.40, 50.28, 83.66, 14.80, 46.40 },
918*aed3e508SAndroid Build Coastguard Worker { false, 4.2053, 67.08, 18.40, 50.28, 83.66, 14.80, 46.40 },
919*aed3e508SAndroid Build Coastguard Worker { false, 4.2163, 67.08, 18.40, 50.28, 83.66, 14.80, 46.40 },
920*aed3e508SAndroid Build Coastguard Worker { false, 4.2274, 67.08, 18.40, 48.34, 83.66, 14.80, 46.40 },
921*aed3e508SAndroid Build Coastguard Worker { false, 4.2385, 67.08, 18.30, 50.28, 83.83, 14.60, 46.40 },
922*aed3e508SAndroid Build Coastguard Worker { false, 4.2494, 67.08, 18.10, 48.34, 83.91, 14.30, 46.40 },
923*aed3e508SAndroid Build Coastguard Worker { false, 4.2602, 67.08, 17.60, 46.40, 84.08, 14.10, 44.46 },
924*aed3e508SAndroid Build Coastguard Worker { false, 4.2712, 67.08, 17.40, 48.34, 84.25, 13.70, 46.40 },
925*aed3e508SAndroid Build Coastguard Worker { false, 4.2822, 67.25, 17.20, 48.34, 84.50, 13.40, 48.34 },
926*aed3e508SAndroid Build Coastguard Worker { false, 4.2932, 67.33, 16.90, 46.40, 84.75, 13.20, 46.40 },
927*aed3e508SAndroid Build Coastguard Worker { false, 4.3044, 67.33, 16.60, 46.40, 84.91, 13.00, 48.34 },
928*aed3e508SAndroid Build Coastguard Worker { false, 4.3153, 67.41, 16.50, 46.40, 84.91, 12.90, 46.40 },
929*aed3e508SAndroid Build Coastguard Worker { false, 4.3264, 67.50, 16.29, 46.40, 84.91, 12.90, 46.40 },
930*aed3e508SAndroid Build Coastguard Worker { false, 4.3372, 67.58, 16.29, 46.40, 85.08, 12.90, 48.34 },
931*aed3e508SAndroid Build Coastguard Worker { false, 4.3481, 67.58, 16.10, 44.46, 85.08, 12.90, 48.34 },
932*aed3e508SAndroid Build Coastguard Worker { false, 4.3591, 67.58, 16.00, 44.46, 85.08, 12.90, 48.34 },
933*aed3e508SAndroid Build Coastguard Worker { false, 4.3699, 67.58, 15.95, 44.46, 85.08, 12.85, 48.34 },
934*aed3e508SAndroid Build Coastguard Worker { false, 4.3808, 67.58, 15.90, 44.46, 85.08, 12.80, 48.34 },
935*aed3e508SAndroid Build Coastguard Worker { false, 4.3922, 67.58, 15.90, 44.46, 85.25, 12.50, 48.34 },
936*aed3e508SAndroid Build Coastguard Worker { false, 4.4035, 67.75, 15.80, 46.40, 85.25, 12.40, 46.40 },
937*aed3e508SAndroid Build Coastguard Worker { false, 4.4146, 67.75, 15.30, 46.40, 85.33, 12.20, 48.34 },
938*aed3e508SAndroid Build Coastguard Worker { false, 4.4260, 67.91, 15.20, 48.34, 85.75, 12.20, 50.28 },
939*aed3e508SAndroid Build Coastguard Worker { false, 4.4373, 67.91, 15.20, 46.40, 85.75, 12.10, 48.34 },
940*aed3e508SAndroid Build Coastguard Worker { false, 4.4485, 67.91, 15.10, 46.40, 85.75, 12.10, 48.34 },
941*aed3e508SAndroid Build Coastguard Worker { false, 4.4712, 67.91, 15.05, 46.40, 85.75, 12.05, 48.34 },
942*aed3e508SAndroid Build Coastguard Worker { false, 4.4940, 67.91, 15.00, 46.40, 85.75, 12.00, 48.34 },
943*aed3e508SAndroid Build Coastguard Worker { false, 4.5052, 67.91, 14.80, 48.34, 85.75, 11.80, 48.34 },
944*aed3e508SAndroid Build Coastguard Worker { false, 4.5163, 68.00, 14.60, 48.34, 85.83, 11.70, 48.34 },
945*aed3e508SAndroid Build Coastguard Worker { false, 4.5276, 68.08, 14.50, 48.34, 85.91, 11.60, 50.28 },
946*aed3e508SAndroid Build Coastguard Worker { false, 4.5390, 68.08, 14.30, 46.40, 85.91, 11.50, 48.34 },
947*aed3e508SAndroid Build Coastguard Worker { false, 4.5499, 68.08, 14.30, 48.34, 85.91, 11.50, 48.34 },
948*aed3e508SAndroid Build Coastguard Worker { false, 4.5613, 68.08, 14.30, 47.37, 85.91, 11.45, 48.34 },
949*aed3e508SAndroid Build Coastguard Worker { false, 4.5726, 68.08, 14.30, 46.40, 85.91, 11.40, 48.34 },
950*aed3e508SAndroid Build Coastguard Worker { false, 4.5837, 68.08, 14.20, 46.40, 85.91, 11.40, 48.34 },
951*aed3e508SAndroid Build Coastguard Worker { false, 4.5949, 68.08, 14.10, 46.40, 85.91, 11.40, 48.34 },
952*aed3e508SAndroid Build Coastguard Worker { false, 4.6061, 68.16, 14.10, 46.40, 85.91, 11.40, 48.34 },
953*aed3e508SAndroid Build Coastguard Worker { false, 4.6172, 68.16, 14.00, 48.34, 86.00, 11.30, 48.34 },
954*aed3e508SAndroid Build Coastguard Worker { false, 4.6285, 68.25, 13.90, 48.34, 86.00, 11.20, 48.34 },
955*aed3e508SAndroid Build Coastguard Worker { false, 4.6399, 68.25, 13.90, 48.34, 86.00, 11.20, 48.34 },
956*aed3e508SAndroid Build Coastguard Worker { false, 4.6514, 68.33, 13.80, 48.34, 86.00, 11.10, 48.34 },
957*aed3e508SAndroid Build Coastguard Worker { false, 4.6741, 68.33, 13.80, 47.37, 86.00, 11.05, 47.37 },
958*aed3e508SAndroid Build Coastguard Worker { false, 4.6968, 68.33, 13.80, 46.40, 86.00, 11.00, 46.40 },
959*aed3e508SAndroid Build Coastguard Worker { false, 4.7079, 68.33, 13.80, 42.52, 86.00, 11.00, 44.46 },
960*aed3e508SAndroid Build Coastguard Worker { false, 4.7191, 68.33, 13.80, 38.64, 86.00, 11.00, 42.52 },
961*aed3e508SAndroid Build Coastguard Worker { false, 4.7304, 68.33, 13.80, 34.76, 86.00, 11.00, 42.52 },
962*aed3e508SAndroid Build Coastguard Worker { false, 4.7417, 68.41, 13.80, 27.00, 86.41, 11.00, 36.70 },
963*aed3e508SAndroid Build Coastguard Worker { false, 4.7528, 68.83, 13.60, 21.18, 86.25, 10.90, 32.82 },
964*aed3e508SAndroid Build Coastguard Worker { false, 4.7638, 68.83, 13.60, 13.42, 86.25, 10.80, 25.06 },
965*aed3e508SAndroid Build Coastguard Worker { false, 4.7749, 68.83, 13.60, 5.65, 86.25, 10.50, 15.36 },
966*aed3e508SAndroid Build Coastguard Worker { false, 4.7862, 68.75, 14.00, 1.77, 85.91, 10.50, 7.60 },
967*aed3e508SAndroid Build Coastguard Worker };
968*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(inputs); i++) {
969*aed3e508SAndroid Build Coastguard Worker if (inputs[i].reset) {
970*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
971*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get());
972*aed3e508SAndroid Build Coastguard Worker }
973*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
974*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, inputs[i].p0, 0.0, inputs[i].x0, inputs[i].y0, 1, 0 },
975*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, inputs[i].p1, 0.0, inputs[i].x1, inputs[i].y1, 2, 0 },
976*aed3e508SAndroid Build Coastguard Worker };
977*aed3e508SAndroid Build Coastguard Worker HardwareState hs = make_hwstate(inputs[i].now, 0, 2, 2, fs);
978*aed3e508SAndroid Build Coastguard Worker
979*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
980*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hs, &timeout);
981*aed3e508SAndroid Build Coastguard Worker if (gs) {
982*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
983*aed3e508SAndroid Build Coastguard Worker EXPECT_LE(gs->details.scroll.dy, 0.0);
984*aed3e508SAndroid Build Coastguard Worker }
985*aed3e508SAndroid Build Coastguard Worker }
986*aed3e508SAndroid Build Coastguard Worker }
987*aed3e508SAndroid Build Coastguard Worker
988*aed3e508SAndroid Build Coastguard Worker struct HardwareStateAnScrollExpectations {
989*aed3e508SAndroid Build Coastguard Worker HardwareState hs;
990*aed3e508SAndroid Build Coastguard Worker float dx;
991*aed3e508SAndroid Build Coastguard Worker float dy;
992*aed3e508SAndroid Build Coastguard Worker };
993*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,DiagonalSnapTest)994*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, DiagonalSnapTest) {
995*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
996*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
997*aed3e508SAndroid Build Coastguard Worker .right = 100,
998*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
999*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
1000*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
1001*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1002*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1003*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1004*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1005*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1006*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1007*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1008*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1009*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1010*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1011*aed3e508SAndroid Build Coastguard Worker };
1012*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
1013*aed3e508SAndroid Build Coastguard Worker
1014*aed3e508SAndroid Build Coastguard Worker const float kBig = 5; // mm
1015*aed3e508SAndroid Build Coastguard Worker const float kSml = 1; // mm
1016*aed3e508SAndroid Build Coastguard Worker
1017*aed3e508SAndroid Build Coastguard Worker const float kX0 = 40;
1018*aed3e508SAndroid Build Coastguard Worker const float kX1 = 60;
1019*aed3e508SAndroid Build Coastguard Worker const float kY = 50; // heh
1020*aed3e508SAndroid Build Coastguard Worker
1021*aed3e508SAndroid Build Coastguard Worker short fid = 1;
1022*aed3e508SAndroid Build Coastguard Worker
1023*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1024*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1025*aed3e508SAndroid Build Coastguard Worker
1026*aed3e508SAndroid Build Coastguard Worker // Perfect diagonal movement - should scroll diagonally
1027*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0, kY, fid++, 0},
1028*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1, kY, fid--, 0},
1029*aed3e508SAndroid Build Coastguard Worker
1030*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0 + kBig, kY + kBig, fid++, 0},
1031*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1 + kBig, kY + kBig, fid++, 0},
1032*aed3e508SAndroid Build Coastguard Worker
1033*aed3e508SAndroid Build Coastguard Worker // Almost vertical movement - should snap to vertical
1034*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0, kY, fid++, 0},
1035*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1, kY, fid--, 0},
1036*aed3e508SAndroid Build Coastguard Worker
1037*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0 + kSml, kY + kBig, fid++, 0},
1038*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1 + kSml, kY + kBig, fid++, 0},
1039*aed3e508SAndroid Build Coastguard Worker
1040*aed3e508SAndroid Build Coastguard Worker // Almost horizontal movement - should snap to horizontal
1041*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0, kY, fid++, 0},
1042*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1, kY, fid--, 0},
1043*aed3e508SAndroid Build Coastguard Worker
1044*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0 + kBig, kY + kSml, fid++, 0},
1045*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1 + kBig, kY + kSml, fid++, 0},
1046*aed3e508SAndroid Build Coastguard Worker
1047*aed3e508SAndroid Build Coastguard Worker // Vertical movement with Warp - shouldn't scroll
1048*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0, kY, fid++, 0},
1049*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1, kY, fid--, 0},
1050*aed3e508SAndroid Build Coastguard Worker
1051*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX0, kY + kBig, fid++, GESTURES_FINGER_WARP_Y},
1052*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX1, kY + kBig, fid++, GESTURES_FINGER_WARP_Y},
1053*aed3e508SAndroid Build Coastguard Worker };
1054*aed3e508SAndroid Build Coastguard Worker ssize_t idx = 0;
1055*aed3e508SAndroid Build Coastguard Worker HardwareStateAnScrollExpectations hardware_states[] = {
1056*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1057*aed3e508SAndroid Build Coastguard Worker { make_hwstate(0.000, 0, 2, 2, &finger_states[idx * 4 ]),
1058*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1059*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.000, 0, 2, 2, &finger_states[idx * 4 ]),
1060*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1061*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.010, 0, 2, 2, &finger_states[idx++ * 4 + 2]),
1062*aed3e508SAndroid Build Coastguard Worker kBig, kBig },
1063*aed3e508SAndroid Build Coastguard Worker
1064*aed3e508SAndroid Build Coastguard Worker { make_hwstate(0.000, 0, 2, 2, &finger_states[idx * 4 ]),
1065*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1066*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.000, 0, 2, 2, &finger_states[idx * 4 ]),
1067*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1068*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.010, 0, 2, 2, &finger_states[idx++ * 4 + 2]),
1069*aed3e508SAndroid Build Coastguard Worker 0, kBig },
1070*aed3e508SAndroid Build Coastguard Worker
1071*aed3e508SAndroid Build Coastguard Worker { make_hwstate(0.000, 0, 2, 2, &finger_states[idx * 4 ]),
1072*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1073*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.000, 0, 2, 2, &finger_states[idx * 4 ]),
1074*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1075*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.010, 0, 2, 2, &finger_states[idx++ * 4 + 2]),
1076*aed3e508SAndroid Build Coastguard Worker kBig, 0 },
1077*aed3e508SAndroid Build Coastguard Worker
1078*aed3e508SAndroid Build Coastguard Worker { make_hwstate(0.000, 0, 2, 2, &finger_states[idx * 4 ]),
1079*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1080*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.000, 0, 2, 2, &finger_states[idx * 4 ]),
1081*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1082*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1.010, 0, 2, 2, &finger_states[idx++ * 4 + 2]),
1083*aed3e508SAndroid Build Coastguard Worker 0, 0 },
1084*aed3e508SAndroid Build Coastguard Worker };
1085*aed3e508SAndroid Build Coastguard Worker
1086*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hardware_states); i++) {
1087*aed3e508SAndroid Build Coastguard Worker HardwareStateAnScrollExpectations& hse = hardware_states[i];
1088*aed3e508SAndroid Build Coastguard Worker if (hse.hs.timestamp == 0.0) {
1089*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
1090*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get());
1091*aed3e508SAndroid Build Coastguard Worker }
1092*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hse.hs, nullptr);
1093*aed3e508SAndroid Build Coastguard Worker if (hse.dx == 0.0 && hse.dy == 0.0) {
1094*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs);
1095*aed3e508SAndroid Build Coastguard Worker continue;
1096*aed3e508SAndroid Build Coastguard Worker }
1097*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
1098*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
1099*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(hse.dx, gs->details.scroll.dx);
1100*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(hse.dy, gs->details.scroll.dy);
1101*aed3e508SAndroid Build Coastguard Worker }
1102*aed3e508SAndroid Build Coastguard Worker }
1103*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,RestingFingerTest)1104*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, RestingFingerTest) {
1105*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
1106*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1107*aed3e508SAndroid Build Coastguard Worker .right = 100,
1108*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
1109*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
1110*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
1111*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1112*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1113*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1114*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1115*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1116*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1117*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1118*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1119*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1120*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1121*aed3e508SAndroid Build Coastguard Worker };
1122*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
1123*aed3e508SAndroid Build Coastguard Worker
1124*aed3e508SAndroid Build Coastguard Worker const float kX = 7;
1125*aed3e508SAndroid Build Coastguard Worker float dx = 7;
1126*aed3e508SAndroid Build Coastguard Worker const float kRestY = hwprops.bottom - 7;
1127*aed3e508SAndroid Build Coastguard Worker const float kMoveY = kRestY - 10;
1128*aed3e508SAndroid Build Coastguard Worker
1129*aed3e508SAndroid Build Coastguard Worker const float kTO = 1.0; // time to wait for change timeout
1130*aed3e508SAndroid Build Coastguard Worker
1131*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1132*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1133*aed3e508SAndroid Build Coastguard Worker
1134*aed3e508SAndroid Build Coastguard Worker // Resting finger in lower left
1135*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX, kRestY, 1, 0},
1136*aed3e508SAndroid Build Coastguard Worker // Moving finger
1137*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, kX, kMoveY, 2, 0},
1138*aed3e508SAndroid Build Coastguard Worker };
1139*aed3e508SAndroid Build Coastguard Worker
1140*aed3e508SAndroid Build Coastguard Worker // Left to right movement, then right to left
1141*aed3e508SAndroid Build Coastguard Worker for (size_t direction = 0; direction < 2; direction++) {
1142*aed3e508SAndroid Build Coastguard Worker if (direction == 1)
1143*aed3e508SAndroid Build Coastguard Worker dx *= -1.0;
1144*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
1145*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get());
1146*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < 4; i++) {
1147*aed3e508SAndroid Build Coastguard Worker HardwareState hs = make_hwstate(kTO + 0.01 * i, 0, 2, 2, finger_states);
1148*aed3e508SAndroid Build Coastguard Worker if (i == 0) {
1149*aed3e508SAndroid Build Coastguard Worker hs.timestamp -= kTO;
1150*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hs, nullptr);
1151*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs);
1152*aed3e508SAndroid Build Coastguard Worker hs.timestamp += kTO;
1153*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hs, nullptr);
1154*aed3e508SAndroid Build Coastguard Worker if (gs && gs->type == kGestureTypeMove) {
1155*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0, gs->details.move.dx);
1156*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0, gs->details.move.dy);
1157*aed3e508SAndroid Build Coastguard Worker }
1158*aed3e508SAndroid Build Coastguard Worker } else {
1159*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hs, nullptr);
1160*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
1161*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
1162*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(dx, gs->details.move.dx);
1163*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0, gs->details.move.dy);
1164*aed3e508SAndroid Build Coastguard Worker }
1165*aed3e508SAndroid Build Coastguard Worker finger_states[1].position_x += dx;
1166*aed3e508SAndroid Build Coastguard Worker }
1167*aed3e508SAndroid Build Coastguard Worker }
1168*aed3e508SAndroid Build Coastguard Worker }
1169*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ThumbRetainTest)1170*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ThumbRetainTest) {
1171*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1172*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1173*aed3e508SAndroid Build Coastguard Worker .right = 100,
1174*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
1175*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
1176*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
1177*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1178*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1179*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1180*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1181*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1182*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1183*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1184*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1185*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1186*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1187*aed3e508SAndroid Build Coastguard Worker };
1188*aed3e508SAndroid Build Coastguard Worker
1189*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1190*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1191*aed3e508SAndroid Build Coastguard Worker // id 1 = finger, 2 = thumb
1192*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 24, 0, 30, 30, 1, 0},
1193*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 58, 0, 30, 50, 2, 0},
1194*aed3e508SAndroid Build Coastguard Worker
1195*aed3e508SAndroid Build Coastguard Worker // thumb, post-move
1196*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 58, 0, 50, 50, 2, 0},
1197*aed3e508SAndroid Build Coastguard Worker };
1198*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
1199*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1200*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.000, 0, 2, 2, &finger_states[0]),
1201*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.100, 0, 2, 2, &finger_states[0]),
1202*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.110, 0, 1, 1, &finger_states[1]), // finger goes away
1203*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.210, 0, 1, 1, &finger_states[1]),
1204*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.220, 0, 1, 1, &finger_states[2]), // thumb moves
1205*aed3e508SAndroid Build Coastguard Worker };
1206*aed3e508SAndroid Build Coastguard Worker
1207*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1208*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 0;
1209*aed3e508SAndroid Build Coastguard Worker
1210*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hardware_states); i++) {
1211*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[i], nullptr);
1212*aed3e508SAndroid Build Coastguard Worker if (!gs)
1213*aed3e508SAndroid Build Coastguard Worker continue;
1214*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type) << "i=" << i;
1215*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0, gs->details.move.dx) << "i=" << i;
1216*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(0.0, gs->details.move.dy) << "i=" << i;
1217*aed3e508SAndroid Build Coastguard Worker }
1218*aed3e508SAndroid Build Coastguard Worker }
1219*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ThumbRetainReevaluateTest)1220*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ThumbRetainReevaluateTest) {
1221*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1222*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1223*aed3e508SAndroid Build Coastguard Worker .right = 100,
1224*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
1225*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
1226*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
1227*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1228*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1229*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1230*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1231*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1232*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1233*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1234*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1235*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1236*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1237*aed3e508SAndroid Build Coastguard Worker };
1238*aed3e508SAndroid Build Coastguard Worker
1239*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1240*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1241*aed3e508SAndroid Build Coastguard Worker // one thumb, one finger (it seems)
1242*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 24, 0, 3.0, 3, 3, 0},
1243*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 58, 0, 13.5, 3, 4, 0},
1244*aed3e508SAndroid Build Coastguard Worker // two big fingers, it turns out!
1245*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 27, 0, 3.0, 6, 3, 0},
1246*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 58, 0, 13.5, 6, 4, 0},
1247*aed3e508SAndroid Build Coastguard Worker // they move
1248*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 27, 0, 3.0, 7, 3, 0},
1249*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 58, 0, 13.5, 7, 4, 0},
1250*aed3e508SAndroid Build Coastguard Worker };
1251*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
1252*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1253*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.000, 0, 2, 2, &finger_states[0]), // 2 fingers arrive
1254*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.010, 0, 2, 2, &finger_states[2]), // pressures fix
1255*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.100, 0, 2, 2, &finger_states[4]), // they move
1256*aed3e508SAndroid Build Coastguard Worker };
1257*aed3e508SAndroid Build Coastguard Worker
1258*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1259*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 0;
1260*aed3e508SAndroid Build Coastguard Worker
1261*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hardware_states); i++) {
1262*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[i], nullptr);
1263*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(!gs || gs->type == kGestureTypeScroll);
1264*aed3e508SAndroid Build Coastguard Worker }
1265*aed3e508SAndroid Build Coastguard Worker }
1266*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,SetHardwarePropertiesTwiceTest)1267*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, SetHardwarePropertiesTwiceTest) {
1268*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1269*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1270*aed3e508SAndroid Build Coastguard Worker .right = 1000,
1271*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
1272*aed3e508SAndroid Build Coastguard Worker .res_x = 500,
1273*aed3e508SAndroid Build Coastguard Worker .res_y = 500,
1274*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1275*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1276*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1277*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1278*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1279*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1280*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1281*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1282*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1283*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1284*aed3e508SAndroid Build Coastguard Worker };
1285*aed3e508SAndroid Build Coastguard Worker hwprops.max_finger_cnt = 3;
1286*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1287*aed3e508SAndroid Build Coastguard Worker
1288*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1289*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1290*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
1291*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 0, 0, 2, 0},
1292*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 0, 0, 3, 0},
1293*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 0, 0, 0, 0, 4, 0},
1294*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 0, 0, 0, 0, 5, 0}
1295*aed3e508SAndroid Build Coastguard Worker };
1296*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_state = {
1297*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1298*aed3e508SAndroid Build Coastguard Worker 200000, 0, 5, 5, &finger_states[0], 0, 0, 0, 0, 0, 0.0
1299*aed3e508SAndroid Build Coastguard Worker };
1300*aed3e508SAndroid Build Coastguard Worker // This used to cause a crash:
1301*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_state, nullptr);
1302*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs);
1303*aed3e508SAndroid Build Coastguard Worker }
1304*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,AmbiguousPalmCoScrollTest)1305*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, AmbiguousPalmCoScrollTest) {
1306*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1307*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1308*aed3e508SAndroid Build Coastguard Worker .right = 100,
1309*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
1310*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
1311*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
1312*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1313*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1314*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 5,
1315*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1316*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1317*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1318*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1319*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1320*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1321*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1322*aed3e508SAndroid Build Coastguard Worker };
1323*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1324*aed3e508SAndroid Build Coastguard Worker
1325*aed3e508SAndroid Build Coastguard Worker const int kPr = 20;
1326*aed3e508SAndroid Build Coastguard Worker
1327*aed3e508SAndroid Build Coastguard Worker const unsigned kPalmFlags = GESTURES_FINGER_POSSIBLE_PALM;
1328*aed3e508SAndroid Build Coastguard Worker
1329*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1330*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1331*aed3e508SAndroid Build Coastguard Worker // stationary palm - movement
1332*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 0, 40, 1, kPalmFlags},
1333*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 30, 35, 2, 0},
1334*aed3e508SAndroid Build Coastguard Worker
1335*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 0, 40, 1, kPalmFlags},
1336*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 30, 40, 2, 0},
1337*aed3e508SAndroid Build Coastguard Worker
1338*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 0, 40, 1, kPalmFlags},
1339*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 30, 45, 2, 0},
1340*aed3e508SAndroid Build Coastguard Worker
1341*aed3e508SAndroid Build Coastguard Worker // Same, but moving palm - scroll
1342*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 0, 35, 3, kPalmFlags},
1343*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 30, 35, 4, 0},
1344*aed3e508SAndroid Build Coastguard Worker
1345*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 0, 40, 3, kPalmFlags},
1346*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 30, 40, 4, 0},
1347*aed3e508SAndroid Build Coastguard Worker
1348*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 0, 45, 3, kPalmFlags},
1349*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kPr, 0, 30, 45, 4, 0},
1350*aed3e508SAndroid Build Coastguard Worker };
1351*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_state[] = {
1352*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1353*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.0, 0, 2, 2, &finger_states[0]),
1354*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.1, 0, 2, 2, &finger_states[2]),
1355*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.2, 0, 2, 2, &finger_states[4]),
1356*aed3e508SAndroid Build Coastguard Worker make_hwstate(3.0, 0, 2, 2, &finger_states[6]),
1357*aed3e508SAndroid Build Coastguard Worker make_hwstate(3.1, 0, 2, 2, &finger_states[8]),
1358*aed3e508SAndroid Build Coastguard Worker make_hwstate(3.2, 0, 2, 2, &finger_states[10]),
1359*aed3e508SAndroid Build Coastguard Worker };
1360*aed3e508SAndroid Build Coastguard Worker GestureType expected_gs[] = {
1361*aed3e508SAndroid Build Coastguard Worker kGestureTypeNull,
1362*aed3e508SAndroid Build Coastguard Worker kGestureTypeNull,
1363*aed3e508SAndroid Build Coastguard Worker kGestureTypeMove,
1364*aed3e508SAndroid Build Coastguard Worker kGestureTypeNull,
1365*aed3e508SAndroid Build Coastguard Worker kGestureTypeScroll,
1366*aed3e508SAndroid Build Coastguard Worker kGestureTypeScroll
1367*aed3e508SAndroid Build Coastguard Worker };
1368*aed3e508SAndroid Build Coastguard Worker if (ii.pinch_enable_.val_)
1369*aed3e508SAndroid Build Coastguard Worker // Movement delay is longer when pinch is enabled
1370*aed3e508SAndroid Build Coastguard Worker expected_gs[2] = kGestureTypeNull;
1371*aed3e508SAndroid Build Coastguard Worker
1372*aed3e508SAndroid Build Coastguard Worker ASSERT_EQ(arraysize(expected_gs), arraysize(hardware_state));
1373*aed3e508SAndroid Build Coastguard Worker
1374*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hardware_state); ++i) {
1375*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_state[i], nullptr);
1376*aed3e508SAndroid Build Coastguard Worker if (expected_gs[i] == kGestureTypeNull) {
1377*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, gs) << "gs:" << gs->String();
1378*aed3e508SAndroid Build Coastguard Worker } else {
1379*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
1380*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(expected_gs[i], gs->type) << "i=" << i
1381*aed3e508SAndroid Build Coastguard Worker << " gs: " << gs->String();
1382*aed3e508SAndroid Build Coastguard Worker }
1383*aed3e508SAndroid Build Coastguard Worker }
1384*aed3e508SAndroid Build Coastguard Worker }
1385*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,PressureChangeMoveTest)1386*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, PressureChangeMoveTest) {
1387*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1388*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1389*aed3e508SAndroid Build Coastguard Worker .right = 1000,
1390*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
1391*aed3e508SAndroid Build Coastguard Worker .res_x = 500,
1392*aed3e508SAndroid Build Coastguard Worker .res_y = 500,
1393*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1394*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1395*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1396*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1397*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1398*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1399*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1400*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1401*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1402*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1403*aed3e508SAndroid Build Coastguard Worker };
1404*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1405*aed3e508SAndroid Build Coastguard Worker
1406*aed3e508SAndroid Build Coastguard Worker const int kBig = 81; // large pressure
1407*aed3e508SAndroid Build Coastguard Worker const int kSml = 50; // small pressure
1408*aed3e508SAndroid Build Coastguard Worker
1409*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1410*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1411*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kSml, 0, 600, 300, 1, 0},
1412*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kSml, 0, 600, 400, 1, 0},
1413*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kBig, 0, 600, 500, 1, 0},
1414*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, kBig, 0, 600, 600, 1, 0},
1415*aed3e508SAndroid Build Coastguard Worker };
1416*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_state[] = {
1417*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1418*aed3e508SAndroid Build Coastguard Worker make_hwstate(2000.00, 0, 1, 1, &finger_states[0]),
1419*aed3e508SAndroid Build Coastguard Worker make_hwstate(2000.01, 0, 1, 1, &finger_states[1]),
1420*aed3e508SAndroid Build Coastguard Worker make_hwstate(2000.02, 0, 1, 1, &finger_states[2]),
1421*aed3e508SAndroid Build Coastguard Worker make_hwstate(2000.03, 0, 1, 1, &finger_states[3]),
1422*aed3e508SAndroid Build Coastguard Worker };
1423*aed3e508SAndroid Build Coastguard Worker
1424*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hardware_state); ++i) {
1425*aed3e508SAndroid Build Coastguard Worker Gesture* result = wrapper.SyncInterpret(hardware_state[i], nullptr);
1426*aed3e508SAndroid Build Coastguard Worker switch (i) {
1427*aed3e508SAndroid Build Coastguard Worker case 0:
1428*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(result);
1429*aed3e508SAndroid Build Coastguard Worker break;
1430*aed3e508SAndroid Build Coastguard Worker case 2:
1431*aed3e508SAndroid Build Coastguard Worker ASSERT_TRUE(result);
1432*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, result->type);
1433*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.0, result->details.move.dy);
1434*aed3e508SAndroid Build Coastguard Worker break;
1435*aed3e508SAndroid Build Coastguard Worker case 1: // fallthrough
1436*aed3e508SAndroid Build Coastguard Worker case 3:
1437*aed3e508SAndroid Build Coastguard Worker ASSERT_TRUE(result);
1438*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, result->type);
1439*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(0.0, result->details.move.dy);
1440*aed3e508SAndroid Build Coastguard Worker break;
1441*aed3e508SAndroid Build Coastguard Worker }
1442*aed3e508SAndroid Build Coastguard Worker }
1443*aed3e508SAndroid Build Coastguard Worker }
1444*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,GetGesturingFingersTest)1445*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, GetGesturingFingersTest) {
1446*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1447*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
1448*aed3e508SAndroid Build Coastguard Worker .right = 1000,
1449*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
1450*aed3e508SAndroid Build Coastguard Worker .res_x = 500,
1451*aed3e508SAndroid Build Coastguard Worker .res_y = 500,
1452*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1453*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1454*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
1455*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1456*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
1457*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
1458*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
1459*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
1460*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
1461*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
1462*aed3e508SAndroid Build Coastguard Worker };
1463*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1464*aed3e508SAndroid Build Coastguard Worker
1465*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1466*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
1467*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 61, 70, 91, 0},
1468*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 62, 65, 92, 0},
1469*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 62, 69, 93, 0},
1470*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 62, 61, 94, 0}
1471*aed3e508SAndroid Build Coastguard Worker };
1472*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_state[] = {
1473*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, finger states pointer
1474*aed3e508SAndroid Build Coastguard Worker make_hwstate(200000, 0, 0, 0, nullptr),
1475*aed3e508SAndroid Build Coastguard Worker make_hwstate(200001, 0, 1, 1, &finger_states[0]),
1476*aed3e508SAndroid Build Coastguard Worker make_hwstate(200002, 0, 2, 2, &finger_states[0]),
1477*aed3e508SAndroid Build Coastguard Worker make_hwstate(200002, 0, 3, 3, &finger_states[0]),
1478*aed3e508SAndroid Build Coastguard Worker make_hwstate(200002, 0, 4, 4, &finger_states[0]),
1479*aed3e508SAndroid Build Coastguard Worker };
1480*aed3e508SAndroid Build Coastguard Worker // few pointing fingers
1481*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(hardware_state[0]);
1482*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(hardware_state[0]);
1483*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ii.GetGesturingFingers(hardware_state[0]).empty());
1484*aed3e508SAndroid Build Coastguard Worker
1485*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(hardware_state[0]);
1486*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(hardware_state[1]);
1487*aed3e508SAndroid Build Coastguard Worker std::set<short> ids =
1488*aed3e508SAndroid Build Coastguard Worker ii.GetGesturingFingers(hardware_state[1]);
1489*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(1, ids.size());
1490*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(91));
1491*aed3e508SAndroid Build Coastguard Worker
1492*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(hardware_state[0]);
1493*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(hardware_state[2]);
1494*aed3e508SAndroid Build Coastguard Worker ids = ii.GetGesturingFingers(hardware_state[2]);
1495*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(2, ids.size());
1496*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(91));
1497*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(92));
1498*aed3e508SAndroid Build Coastguard Worker
1499*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(hardware_state[0]);
1500*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(hardware_state[3]);
1501*aed3e508SAndroid Build Coastguard Worker ids = ii.GetGesturingFingers(hardware_state[3]);
1502*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(3, ids.size());
1503*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(91));
1504*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(92));
1505*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(93));
1506*aed3e508SAndroid Build Coastguard Worker
1507*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(hardware_state[0]);
1508*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(hardware_state[4]);
1509*aed3e508SAndroid Build Coastguard Worker ids = ii.GetGesturingFingers(hardware_state[4]);
1510*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(4, ids.size());
1511*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(91));
1512*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(92));
1513*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(93));
1514*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(94));
1515*aed3e508SAndroid Build Coastguard Worker
1516*aed3e508SAndroid Build Coastguard Worker // T5R2 test
1517*aed3e508SAndroid Build Coastguard Worker hwprops.supports_t5r2 = 1;
1518*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(&ii, &hwprops);
1519*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(hardware_state[0]);
1520*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(hardware_state[2]);
1521*aed3e508SAndroid Build Coastguard Worker ids = ii.GetGesturingFingers(hardware_state[2]);
1522*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(2, ids.size());
1523*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(91));
1524*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ids.end() != ids.find(92));
1525*aed3e508SAndroid Build Coastguard Worker }
1526*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,GetGesturingFingersWithEmptyStateTest)1527*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, GetGesturingFingersWithEmptyStateTest) {
1528*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1529*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {};
1530*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1531*aed3e508SAndroid Build Coastguard Worker
1532*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
1533*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
1534*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 61, 70, 91, 0},
1535*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 62, 65, 92, 0},
1536*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 62, 69, 93, 0},
1537*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 62, 61, 94, 0},
1538*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 1, 0, 63, 80, 95, 0},
1539*aed3e508SAndroid Build Coastguard Worker };
1540*aed3e508SAndroid Build Coastguard Worker HardwareState five_finger_hwstate =
1541*aed3e508SAndroid Build Coastguard Worker make_hwstate(200000, 0, 5, 5, &finger_states[0]);
1542*aed3e508SAndroid Build Coastguard Worker HardwareState no_finger_hwstate = make_hwstate(200001, 0, 0, 0, nullptr);
1543*aed3e508SAndroid Build Coastguard Worker ii.ResetSameFingersState(five_finger_hwstate);
1544*aed3e508SAndroid Build Coastguard Worker ii.UpdatePointingFingers(five_finger_hwstate);
1545*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ii.GetGesturingFingers(no_finger_hwstate).empty());
1546*aed3e508SAndroid Build Coastguard Worker }
1547*aed3e508SAndroid Build Coastguard Worker
1548*aed3e508SAndroid Build Coastguard Worker namespace {
MkSet()1549*aed3e508SAndroid Build Coastguard Worker std::set<short> MkSet() {
1550*aed3e508SAndroid Build Coastguard Worker return std::set<short>();
1551*aed3e508SAndroid Build Coastguard Worker }
MkSet(short the_id)1552*aed3e508SAndroid Build Coastguard Worker std::set<short> MkSet(short the_id) {
1553*aed3e508SAndroid Build Coastguard Worker std::set<short> ret;
1554*aed3e508SAndroid Build Coastguard Worker ret.insert(the_id);
1555*aed3e508SAndroid Build Coastguard Worker return ret;
1556*aed3e508SAndroid Build Coastguard Worker }
MkSet(short id1,short id2)1557*aed3e508SAndroid Build Coastguard Worker std::set<short> MkSet(short id1, short id2) {
1558*aed3e508SAndroid Build Coastguard Worker std::set<short> ret;
1559*aed3e508SAndroid Build Coastguard Worker ret.insert(id1);
1560*aed3e508SAndroid Build Coastguard Worker ret.insert(id2);
1561*aed3e508SAndroid Build Coastguard Worker return ret;
1562*aed3e508SAndroid Build Coastguard Worker }
MkSet(short id1,short id2,short id3)1563*aed3e508SAndroid Build Coastguard Worker std::set<short> MkSet(short id1, short id2, short id3) {
1564*aed3e508SAndroid Build Coastguard Worker std::set<short> ret;
1565*aed3e508SAndroid Build Coastguard Worker ret.insert(id1);
1566*aed3e508SAndroid Build Coastguard Worker ret.insert(id2);
1567*aed3e508SAndroid Build Coastguard Worker ret.insert(id3);
1568*aed3e508SAndroid Build Coastguard Worker return ret;
1569*aed3e508SAndroid Build Coastguard Worker }
1570*aed3e508SAndroid Build Coastguard Worker } // namespace{}
1571*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,TapRecordTest)1572*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, TapRecordTest) {
1573*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
1574*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {};
1575*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
1576*aed3e508SAndroid Build Coastguard Worker TapRecord tr(&ii);
1577*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1578*aed3e508SAndroid Build Coastguard Worker // two finger IDs:
1579*aed3e508SAndroid Build Coastguard Worker const short kF1 = 91;
1580*aed3e508SAndroid Build Coastguard Worker const short kF2 = 92;
1581*aed3e508SAndroid Build Coastguard Worker const float kTapMoveDist = 1.0; // mm
1582*aed3e508SAndroid Build Coastguard Worker ii.tap_min_pressure_.val_ = 25;
1583*aed3e508SAndroid Build Coastguard Worker
1584*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
1585*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
1586*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, kF1, 0},
1587*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 75, 0, 4, 9, kF2, 0},
1588*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 7, 4, kF1, 0}
1589*aed3e508SAndroid Build Coastguard Worker };
1590*aed3e508SAndroid Build Coastguard Worker HardwareState nullstate = make_hwstate(0.0, 0, 0, 0, nullptr);
1591*aed3e508SAndroid Build Coastguard Worker HardwareState hw[] = {
1592*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
1593*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.0, 0, 1, 1, &fs[0]),
1594*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.1, 0, 2, 2, &fs[0]),
1595*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.2, 0, 1, 1, &fs[1]),
1596*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.3, 0, 2, 2, &fs[0]),
1597*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.4, 0, 1, 1, &fs[1]),
1598*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.5, 0, 1, 1, &fs[2]),
1599*aed3e508SAndroid Build Coastguard Worker };
1600*aed3e508SAndroid Build Coastguard Worker
1601*aed3e508SAndroid Build Coastguard Worker // Hack: TapRecord uses ImmediateInterpreter's FingerMetrics for origin
1602*aed3e508SAndroid Build Coastguard Worker // timestamps, so we need to populate those.
1603*aed3e508SAndroid Build Coastguard Worker ii.metrics_->Update(hw[0]);
1604*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[0], nullstate, MkSet(kF1), MkSet(), MkSet());
1605*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.Moving(hw[0], kTapMoveDist));
1606*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1607*aed3e508SAndroid Build Coastguard Worker ii.metrics_->Update(hw[1]);
1608*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[1], hw[0], MkSet(), MkSet(), MkSet());
1609*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.Moving(hw[1], kTapMoveDist));
1610*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1611*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[2], hw[1], MkSet(), MkSet(kF1), MkSet());
1612*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.Moving(hw[2], kTapMoveDist));
1613*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(tr.TapComplete());
1614*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(GESTURES_BUTTON_LEFT, tr.TapType());
1615*aed3e508SAndroid Build Coastguard Worker
1616*aed3e508SAndroid Build Coastguard Worker tr.Clear();
1617*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1618*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[2], hw[1], MkSet(kF2), MkSet(), MkSet());
1619*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.Moving(hw[2], kTapMoveDist));
1620*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1621*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[3], hw[2], MkSet(kF1), MkSet(), MkSet(kF2));
1622*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.Moving(hw[3], kTapMoveDist));
1623*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1624*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[4], hw[3], MkSet(), MkSet(kF1), MkSet());
1625*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.Moving(hw[4], kTapMoveDist));
1626*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(tr.TapComplete());
1627*aed3e508SAndroid Build Coastguard Worker
1628*aed3e508SAndroid Build Coastguard Worker tr.Clear();
1629*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1630*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[0], nullstate, MkSet(kF1), MkSet(), MkSet());
1631*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[5], hw[4], MkSet(), MkSet(), MkSet());
1632*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(tr.Moving(hw[5], kTapMoveDist));
1633*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(tr.TapComplete());
1634*aed3e508SAndroid Build Coastguard Worker
1635*aed3e508SAndroid Build Coastguard Worker // This should log an error
1636*aed3e508SAndroid Build Coastguard Worker tr.Clear();
1637*aed3e508SAndroid Build Coastguard Worker tr.Update(hw[2], hw[1], MkSet(), MkSet(kF1), MkSet());
1638*aed3e508SAndroid Build Coastguard Worker }
1639*aed3e508SAndroid Build Coastguard Worker
1640*aed3e508SAndroid Build Coastguard Worker namespace {
1641*aed3e508SAndroid Build Coastguard Worker
1642*aed3e508SAndroid Build Coastguard Worker // Contains inputs to be made to the tap-to-click state machine, and the
1643*aed3e508SAndroid Build Coastguard Worker // expected state and output of the machine after those inputs.
1644*aed3e508SAndroid Build Coastguard Worker struct HWStateGs {
1645*aed3e508SAndroid Build Coastguard Worker HardwareState hws;
1646*aed3e508SAndroid Build Coastguard Worker // If >= 0, no HardwareState is passed into the state machine, simulating a
1647*aed3e508SAndroid Build Coastguard Worker // callback.
1648*aed3e508SAndroid Build Coastguard Worker stime_t callback_now;
1649*aed3e508SAndroid Build Coastguard Worker // Tracking IDs of fingers that are considered to be gesturing.
1650*aed3e508SAndroid Build Coastguard Worker std::set<short> gesturing_fingers;
1651*aed3e508SAndroid Build Coastguard Worker
1652*aed3e508SAndroid Build Coastguard Worker unsigned expected_down;
1653*aed3e508SAndroid Build Coastguard Worker unsigned expected_up;
1654*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter::TapToClickState expected_state;
1655*aed3e508SAndroid Build Coastguard Worker // Whether the state machine is expected to set a timeout after receiving
1656*aed3e508SAndroid Build Coastguard Worker // these inputs.
1657*aed3e508SAndroid Build Coastguard Worker bool timeout;
1658*aed3e508SAndroid Build Coastguard Worker };
1659*aed3e508SAndroid Build Coastguard Worker
1660*aed3e508SAndroid Build Coastguard Worker // Shorter names so that HWStateGs definitions take only 1 line each.
1661*aed3e508SAndroid Build Coastguard Worker typedef ImmediateInterpreter::TapToClickState TapState;
1662*aed3e508SAndroid Build Coastguard Worker constexpr TapState kIdl = ImmediateInterpreter::kTtcIdle;
1663*aed3e508SAndroid Build Coastguard Worker constexpr TapState kFTB = ImmediateInterpreter::kTtcFirstTapBegan;
1664*aed3e508SAndroid Build Coastguard Worker constexpr TapState kTpC = ImmediateInterpreter::kTtcTapComplete;
1665*aed3e508SAndroid Build Coastguard Worker constexpr TapState kSTB = ImmediateInterpreter::kTtcSubsequentTapBegan;
1666*aed3e508SAndroid Build Coastguard Worker constexpr TapState kDrg = ImmediateInterpreter::kTtcDrag;
1667*aed3e508SAndroid Build Coastguard Worker constexpr TapState kDRl = ImmediateInterpreter::kTtcDragRelease;
1668*aed3e508SAndroid Build Coastguard Worker constexpr TapState kDRt = ImmediateInterpreter::kTtcDragRetouch;
1669*aed3e508SAndroid Build Coastguard Worker constexpr unsigned kBL = GESTURES_BUTTON_LEFT;
1670*aed3e508SAndroid Build Coastguard Worker constexpr unsigned kBM = GESTURES_BUTTON_MIDDLE;
1671*aed3e508SAndroid Build Coastguard Worker constexpr unsigned kBR = GESTURES_BUTTON_RIGHT;
1672*aed3e508SAndroid Build Coastguard Worker
1673*aed3e508SAndroid Build Coastguard Worker } // namespace {}
1674*aed3e508SAndroid Build Coastguard Worker
1675*aed3e508SAndroid Build Coastguard Worker class TapToClickStateMachineTest : public ::testing::Test {
1676*aed3e508SAndroid Build Coastguard Worker protected:
set_gesture_properties()1677*aed3e508SAndroid Build Coastguard Worker void set_gesture_properties() {
1678*aed3e508SAndroid Build Coastguard Worker ii_->drag_lock_enable_.val_ = true;
1679*aed3e508SAndroid Build Coastguard Worker ii_->motion_tap_prevent_timeout_.val_ = 0;
1680*aed3e508SAndroid Build Coastguard Worker ii_->tapping_finger_min_separation_.val_ = 1.0;
1681*aed3e508SAndroid Build Coastguard Worker ii_->tap_drag_timeout_.val_ = 0.05;
1682*aed3e508SAndroid Build Coastguard Worker ii_->tap_enable_.val_ = true;
1683*aed3e508SAndroid Build Coastguard Worker ii_->tap_drag_enable_.val_ = tap_drag_enable_;
1684*aed3e508SAndroid Build Coastguard Worker ii_->tap_move_dist_.val_ = 1.0;
1685*aed3e508SAndroid Build Coastguard Worker ii_->tap_timeout_.val_ = tap_timeout_;
1686*aed3e508SAndroid Build Coastguard Worker ii_->inter_tap_timeout_.val_ = 0.05;
1687*aed3e508SAndroid Build Coastguard Worker ii_->three_finger_click_enable_.val_ = true;
1688*aed3e508SAndroid Build Coastguard Worker ii_->t5r2_three_finger_click_enable_.val_ = true;
1689*aed3e508SAndroid Build Coastguard Worker ii_->zero_finger_click_enable_.val_ = true;
1690*aed3e508SAndroid Build Coastguard Worker }
1691*aed3e508SAndroid Build Coastguard Worker
check_hwstates(const std::vector<HWStateGs> & states,std::optional<std::string> label=std::nullopt)1692*aed3e508SAndroid Build Coastguard Worker void check_hwstates(const std::vector<HWStateGs>& states,
1693*aed3e508SAndroid Build Coastguard Worker std::optional<std::string> label = std::nullopt) {
1694*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kIdl, ii_->tap_to_click_state_);
1695*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < states.size(); ++i) {
1696*aed3e508SAndroid Build Coastguard Worker std::string label_or_empty = label.has_value() ? " (" + *label + ")" : "";
1697*aed3e508SAndroid Build Coastguard Worker SCOPED_TRACE(StringPrintf("State %zu%s", i, label_or_empty.c_str()));
1698*aed3e508SAndroid Build Coastguard Worker
1699*aed3e508SAndroid Build Coastguard Worker unsigned buttons_down = 0;
1700*aed3e508SAndroid Build Coastguard Worker unsigned buttons_up = 0;
1701*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
1702*aed3e508SAndroid Build Coastguard Worker bool same_fingers = false;
1703*aed3e508SAndroid Build Coastguard Worker const HardwareState* hwstate = &states[i].hws;
1704*aed3e508SAndroid Build Coastguard Worker stime_t now = states[i].callback_now;
1705*aed3e508SAndroid Build Coastguard Worker if (states[i].callback_now >= 0.0) {
1706*aed3e508SAndroid Build Coastguard Worker hwstate = nullptr;
1707*aed3e508SAndroid Build Coastguard Worker } else {
1708*aed3e508SAndroid Build Coastguard Worker now = states[i].hws.timestamp;
1709*aed3e508SAndroid Build Coastguard Worker }
1710*aed3e508SAndroid Build Coastguard Worker
1711*aed3e508SAndroid Build Coastguard Worker if (!hwstate || hwstate->timestamp != 0.0) {
1712*aed3e508SAndroid Build Coastguard Worker same_fingers = ii_->state_buffer_.Get(1).SameFingersAs(states[i].hws);
1713*aed3e508SAndroid Build Coastguard Worker }
1714*aed3e508SAndroid Build Coastguard Worker
1715*aed3e508SAndroid Build Coastguard Worker if (hwstate)
1716*aed3e508SAndroid Build Coastguard Worker ii_->state_buffer_.PushState(*hwstate);
1717*aed3e508SAndroid Build Coastguard Worker // TODO(b/307933752): this is unrealistic compared to the actual code that
1718*aed3e508SAndroid Build Coastguard Worker // tracks origin timestamps, but making it more realistic (by calling
1719*aed3e508SAndroid Build Coastguard Worker // ii_->metrics_->Update(*hwstate)) causes
1720*aed3e508SAndroid Build Coastguard Worker // OneFingerTapThenMoveAfterDelayDoesNotDrag to fail.
1721*aed3e508SAndroid Build Coastguard Worker for (auto finger: states[i].gesturing_fingers) {
1722*aed3e508SAndroid Build Coastguard Worker ii_->metrics_->SetFingerOriginTimestampForTesting(finger, 0);
1723*aed3e508SAndroid Build Coastguard Worker }
1724*aed3e508SAndroid Build Coastguard Worker ii_->UpdateTapState(
1725*aed3e508SAndroid Build Coastguard Worker hwstate, states[i].gesturing_fingers, same_fingers, now,
1726*aed3e508SAndroid Build Coastguard Worker &buttons_down, &buttons_up, &timeout);
1727*aed3e508SAndroid Build Coastguard Worker ii_->prev_gs_fingers_ = states[i].gesturing_fingers;
1728*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(states[i].expected_down, buttons_down);
1729*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(states[i].expected_up, buttons_up);
1730*aed3e508SAndroid Build Coastguard Worker if (states[i].timeout)
1731*aed3e508SAndroid Build Coastguard Worker EXPECT_GT(timeout, 0.0);
1732*aed3e508SAndroid Build Coastguard Worker else
1733*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(NO_DEADLINE, timeout);
1734*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(states[i].expected_state, ii_->tap_to_click_state_);
1735*aed3e508SAndroid Build Coastguard Worker }
1736*aed3e508SAndroid Build Coastguard Worker }
1737*aed3e508SAndroid Build Coastguard Worker
run_test(const std::vector<HWStateGs> & states,std::optional<std::string> label=std::nullopt)1738*aed3e508SAndroid Build Coastguard Worker void run_test(const std::vector<HWStateGs>& states,
1739*aed3e508SAndroid Build Coastguard Worker std::optional<std::string> label = std::nullopt) {
1740*aed3e508SAndroid Build Coastguard Worker ii_.reset(new ImmediateInterpreter(nullptr, nullptr));
1741*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii_.get(), &hwprops_);
1742*aed3e508SAndroid Build Coastguard Worker set_gesture_properties();
1743*aed3e508SAndroid Build Coastguard Worker check_hwstates(states, label);
1744*aed3e508SAndroid Build Coastguard Worker }
1745*aed3e508SAndroid Build Coastguard Worker
1746*aed3e508SAndroid Build Coastguard Worker // Algorithmically adds a resting thumb to all cases in states, and then tests
1747*aed3e508SAndroid Build Coastguard Worker // them.
run_test_with_added_resting_thumb(const std::vector<HWStateGs> & states)1748*aed3e508SAndroid Build Coastguard Worker void run_test_with_added_resting_thumb(const std::vector<HWStateGs>& states) {
1749*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states_with_thumbs = states;
1750*aed3e508SAndroid Build Coastguard Worker std::vector<std::vector<FingerState> > thumb_fs(states.size());
1751*aed3e508SAndroid Build Coastguard Worker const FingerState fs_thumb = {0, 0, 0, 0, 80, 0, 5, 9, 71, 0};
1752*aed3e508SAndroid Build Coastguard Worker // Start out with the thumb being able to gesture.
1753*aed3e508SAndroid Build Coastguard Worker bool thumb_gestures = true;
1754*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < states_with_thumbs.size(); ++i) {
1755*aed3e508SAndroid Build Coastguard Worker HardwareState* hs = &states_with_thumbs[i].hws;
1756*aed3e508SAndroid Build Coastguard Worker if (hs->finger_cnt > 0) {
1757*aed3e508SAndroid Build Coastguard Worker // Once a finger is present, the thumb can't gesture.
1758*aed3e508SAndroid Build Coastguard Worker thumb_gestures = false;
1759*aed3e508SAndroid Build Coastguard Worker }
1760*aed3e508SAndroid Build Coastguard Worker std::vector<FingerState>& newfs = thumb_fs[i];
1761*aed3e508SAndroid Build Coastguard Worker newfs.resize(hs->finger_cnt + 1);
1762*aed3e508SAndroid Build Coastguard Worker newfs[0] = fs_thumb;
1763*aed3e508SAndroid Build Coastguard Worker for (size_t j = 0; j < hs->finger_cnt; ++j)
1764*aed3e508SAndroid Build Coastguard Worker newfs[j + 1] = hs->fingers[j];
1765*aed3e508SAndroid Build Coastguard Worker std::set<short>& gs = states_with_thumbs[i].gesturing_fingers;
1766*aed3e508SAndroid Build Coastguard Worker if (thumb_gestures)
1767*aed3e508SAndroid Build Coastguard Worker gs.insert(fs_thumb.tracking_id);
1768*aed3e508SAndroid Build Coastguard Worker hs->fingers = &thumb_fs[i][0];
1769*aed3e508SAndroid Build Coastguard Worker hs->finger_cnt++;
1770*aed3e508SAndroid Build Coastguard Worker hs->touch_cnt++;
1771*aed3e508SAndroid Build Coastguard Worker }
1772*aed3e508SAndroid Build Coastguard Worker
1773*aed3e508SAndroid Build Coastguard Worker run_test(states_with_thumbs, "with resting thumb");
1774*aed3e508SAndroid Build Coastguard Worker }
1775*aed3e508SAndroid Build Coastguard Worker
1776*aed3e508SAndroid Build Coastguard Worker // Removes pressure data from the states, then tests them.
run_test_without_pressure_data(const std::vector<HWStateGs> & states)1777*aed3e508SAndroid Build Coastguard Worker void run_test_without_pressure_data(const std::vector<HWStateGs>& states) {
1778*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = hwprops_;
1779*aed3e508SAndroid Build Coastguard Worker hwprops.reports_pressure = false;
1780*aed3e508SAndroid Build Coastguard Worker
1781*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states_without_pressure = states;
1782*aed3e508SAndroid Build Coastguard Worker std::vector<std::vector<FingerState>> finger_states(states.size());
1783*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < states_without_pressure.size(); i++) {
1784*aed3e508SAndroid Build Coastguard Worker HWStateGs& state = states_without_pressure[i];
1785*aed3e508SAndroid Build Coastguard Worker if (state.hws.finger_cnt == 0) {
1786*aed3e508SAndroid Build Coastguard Worker continue;
1787*aed3e508SAndroid Build Coastguard Worker }
1788*aed3e508SAndroid Build Coastguard Worker for (size_t j = 0; j < state.hws.finger_cnt; j++) {
1789*aed3e508SAndroid Build Coastguard Worker FingerState fs_without_pressure = state.hws.fingers[j];
1790*aed3e508SAndroid Build Coastguard Worker fs_without_pressure.pressure = 0;
1791*aed3e508SAndroid Build Coastguard Worker finger_states[i].push_back(fs_without_pressure);
1792*aed3e508SAndroid Build Coastguard Worker }
1793*aed3e508SAndroid Build Coastguard Worker state.hws.fingers = &finger_states[i][0];
1794*aed3e508SAndroid Build Coastguard Worker }
1795*aed3e508SAndroid Build Coastguard Worker
1796*aed3e508SAndroid Build Coastguard Worker ii_.reset(new ImmediateInterpreter(nullptr, nullptr));
1797*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii_.get(), &hwprops);
1798*aed3e508SAndroid Build Coastguard Worker set_gesture_properties();
1799*aed3e508SAndroid Build Coastguard Worker check_hwstates(states_without_pressure, "without pressure data");
1800*aed3e508SAndroid Build Coastguard Worker }
1801*aed3e508SAndroid Build Coastguard Worker
1802*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii_;
1803*aed3e508SAndroid Build Coastguard Worker bool tap_drag_enable_ = true;
1804*aed3e508SAndroid Build Coastguard Worker double tap_timeout_ = 0.05;
1805*aed3e508SAndroid Build Coastguard Worker private:
1806*aed3e508SAndroid Build Coastguard Worker const HardwareProperties hwprops_ = {
1807*aed3e508SAndroid Build Coastguard Worker .right = 200,
1808*aed3e508SAndroid Build Coastguard Worker .bottom = 200,
1809*aed3e508SAndroid Build Coastguard Worker .res_x = 1.0, // pixels/TP width
1810*aed3e508SAndroid Build Coastguard Worker .res_y = 1.0, // pixels/TP height
1811*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
1812*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
1813*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 5,
1814*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
1815*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = false,
1816*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = false,
1817*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
1818*aed3e508SAndroid Build Coastguard Worker .has_wheel = false,
1819*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = false,
1820*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
1821*aed3e508SAndroid Build Coastguard Worker };
1822*aed3e508SAndroid Build Coastguard Worker };
1823*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTap)1824*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTap) {
1825*aed3e508SAndroid Build Coastguard Worker FingerState fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1826*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1827*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kFTB, false},
1828*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
1829*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07, 0, 0, 0, nullptr), .07, MkSet(), kBL, kBL, kIdl, false},
1830*aed3e508SAndroid Build Coastguard Worker };
1831*aed3e508SAndroid Build Coastguard Worker run_test(states);
1832*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1833*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1834*aed3e508SAndroid Build Coastguard Worker }
1835*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapWithoutDraggingEnabled)1836*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapWithoutDraggingEnabled) {
1837*aed3e508SAndroid Build Coastguard Worker FingerState fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1838*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1839*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kFTB, false},
1840*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), kBL, kBL, kIdl, false},
1841*aed3e508SAndroid Build Coastguard Worker };
1842*aed3e508SAndroid Build Coastguard Worker tap_drag_enable_ = false;
1843*aed3e508SAndroid Build Coastguard Worker run_test(states);
1844*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1845*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1846*aed3e508SAndroid Build Coastguard Worker }
1847*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapWithClick)1848*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapWithClick) {
1849*aed3e508SAndroid Build Coastguard Worker FingerState fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1850*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1851*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, kBL, 1, 1, &fs), -1, MkSet(91), 0, 0, kIdl, false},
1852*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
1853*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07, 0, 0, 0, nullptr), .07, MkSet(), 0, 0, kIdl, false},
1854*aed3e508SAndroid Build Coastguard Worker };
1855*aed3e508SAndroid Build Coastguard Worker run_test(states);
1856*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1857*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1858*aed3e508SAndroid Build Coastguard Worker }
1859*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerSwipe)1860*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerSwipe) {
1861*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
1862*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
1863*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
1864*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
1865*aed3e508SAndroid Build Coastguard Worker };
1866*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1867*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(95), 0, 0, kFTB, false},
1868*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 1, 1, &fs[1]), -1, MkSet(95), 0, 0, kIdl, false},
1869*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 1, 1, &fs[2]), -1, MkSet(95), 0, 0, kIdl, false},
1870*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
1871*aed3e508SAndroid Build Coastguard Worker };
1872*aed3e508SAndroid Build Coastguard Worker run_test(states);
1873*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1874*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1875*aed3e508SAndroid Build Coastguard Worker }
1876*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,DoubleOneFingerTap)1877*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, DoubleOneFingerTap) {
1878*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
1879*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
1880*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 93, 0},
1881*aed3e508SAndroid Build Coastguard Worker };
1882*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1883*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(91), 0, 0, kFTB, false},
1884*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
1885*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 1, 1, &fs[1]), -1, MkSet(93), 0, 0, kSTB, false},
1886*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), kBL, kBL, kTpC, true},
1887*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09, 0, 0, 0, nullptr), .09, MkSet(), kBL, kBL, kIdl, false},
1888*aed3e508SAndroid Build Coastguard Worker };
1889*aed3e508SAndroid Build Coastguard Worker run_test(states);
1890*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1891*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1892*aed3e508SAndroid Build Coastguard Worker }
1893*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TripleOneFingerTap)1894*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TripleOneFingerTap) {
1895*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
1896*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
1897*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 93, 0},
1898*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 94, 0},
1899*aed3e508SAndroid Build Coastguard Worker };
1900*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1901*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(91), 0, 0, kFTB, false},
1902*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
1903*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 1, 1, &fs[1]), -1, MkSet(93), 0, 0, kSTB, false},
1904*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), kBL, kBL, kTpC, true},
1905*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04, 0, 1, 1, &fs[2]), -1, MkSet(94), 0, 0, kSTB, false},
1906*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.05, 0, 0, 0, nullptr), -1, MkSet(), kBL, kBL, kTpC, true},
1907*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.11, 0, 0, 0, nullptr), .11, MkSet(), kBL, kBL, kIdl, false},
1908*aed3e508SAndroid Build Coastguard Worker };
1909*aed3e508SAndroid Build Coastguard Worker run_test(states);
1910*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1911*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1912*aed3e508SAndroid Build Coastguard Worker }
1913*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapAndDrag)1914*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapAndDrag) {
1915*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1916*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
1917*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
1918*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
1919*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
1920*aed3e508SAndroid Build Coastguard Worker };
1921*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1922*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
1923*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
1924*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&drag_fs[0]),-1,MkSet(95),0,0,kSTB,false},
1925*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.13,0,1,1,&drag_fs[1]),-1,MkSet(95),kBL,0,kDrg,false},
1926*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14,0,1,1,&drag_fs[2]),-1,MkSet(95),0,0,kDrg,false},
1927*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.15,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
1928*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),0,kBL,kIdl,false},
1929*aed3e508SAndroid Build Coastguard Worker };
1930*aed3e508SAndroid Build Coastguard Worker run_test(states);
1931*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1932*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1933*aed3e508SAndroid Build Coastguard Worker }
1934*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapThenMoveAfterDelayDoesNotDrag)1935*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapThenMoveAfterDelayDoesNotDrag) {
1936*aed3e508SAndroid Build Coastguard Worker // TODO(b/307933752): this test fails if more realistic origin timestamps are
1937*aed3e508SAndroid Build Coastguard Worker // set in TapToClickStateMachineTest::check_hwstates (i.e. calling
1938*aed3e508SAndroid Build Coastguard Worker // ii_->metrics_->Update instead of setting the origin timestamps of
1939*aed3e508SAndroid Build Coastguard Worker // gesturing_fingers to 0). Check whether that's a problem with the test or
1940*aed3e508SAndroid Build Coastguard Worker // the code it's testing.
1941*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1942*aed3e508SAndroid Build Coastguard Worker FingerState move_fs[] = {
1943*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
1944*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
1945*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
1946*aed3e508SAndroid Build Coastguard Worker };
1947*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1948*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
1949*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
1950*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.22,0,1,1,&move_fs[0]),-1,MkSet(95),kBL,kBL,kIdl,false},
1951*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.23,0,1,1,&move_fs[1]),-1,MkSet(95),0,0,kIdl,false},
1952*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.25,0,1,1,&move_fs[2]),-1,MkSet(95),0,0,kIdl,false},
1953*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.26,0,0,0,nullptr),-1,MkSet(),0,0,kIdl,false},
1954*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),0,0,kIdl,false},
1955*aed3e508SAndroid Build Coastguard Worker };
1956*aed3e508SAndroid Build Coastguard Worker run_test(states);
1957*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1958*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1959*aed3e508SAndroid Build Coastguard Worker }
1960*aed3e508SAndroid Build Coastguard Worker
1961*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapAndMoveDrags)1962*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapAndMoveDrags) {
1963*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1964*aed3e508SAndroid Build Coastguard Worker FingerState move_fs[] = {
1965*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
1966*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
1967*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
1968*aed3e508SAndroid Build Coastguard Worker };
1969*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1970*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
1971*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
1972*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&move_fs[0]),-1,MkSet(95),0,0,kSTB,false},
1973*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,1,1,&move_fs[1]),-1,MkSet(95),kBL,0,kDrg,false},
1974*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04,0,1,1,&move_fs[2]),-1,MkSet(95),0,0,kDrg,false},
1975*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.05,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
1976*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),0,kBL,kIdl,false},
1977*aed3e508SAndroid Build Coastguard Worker };
1978*aed3e508SAndroid Build Coastguard Worker run_test(states);
1979*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
1980*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
1981*aed3e508SAndroid Build Coastguard Worker }
1982*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapDragLock)1983*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapDragLock) {
1984*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
1985*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
1986*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
1987*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
1988*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
1989*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 96, 0},
1990*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 96, 0},
1991*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 96, 0},
1992*aed3e508SAndroid Build Coastguard Worker };
1993*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
1994*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
1995*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
1996*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&drag_fs[0]),-1,MkSet(95),0,0,kSTB,false},
1997*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.08,0,1,1,&drag_fs[1]),-1,MkSet(95),kBL,0,kDrg,false},
1998*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09,0,1,1,&drag_fs[2]),-1,MkSet(95),0,0,kDrg,false},
1999*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.10,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
2000*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.11,0,1,1,&drag_fs[3]),-1,MkSet(96),0,0,kDRt,false},
2001*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.12,0,1,1,&drag_fs[4]),-1,MkSet(96),0,0,kDrg,false},
2002*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.13,0,1,1,&drag_fs[5]),-1,MkSet(96),0,0,kDrg,false},
2003*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
2004*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),0,kBL,kIdl,false},
2005*aed3e508SAndroid Build Coastguard Worker };
2006*aed3e508SAndroid Build Coastguard Worker run_test(states);
2007*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2008*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2009*aed3e508SAndroid Build Coastguard Worker }
2010*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerLongPress)2011*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerLongPress) {
2012*aed3e508SAndroid Build Coastguard Worker FingerState fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2013*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2014*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kFTB, false},
2015*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kFTB, false},
2016*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kFTB, false},
2017*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.06, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kIdl, false},
2018*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2019*aed3e508SAndroid Build Coastguard Worker };
2020*aed3e508SAndroid Build Coastguard Worker run_test(states);
2021*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2022*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2023*aed3e508SAndroid Build Coastguard Worker }
2024*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapThenLongPress)2025*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapThenLongPress) {
2026*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2027*aed3e508SAndroid Build Coastguard Worker FingerState press_fs = {0, 0, 0, 0, 50, 0, 4, 4, 95, 0};
2028*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2029*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
2030*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2031*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&press_fs),-1,MkSet(95),0,0,kSTB,false},
2032*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14,0,1,1,&press_fs),-1,MkSet(95),kBL,0,kDrg,false},
2033*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.16,0,1,1,&press_fs),-1,MkSet(95),0,0,kDrg,false},
2034*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.18,0,1,1,&press_fs),-1,MkSet(95),0,0,kDrg,false},
2035*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.19,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
2036*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),0,kBL,kIdl,false},
2037*aed3e508SAndroid Build Coastguard Worker };
2038*aed3e508SAndroid Build Coastguard Worker run_test(states);
2039*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2040*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2041*aed3e508SAndroid Build Coastguard Worker }
2042*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTap)2043*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerTap) {
2044*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2045*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2046*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2047*aed3e508SAndroid Build Coastguard Worker };
2048*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2049*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(97, 98), 0, 0, kFTB, false},
2050*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2051*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07, 0, 0, 0, nullptr), .07, MkSet(), 0, 0, kIdl, false},
2052*aed3e508SAndroid Build Coastguard Worker };
2053*aed3e508SAndroid Build Coastguard Worker run_test(states);
2054*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2055*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2056*aed3e508SAndroid Build Coastguard Worker }
2057*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,ThreeFingerTap)2058*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, ThreeFingerTap) {
2059*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2060*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2061*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2062*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 14, 1, 99, 0},
2063*aed3e508SAndroid Build Coastguard Worker };
2064*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2065*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,3,3,&fs[0]),-1,MkSet(97,98,99),0,0,kFTB,false},
2066*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),kBM,kBM,kIdl,false},
2067*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07,0,0,0,nullptr),.07,MkSet(),0,0,kIdl,false},
2068*aed3e508SAndroid Build Coastguard Worker };
2069*aed3e508SAndroid Build Coastguard Worker run_test(states);
2070*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2071*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2072*aed3e508SAndroid Build Coastguard Worker }
2073*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapWithOneFingerVeryLightGivesLeftClick)2074*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest,
2075*aed3e508SAndroid Build Coastguard Worker TwoFingerTapWithOneFingerVeryLightGivesLeftClick) {
2076*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2077*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2078*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 3, 0, 9, 1, 98, 0},
2079*aed3e508SAndroid Build Coastguard Worker };
2080*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2081*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(97, 98), 0, 0, kFTB, false},
2082*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
2083*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07, 0, 0, 0, nullptr), .07, MkSet(), kBL, kBL, kIdl, false},
2084*aed3e508SAndroid Build Coastguard Worker };
2085*aed3e508SAndroid Build Coastguard Worker run_test(states);
2086*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2087*aed3e508SAndroid Build Coastguard Worker }
2088*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerScroll)2089*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerScroll) {
2090*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2091*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2092*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2093*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 5, 97, 0},
2094*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 5, 98, 0},
2095*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 9, 97, 0},
2096*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 9, 98, 0},
2097*aed3e508SAndroid Build Coastguard Worker };
2098*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2099*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(97, 98), 0, 0, kFTB, false},
2100*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 2, 2, &fs[2]), -1, MkSet(97, 98), 0, 0, kIdl, false},
2101*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 2, 2, &fs[4]), -1, MkSet(97, 98), 0, 0, kIdl, false},
2102*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2103*aed3e508SAndroid Build Coastguard Worker };
2104*aed3e508SAndroid Build Coastguard Worker run_test(states);
2105*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2106*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2107*aed3e508SAndroid Build Coastguard Worker }
2108*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapThenTwoFingerTap)2109*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapThenTwoFingerTap) {
2110*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2111*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2112*aed3e508SAndroid Build Coastguard Worker
2113*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2114*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2115*aed3e508SAndroid Build Coastguard Worker };
2116*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2117*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&fs[0]),-1,MkSet(91),0,0,kFTB,false},
2118*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2119*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,2,2,&fs[1]),-1,MkSet(97,98),kBL,kBL,kFTB,false},
2120*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,0,0,nullptr),-1,MkSet(),kBR,kBR,kIdl,false},
2121*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09,0,0,0,nullptr),.09,MkSet(),0,0,kIdl,false},
2122*aed3e508SAndroid Build Coastguard Worker };
2123*aed3e508SAndroid Build Coastguard Worker run_test(states);
2124*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2125*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2126*aed3e508SAndroid Build Coastguard Worker }
2127*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapThenMultiFrameTwoFingerTap)2128*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapThenMultiFrameTwoFingerTap) {
2129*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2130*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2131*aed3e508SAndroid Build Coastguard Worker
2132*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2133*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2134*aed3e508SAndroid Build Coastguard Worker };
2135*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2136*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(91), 0, 0, kFTB, false},
2137*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
2138*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 1, 1, &fs[1]), -1, MkSet(97), 0, 0, kSTB, false},
2139*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 1, 1, &fs[2]), -1, MkSet(98), kBL, kBL, kFTB, false},
2140*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2141*aed3e508SAndroid Build Coastguard Worker };
2142*aed3e508SAndroid Build Coastguard Worker run_test(states);
2143*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2144*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2145*aed3e508SAndroid Build Coastguard Worker }
2146*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapThenOneFingerTap)2147*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerTapThenOneFingerTap) {
2148*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2149*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2150*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2151*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2152*aed3e508SAndroid Build Coastguard Worker };
2153*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2154*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(97, 98), 0, 0, kFTB, false},
2155*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2156*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 1, 1, &fs[2]), -1, MkSet(91), 0, 0, kFTB, false},
2157*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
2158*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09, 0, 0, 0, nullptr), .09, MkSet(), kBL, kBL, kIdl, false},
2159*aed3e508SAndroid Build Coastguard Worker };
2160*aed3e508SAndroid Build Coastguard Worker run_test(states);
2161*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2162*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2163*aed3e508SAndroid Build Coastguard Worker }
2164*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,ThreeFingerTapThenOneFingerTap)2165*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, ThreeFingerTapThenOneFingerTap) {
2166*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2167*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2168*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2169*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 14, 1, 99, 0},
2170*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2171*aed3e508SAndroid Build Coastguard Worker };
2172*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2173*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,3,3,&fs[0]),-1,MkSet(97,98,99),0,0,kFTB,false},
2174*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),kBM,kBM,kIdl,false},
2175*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&fs[3]),-1,MkSet(91),0,0,kFTB,false},
2176*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2177*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09,0,0,0,nullptr),.09,MkSet(),kBL,kBL,kIdl,false},
2178*aed3e508SAndroid Build Coastguard Worker };
2179*aed3e508SAndroid Build Coastguard Worker run_test(states);
2180*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2181*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2182*aed3e508SAndroid Build Coastguard Worker }
2183*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,DoubleTwoFingerTap)2184*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, DoubleTwoFingerTap) {
2185*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2186*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
2187*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 96, 0},
2188*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2189*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2190*aed3e508SAndroid Build Coastguard Worker };
2191*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2192*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kFTB, false},
2193*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2194*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 2, 2, &fs[2]), -1, MkSet(97, 98), 0, 0, kFTB, false},
2195*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2196*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09, 0, 0, 0, nullptr), .09, MkSet(), 0, 0, kIdl, false},
2197*aed3e508SAndroid Build Coastguard Worker };
2198*aed3e508SAndroid Build Coastguard Worker run_test(states);
2199*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2200*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2201*aed3e508SAndroid Build Coastguard Worker }
2202*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,DrumrollSeparationOnFastSwipe)2203*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, DrumrollSeparationOnFastSwipe) {
2204*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2205*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 50, 40, 95, 0},
2206*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 70, 40, 96, GESTURES_FINGER_NO_TAP},
2207*aed3e508SAndroid Build Coastguard Worker };
2208*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2209*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(95), 0, 0, kFTB, false},
2210*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 1, 1, &fs[1]), -1, MkSet(96), 0, 0, kIdl, false},
2211*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2212*aed3e508SAndroid Build Coastguard Worker };
2213*aed3e508SAndroid Build Coastguard Worker run_test(states);
2214*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2215*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2216*aed3e508SAndroid Build Coastguard Worker }
2217*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapThenTwoFingerDrag)2218*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapThenTwoFingerDrag) {
2219*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2220*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
2221*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2222*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2223*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 5, 97, 0},
2224*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 5, 98, 0},
2225*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 9, 97, 0},
2226*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 9, 98, 0},
2227*aed3e508SAndroid Build Coastguard Worker };
2228*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2229*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
2230*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2231*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,2,2,&drag_fs[0]),-1,MkSet(97,98),kBL,kBL,kFTB,false},
2232*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,2,2,&drag_fs[2]),-1,MkSet(97,98),0,0,kIdl,false},
2233*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04,0,2,2,&drag_fs[4]),-1,MkSet(97,98),0,0,kIdl,false},
2234*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.05,0,0,0,nullptr),-1,MkSet(),0,0,kIdl,false},
2235*aed3e508SAndroid Build Coastguard Worker };
2236*aed3e508SAndroid Build Coastguard Worker run_test(states);
2237*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2238*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2239*aed3e508SAndroid Build Coastguard Worker }
2240*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapThenMultiFrameTwoFingerDrag)2241*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapThenMultiFrameTwoFingerDrag) {
2242*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2243*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
2244*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2245*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 5, 97, 0},
2246*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 5, 98, 0},
2247*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 9, 97, 0},
2248*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 9, 98, 0},
2249*aed3e508SAndroid Build Coastguard Worker };
2250*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2251*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
2252*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2253*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&drag_fs[0]),-1,MkSet(97),0,0,kSTB,false},
2254*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,2,2,&drag_fs[1]),-1,MkSet(97,98),kBL,kBL,kIdl,false},
2255*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04,0,2,2,&drag_fs[3]),-1,MkSet(97,98),0,0,kIdl,false},
2256*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.05,0,0,0,nullptr),-1,MkSet(),0,0,kIdl,false},
2257*aed3e508SAndroid Build Coastguard Worker };
2258*aed3e508SAndroid Build Coastguard Worker run_test(states);
2259*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2260*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2261*aed3e508SAndroid Build Coastguard Worker }
2262*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerTapAndDragWithExtraFingerLater)2263*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerTapAndDragWithExtraFingerLater) {
2264*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2265*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
2266*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2267*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 5, 97, 0},
2268*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 5, 98, 0},
2269*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 9, 97, 0},
2270*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 9, 98, 0},
2271*aed3e508SAndroid Build Coastguard Worker };
2272*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2273*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs),-1,MkSet(91),0,0,kFTB,false},
2274*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2275*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&drag_fs[0]),-1,MkSet(97),0,0,kSTB,false},
2276*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.13,0,1,1,&drag_fs[0]),-1,MkSet(97),kBL,0,kDrg,false},
2277*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14,0,2,2,&drag_fs[1]),-1,MkSet(97,98),0,kBL,kIdl,false},
2278*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.15,0,2,2,&drag_fs[3]),-1,MkSet(97,98),0,0,kIdl,false},
2279*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.16,0,0,0,nullptr),-1,MkSet(),0,0,kIdl,false},
2280*aed3e508SAndroid Build Coastguard Worker };
2281*aed3e508SAndroid Build Coastguard Worker run_test(states);
2282*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2283*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2284*aed3e508SAndroid Build Coastguard Worker }
2285*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapThenOneFingerDrag)2286*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerTapThenOneFingerDrag) {
2287*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs[] = {
2288*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 9, 97, 0},
2289*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 9, 98, 0},
2290*aed3e508SAndroid Build Coastguard Worker };
2291*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
2292*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
2293*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
2294*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
2295*aed3e508SAndroid Build Coastguard Worker };
2296*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2297*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,2,2,&tap_fs[0]),-1,MkSet(97,98),0,0,kFTB,false},
2298*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),kBR,kBR,kIdl,false},
2299*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&drag_fs[0]),-1,MkSet(95),0,0,kFTB,false},
2300*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,1,1,&drag_fs[1]),-1,MkSet(95),0,0,kIdl,false},
2301*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04,0,1,1,&drag_fs[2]),-1,MkSet(95),0,0,kIdl,false},
2302*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.05,0,0,0,nullptr),-1,MkSet(),0,0,kIdl,false},
2303*aed3e508SAndroid Build Coastguard Worker };
2304*aed3e508SAndroid Build Coastguard Worker run_test(states);
2305*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2306*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2307*aed3e508SAndroid Build Coastguard Worker }
2308*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapAndDrag)2309*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerTapAndDrag) {
2310*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs[] = {
2311*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
2312*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 96, 0},
2313*aed3e508SAndroid Build Coastguard Worker };
2314*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
2315*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2316*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2317*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 5, 97, 0},
2318*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 5, 98, 0},
2319*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 9, 97, 0},
2320*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 9, 98, 0},
2321*aed3e508SAndroid Build Coastguard Worker };
2322*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2323*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,2,2,&tap_fs[0]),-1,MkSet(95,96),0,0,kFTB,false},
2324*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),kBR,kBR,kIdl,false},
2325*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,2,2,&drag_fs[0]),-1,MkSet(97,98),0,0,kFTB,false},
2326*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03,0,2,2,&drag_fs[2]),-1,MkSet(97,98),0,0,kIdl,false},
2327*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.04,0,2,2,&drag_fs[4]),-1,MkSet(97,98),0,0,kIdl,false},
2328*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.05,0,0,0,nullptr),-1,MkSet(),0,0,kIdl,false},
2329*aed3e508SAndroid Build Coastguard Worker };
2330*aed3e508SAndroid Build Coastguard Worker run_test(states);
2331*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2332*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2333*aed3e508SAndroid Build Coastguard Worker }
2334*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerDragThenTwoFingerTap)2335*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerDragThenTwoFingerTap) {
2336*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs1 = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2337*aed3e508SAndroid Build Coastguard Worker FingerState drag_fs[] = {
2338*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 95, 0},
2339*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 95, 0},
2340*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
2341*aed3e508SAndroid Build Coastguard Worker };
2342*aed3e508SAndroid Build Coastguard Worker FingerState tap_fs2[] = {
2343*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2344*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2345*aed3e508SAndroid Build Coastguard Worker };
2346*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2347*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&tap_fs1),-1,MkSet(91),0,0,kFTB,false},
2348*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2349*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&drag_fs[0]),-1,MkSet(95),0,0,kSTB,false},
2350*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.10,0,1,1,&drag_fs[1]),-1,MkSet(95),kBL,0,kDrg,false},
2351*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.11,0,1,1,&drag_fs[2]),-1,MkSet(95),0,0,kDrg,false},
2352*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.12,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
2353*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.13,0,2,2,&tap_fs2[0]),-1,MkSet(97,98),0,0,kDRt,false},
2354*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14,0,0,0,nullptr),-1,MkSet(),0,kBL,kTpC,true},
2355*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),kBR,kBR,kIdl,false},
2356*aed3e508SAndroid Build Coastguard Worker };
2357*aed3e508SAndroid Build Coastguard Worker run_test(states);
2358*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2359*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2360*aed3e508SAndroid Build Coastguard Worker }
2361*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,SlowDoubleTap)2362*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, SlowDoubleTap) {
2363*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2364*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2365*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 93, 0},
2366*aed3e508SAndroid Build Coastguard Worker };
2367*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2368*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(91), 0, 0, kFTB, false},
2369*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.10, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
2370*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.12, 0, 1, 1, &fs[1]), -1, MkSet(93), 0, 0, kSTB, false},
2371*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.22, 0, 0, 0, nullptr), -1, MkSet(), kBL, kBL, kTpC, true},
2372*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.90, 0, 0, 0, nullptr), .9, MkSet(), kBL, kBL, kIdl, false},
2373*aed3e508SAndroid Build Coastguard Worker };
2374*aed3e508SAndroid Build Coastguard Worker tap_timeout_ = 0.11;
2375*aed3e508SAndroid Build Coastguard Worker run_test(states);
2376*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2377*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2378*aed3e508SAndroid Build Coastguard Worker }
2379*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapWithVeryCloseFingersIgnored)2380*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerTapWithVeryCloseFingersIgnored) {
2381*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2382*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8.0, 4, 95, 0},
2383*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8.1, 4, 96, 0},
2384*aed3e508SAndroid Build Coastguard Worker };
2385*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2386*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kIdl, false},
2387*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2388*aed3e508SAndroid Build Coastguard Worker };
2389*aed3e508SAndroid Build Coastguard Worker run_test(states);
2390*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2391*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2392*aed3e508SAndroid Build Coastguard Worker }
2393*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,VeryLightTapIgnored)2394*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, VeryLightTapIgnored) {
2395*aed3e508SAndroid Build Coastguard Worker FingerState fs = {0, 0, 0, 0, 15, 0, 9.5, 4, 95, 0};
2396*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2397*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs), -1, MkSet(95), 0, 0, kFTB, false},
2398*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2399*aed3e508SAndroid Build Coastguard Worker };
2400*aed3e508SAndroid Build Coastguard Worker run_test(states);
2401*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2402*aed3e508SAndroid Build Coastguard Worker }
2403*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,VeryLightTwoFingerTapIgnored)2404*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, VeryLightTwoFingerTapIgnored) {
2405*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2406*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 15, 0, 9.5, 4, 95, 0},
2407*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 15, 0, 11, 4, 96, 0},
2408*aed3e508SAndroid Build Coastguard Worker };
2409*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2410*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95,96), 0, 0, kFTB, false},
2411*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2412*aed3e508SAndroid Build Coastguard Worker };
2413*aed3e508SAndroid Build Coastguard Worker run_test(states);
2414*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2415*aed3e508SAndroid Build Coastguard Worker }
2416*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapWithOneVeryLightGivesRightClick)2417*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest,
2418*aed3e508SAndroid Build Coastguard Worker TwoFingerTapWithOneVeryLightGivesRightClick) {
2419*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2420*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8.1, 4, 96, 0},
2421*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 15, 0, 9.5, 4, 95, 0},
2422*aed3e508SAndroid Build Coastguard Worker };
2423*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2424*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kFTB, false},
2425*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2426*aed3e508SAndroid Build Coastguard Worker };
2427*aed3e508SAndroid Build Coastguard Worker run_test(states);
2428*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2429*aed3e508SAndroid Build Coastguard Worker }
2430*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerTapTooFarApartGivesLeftClick)2431*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerTapTooFarApartGivesLeftClick) {
2432*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2433*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 20, 4, 95, 0},
2434*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 90, 4, 96, 0},
2435*aed3e508SAndroid Build Coastguard Worker };
2436*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2437*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kFTB, false},
2438*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kTpC, true},
2439*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.07, 0, 0, 0, nullptr), .07, MkSet(), kBL, kBL, kIdl, false},
2440*aed3e508SAndroid Build Coastguard Worker };
2441*aed3e508SAndroid Build Coastguard Worker run_test(states);
2442*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2443*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2444*aed3e508SAndroid Build Coastguard Worker }
2445*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingersMergingDoesntClick)2446*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingersMergingDoesntClick) {
2447*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2448*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 95, 0},
2449*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 96, 0},
2450*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2451*aed3e508SAndroid Build Coastguard Worker };
2452*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2453*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kFTB, false},
2454*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kIdl, false},
2455*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01, 0, 1, 1, &fs[2]), -1, MkSet(91), 0, 0, kIdl, false},
2456*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2457*aed3e508SAndroid Build Coastguard Worker };
2458*aed3e508SAndroid Build Coastguard Worker run_test(states);
2459*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2460*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2461*aed3e508SAndroid Build Coastguard Worker }
2462*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,OneFingerMarkedAsPalmIgnored)2463*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, OneFingerMarkedAsPalmIgnored) {
2464*aed3e508SAndroid Build Coastguard Worker FingerState palm_fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, GESTURES_FINGER_PALM};
2465*aed3e508SAndroid Build Coastguard Worker FingerState fs = {0, 0, 0, 0, 50, 0, 4, 4, 91, 0};
2466*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2467*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &palm_fs), -1, MkSet(), 0, 0, kIdl, false},
2468*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.50, 0, 1, 1, &fs), -1, MkSet(91), 0, 0, kIdl, false},
2469*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.51, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2470*aed3e508SAndroid Build Coastguard Worker };
2471*aed3e508SAndroid Build Coastguard Worker run_test(states);
2472*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2473*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2474*aed3e508SAndroid Build Coastguard Worker }
2475*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingersBelowPressureThresholdAndNotGesturing)2476*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest,
2477*aed3e508SAndroid Build Coastguard Worker TwoFingersBelowPressureThresholdAndNotGesturing) {
2478*aed3e508SAndroid Build Coastguard Worker // Two fingers seem to tap, the bigger of which is the only one that meets the
2479*aed3e508SAndroid Build Coastguard Worker // minimum pressure threshold. Then that higher pressure finger is no longer
2480*aed3e508SAndroid Build Coastguard Worker // gesturing (e.g., it gets classified as a thumb).
2481*aed3e508SAndroid Build Coastguard Worker // There should be no tap because the one remaining finger didn't meet the
2482*aed3e508SAndroid Build Coastguard Worker // minimum pressure threshold.
2483*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2484*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 50, 40, 95, 0},
2485*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 15, 0, 70, 40, 96, 0},
2486*aed3e508SAndroid Build Coastguard Worker };
2487*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2488*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(95, 96), 0, 0, kFTB, false},
2489*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 2, 2, &fs[0]), -1, MkSet(96), 0, 0, kFTB, false},
2490*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2491*aed3e508SAndroid Build Coastguard Worker };
2492*aed3e508SAndroid Build Coastguard Worker run_test(states);
2493*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2494*aed3e508SAndroid Build Coastguard Worker }
2495*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,TwoFingerClickNotRegisteredAsTap)2496*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, TwoFingerClickNotRegisteredAsTap) {
2497*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2498*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2499*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 75, 0, 4, 9, 92, 0},
2500*aed3e508SAndroid Build Coastguard Worker };
2501*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2502*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 2, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2503*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 1, 2, 2, &fs[0]), -1, MkSet(91, 92), 0, 0, kIdl, false},
2504*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 2, 2, &fs[0]), -1, MkSet(91, 92), 0, 0, kIdl, false},
2505*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2506*aed3e508SAndroid Build Coastguard Worker };
2507*aed3e508SAndroid Build Coastguard Worker run_test(states);
2508*aed3e508SAndroid Build Coastguard Worker run_test_with_added_resting_thumb(states);
2509*aed3e508SAndroid Build Coastguard Worker run_test_without_pressure_data(states);
2510*aed3e508SAndroid Build Coastguard Worker }
2511*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2TwoFingerTapWithRestingThumb)2512*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2TwoFingerTapWithRestingThumb) {
2513*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2514*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 80, 0, 5, 9, 70, 0}, // thumb
2515*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2516*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 80, 0, 5, 9, 71, 0}, // thumb with new ID
2517*aed3e508SAndroid Build Coastguard Worker };
2518*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2519*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(70), 0, 0, kFTB, false},
2520*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.00, 0, 1, 1, &fs[0]), -1, MkSet(70), 0, 0, kIdl, false},
2521*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01, 0, 1, 3, &fs[0]), -1, MkSet(70), 0, 0, kFTB, false},
2522*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02, 0, 2, 3, &fs[0]), -1, MkSet(70, 91), 0, 0, kFTB, false},
2523*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.03, 0, 0, 2, nullptr), -1, MkSet(), 0, 0, kFTB, false},
2524*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.04, 0, 1, 1, &fs[2]), -1, MkSet(71), kBR, kBR, kIdl, false},
2525*aed3e508SAndroid Build Coastguard Worker };
2526*aed3e508SAndroid Build Coastguard Worker run_test(states);
2527*aed3e508SAndroid Build Coastguard Worker }
2528*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2ThreeFingerTap)2529*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2ThreeFingerTap) {
2530*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2531*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2532*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 75, 0, 4, 9, 92, 0},
2533*aed3e508SAndroid Build Coastguard Worker };
2534*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2535*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 3, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2536*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 0, 1, nullptr), -1, MkSet(), 0, 0, kFTB, false},
2537*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 0, 0, nullptr), -1, MkSet(), kBM, kBM, kIdl, false},
2538*aed3e508SAndroid Build Coastguard Worker };
2539*aed3e508SAndroid Build Coastguard Worker run_test(states);
2540*aed3e508SAndroid Build Coastguard Worker }
2541*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2ThreeFingerTap2)2542*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2ThreeFingerTap2) {
2543*aed3e508SAndroid Build Coastguard Worker // Another three-finger tap test, slightly different to the one above.
2544*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2545*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2546*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 75, 0, 4, 9, 92, 0},
2547*aed3e508SAndroid Build Coastguard Worker };
2548*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2549*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 3, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2550*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 2, 3, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2551*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 0, 0, nullptr), -1, MkSet(), kBM, kBM, kIdl, false},
2552*aed3e508SAndroid Build Coastguard Worker };
2553*aed3e508SAndroid Build Coastguard Worker run_test(states);
2554*aed3e508SAndroid Build Coastguard Worker }
2555*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2ThreeFingerTapWithRestingThumb)2556*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2ThreeFingerTapWithRestingThumb) {
2557*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2558*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 80, 0, 5, 9, 70, 0}, // thumb
2559*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2560*aed3e508SAndroid Build Coastguard Worker };
2561*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2562*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(70), 0, 0, kFTB, false},
2563*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.00, 0, 1, 1, &fs[0]), -1, MkSet(70), 0, 0, kIdl, false},
2564*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01, 0, 1, 4, &fs[0]), -1, MkSet(70), 0, 0, kFTB, false},
2565*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02, 0, 2, 4, &fs[0]), -1, MkSet(70, 91), 0, 0, kFTB, false},
2566*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.03, 0, 1, 1, &fs[0]), -1, MkSet(70), kBM, kBM, kIdl, false},
2567*aed3e508SAndroid Build Coastguard Worker };
2568*aed3e508SAndroid Build Coastguard Worker run_test(states);
2569*aed3e508SAndroid Build Coastguard Worker }
2570*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2FourFingerTap)2571*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2FourFingerTap) {
2572*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2573*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2574*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 75, 0, 4, 9, 92, 0},
2575*aed3e508SAndroid Build Coastguard Worker };
2576*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2577*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 3, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2578*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01, 0, 1, 4, &fs[0]), -1, MkSet(91), 0, 0, kFTB, false},
2579*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02, 0, 2, 4, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2580*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.03, 0, 0, 0, nullptr), -1, MkSet(), kBR, kBR, kIdl, false},
2581*aed3e508SAndroid Build Coastguard Worker };
2582*aed3e508SAndroid Build Coastguard Worker run_test(states);
2583*aed3e508SAndroid Build Coastguard Worker }
2584*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2FourFingerTapWithRestingThumb)2585*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2FourFingerTapWithRestingThumb) {
2586*aed3e508SAndroid Build Coastguard Worker FingerState thumb_fs = {0, 0, 0, 0, 80, 0, 5, 9, 70, 0};
2587*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2588*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&thumb_fs),-1,MkSet(70),0,0,kFTB,false},
2589*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.00,0,1,1,&thumb_fs),-1,MkSet(70),0,0,kIdl,false},
2590*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01,0,1,5,&thumb_fs),-1,MkSet(70),0,0,kFTB,false},
2591*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02,0,1,1,&thumb_fs),-1,MkSet(70),kBR,kBR,kIdl,false},
2592*aed3e508SAndroid Build Coastguard Worker };
2593*aed3e508SAndroid Build Coastguard Worker run_test(states);
2594*aed3e508SAndroid Build Coastguard Worker }
2595*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2FourFingerTapWithRestingThumb2)2596*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2FourFingerTapWithRestingThumb2) {
2597*aed3e508SAndroid Build Coastguard Worker // Another four-finger tap test, slightly different to the one above.
2598*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2599*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 80, 0, 5, 9, 70, 0}, // thumb
2600*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2601*aed3e508SAndroid Build Coastguard Worker };
2602*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2603*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 1, 1, &fs[0]), -1, MkSet(70), 0, 0, kFTB, false},
2604*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.00, 0, 1, 1, &fs[0]), -1, MkSet(70), 0, 0, kIdl, false},
2605*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01, 0, 1, 5, &fs[0]), -1, MkSet(70), 0, 0, kFTB, false},
2606*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02, 0, 2, 5, &fs[0]), -1, MkSet(70, 91), 0, 0, kFTB, false},
2607*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.03, 0, 1, 1, &fs[0]), -1, MkSet(70), kBR, kBR, kIdl, false},
2608*aed3e508SAndroid Build Coastguard Worker };
2609*aed3e508SAndroid Build Coastguard Worker run_test(states);
2610*aed3e508SAndroid Build Coastguard Worker }
2611*aed3e508SAndroid Build Coastguard Worker
TEST_F(TapToClickStateMachineTest,T5R2ThreeFingersLettingGoIgnored)2612*aed3e508SAndroid Build Coastguard Worker TEST_F(TapToClickStateMachineTest, T5R2ThreeFingersLettingGoIgnored) {
2613*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2614*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2615*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 75, 0, 4, 9, 92, 0},
2616*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 1, 97, 0},
2617*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 9, 1, 98, 0},
2618*aed3e508SAndroid Build Coastguard Worker };
2619*aed3e508SAndroid Build Coastguard Worker std::vector<HWStateGs> states = {
2620*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 2, 3, &fs[0]), -1, MkSet(91, 92), 0, 0, kFTB, false},
2621*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01, 0, 2, 3, &fs[0]), -1, MkSet(91, 92), 0, 0, kIdl, false},
2622*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02, 0, 0, 2, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2623*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.03, 0, 2, 2, &fs[2]), -1, MkSet(97, 98), 0, 0, kIdl, false},
2624*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.04, 0, 0, 0, nullptr), -1, MkSet(), 0, 0, kIdl, false},
2625*aed3e508SAndroid Build Coastguard Worker };
2626*aed3e508SAndroid Build Coastguard Worker run_test(states);
2627*aed3e508SAndroid Build Coastguard Worker }
2628*aed3e508SAndroid Build Coastguard Worker
2629*aed3e508SAndroid Build Coastguard Worker namespace {
2630*aed3e508SAndroid Build Coastguard Worker
2631*aed3e508SAndroid Build Coastguard Worker struct TapToClickLowPressureBeginOrEndInputs {
2632*aed3e508SAndroid Build Coastguard Worker stime_t now;
2633*aed3e508SAndroid Build Coastguard Worker float x0, y0, p0; // (x, y), pressure
2634*aed3e508SAndroid Build Coastguard Worker short id0; // tracking id
2635*aed3e508SAndroid Build Coastguard Worker float x1, y1, p1; // (x, y), pressure
2636*aed3e508SAndroid Build Coastguard Worker short id1; // tracking id
2637*aed3e508SAndroid Build Coastguard Worker };
2638*aed3e508SAndroid Build Coastguard Worker
2639*aed3e508SAndroid Build Coastguard Worker } // namespace {}
2640*aed3e508SAndroid Build Coastguard Worker
2641*aed3e508SAndroid Build Coastguard Worker // Test that if a tap contact has some frames before and after that tap, with
2642*aed3e508SAndroid Build Coastguard Worker // a finger that's located far from the tap spot, but has low pressure at that
2643*aed3e508SAndroid Build Coastguard Worker // location, it's still a tap. We see this happen on some hardware particularly
2644*aed3e508SAndroid Build Coastguard Worker // for right clicks. This is based on two logs from Ken Moore.
TEST(ImmediateInterpreterTest,TapToClickLowPressureBeginOrEndTest)2645*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, TapToClickLowPressureBeginOrEndTest) {
2646*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
2647*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
2648*aed3e508SAndroid Build Coastguard Worker .right = 106.666672,
2649*aed3e508SAndroid Build Coastguard Worker .bottom = 68.000000,
2650*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
2651*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
2652*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
2653*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
2654*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 15,
2655*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
2656*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
2657*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
2658*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
2659*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
2660*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
2661*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
2662*aed3e508SAndroid Build Coastguard Worker };
2663*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
2664*aed3e508SAndroid Build Coastguard Worker
2665*aed3e508SAndroid Build Coastguard Worker TapToClickLowPressureBeginOrEndInputs inputs[] = {
2666*aed3e508SAndroid Build Coastguard Worker // Two runs
2667*aed3e508SAndroid Build Coastguard Worker { 32.4901, 55.5, 24.8, 7.0, 1, 0.0, 0.0, 0.0, -1 },
2668*aed3e508SAndroid Build Coastguard Worker { 32.5010, 57.7, 25.0, 43.0, 1, 42.0, 27.5, 36.0, 2 },
2669*aed3e508SAndroid Build Coastguard Worker { 32.5118, 58.0, 25.0, 44.0, 1, 42.0, 27.5, 43.0, 2 },
2670*aed3e508SAndroid Build Coastguard Worker { 32.5227, 58.0, 25.0, 44.0, 1, 42.0, 27.6, 44.0, 2 },
2671*aed3e508SAndroid Build Coastguard Worker { 32.5335, 58.0, 25.0, 45.0, 1, 42.0, 27.6, 45.0, 2 },
2672*aed3e508SAndroid Build Coastguard Worker { 32.5443, 58.0, 25.0, 44.0, 1, 42.0, 27.6, 45.0, 2 },
2673*aed3e508SAndroid Build Coastguard Worker { 32.5552, 58.0, 25.0, 44.0, 1, 42.0, 27.6, 44.0, 2 },
2674*aed3e508SAndroid Build Coastguard Worker { 32.5661, 58.0, 25.0, 42.0, 1, 42.0, 27.6, 42.0, 2 },
2675*aed3e508SAndroid Build Coastguard Worker { 32.5769, 58.0, 25.0, 35.0, 1, 42.0, 27.6, 35.0, 2 },
2676*aed3e508SAndroid Build Coastguard Worker { 32.5878, 58.0, 25.0, 15.0, 1, 41.9, 27.6, 18.0, 2 },
2677*aed3e508SAndroid Build Coastguard Worker { 32.5965, 45.9, 27.5, 7.0, 2, 0.0, 0.0, 0.0, -1 },
2678*aed3e508SAndroid Build Coastguard Worker { 32.6042, 0.0, 0.0, 0.0, -1, 0.0, 0.0, 0.0, -1 },
2679*aed3e508SAndroid Build Coastguard Worker
2680*aed3e508SAndroid Build Coastguard Worker { 90.6057, 64.0, 37.0, 18.0, 1, 0.0, 0.0, 0.0, -1 },
2681*aed3e508SAndroid Build Coastguard Worker { 90.6144, 63.6, 37.0, 43.0, 1, 0.0, 0.0, 0.0, -1 },
2682*aed3e508SAndroid Build Coastguard Worker { 90.6254, 63.6, 37.0, 43.0, 1, 46.5, 40.2, 47.0, 2 },
2683*aed3e508SAndroid Build Coastguard Worker { 90.6361, 63.6, 37.0, 44.0, 1, 46.5, 40.2, 44.0, 2 },
2684*aed3e508SAndroid Build Coastguard Worker { 90.6470, 63.6, 37.0, 45.0, 1, 46.5, 40.2, 46.0, 2 },
2685*aed3e508SAndroid Build Coastguard Worker { 90.6579, 63.6, 37.0, 45.0, 1, 46.5, 40.2, 46.0, 2 },
2686*aed3e508SAndroid Build Coastguard Worker { 90.6686, 63.6, 37.0, 45.0, 1, 46.5, 40.2, 47.0, 2 },
2687*aed3e508SAndroid Build Coastguard Worker { 90.6795, 63.6, 37.0, 46.0, 1, 46.5, 40.2, 47.0, 2 },
2688*aed3e508SAndroid Build Coastguard Worker { 90.6903, 63.6, 37.0, 45.0, 1, 46.5, 40.2, 46.0, 2 },
2689*aed3e508SAndroid Build Coastguard Worker { 90.7012, 63.6, 37.0, 44.0, 1, 46.3, 40.2, 44.0, 2 },
2690*aed3e508SAndroid Build Coastguard Worker { 90.7121, 63.6, 37.2, 38.0, 1, 46.4, 40.2, 31.0, 2 },
2691*aed3e508SAndroid Build Coastguard Worker { 90.7229, 63.6, 37.4, 22.0, 1, 46.4, 40.2, 12.0, 2 },
2692*aed3e508SAndroid Build Coastguard Worker { 90.7317, 61.1, 38.0, 8.0, 1, 0.0, 0.0, 0.0, -1 },
2693*aed3e508SAndroid Build Coastguard Worker { 90.7391, 0.0, 0.0, 0.0, -1, 0.0, 0.0, 0.0, -1 },
2694*aed3e508SAndroid Build Coastguard Worker };
2695*aed3e508SAndroid Build Coastguard Worker
2696*aed3e508SAndroid Build Coastguard Worker bool reset_next_time = true;
2697*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(inputs); i++) {
2698*aed3e508SAndroid Build Coastguard Worker const TapToClickLowPressureBeginOrEndInputs& input = inputs[i];
2699*aed3e508SAndroid Build Coastguard Worker if (reset_next_time) {
2700*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
2701*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get());
2702*aed3e508SAndroid Build Coastguard Worker ii->tap_enable_.val_ = 1;
2703*aed3e508SAndroid Build Coastguard Worker reset_next_time = false;
2704*aed3e508SAndroid Build Coastguard Worker }
2705*aed3e508SAndroid Build Coastguard Worker // Prep inputs
2706*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2707*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, input.p0, 0, input.x0, input.y0, input.id0, 0 },
2708*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, input.p1, 0, input.x1, input.y1, input.id1, 0 },
2709*aed3e508SAndroid Build Coastguard Worker };
2710*aed3e508SAndroid Build Coastguard Worker unsigned short finger_cnt = fs[0].tracking_id == -1 ? 0 :
2711*aed3e508SAndroid Build Coastguard Worker (fs[1].tracking_id == -1 ? 1 : 2);
2712*aed3e508SAndroid Build Coastguard Worker HardwareState hs = make_hwstate(input.now, 0, finger_cnt, finger_cnt, fs);
2713*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
2714*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hs, &timeout);
2715*aed3e508SAndroid Build Coastguard Worker if (finger_cnt > 0) {
2716*aed3e508SAndroid Build Coastguard Worker // Expect no timeout
2717*aed3e508SAndroid Build Coastguard Worker EXPECT_LT(timeout, 0);
2718*aed3e508SAndroid Build Coastguard Worker } else {
2719*aed3e508SAndroid Build Coastguard Worker // No timeout b/c it's right click. Expect the right click gesture
2720*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs) << "timeout:" << timeout;
2721*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeButtonsChange, gs->type);
2722*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(GESTURES_BUTTON_RIGHT, gs->details.buttons.down);
2723*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(GESTURES_BUTTON_RIGHT, gs->details.buttons.up);
2724*aed3e508SAndroid Build Coastguard Worker reset_next_time = true; // All done w/ this run.
2725*aed3e508SAndroid Build Coastguard Worker }
2726*aed3e508SAndroid Build Coastguard Worker }
2727*aed3e508SAndroid Build Coastguard Worker }
2728*aed3e508SAndroid Build Coastguard Worker
2729*aed3e508SAndroid Build Coastguard Worker // Does two tap gestures, one with keyboard interference.
TEST(ImmediateInterpreterTest,TapToClickKeyboardTest)2730*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, TapToClickKeyboardTest) {
2731*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
2732*aed3e508SAndroid Build Coastguard Worker
2733*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
2734*aed3e508SAndroid Build Coastguard Worker .right = 200,
2735*aed3e508SAndroid Build Coastguard Worker .bottom = 200,
2736*aed3e508SAndroid Build Coastguard Worker .res_x = 1.0,
2737*aed3e508SAndroid Build Coastguard Worker .res_y = 1.0,
2738*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
2739*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
2740*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 5,
2741*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
2742*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
2743*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
2744*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
2745*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
2746*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
2747*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
2748*aed3e508SAndroid Build Coastguard Worker };
2749*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
2750*aed3e508SAndroid Build Coastguard Worker
2751*aed3e508SAndroid Build Coastguard Worker FingerState fs = {
2752*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
2753*aed3e508SAndroid Build Coastguard Worker 0, 0, 0, 0, 50, 0, 4, 4, 91, 0
2754*aed3e508SAndroid Build Coastguard Worker };
2755*aed3e508SAndroid Build Coastguard Worker HardwareState hwstates[] = {
2756*aed3e508SAndroid Build Coastguard Worker // Simple 1-finger tap
2757*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.01, 0, 1, 1, &fs),
2758*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.02, 0, 0, 0, nullptr),
2759*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.30, 0, 0, 0, nullptr),
2760*aed3e508SAndroid Build Coastguard Worker };
2761*aed3e508SAndroid Build Coastguard Worker
2762*aed3e508SAndroid Build Coastguard Worker enum {
2763*aed3e508SAndroid Build Coastguard Worker kWithoutKeyboard = 0,
2764*aed3e508SAndroid Build Coastguard Worker kWithKeyboard,
2765*aed3e508SAndroid Build Coastguard Worker kMaxTests
2766*aed3e508SAndroid Build Coastguard Worker };
2767*aed3e508SAndroid Build Coastguard Worker for (size_t test = 0; test != kMaxTests; test++) {
2768*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
2769*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get());
2770*aed3e508SAndroid Build Coastguard Worker ii->motion_tap_prevent_timeout_.val_ = 0;
2771*aed3e508SAndroid Build Coastguard Worker ii->tap_enable_.val_ = 1;
2772*aed3e508SAndroid Build Coastguard Worker ii->tap_drag_enable_.val_ = 1;
2773*aed3e508SAndroid Build Coastguard Worker
2774*aed3e508SAndroid Build Coastguard Worker if (test == kWithKeyboard)
2775*aed3e508SAndroid Build Coastguard Worker ii->keyboard_touched_ = 0.001;
2776*aed3e508SAndroid Build Coastguard Worker
2777*aed3e508SAndroid Build Coastguard Worker unsigned down = 0;
2778*aed3e508SAndroid Build Coastguard Worker unsigned up = 0;
2779*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hwstates); i++) {
2780*aed3e508SAndroid Build Coastguard Worker down = 0;
2781*aed3e508SAndroid Build Coastguard Worker up = 0;
2782*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
2783*aed3e508SAndroid Build Coastguard Worker std::set<short> gs =
2784*aed3e508SAndroid Build Coastguard Worker hwstates[i].finger_cnt == 1 ? MkSet(91) : MkSet();
2785*aed3e508SAndroid Build Coastguard Worker ii->metrics_->Update(hwstates[i]);
2786*aed3e508SAndroid Build Coastguard Worker ii->UpdateTapState(
2787*aed3e508SAndroid Build Coastguard Worker &hwstates[i],
2788*aed3e508SAndroid Build Coastguard Worker gs,
2789*aed3e508SAndroid Build Coastguard Worker false, // same fingers
2790*aed3e508SAndroid Build Coastguard Worker hwstates[i].timestamp,
2791*aed3e508SAndroid Build Coastguard Worker &down,
2792*aed3e508SAndroid Build Coastguard Worker &up,
2793*aed3e508SAndroid Build Coastguard Worker &timeout);
2794*aed3e508SAndroid Build Coastguard Worker }
2795*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(down, up);
2796*aed3e508SAndroid Build Coastguard Worker if (test == kWithoutKeyboard)
2797*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(GESTURES_BUTTON_LEFT, down);
2798*aed3e508SAndroid Build Coastguard Worker else
2799*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, down);
2800*aed3e508SAndroid Build Coastguard Worker }
2801*aed3e508SAndroid Build Coastguard Worker }
2802*aed3e508SAndroid Build Coastguard Worker
2803*aed3e508SAndroid Build Coastguard Worker enum class TtcEnableTestMode {
2804*aed3e508SAndroid Build Coastguard Worker TapEnabled = 0,
2805*aed3e508SAndroid Build Coastguard Worker TapDisabledDuringGesture,
2806*aed3e508SAndroid Build Coastguard Worker TapDisabledBeforeGestureWhileIdle,
2807*aed3e508SAndroid Build Coastguard Worker TapPausedDuringGesture,
2808*aed3e508SAndroid Build Coastguard Worker TapPausedBeforeGestureWhileIdle,
2809*aed3e508SAndroid Build Coastguard Worker };
2810*aed3e508SAndroid Build Coastguard Worker
2811*aed3e508SAndroid Build Coastguard Worker class ImmediateInterpreterTtcEnableTest :
2812*aed3e508SAndroid Build Coastguard Worker public testing::TestWithParam<TtcEnableTestMode> {};
2813*aed3e508SAndroid Build Coastguard Worker
TEST_P(ImmediateInterpreterTtcEnableTest,TapToClickEnableTest)2814*aed3e508SAndroid Build Coastguard Worker TEST_P(ImmediateInterpreterTtcEnableTest, TapToClickEnableTest) {
2815*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
2816*aed3e508SAndroid Build Coastguard Worker ii.drag_lock_enable_.val_ = 1;
2817*aed3e508SAndroid Build Coastguard Worker ii.motion_tap_prevent_timeout_.val_ = 0;
2818*aed3e508SAndroid Build Coastguard Worker ii.tap_drag_timeout_.val_ = 0.05;
2819*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 1;
2820*aed3e508SAndroid Build Coastguard Worker ii.tap_drag_enable_.val_ = 1;
2821*aed3e508SAndroid Build Coastguard Worker ii.tap_paused_.val_ = 0;
2822*aed3e508SAndroid Build Coastguard Worker ii.tap_move_dist_.val_ = 1.0;
2823*aed3e508SAndroid Build Coastguard Worker ii.tap_timeout_.val_ = 0.05;
2824*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kIdl, ii.tap_to_click_state_);
2825*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(ii.tap_enable_.val_);
2826*aed3e508SAndroid Build Coastguard Worker
2827*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
2828*aed3e508SAndroid Build Coastguard Worker .right = 200,
2829*aed3e508SAndroid Build Coastguard Worker .bottom = 200,
2830*aed3e508SAndroid Build Coastguard Worker .res_x = 1.0,
2831*aed3e508SAndroid Build Coastguard Worker .res_y = 1.0,
2832*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
2833*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
2834*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 5,
2835*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
2836*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
2837*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
2838*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
2839*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
2840*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
2841*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
2842*aed3e508SAndroid Build Coastguard Worker };
2843*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
2844*aed3e508SAndroid Build Coastguard Worker
2845*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
2846*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
2847*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 91, 0},
2848*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 92, 0},
2849*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 92, 0},
2850*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 92, 0},
2851*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 4, 4, 93, 0},
2852*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 6, 4, 93, 0},
2853*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 50, 0, 8, 4, 93, 0},
2854*aed3e508SAndroid Build Coastguard Worker };
2855*aed3e508SAndroid Build Coastguard Worker
2856*aed3e508SAndroid Build Coastguard Worker HWStateGs hwsgs_list[] = {
2857*aed3e508SAndroid Build Coastguard Worker // 1-finger tap, move, release, move again (drag lock)
2858*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00,0,1,1,&fs[0]),-1,MkSet(91),0,0,kFTB,false},
2859*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.01,0,0,0,nullptr),-1,MkSet(),0,0,kTpC,true},
2860*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.02,0,1,1,&fs[1]),-1,MkSet(92),0,0,kSTB,false},
2861*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.08,0,1,1,&fs[2]),-1,MkSet(92),kBL,0,kDrg,false},
2862*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.09,0,1,1,&fs[3]),-1,MkSet(92),0,0,kDrg,false},
2863*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.10,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
2864*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.11,0,1,1,&fs[4]),-1,MkSet(93),0,0,kDRt,false},
2865*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.12,0,1,1,&fs[5]),-1,MkSet(93),0,0,kDrg,false},
2866*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.13,0,1,1,&fs[6]),-1,MkSet(93),0,0,kDrg,false},
2867*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14,0,0,0,nullptr),-1,MkSet(),0,0,kDRl,true},
2868*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.99,0,0,0,nullptr),.99,MkSet(),0,kBL,kIdl,false}
2869*aed3e508SAndroid Build Coastguard Worker };
2870*aed3e508SAndroid Build Coastguard Worker
2871*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(hwsgs_list); ++i) {
2872*aed3e508SAndroid Build Coastguard Worker string desc;
2873*aed3e508SAndroid Build Coastguard Worker stime_t disable_time = 0.0;
2874*aed3e508SAndroid Build Coastguard Worker stime_t pause_time = 0.0;
2875*aed3e508SAndroid Build Coastguard Worker switch (GetParam()) {
2876*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapEnabled:
2877*aed3e508SAndroid Build Coastguard Worker desc = "tap enabled";
2878*aed3e508SAndroid Build Coastguard Worker disable_time = -1; // unreachable time
2879*aed3e508SAndroid Build Coastguard Worker pause_time = -1;
2880*aed3e508SAndroid Build Coastguard Worker break;
2881*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapDisabledDuringGesture:
2882*aed3e508SAndroid Build Coastguard Worker desc = "tap disabled during gesture";
2883*aed3e508SAndroid Build Coastguard Worker disable_time = 0.02;
2884*aed3e508SAndroid Build Coastguard Worker pause_time = -1;
2885*aed3e508SAndroid Build Coastguard Worker break;
2886*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapDisabledBeforeGestureWhileIdle:
2887*aed3e508SAndroid Build Coastguard Worker desc = "tap disabled while Idle";
2888*aed3e508SAndroid Build Coastguard Worker disable_time = 0.00;
2889*aed3e508SAndroid Build Coastguard Worker pause_time = -1;
2890*aed3e508SAndroid Build Coastguard Worker break;
2891*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapPausedDuringGesture:
2892*aed3e508SAndroid Build Coastguard Worker desc = "tap paused during gesture";
2893*aed3e508SAndroid Build Coastguard Worker disable_time = -1;
2894*aed3e508SAndroid Build Coastguard Worker pause_time = 0.02;
2895*aed3e508SAndroid Build Coastguard Worker break;
2896*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapPausedBeforeGestureWhileIdle:
2897*aed3e508SAndroid Build Coastguard Worker desc = "tap paused while Idle";
2898*aed3e508SAndroid Build Coastguard Worker disable_time = 0.00;
2899*aed3e508SAndroid Build Coastguard Worker pause_time = -1;
2900*aed3e508SAndroid Build Coastguard Worker break;
2901*aed3e508SAndroid Build Coastguard Worker }
2902*aed3e508SAndroid Build Coastguard Worker SCOPED_TRACE(StringPrintf("State %zu (%s)", i, desc.c_str()));
2903*aed3e508SAndroid Build Coastguard Worker
2904*aed3e508SAndroid Build Coastguard Worker HWStateGs &hwsgs = hwsgs_list[i];
2905*aed3e508SAndroid Build Coastguard Worker HardwareState* hwstate = &hwsgs.hws;
2906*aed3e508SAndroid Build Coastguard Worker stime_t now = hwsgs.callback_now;
2907*aed3e508SAndroid Build Coastguard Worker if (hwsgs.callback_now >= 0.0)
2908*aed3e508SAndroid Build Coastguard Worker hwstate = nullptr;
2909*aed3e508SAndroid Build Coastguard Worker else
2910*aed3e508SAndroid Build Coastguard Worker now = hwsgs.hws.timestamp;
2911*aed3e508SAndroid Build Coastguard Worker
2912*aed3e508SAndroid Build Coastguard Worker bool same_fingers = false;
2913*aed3e508SAndroid Build Coastguard Worker if (!hwstate || hwstate->timestamp != 0.0) {
2914*aed3e508SAndroid Build Coastguard Worker same_fingers = ii.state_buffer_.Get(1).SameFingersAs(hwsgs.hws);
2915*aed3e508SAndroid Build Coastguard Worker }
2916*aed3e508SAndroid Build Coastguard Worker
2917*aed3e508SAndroid Build Coastguard Worker // Disable tap in the middle of the gesture
2918*aed3e508SAndroid Build Coastguard Worker if (hwstate && hwstate->timestamp == disable_time)
2919*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 0;
2920*aed3e508SAndroid Build Coastguard Worker
2921*aed3e508SAndroid Build Coastguard Worker if (hwstate && hwstate->timestamp == pause_time)
2922*aed3e508SAndroid Build Coastguard Worker ii.tap_paused_.val_ = true;
2923*aed3e508SAndroid Build Coastguard Worker
2924*aed3e508SAndroid Build Coastguard Worker if (hwstate) {
2925*aed3e508SAndroid Build Coastguard Worker ii.metrics_->Update(*hwstate);
2926*aed3e508SAndroid Build Coastguard Worker ii.state_buffer_.PushState(*hwstate);
2927*aed3e508SAndroid Build Coastguard Worker }
2928*aed3e508SAndroid Build Coastguard Worker unsigned buttons_down = 0;
2929*aed3e508SAndroid Build Coastguard Worker unsigned buttons_up = 0;
2930*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
2931*aed3e508SAndroid Build Coastguard Worker ii.UpdateTapState(
2932*aed3e508SAndroid Build Coastguard Worker hwstate, hwsgs.gesturing_fingers, same_fingers, now, &buttons_down,
2933*aed3e508SAndroid Build Coastguard Worker &buttons_up, &timeout);
2934*aed3e508SAndroid Build Coastguard Worker ii.prev_gs_fingers_ = hwsgs.gesturing_fingers;
2935*aed3e508SAndroid Build Coastguard Worker
2936*aed3e508SAndroid Build Coastguard Worker switch (GetParam()) {
2937*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapEnabled:
2938*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapDisabledDuringGesture:
2939*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapPausedDuringGesture:
2940*aed3e508SAndroid Build Coastguard Worker // tap should be enabled
2941*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(hwsgs.expected_down, buttons_down);
2942*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(hwsgs.expected_up, buttons_up);
2943*aed3e508SAndroid Build Coastguard Worker if (hwsgs.timeout)
2944*aed3e508SAndroid Build Coastguard Worker EXPECT_GT(timeout, 0.0);
2945*aed3e508SAndroid Build Coastguard Worker else
2946*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(NO_DEADLINE, timeout);
2947*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(hwsgs.expected_state, ii.tap_to_click_state_);
2948*aed3e508SAndroid Build Coastguard Worker break;
2949*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapDisabledBeforeGestureWhileIdle:
2950*aed3e508SAndroid Build Coastguard Worker case TtcEnableTestMode::TapPausedBeforeGestureWhileIdle:
2951*aed3e508SAndroid Build Coastguard Worker // tap should be disabled
2952*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, buttons_down);
2953*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, buttons_up);
2954*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(NO_DEADLINE, timeout);
2955*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kIdl, ii.tap_to_click_state_);
2956*aed3e508SAndroid Build Coastguard Worker break;
2957*aed3e508SAndroid Build Coastguard Worker }
2958*aed3e508SAndroid Build Coastguard Worker }
2959*aed3e508SAndroid Build Coastguard Worker }
2960*aed3e508SAndroid Build Coastguard Worker
2961*aed3e508SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2962*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreterTtc, ImmediateInterpreterTtcEnableTest,
2963*aed3e508SAndroid Build Coastguard Worker testing::Values(TtcEnableTestMode::TapEnabled,
2964*aed3e508SAndroid Build Coastguard Worker TtcEnableTestMode::TapDisabledDuringGesture,
2965*aed3e508SAndroid Build Coastguard Worker TtcEnableTestMode::TapDisabledBeforeGestureWhileIdle,
2966*aed3e508SAndroid Build Coastguard Worker TtcEnableTestMode::TapPausedDuringGesture,
2967*aed3e508SAndroid Build Coastguard Worker TtcEnableTestMode::TapPausedBeforeGestureWhileIdle));
2968*aed3e508SAndroid Build Coastguard Worker
2969*aed3e508SAndroid Build Coastguard Worker struct ClickTestHardwareStateAndExpectations {
2970*aed3e508SAndroid Build Coastguard Worker HardwareState hs;
2971*aed3e508SAndroid Build Coastguard Worker stime_t timeout;
2972*aed3e508SAndroid Build Coastguard Worker unsigned expected_down;
2973*aed3e508SAndroid Build Coastguard Worker unsigned expected_up;
2974*aed3e508SAndroid Build Coastguard Worker };
2975*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ClickTest)2976*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ClickTest) {
2977*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
2978*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
2979*aed3e508SAndroid Build Coastguard Worker .right = 100,
2980*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
2981*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
2982*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
2983*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
2984*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
2985*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
2986*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
2987*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
2988*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
2989*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
2990*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
2991*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
2992*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
2993*aed3e508SAndroid Build Coastguard Worker };
2994*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
2995*aed3e508SAndroid Build Coastguard Worker EXPECT_FLOAT_EQ(10.0, ii.tapping_finger_min_separation_.val_);
2996*aed3e508SAndroid Build Coastguard Worker
2997*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
2998*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
2999*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 50, 50, 1, 0},
3000*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 70, 50, 2, 0},
3001*aed3e508SAndroid Build Coastguard Worker // Fingers very close together - shouldn't right click
3002*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 50, 50, 1, 0},
3003*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 55, 50, 2, 0},
3004*aed3e508SAndroid Build Coastguard Worker // Large vertical dist - shouldn right click when timing is good.
3005*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 8.4, 94, 1, 0},
3006*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 51.2, 70, 2, 0},
3007*aed3e508SAndroid Build Coastguard Worker };
3008*aed3e508SAndroid Build Coastguard Worker ClickTestHardwareStateAndExpectations records[] = {
3009*aed3e508SAndroid Build Coastguard Worker // reset
3010*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0,0,0,0,nullptr),NO_DEADLINE,0,0},
3011*aed3e508SAndroid Build Coastguard Worker
3012*aed3e508SAndroid Build Coastguard Worker // button down, 2 fingers touch, button up, 2 fingers lift
3013*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1,1,0,0,nullptr),NO_DEADLINE,0,0},
3014*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01,1,2,2,&finger_states[0]), NO_DEADLINE, 0, 0},
3015*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2,0,2,2,&finger_states[0]),
3016*aed3e508SAndroid Build Coastguard Worker NO_DEADLINE, GESTURES_BUTTON_RIGHT, GESTURES_BUTTON_RIGHT},
3017*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3,0,0,0,nullptr), NO_DEADLINE, 0, 0},
3018*aed3e508SAndroid Build Coastguard Worker
3019*aed3e508SAndroid Build Coastguard Worker // button down, 2 close fingers touch, fingers lift
3020*aed3e508SAndroid Build Coastguard Worker {make_hwstate(7,1,0,0,nullptr), NO_DEADLINE, 0, 0},
3021*aed3e508SAndroid Build Coastguard Worker {make_hwstate(7.01,1,2,2,&finger_states[2]), NO_DEADLINE, 0, 0},
3022*aed3e508SAndroid Build Coastguard Worker {make_hwstate(7.02,0,2,2,&finger_states[2]),
3023*aed3e508SAndroid Build Coastguard Worker NO_DEADLINE, GESTURES_BUTTON_LEFT,GESTURES_BUTTON_LEFT},
3024*aed3e508SAndroid Build Coastguard Worker {make_hwstate(8,0,0,0,nullptr), NO_DEADLINE, 0, 0},
3025*aed3e508SAndroid Build Coastguard Worker
3026*aed3e508SAndroid Build Coastguard Worker // button down with 2 fingers, button up, fingers lift
3027*aed3e508SAndroid Build Coastguard Worker {make_hwstate(9.01,1,2,2,&finger_states[4]),NO_DEADLINE,0,0},
3028*aed3e508SAndroid Build Coastguard Worker {make_hwstate(9.02,1,2,2,&finger_states[4]),NO_DEADLINE,0,0},
3029*aed3e508SAndroid Build Coastguard Worker {make_hwstate(9.5,0,2,2,&finger_states[4]),
3030*aed3e508SAndroid Build Coastguard Worker NO_DEADLINE, GESTURES_BUTTON_RIGHT,GESTURES_BUTTON_RIGHT},
3031*aed3e508SAndroid Build Coastguard Worker {make_hwstate(10,0,0,0,nullptr), NO_DEADLINE, 0, 0},
3032*aed3e508SAndroid Build Coastguard Worker
3033*aed3e508SAndroid Build Coastguard Worker // button down with 2 fingers, timeout, button up, fingers lift
3034*aed3e508SAndroid Build Coastguard Worker {make_hwstate(11,1,2,2,&finger_states[4]), NO_DEADLINE, 0, 0},
3035*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0,0,0,0,nullptr),11.5,GESTURES_BUTTON_RIGHT,0},
3036*aed3e508SAndroid Build Coastguard Worker {make_hwstate(12,0,2,2,&finger_states[4]), NO_DEADLINE, 0,
3037*aed3e508SAndroid Build Coastguard Worker GESTURES_BUTTON_RIGHT},
3038*aed3e508SAndroid Build Coastguard Worker {make_hwstate(10,0,0,0,nullptr), NO_DEADLINE, 0, 0}
3039*aed3e508SAndroid Build Coastguard Worker };
3040*aed3e508SAndroid Build Coastguard Worker
3041*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(records); ++i) {
3042*aed3e508SAndroid Build Coastguard Worker Gesture* result = nullptr;
3043*aed3e508SAndroid Build Coastguard Worker if (records[i].timeout < 0.0)
3044*aed3e508SAndroid Build Coastguard Worker result = wrapper.SyncInterpret(records[i].hs, nullptr);
3045*aed3e508SAndroid Build Coastguard Worker else
3046*aed3e508SAndroid Build Coastguard Worker result = wrapper.HandleTimer(records[i].timeout, nullptr);
3047*aed3e508SAndroid Build Coastguard Worker if (records[i].expected_down == 0 && records[i].expected_up == 0) {
3048*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, result) << "i=" << i;
3049*aed3e508SAndroid Build Coastguard Worker } else {
3050*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, result) << "i=" << i;
3051*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(records[i].expected_down, result->details.buttons.down);
3052*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(records[i].expected_up, result->details.buttons.up);
3053*aed3e508SAndroid Build Coastguard Worker }
3054*aed3e508SAndroid Build Coastguard Worker }
3055*aed3e508SAndroid Build Coastguard Worker }
3056*aed3e508SAndroid Build Coastguard Worker
3057*aed3e508SAndroid Build Coastguard Worker struct ClickDragLockInputAndExpectations {
3058*aed3e508SAndroid Build Coastguard Worker HardwareState hs;
3059*aed3e508SAndroid Build Coastguard Worker stime_t timeout;
3060*aed3e508SAndroid Build Coastguard Worker unsigned expected_down;
3061*aed3e508SAndroid Build Coastguard Worker unsigned expected_up;
3062*aed3e508SAndroid Build Coastguard Worker bool expected_move;
3063*aed3e508SAndroid Build Coastguard Worker };
3064*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ClickDragLockTest)3065*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ClickDragLockTest) {
3066*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3067*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3068*aed3e508SAndroid Build Coastguard Worker .right = 100,
3069*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
3070*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3071*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3072*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3073*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3074*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3075*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
3076*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3077*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
3078*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
3079*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3080*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3081*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
3082*aed3e508SAndroid Build Coastguard Worker };
3083*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3084*aed3e508SAndroid Build Coastguard Worker
3085*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
3086*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
3087*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 50, 50, 1, 0},
3088*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 70, 50, 2, 0},
3089*aed3e508SAndroid Build Coastguard Worker // One finger moves fast enough to lock on.
3090*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 45, 50, 1, 0},
3091*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 70, 50, 2, 0},
3092*aed3e508SAndroid Build Coastguard Worker // Second finger moves, but not fast enough to break lock.
3093*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 45, 50, 1, 0},
3094*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 71, 50, 2, 0},
3095*aed3e508SAndroid Build Coastguard Worker // Second finger moves fast enough to break lock.
3096*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 45, 50, 1, 0},
3097*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 76, 50, 2, 0},
3098*aed3e508SAndroid Build Coastguard Worker // First finger moves, but not fast enough to break lock.
3099*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 44, 50, 1, 0},
3100*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 10, 0, 76, 50, 2, 0},
3101*aed3e508SAndroid Build Coastguard Worker };
3102*aed3e508SAndroid Build Coastguard Worker ClickDragLockInputAndExpectations records[] = {
3103*aed3e508SAndroid Build Coastguard Worker // reset
3104*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0,0,0,0,nullptr),NO_DEADLINE,0,0,false},
3105*aed3e508SAndroid Build Coastguard Worker
3106*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1,1,0,0,nullptr),NO_DEADLINE,0,0,false},
3107*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01,1,2,2,&finger_states[0]), NO_DEADLINE, 0, 0, false},
3108*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2,1,2,2,&finger_states[0]),
3109*aed3e508SAndroid Build Coastguard Worker NO_DEADLINE, GESTURES_BUTTON_RIGHT, 0, false},
3110*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.1,1,2,2,&finger_states[2]), NO_DEADLINE, 0, 0, true},
3111*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.2,1,2,2,&finger_states[4]), NO_DEADLINE, 0, 0, false},
3112*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.3,1,2,2,&finger_states[6]), NO_DEADLINE, 0, 0, true},
3113*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.4,1,2,2,&finger_states[8]), NO_DEADLINE, 0, 0, false},
3114*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3,0,0,0,nullptr),
3115*aed3e508SAndroid Build Coastguard Worker NO_DEADLINE, 0, GESTURES_BUTTON_RIGHT, false},
3116*aed3e508SAndroid Build Coastguard Worker
3117*aed3e508SAndroid Build Coastguard Worker {make_hwstate(10,0,0,0,nullptr), NO_DEADLINE, 0, 0, false}
3118*aed3e508SAndroid Build Coastguard Worker };
3119*aed3e508SAndroid Build Coastguard Worker
3120*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(records); ++i) {
3121*aed3e508SAndroid Build Coastguard Worker Gesture* result = nullptr;
3122*aed3e508SAndroid Build Coastguard Worker if (records[i].timeout < 0.0)
3123*aed3e508SAndroid Build Coastguard Worker result = wrapper.SyncInterpret(records[i].hs, nullptr);
3124*aed3e508SAndroid Build Coastguard Worker else
3125*aed3e508SAndroid Build Coastguard Worker result = wrapper.HandleTimer(records[i].timeout, nullptr);
3126*aed3e508SAndroid Build Coastguard Worker if (records[i].expected_move) {
3127*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, result) << "i=" << i;
3128*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(result->type, kGestureTypeMove);
3129*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(result->details.move.dx, 0.0);
3130*aed3e508SAndroid Build Coastguard Worker } else if (records[i].expected_down != 0 || records[i].expected_up != 0) {
3131*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, result) << "i=" << i;
3132*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(records[i].expected_down, result->details.buttons.down);
3133*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(records[i].expected_up, result->details.buttons.up);
3134*aed3e508SAndroid Build Coastguard Worker } else {
3135*aed3e508SAndroid Build Coastguard Worker if (result) {
3136*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(result->type, kGestureTypeMove);
3137*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(result->details.move.dx, 0.0);
3138*aed3e508SAndroid Build Coastguard Worker }
3139*aed3e508SAndroid Build Coastguard Worker }
3140*aed3e508SAndroid Build Coastguard Worker }
3141*aed3e508SAndroid Build Coastguard Worker }
3142*aed3e508SAndroid Build Coastguard Worker
3143*aed3e508SAndroid Build Coastguard Worker struct BigHandsRightClickInputAndExpectations {
3144*aed3e508SAndroid Build Coastguard Worker HardwareState hs;
3145*aed3e508SAndroid Build Coastguard Worker unsigned out_buttons_down;
3146*aed3e508SAndroid Build Coastguard Worker unsigned out_buttons_up;
3147*aed3e508SAndroid Build Coastguard Worker FingerState fs[2];
3148*aed3e508SAndroid Build Coastguard Worker };
3149*aed3e508SAndroid Build Coastguard Worker
3150*aed3e508SAndroid Build Coastguard Worker // This was recorded from Ian Fette, who had trouble right-clicking.
3151*aed3e508SAndroid Build Coastguard Worker // This test plays back part of his log to ensure that it generates a
3152*aed3e508SAndroid Build Coastguard Worker // right click.
TEST(ImmediateInterpreterTest,BigHandsRightClickTest)3153*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, BigHandsRightClickTest) {
3154*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3155*aed3e508SAndroid Build Coastguard Worker .right = 106.666672,
3156*aed3e508SAndroid Build Coastguard Worker .bottom = 68.000000,
3157*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3158*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3159*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3160*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3161*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 15,
3162*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
3163*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3164*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
3165*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
3166*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3167*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3168*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
3169*aed3e508SAndroid Build Coastguard Worker };
3170*aed3e508SAndroid Build Coastguard Worker BigHandsRightClickInputAndExpectations records[] = {
3171*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.327647, 0, 2, 2, nullptr), 0, 0,
3172*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 50.013428, 0, 20.250002, 59.400002, 130, 0 },
3173*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 41.862095, 0, 57.458694, 43.700001, 131, 0 } } },
3174*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.344421, 0, 2, 2, nullptr), 0, 0,
3175*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 50.301102, 0, 20.250002, 59.400002, 130, 0 },
3176*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.007469, 0, 57.479977, 43.700001, 131, 0 } } },
3177*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.361196, 1, 2, 2, nullptr), 0, 0,
3178*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 50.608433, 0, 20.250002, 59.400002, 130, 0 },
3179*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.065464, 0, 57.494164, 43.700001, 131, 0 } } },
3180*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.372364, 1, 2, 2, nullptr), 0, 0,
3181*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 50.840954, 0, 20.250002, 59.400002, 130, 0 },
3182*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.071739, 0, 57.507217, 43.700001, 131, 0 } } },
3183*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.383517, 1, 2, 2, nullptr), 0, 0,
3184*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 51.047310, 0, 20.250002, 59.400002, 130, 0 },
3185*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.054974, 0, 57.527523, 43.700001, 131, 0 } } },
3186*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.394680, 1, 2, 2, nullptr), 0, 0,
3187*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 51.355824, 0, 20.250002, 59.400002, 130, 0 },
3188*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.066948, 0, 57.550964, 43.700001, 131, 0 } } },
3189*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.405842, 1, 2, 2, nullptr), 0, 0,
3190*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 51.791901, 0, 20.250002, 59.400002, 130, 0 },
3191*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.188736, 0, 57.569374, 43.700001, 131, 0 } } },
3192*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.416791, 1, 2, 2, nullptr), GESTURES_BUTTON_RIGHT,
3193*aed3e508SAndroid Build Coastguard Worker 0,
3194*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 52.264156, 0, 20.250002, 59.400002, 130, 0 },
3195*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.424179, 0, 57.586361, 43.700001, 131, 0 } } },
3196*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.427937, 1, 2, 2, nullptr), 0, 0,
3197*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 52.725105, 0, 20.250002, 59.400002, 130, 0 },
3198*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.676739, 0, 57.609421, 43.700001, 131, 0 } } },
3199*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.439094, 1, 2, 2, nullptr), 0, 0,
3200*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 53.191925, 0, 20.250002, 59.400002, 130, 0 },
3201*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.868217, 0, 57.640007, 43.700001, 131, 0 } } },
3202*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.461392, 1, 2, 2, nullptr), 0, 0,
3203*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 53.602665, 0, 20.250002, 59.400002, 130, 0 },
3204*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.016544, 0, 57.676689, 43.700001, 131, 0 } } },
3205*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.483690, 1, 2, 2, nullptr), 0, 0,
3206*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 53.879429, 0, 20.250002, 59.400002, 130, 0 },
3207*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.208221, 0, 57.711613, 43.700001, 131, 0 } } },
3208*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.511815, 1, 2, 2, nullptr), 0, 0,
3209*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 54.059937, 0, 20.250002, 59.400002, 130, 0 },
3210*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.467258, 0, 57.736385, 43.700001, 131, 0 } } },
3211*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.539940, 1, 2, 2, nullptr), 0, 0,
3212*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 54.253189, 0, 20.250002, 59.400002, 130, 0 },
3213*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.717934, 0, 57.750286, 43.700001, 131, 0 } } },
3214*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.556732, 1, 2, 2, nullptr), 0, 0,
3215*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 54.500740, 0, 20.250002, 59.400002, 130, 0 },
3216*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.863792, 0, 57.758759, 43.700001, 131, 0 } } },
3217*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.573523, 1, 2, 2, nullptr), 0, 0,
3218*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 54.737640, 0, 20.250002, 59.400002, 130, 0 },
3219*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.825844, 0, 57.771137, 43.700001, 131, 0 } } },
3220*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.584697, 1, 2, 2, nullptr), 0, 0,
3221*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 54.906223, 0, 20.250002, 59.400002, 130, 0 },
3222*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.654804, 0, 57.790218, 43.700001, 131, 0 } } },
3223*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.595872, 1, 2, 2, nullptr), 0, 0,
3224*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.001118, 0, 20.250002, 59.400002, 130, 0 },
3225*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.542431, 0, 57.809731, 43.700001, 131, 0 } } },
3226*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.618320, 1, 2, 2, nullptr), 0, 0,
3227*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.039989, 0, 20.252811, 59.400002, 130, 0 },
3228*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.585777, 0, 57.824154, 43.700001, 131, 0 } } },
3229*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.640768, 1, 2, 2, nullptr), 0, 0,
3230*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.045246, 0, 20.264456, 59.400002, 130, 0 },
3231*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.715435, 0, 57.832584, 43.700001, 131, 0 } } },
3232*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.691161, 1, 2, 2, nullptr), 0, 0,
3233*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.068935, 0, 20.285036, 59.400002, 130, 0 },
3234*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.845741, 0, 57.836266, 43.700001, 131, 0 } } },
3235*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.741554, 1, 2, 2, nullptr), 0, 0,
3236*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.195026, 0, 20.306564, 59.400002, 130, 0 },
3237*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.941154, 0, 57.836994, 43.700001, 131, 0 } } },
3238*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.758389, 1, 2, 2, nullptr), 0, 0,
3239*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.430550, 0, 20.322674, 59.400002, 130, 0 },
3240*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.962692, 0, 57.836308, 43.700001, 131, 0 } } },
3241*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.775225, 1, 2, 2, nullptr), 0, 0,
3242*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.681423, 0, 20.332201, 59.400002, 130, 0 },
3243*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.846741, 0, 57.835224, 43.700001, 131, 0 } } },
3244*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.786418, 1, 2, 2, nullptr), 0, 0,
3245*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.803486, 0, 20.336439, 59.400002, 130, 0 },
3246*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.604134, 0, 57.834267, 43.700001, 131, 0 } } },
3247*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.803205, 1, 2, 2, nullptr), 0, 0,
3248*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.738258, 0, 20.337351, 59.396629, 130, 0 },
3249*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.340977, 0, 57.833622, 43.700001, 131, 0 } } },
3250*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.819993, 1, 2, 2, nullptr), 0, 0,
3251*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.647045, 0, 20.336643, 59.382656, 130, 0 },
3252*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.140343, 0, 57.833279, 43.700001, 131, 0 } } },
3253*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.831121, 1, 2, 2, nullptr), 0, 0,
3254*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.670898, 0, 20.335459, 59.357960, 130, 0 },
3255*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.019653, 0, 57.827530, 43.700001, 131, 0 } } },
3256*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.842232, 1, 2, 2, nullptr), 0, 0,
3257*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.769543, 0, 20.334396, 59.332127, 130, 0 },
3258*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.964531, 0, 57.807049, 43.700001, 131, 0 } } },
3259*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.853342, 1, 2, 2, nullptr), 0, 0,
3260*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.872444, 0, 20.333672, 59.312794, 130, 0 },
3261*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.951347, 0, 57.771957, 43.700001, 131, 0 } } },
3262*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.864522, 1, 2, 2, nullptr), 0, 0,
3263*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.949341, 0, 20.333281, 59.301361, 130, 0 },
3264*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.959034, 0, 57.729061, 43.700001, 131, 0 } } },
3265*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.875702, 1, 2, 2, nullptr), 0, 0,
3266*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.994751, 0, 20.333134, 59.296276, 130, 0 },
3267*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.973259, 0, 57.683277, 43.700001, 131, 0 } } },
3268*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.886840, 1, 2, 2, nullptr), 0, 0,
3269*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 56.014912, 0, 20.333128, 59.295181, 130, 0 },
3270*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.918892, 0, 57.640221, 43.700001, 131, 0 } } },
3271*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.898031, 1, 2, 2, nullptr), 0, 0,
3272*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.951756, 0, 20.333181, 59.296028, 130, 0 },
3273*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.715969, 0, 57.601479, 43.700001, 131, 0 } } },
3274*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.909149, 1, 2, 2, nullptr), 0, 0,
3275*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.736336, 0, 20.333244, 59.297451, 130, 0 },
3276*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.304108, 0, 57.563725, 43.700001, 131, 0 } } },
3277*aed3e508SAndroid Build Coastguard Worker { make_hwstate(1329527921.920301, 0, 2, 2, nullptr), 0,
3278*aed3e508SAndroid Build Coastguard Worker GESTURES_BUTTON_RIGHT,
3279*aed3e508SAndroid Build Coastguard Worker { { 0, 0, 0, 0, 55.448730, 0, 20.333294, 59.298725, 130, 0 },
3280*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 41.444939, 0, 57.525326, 43.700001, 131, 0 } } }
3281*aed3e508SAndroid Build Coastguard Worker };
3282*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3283*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3284*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(records); i++) {
3285*aed3e508SAndroid Build Coastguard Worker // Make the hwstate point to the fingers
3286*aed3e508SAndroid Build Coastguard Worker HardwareState& hs = records[i].hs;
3287*aed3e508SAndroid Build Coastguard Worker hs.fingers = records[i].fs;
3288*aed3e508SAndroid Build Coastguard Worker Gesture* gs_out = wrapper.SyncInterpret(hs, nullptr);
3289*aed3e508SAndroid Build Coastguard Worker if (!gs_out || gs_out->type != kGestureTypeButtonsChange) {
3290*aed3e508SAndroid Build Coastguard Worker // We got no output buttons gesture. Make sure we expected that
3291*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, records[i].out_buttons_down);
3292*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, records[i].out_buttons_up);
3293*aed3e508SAndroid Build Coastguard Worker } else if (gs_out) {
3294*aed3e508SAndroid Build Coastguard Worker // We got a buttons gesture
3295*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(gs_out->details.buttons.down, records[i].out_buttons_down);
3296*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(gs_out->details.buttons.up, records[i].out_buttons_up);
3297*aed3e508SAndroid Build Coastguard Worker } else {
3298*aed3e508SAndroid Build Coastguard Worker ADD_FAILURE(); // This should be unreachable
3299*aed3e508SAndroid Build Coastguard Worker }
3300*aed3e508SAndroid Build Coastguard Worker }
3301*aed3e508SAndroid Build Coastguard Worker }
3302*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ChangeTimeoutTest)3303*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ChangeTimeoutTest) {
3304*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3305*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3306*aed3e508SAndroid Build Coastguard Worker .right = 1000,
3307*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
3308*aed3e508SAndroid Build Coastguard Worker .res_x = 500,
3309*aed3e508SAndroid Build Coastguard Worker .res_y = 500,
3310*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3311*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3312*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3313*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
3314*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3315*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
3316*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
3317*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3318*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3319*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
3320*aed3e508SAndroid Build Coastguard Worker };
3321*aed3e508SAndroid Build Coastguard Worker
3322*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
3323*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
3324*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 21, 0, 30, 30, 2, 0},
3325*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 21, 0, 10, 10, 1, 0},
3326*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 21, 0, 10, 20, 1, 0},
3327*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 21, 0, 20, 20, 1, 0}
3328*aed3e508SAndroid Build Coastguard Worker };
3329*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
3330*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, finger states pointer
3331*aed3e508SAndroid Build Coastguard Worker // One finger moves
3332*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.10, 0, 1, 1, &finger_states[1]),
3333*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.12, 0, 1, 1, &finger_states[2]),
3334*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.16, 0, 1, 1, &finger_states[3]),
3335*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.5, 0, 0, 0, nullptr),
3336*aed3e508SAndroid Build Coastguard Worker // One finger moves after another finger leaves
3337*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.09, 0, 2, 2, &finger_states[0]),
3338*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.10, 0, 1, 1, &finger_states[1]),
3339*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.12, 0, 1, 1, &finger_states[2]),
3340*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.36, 0, 1, 1, &finger_states[3]),
3341*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.5, 0, 0, 0, nullptr),
3342*aed3e508SAndroid Build Coastguard Worker };
3343*aed3e508SAndroid Build Coastguard Worker
3344*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3345*aed3e508SAndroid Build Coastguard Worker
3346*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[0], nullptr));
3347*aed3e508SAndroid Build Coastguard Worker
3348*aed3e508SAndroid Build Coastguard Worker // One finger moves, change_timeout_ is not applied.
3349*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[1], nullptr);
3350*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
3351*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
3352*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dx);
3353*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(10, gs->details.move.dy);
3354*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.10, gs->start_time);
3355*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.12, gs->end_time);
3356*aed3e508SAndroid Build Coastguard Worker
3357*aed3e508SAndroid Build Coastguard Worker // One finger moves, change_timeout_ does not block the gesture.
3358*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[2], nullptr);
3359*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(nullptr, gs);
3360*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
3361*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(10, gs->details.move.dx);
3362*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dy);
3363*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.12, gs->start_time);
3364*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0.16, gs->end_time);
3365*aed3e508SAndroid Build Coastguard Worker
3366*aed3e508SAndroid Build Coastguard Worker // No finger.
3367*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[3], nullptr));
3368*aed3e508SAndroid Build Coastguard Worker
3369*aed3e508SAndroid Build Coastguard Worker // Start with 2 fingers.
3370*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[4], nullptr));
3371*aed3e508SAndroid Build Coastguard Worker // One finger leaves, finger_leave_time_ recorded.
3372*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[5], nullptr));
3373*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(ii.finger_leave_time_, 1.10);
3374*aed3e508SAndroid Build Coastguard Worker // One finger moves, change_timeout_ blocks the gesture.
3375*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[6], nullptr));
3376*aed3e508SAndroid Build Coastguard Worker
3377*aed3e508SAndroid Build Coastguard Worker // One finger moves, finger_leave_time_ + change_timeout_
3378*aed3e508SAndroid Build Coastguard Worker // has been passed.
3379*aed3e508SAndroid Build Coastguard Worker gs = wrapper.SyncInterpret(hardware_states[7], nullptr);
3380*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(nullptr, gs);
3381*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeMove, gs->type);
3382*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(10, gs->details.move.dx);
3383*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, gs->details.move.dy);
3384*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(1.12, gs->start_time);
3385*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(1.36, gs->end_time);
3386*aed3e508SAndroid Build Coastguard Worker
3387*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, wrapper.SyncInterpret(hardware_states[8], nullptr));
3388*aed3e508SAndroid Build Coastguard Worker }
3389*aed3e508SAndroid Build Coastguard Worker
3390*aed3e508SAndroid Build Coastguard Worker // Tests that fingers that have been present a while, but are stationary,
3391*aed3e508SAndroid Build Coastguard Worker // can be evaluated multiple times when they start moving.
3392*aed3e508SAndroid Build Coastguard Worker
3393*aed3e508SAndroid Build Coastguard Worker enum PinchTestExpectedResult {
3394*aed3e508SAndroid Build Coastguard Worker kPinch,
3395*aed3e508SAndroid Build Coastguard Worker kNoPinch,
3396*aed3e508SAndroid Build Coastguard Worker kAny,
3397*aed3e508SAndroid Build Coastguard Worker kNull
3398*aed3e508SAndroid Build Coastguard Worker };
3399*aed3e508SAndroid Build Coastguard Worker
3400*aed3e508SAndroid Build Coastguard Worker struct PinchTestInput {
3401*aed3e508SAndroid Build Coastguard Worker HardwareState hs;
3402*aed3e508SAndroid Build Coastguard Worker PinchTestExpectedResult expected_result;
3403*aed3e508SAndroid Build Coastguard Worker };
3404*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,PinchTests)3405*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, PinchTests) {
3406*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3407*aed3e508SAndroid Build Coastguard Worker ii.pinch_enable_.val_ = 1;
3408*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3409*aed3e508SAndroid Build Coastguard Worker .right = 100,
3410*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
3411*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3412*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3413*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3414*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3415*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3416*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
3417*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3418*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
3419*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
3420*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3421*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3422*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
3423*aed3e508SAndroid Build Coastguard Worker };
3424*aed3e508SAndroid Build Coastguard Worker
3425*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
3426*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
3427*aed3e508SAndroid Build Coastguard Worker // 0: start position
3428*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 40, 1, 0},
3429*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 90, 90, 2, 0},
3430*aed3e508SAndroid Build Coastguard Worker
3431*aed3e508SAndroid Build Coastguard Worker // 2: pinch inwards
3432*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 41, 41, 1, 0},
3433*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 89, 89, 2, 0},
3434*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 42, 42, 1, 0},
3435*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 88, 88, 2, 0},
3436*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 43, 43, 1, 0},
3437*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 87, 87, 2, 0},
3438*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 44, 44, 1, 0},
3439*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 86, 86, 2, 0},
3440*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 45, 45, 1, 0},
3441*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 85, 85, 2, 0},
3442*aed3e508SAndroid Build Coastguard Worker
3443*aed3e508SAndroid Build Coastguard Worker // 12: pinch outwards
3444*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 39, 39, 1, 0},
3445*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 91, 91, 2, 0},
3446*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 38, 38, 1, 0},
3447*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 92, 92, 2, 0},
3448*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 37, 37, 1, 0},
3449*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 93, 93, 2, 0},
3450*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 36, 36, 1, 0},
3451*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 94, 94, 2, 0},
3452*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 35, 35, 1, 0},
3453*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 95, 95, 2, 0},
3454*aed3e508SAndroid Build Coastguard Worker
3455*aed3e508SAndroid Build Coastguard Worker // 22: single finger pinch
3456*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 39, 39, 1, 0},
3457*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 90, 90, 2, 0},
3458*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 38, 38, 1, 0},
3459*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 90, 90, 2, 0},
3460*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 37, 37, 1, 0},
3461*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 90, 90, 2, 0},
3462*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 36, 36, 1, 0},
3463*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 90, 90, 2, 0},
3464*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 35, 35, 1, 0},
3465*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 90, 90, 2, 0},
3466*aed3e508SAndroid Build Coastguard Worker };
3467*aed3e508SAndroid Build Coastguard Worker
3468*aed3e508SAndroid Build Coastguard Worker PinchTestInput input_states[] = {
3469*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
3470*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.00, 0, 0, 0, nullptr), kAny},
3471*aed3e508SAndroid Build Coastguard Worker
3472*aed3e508SAndroid Build Coastguard Worker // fast pinch outwards
3473*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.11, 0, 2, 2, &finger_states[0]), kAny},
3474*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.12, 0, 2, 2, &finger_states[4]), kAny},
3475*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.13, 0, 2, 2, &finger_states[8]), kAny},
3476*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.14, 0, 2, 2, &finger_states[10]), kPinch},
3477*aed3e508SAndroid Build Coastguard Worker {make_hwstate(0.15, 0, 0, 0, nullptr), kAny},
3478*aed3e508SAndroid Build Coastguard Worker
3479*aed3e508SAndroid Build Coastguard Worker // slow pinch
3480*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.01, 0, 2, 2, &finger_states[0]), kAny},
3481*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.02, 0, 2, 2, &finger_states[0]), kAny},
3482*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.03, 0, 2, 2, &finger_states[2]), kAny},
3483*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.04, 0, 2, 2, &finger_states[2]), kAny},
3484*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.05, 0, 2, 2, &finger_states[4]), kAny},
3485*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.06, 0, 2, 2, &finger_states[4]), kAny},
3486*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.07, 0, 2, 2, &finger_states[6]), kAny},
3487*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.08, 0, 2, 2, &finger_states[6]), kAny},
3488*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.09, 0, 2, 2, &finger_states[8]), kAny},
3489*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.10, 0, 2, 2, &finger_states[8]), kAny},
3490*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.11, 0, 2, 2, &finger_states[10]), kPinch},
3491*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.12, 0, 2, 2, &finger_states[10]), kNull},
3492*aed3e508SAndroid Build Coastguard Worker {make_hwstate(1.13, 0, 0, 0, nullptr), kAny},
3493*aed3e508SAndroid Build Coastguard Worker
3494*aed3e508SAndroid Build Coastguard Worker // single finger pinch
3495*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.01, 0, 2, 2, &finger_states[22]), kAny},
3496*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.02, 0, 2, 2, &finger_states[26]), kAny},
3497*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.03, 0, 2, 2, &finger_states[30]), kAny},
3498*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.04, 0, 2, 2, &finger_states[30]), kNoPinch},
3499*aed3e508SAndroid Build Coastguard Worker {make_hwstate(2.05, 0, 0, 0, nullptr), kAny},
3500*aed3e508SAndroid Build Coastguard Worker
3501*aed3e508SAndroid Build Coastguard Worker
3502*aed3e508SAndroid Build Coastguard Worker // first single finger pinch, then second moves too.
3503*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3.01, 0, 2, 2, &finger_states[22]), kAny},
3504*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3.02, 0, 2, 2, &finger_states[24]), kAny},
3505*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3.03, 0, 2, 2, &finger_states[6]), kAny},
3506*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3.04, 0, 2, 2, &finger_states[8]), kAny},
3507*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3.05, 0, 2, 2, &finger_states[10]), kPinch},
3508*aed3e508SAndroid Build Coastguard Worker {make_hwstate(3.06, 0, 0, 0, nullptr), kAny},
3509*aed3e508SAndroid Build Coastguard Worker
3510*aed3e508SAndroid Build Coastguard Worker // fast pinch inwards
3511*aed3e508SAndroid Build Coastguard Worker {make_hwstate(4.01, 0, 2, 2, &finger_states[10]), kAny},
3512*aed3e508SAndroid Build Coastguard Worker {make_hwstate(4.02, 0, 2, 2, &finger_states[8]), kAny},
3513*aed3e508SAndroid Build Coastguard Worker {make_hwstate(4.03, 0, 2, 2, &finger_states[4]), kAny},
3514*aed3e508SAndroid Build Coastguard Worker {make_hwstate(4.04, 0, 2, 2, &finger_states[0]), kPinch},
3515*aed3e508SAndroid Build Coastguard Worker {make_hwstate(4.05, 0, 0, 0, nullptr), kAny},
3516*aed3e508SAndroid Build Coastguard Worker };
3517*aed3e508SAndroid Build Coastguard Worker
3518*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3519*aed3e508SAndroid Build Coastguard Worker
3520*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(input_states); ++idx) {
3521*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(input_states[idx].hs, nullptr);
3522*aed3e508SAndroid Build Coastguard Worker // assert pinch detected
3523*aed3e508SAndroid Build Coastguard Worker if (input_states[idx].expected_result == kPinch) {
3524*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(nullptr, gs);
3525*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypePinch, gs->type) << "idx=" << idx;
3526*aed3e508SAndroid Build Coastguard Worker }
3527*aed3e508SAndroid Build Coastguard Worker // assert pinch not detected
3528*aed3e508SAndroid Build Coastguard Worker if (input_states[idx].expected_result == kNoPinch) {
3529*aed3e508SAndroid Build Coastguard Worker if (gs != nullptr) {
3530*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(kGestureTypePinch, gs->type);
3531*aed3e508SAndroid Build Coastguard Worker }
3532*aed3e508SAndroid Build Coastguard Worker }
3533*aed3e508SAndroid Build Coastguard Worker // assert if nullptr is not given back
3534*aed3e508SAndroid Build Coastguard Worker if (input_states[idx].expected_result == kNull) {
3535*aed3e508SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, gs);
3536*aed3e508SAndroid Build Coastguard Worker }
3537*aed3e508SAndroid Build Coastguard Worker }
3538*aed3e508SAndroid Build Coastguard Worker }
3539*aed3e508SAndroid Build Coastguard Worker
3540*aed3e508SAndroid Build Coastguard Worker struct AvoidAccidentalPinchTestInput {
3541*aed3e508SAndroid Build Coastguard Worker TestCaseStartOrContinueFlag flag;
3542*aed3e508SAndroid Build Coastguard Worker stime_t now;
3543*aed3e508SAndroid Build Coastguard Worker float x0, y0, p0, x1, y1, p1; // (x, y) coordinate + pressure per finger
3544*aed3e508SAndroid Build Coastguard Worker GestureType expected_gesture;
3545*aed3e508SAndroid Build Coastguard Worker };
3546*aed3e508SAndroid Build Coastguard Worker
3547*aed3e508SAndroid Build Coastguard Worker // These data are from real logs where a move with resting thumb was appempted,
3548*aed3e508SAndroid Build Coastguard Worker // but pinch code prevented it.
TEST(ImmediateInterpreterTest,AvoidAccidentalPinchTest)3549*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, AvoidAccidentalPinchTest) {
3550*aed3e508SAndroid Build Coastguard Worker std::unique_ptr<ImmediateInterpreter> ii;
3551*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3552*aed3e508SAndroid Build Coastguard Worker .right = 106.666672,
3553*aed3e508SAndroid Build Coastguard Worker .bottom = 68.000000,
3554*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3555*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3556*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3557*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3558*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 15,
3559*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
3560*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3561*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
3562*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
3563*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3564*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3565*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
3566*aed3e508SAndroid Build Coastguard Worker };
3567*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(ii.get(), &hwprops);
3568*aed3e508SAndroid Build Coastguard Worker
3569*aed3e508SAndroid Build Coastguard Worker const GestureType kMov = kGestureTypeMove;
3570*aed3e508SAndroid Build Coastguard Worker const GestureType kAny = kGestureTypeNull;
3571*aed3e508SAndroid Build Coastguard Worker
3572*aed3e508SAndroid Build Coastguard Worker AvoidAccidentalPinchTestInput inputs[] = {
3573*aed3e508SAndroid Build Coastguard Worker { kS, 0.97697, 44.08, 64.30, 118.20, 35.91, 27.70, 44.46, kAny },
3574*aed3e508SAndroid Build Coastguard Worker { kC, 0.98755, 44.08, 64.30, 118.20, 35.91, 27.70, 50.28, kAny },
3575*aed3e508SAndroid Build Coastguard Worker { kC, 0.99816, 44.08, 64.30, 118.20, 35.91, 27.70, 54.16, kAny },
3576*aed3e508SAndroid Build Coastguard Worker { kC, 1.00876, 45.33, 65.50, 98.79, 35.91, 27.60, 56.10, kAny },
3577*aed3e508SAndroid Build Coastguard Worker { kC, 1.01936, 45.33, 65.50, 98.79, 35.91, 27.60, 58.04, kAny },
3578*aed3e508SAndroid Build Coastguard Worker { kC, 1.03026, 45.33, 65.50, 100.73, 34.50, 26.70, 63.87, kAny },
3579*aed3e508SAndroid Build Coastguard Worker { kC, 1.04124, 45.33, 65.50, 102.67, 33.00, 26.10, 65.81, kMov },
3580*aed3e508SAndroid Build Coastguard Worker { kC, 1.05198, 45.33, 65.50, 102.67, 31.25, 25.60, 71.63, kMov },
3581*aed3e508SAndroid Build Coastguard Worker { kC, 1.06279, 45.33, 65.50, 104.61, 28.75, 25.10, 73.57, kMov },
3582*aed3e508SAndroid Build Coastguard Worker { kC, 1.07364, 45.33, 65.50, 104.61, 27.00, 24.60, 71.63, kMov },
3583*aed3e508SAndroid Build Coastguard Worker { kC, 1.08451, 45.33, 65.50, 104.61, 25.41, 24.10, 71.63, kMov },
3584*aed3e508SAndroid Build Coastguard Worker { kC, 1.09512, 45.33, 65.50, 102.67, 23.58, 23.50, 75.51, kMov },
3585*aed3e508SAndroid Build Coastguard Worker { kC, 1.10573, 45.33, 65.50, 104.61, 22.25, 23.30, 73.57, kMov },
3586*aed3e508SAndroid Build Coastguard Worker { kC, 1.11671, 45.33, 65.50, 104.61, 21.16, 23.20, 75.51, kMov },
3587*aed3e508SAndroid Build Coastguard Worker { kC, 1.12744, 45.33, 65.50, 104.61, 20.25, 23.20, 81.33, kMov },
3588*aed3e508SAndroid Build Coastguard Worker { kC, 1.13833, 45.33, 65.50, 104.61, 19.41, 23.20, 79.39, kMov },
3589*aed3e508SAndroid Build Coastguard Worker { kC, 1.14913, 45.33, 65.50, 104.61, 18.33, 23.20, 81.33, kMov },
3590*aed3e508SAndroid Build Coastguard Worker { kC, 1.15985, 45.41, 65.50, 104.61, 17.50, 23.40, 79.39, kMov },
3591*aed3e508SAndroid Build Coastguard Worker { kC, 1.17044, 45.58, 65.50, 106.55, 16.75, 23.80, 81.33, kMov },
3592*aed3e508SAndroid Build Coastguard Worker { kC, 1.18117, 45.58, 65.50, 106.55, 16.33, 24.20, 77.45, kMov },
3593*aed3e508SAndroid Build Coastguard Worker { kC, 1.19188, 45.58, 65.50, 106.55, 16.00, 24.30, 71.63, kMov },
3594*aed3e508SAndroid Build Coastguard Worker { kC, 1.20260, 45.58, 65.50, 106.55, 16.00, 24.50, 48.34, kAny },
3595*aed3e508SAndroid Build Coastguard Worker { kC, 1.21331, 45.58, 65.50, 106.55, 15.91, 24.80, 9.54, kAny },
3596*aed3e508SAndroid Build Coastguard Worker
3597*aed3e508SAndroid Build Coastguard Worker { kS, 3.92951, 58.50, 58.40, 118.20, 38.25, 14.40, 3.71, kAny },
3598*aed3e508SAndroid Build Coastguard Worker { kC, 3.94014, 58.33, 58.40, 118.20, 38.25, 14.40, 38.64, kAny },
3599*aed3e508SAndroid Build Coastguard Worker { kC, 3.95082, 58.25, 58.40, 118.20, 38.33, 14.40, 50.28, kAny },
3600*aed3e508SAndroid Build Coastguard Worker { kC, 3.96148, 58.08, 58.40, 118.20, 38.41, 14.40, 52.22, kAny },
3601*aed3e508SAndroid Build Coastguard Worker { kC, 3.97222, 57.91, 58.40, 118.20, 38.41, 14.50, 56.10, kAny },
3602*aed3e508SAndroid Build Coastguard Worker { kC, 3.98303, 57.83, 58.40, 118.20, 38.58, 14.60, 59.99, kAny },
3603*aed3e508SAndroid Build Coastguard Worker { kC, 3.99376, 57.66, 58.40, 118.20, 38.75, 14.80, 63.87, kAny },
3604*aed3e508SAndroid Build Coastguard Worker { kC, 4.00452, 57.58, 58.40, 118.20, 38.91, 15.00, 65.81, kAny },
3605*aed3e508SAndroid Build Coastguard Worker { kC, 4.01528, 57.50, 58.40, 118.20, 39.33, 15.30, 67.75, kAny },
3606*aed3e508SAndroid Build Coastguard Worker { kC, 4.02621, 57.41, 58.40, 118.20, 39.50, 15.70, 69.69, kAny },
3607*aed3e508SAndroid Build Coastguard Worker { kC, 4.03697, 57.41, 58.40, 118.20, 39.75, 16.10, 73.57, kMov },
3608*aed3e508SAndroid Build Coastguard Worker { kC, 4.04781, 57.25, 58.40, 118.20, 40.00, 16.60, 71.63, kMov },
3609*aed3e508SAndroid Build Coastguard Worker { kC, 4.05869, 57.25, 58.40, 118.20, 40.25, 17.00, 71.63, kMov },
3610*aed3e508SAndroid Build Coastguard Worker { kC, 4.06966, 57.25, 58.40, 118.20, 40.50, 17.30, 69.69, kMov },
3611*aed3e508SAndroid Build Coastguard Worker { kC, 4.08034, 57.16, 58.40, 118.20, 40.75, 17.70, 71.63, kMov },
3612*aed3e508SAndroid Build Coastguard Worker { kC, 4.09120, 57.08, 58.40, 118.20, 41.16, 17.90, 73.57, kMov },
3613*aed3e508SAndroid Build Coastguard Worker { kC, 4.10214, 57.00, 58.40, 118.20, 41.50, 18.30, 73.57, kMov },
3614*aed3e508SAndroid Build Coastguard Worker { kC, 4.11304, 56.83, 58.29, 118.20, 42.00, 18.60, 71.63, kMov },
3615*aed3e508SAndroid Build Coastguard Worker { kC, 4.12390, 56.83, 58.29, 118.20, 42.58, 19.00, 71.63, kMov },
3616*aed3e508SAndroid Build Coastguard Worker { kC, 4.13447, 56.66, 58.29, 118.20, 43.16, 19.60, 67.75, kMov },
3617*aed3e508SAndroid Build Coastguard Worker { kC, 4.14521, 56.66, 58.29, 118.20, 43.75, 20.20, 67.75, kMov },
3618*aed3e508SAndroid Build Coastguard Worker { kC, 4.15606, 56.50, 58.20, 118.20, 44.41, 21.10, 69.69, kMov },
3619*aed3e508SAndroid Build Coastguard Worker { kC, 4.16692, 56.50, 58.20, 118.20, 44.91, 22.10, 67.75, kMov },
3620*aed3e508SAndroid Build Coastguard Worker { kC, 4.17778, 56.41, 58.20, 118.20, 45.58, 23.00, 65.81, kMov },
3621*aed3e508SAndroid Build Coastguard Worker { kC, 4.18894, 56.33, 58.10, 118.20, 46.08, 23.60, 65.81, kMov },
3622*aed3e508SAndroid Build Coastguard Worker { kC, 4.20017, 56.33, 58.10, 118.20, 46.50, 24.10, 65.81, kMov },
3623*aed3e508SAndroid Build Coastguard Worker { kC, 4.21111, 56.33, 58.10, 118.20, 46.83, 24.50, 63.87, kMov },
3624*aed3e508SAndroid Build Coastguard Worker { kC, 4.22204, 56.33, 58.10, 118.20, 47.08, 24.80, 61.93, kMov },
3625*aed3e508SAndroid Build Coastguard Worker { kC, 4.23308, 56.25, 58.10, 118.20, 47.50, 25.20, 59.99, kMov },
3626*aed3e508SAndroid Build Coastguard Worker { kC, 4.24371, 56.25, 58.10, 118.20, 48.00, 25.80, 58.04, kMov },
3627*aed3e508SAndroid Build Coastguard Worker { kC, 4.25438, 56.25, 58.10, 118.20, 48.66, 26.50, 58.04, kMov },
3628*aed3e508SAndroid Build Coastguard Worker { kC, 4.26508, 56.08, 58.00, 118.20, 49.50, 27.50, 54.16, kMov },
3629*aed3e508SAndroid Build Coastguard Worker { kC, 4.27572, 56.00, 58.00, 118.20, 50.33, 28.60, 56.10, kMov },
3630*aed3e508SAndroid Build Coastguard Worker { kC, 4.28662, 56.00, 58.00, 118.20, 51.33, 29.50, 58.04, kMov },
3631*aed3e508SAndroid Build Coastguard Worker { kC, 4.29757, 55.91, 58.00, 118.20, 51.58, 31.90, 56.10, kMov },
3632*aed3e508SAndroid Build Coastguard Worker { kC, 4.30850, 55.91, 58.00, 118.20, 52.08, 32.00, 54.16, kMov },
3633*aed3e508SAndroid Build Coastguard Worker { kC, 4.31943, 55.91, 58.00, 118.20, 52.58, 32.40, 54.16, kMov },
3634*aed3e508SAndroid Build Coastguard Worker { kC, 4.33022, 55.83, 57.90, 118.20, 52.75, 33.10, 52.22, kMov },
3635*aed3e508SAndroid Build Coastguard Worker { kC, 4.34104, 55.83, 57.90, 118.20, 53.16, 33.60, 52.22, kMov },
3636*aed3e508SAndroid Build Coastguard Worker { kC, 4.35167, 55.83, 57.90, 118.20, 53.58, 34.20, 50.28, kMov },
3637*aed3e508SAndroid Build Coastguard Worker { kC, 4.36225, 55.83, 57.90, 118.20, 53.91, 35.00, 48.34, kMov },
3638*aed3e508SAndroid Build Coastguard Worker { kC, 4.37290, 55.75, 57.90, 118.20, 54.58, 35.50, 50.28, kMov },
3639*aed3e508SAndroid Build Coastguard Worker { kC, 4.38368, 55.66, 57.90, 118.20, 55.33, 36.10, 48.34, kMov },
3640*aed3e508SAndroid Build Coastguard Worker { kC, 4.39441, 55.66, 57.90, 118.20, 55.91, 36.70, 48.34, kMov },
3641*aed3e508SAndroid Build Coastguard Worker { kC, 4.40613, 56.16, 57.90, 118.20, 57.00, 37.20, 50.28, kMov },
3642*aed3e508SAndroid Build Coastguard Worker { kC, 4.41787, 56.16, 57.90, 118.20, 57.33, 37.70, 50.28, kMov },
3643*aed3e508SAndroid Build Coastguard Worker { kC, 4.42925, 56.16, 57.90, 118.20, 57.58, 37.90, 48.34, kMov },
3644*aed3e508SAndroid Build Coastguard Worker { kC, 4.44080, 56.16, 57.90, 118.20, 57.66, 38.00, 50.28, kMov },
3645*aed3e508SAndroid Build Coastguard Worker { kC, 4.45249, 56.16, 57.90, 118.20, 57.75, 38.10, 50.28, kMov },
3646*aed3e508SAndroid Build Coastguard Worker { kC, 4.46393, 56.16, 57.90, 118.20, 57.75, 38.10, 50.28, kAny },
3647*aed3e508SAndroid Build Coastguard Worker { kC, 4.47542, 56.16, 57.90, 118.20, 57.75, 38.15, 50.28, kMov },
3648*aed3e508SAndroid Build Coastguard Worker { kC, 4.48691, 56.16, 57.90, 118.20, 57.75, 38.20, 50.28, kMov },
3649*aed3e508SAndroid Build Coastguard Worker { kC, 4.49843, 56.16, 57.90, 118.20, 57.75, 38.20, 50.28, kAny },
3650*aed3e508SAndroid Build Coastguard Worker { kC, 4.51581, 56.16, 57.90, 118.20, 57.75, 38.25, 51.25, kMov },
3651*aed3e508SAndroid Build Coastguard Worker { kC, 4.53319, 56.16, 57.90, 118.20, 57.75, 38.29, 52.22, kMov },
3652*aed3e508SAndroid Build Coastguard Worker { kC, 4.54472, 56.16, 57.90, 118.20, 57.75, 38.70, 50.28, kMov },
3653*aed3e508SAndroid Build Coastguard Worker { kC, 4.55630, 56.16, 57.90, 118.20, 57.75, 38.70, 50.28, kAny },
3654*aed3e508SAndroid Build Coastguard Worker { kC, 4.56787, 56.16, 57.90, 118.20, 57.75, 38.70, 52.22, kAny },
3655*aed3e508SAndroid Build Coastguard Worker { kC, 4.57928, 56.16, 57.90, 118.20, 58.33, 38.50, 50.28, kMov },
3656*aed3e508SAndroid Build Coastguard Worker { kC, 4.59082, 56.16, 57.90, 118.20, 58.25, 38.60, 50.28, kMov },
3657*aed3e508SAndroid Build Coastguard Worker { kC, 4.60234, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kMov },
3658*aed3e508SAndroid Build Coastguard Worker { kC, 4.61389, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3659*aed3e508SAndroid Build Coastguard Worker { kC, 4.62545, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3660*aed3e508SAndroid Build Coastguard Worker { kC, 4.64281, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3661*aed3e508SAndroid Build Coastguard Worker { kC, 4.66018, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3662*aed3e508SAndroid Build Coastguard Worker { kC, 4.67747, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3663*aed3e508SAndroid Build Coastguard Worker { kC, 4.69476, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3664*aed3e508SAndroid Build Coastguard Worker { kC, 4.70628, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3665*aed3e508SAndroid Build Coastguard Worker { kC, 4.71781, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3666*aed3e508SAndroid Build Coastguard Worker { kC, 4.72934, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3667*aed3e508SAndroid Build Coastguard Worker { kC, 4.74087, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3668*aed3e508SAndroid Build Coastguard Worker { kC, 4.75240, 56.16, 57.90, 118.20, 58.33, 38.60, 52.22, kAny },
3669*aed3e508SAndroid Build Coastguard Worker { kC, 4.76418, 56.16, 57.90, 118.20, 58.33, 38.60, 50.28, kAny },
3670*aed3e508SAndroid Build Coastguard Worker { kC, 4.77545, 56.08, 57.90, 118.20, 58.33, 38.60, 50.28, kAny },
3671*aed3e508SAndroid Build Coastguard Worker { kC, 4.78690, 56.08, 57.90, 118.20, 58.33, 38.60, 48.34, kAny },
3672*aed3e508SAndroid Build Coastguard Worker { kC, 4.79818, 56.08, 57.90, 118.20, 58.33, 38.60, 27.00, kAny },
3673*aed3e508SAndroid Build Coastguard Worker { kC, 4.80970, 56.08, 57.90, 118.20, 58.33, 38.60, 9.54, kAny },
3674*aed3e508SAndroid Build Coastguard Worker };
3675*aed3e508SAndroid Build Coastguard Worker
3676*aed3e508SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(inputs); i++) {
3677*aed3e508SAndroid Build Coastguard Worker const AvoidAccidentalPinchTestInput& input = inputs[i];
3678*aed3e508SAndroid Build Coastguard Worker if (input.flag == kS) {
3679*aed3e508SAndroid Build Coastguard Worker ii.reset(new ImmediateInterpreter(nullptr, nullptr));
3680*aed3e508SAndroid Build Coastguard Worker ii->pinch_enable_.val_ = true;
3681*aed3e508SAndroid Build Coastguard Worker MetricsProperties* mprops = new MetricsProperties(nullptr);
3682*aed3e508SAndroid Build Coastguard Worker mprops->two_finger_close_vertical_distance_thresh.val_ = 35.0;
3683*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(ii.get(), mprops);
3684*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(ImmediateInterpreter::TapToClickState::kTtcIdle,
3685*aed3e508SAndroid Build Coastguard Worker ii->tap_to_click_state());
3686*aed3e508SAndroid Build Coastguard Worker }
3687*aed3e508SAndroid Build Coastguard Worker // Prep inputs
3688*aed3e508SAndroid Build Coastguard Worker FingerState fs[] = {
3689*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, input.p0, 0, input.x0, input.y0, 1, 0 },
3690*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, input.p1, 0, input.x1, input.y1, 2, 0 },
3691*aed3e508SAndroid Build Coastguard Worker };
3692*aed3e508SAndroid Build Coastguard Worker HardwareState hs = make_hwstate(input.now, 0, 2, 2, fs);
3693*aed3e508SAndroid Build Coastguard Worker stime_t timeout = NO_DEADLINE;
3694*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hs, &timeout);
3695*aed3e508SAndroid Build Coastguard Worker if (input.expected_gesture != kAny) {
3696*aed3e508SAndroid Build Coastguard Worker if (gs)
3697*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(input.expected_gesture, gs->type);
3698*aed3e508SAndroid Build Coastguard Worker }
3699*aed3e508SAndroid Build Coastguard Worker }
3700*aed3e508SAndroid Build Coastguard Worker }
3701*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,SemiMtActiveAreaTest)3702*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, SemiMtActiveAreaTest) {
3703*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3704*aed3e508SAndroid Build Coastguard Worker
3705*aed3e508SAndroid Build Coastguard Worker HardwareProperties old_hwprops = {
3706*aed3e508SAndroid Build Coastguard Worker .right = 90.404251,
3707*aed3e508SAndroid Build Coastguard Worker .bottom = 48.953846,
3708*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3709*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3710*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3711*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3712*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3713*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 3,
3714*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3715*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 1,
3716*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
3717*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3718*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3719*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
3720*aed3e508SAndroid Build Coastguard Worker };
3721*aed3e508SAndroid Build Coastguard Worker
3722*aed3e508SAndroid Build Coastguard Worker const unsigned kNonPalmFlags = GESTURES_FINGER_WARP_X |
3723*aed3e508SAndroid Build Coastguard Worker GESTURES_FINGER_WARP_Y;
3724*aed3e508SAndroid Build Coastguard Worker const unsigned kPalmFlags = kNonPalmFlags | GESTURES_FINGER_PALM;
3725*aed3e508SAndroid Build Coastguard Worker
3726*aed3e508SAndroid Build Coastguard Worker FingerState old_finger_states[] = {
3727*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
3728*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 14, 0, 50, 8, 11, kPalmFlags },
3729*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 33, 0, 50, 8, 11, kPalmFlags },
3730*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 37, 0, 50, 8, 11, kPalmFlags },
3731*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 39, 0, 50, 8, 11, kPalmFlags },
3732*aed3e508SAndroid Build Coastguard Worker };
3733*aed3e508SAndroid Build Coastguard Worker
3734*aed3e508SAndroid Build Coastguard Worker HardwareState old_hardware_states[] = {
3735*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, touch count, finger states pointer
3736*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.05, 0, 1, 1, &old_finger_states[0]),
3737*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.10, 0, 1, 1, &old_finger_states[1]),
3738*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.15, 0, 1, 1, &old_finger_states[2]),
3739*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.20, 0, 1, 1, &old_finger_states[3]),
3740*aed3e508SAndroid Build Coastguard Worker };
3741*aed3e508SAndroid Build Coastguard Worker
3742*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &old_hwprops);
3743*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 1;
3744*aed3e508SAndroid Build Coastguard Worker
3745*aed3e508SAndroid Build Coastguard Worker // The finger will not change the tap_to_click_state_ at all.
3746*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(old_hardware_states); ++idx) {
3747*aed3e508SAndroid Build Coastguard Worker wrapper.SyncInterpret(old_hardware_states[idx], nullptr);
3748*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kIdl, ii.tap_to_click_state_);
3749*aed3e508SAndroid Build Coastguard Worker }
3750*aed3e508SAndroid Build Coastguard Worker
3751*aed3e508SAndroid Build Coastguard Worker HardwareProperties new_hwprops = {
3752*aed3e508SAndroid Build Coastguard Worker .right = 96.085106,
3753*aed3e508SAndroid Build Coastguard Worker .bottom = 57.492310,
3754*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3755*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3756*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3757*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3758*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3759*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 3,
3760*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3761*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 1,
3762*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
3763*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3764*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3765*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
3766*aed3e508SAndroid Build Coastguard Worker };
3767*aed3e508SAndroid Build Coastguard Worker
3768*aed3e508SAndroid Build Coastguard Worker FingerState new_finger_states[] = {
3769*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
3770*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 14, 0, 55, 12, 7, kNonPalmFlags },
3771*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 33, 0, 55, 12, 7, kNonPalmFlags },
3772*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 37, 0, 55, 12, 7, kNonPalmFlags },
3773*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 39, 0, 55, 12, 7, kNonPalmFlags },
3774*aed3e508SAndroid Build Coastguard Worker };
3775*aed3e508SAndroid Build Coastguard Worker
3776*aed3e508SAndroid Build Coastguard Worker HardwareState new_hardware_states[] = {
3777*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, touch count, finger states pointer
3778*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.05, 0, 1, 1, &new_finger_states[0]),
3779*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.10, 0, 1, 1, &new_finger_states[1]),
3780*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.15, 0, 1, 1, &new_finger_states[2]),
3781*aed3e508SAndroid Build Coastguard Worker make_hwstate(0.20, 0, 1, 1, &new_finger_states[3]),
3782*aed3e508SAndroid Build Coastguard Worker };
3783*aed3e508SAndroid Build Coastguard Worker
3784*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(&ii, &new_hwprops);
3785*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = true;
3786*aed3e508SAndroid Build Coastguard Worker
3787*aed3e508SAndroid Build Coastguard Worker // With new active area, the finger changes the tap_to_click_state_ to
3788*aed3e508SAndroid Build Coastguard Worker // FirstTapBegan.
3789*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(new_hardware_states); ++idx) {
3790*aed3e508SAndroid Build Coastguard Worker wrapper.SyncInterpret(new_hardware_states[idx], nullptr);
3791*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(ii.kTtcFirstTapBegan, ii.tap_to_click_state_);
3792*aed3e508SAndroid Build Coastguard Worker }
3793*aed3e508SAndroid Build Coastguard Worker }
3794*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,SemiMtNoPinchTest)3795*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, SemiMtNoPinchTest) {
3796*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3797*aed3e508SAndroid Build Coastguard Worker ii.pinch_enable_.val_ = 1;
3798*aed3e508SAndroid Build Coastguard Worker
3799*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3800*aed3e508SAndroid Build Coastguard Worker .right = 90.404251,
3801*aed3e508SAndroid Build Coastguard Worker .bottom = 48.953846,
3802*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3803*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3804*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3805*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3806*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3807*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 3,
3808*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3809*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
3810*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
3811*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3812*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3813*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
3814*aed3e508SAndroid Build Coastguard Worker };
3815*aed3e508SAndroid Build Coastguard Worker
3816*aed3e508SAndroid Build Coastguard Worker FingerState finger_state[] = {
3817*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
3818*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 25, 0, 30, 53, 1, 0}, // index 0
3819*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 46, 0, 30, 53, 1, 0}, // index 1
3820*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 69, 0, 30, 53, 1, 0}, // index 2
3821*aed3e508SAndroid Build Coastguard Worker
3822*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 67, 0, 30, 53, 1, 0}, // index 3
3823*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 67, 0, 68, 27, 2, 0},
3824*aed3e508SAndroid Build Coastguard Worker
3825*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 91, 0, 43, 52, 1, 0}, // index 5
3826*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 91, 0, 44, 23, 2, 0},
3827*aed3e508SAndroid Build Coastguard Worker
3828*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 91, 0, 43, 52, 1, 0}, // index 7
3829*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 91, 0, 43, 23, 2, 0},
3830*aed3e508SAndroid Build Coastguard Worker };
3831*aed3e508SAndroid Build Coastguard Worker
3832*aed3e508SAndroid Build Coastguard Worker
3833*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
3834*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, touch count, finger states pointer
3835*aed3e508SAndroid Build Coastguard Worker make_hwstate(2106.273252, 0, 1, 1, &finger_state[0]),
3836*aed3e508SAndroid Build Coastguard Worker make_hwstate(2106.285466, 0, 1, 1, &finger_state[1]),
3837*aed3e508SAndroid Build Coastguard Worker make_hwstate(2106.298021, 0, 1, 1, &finger_state[2]),
3838*aed3e508SAndroid Build Coastguard Worker make_hwstate(2106.325599, 0, 2, 2, &finger_state[3]),
3839*aed3e508SAndroid Build Coastguard Worker make_hwstate(2106.648152, 0, 2, 2, &finger_state[5]),
3840*aed3e508SAndroid Build Coastguard Worker make_hwstate(2106.660447, 0, 2, 2, &finger_state[7]),
3841*aed3e508SAndroid Build Coastguard Worker // pinch if not semi_mt device
3842*aed3e508SAndroid Build Coastguard Worker };
3843*aed3e508SAndroid Build Coastguard Worker
3844*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3845*aed3e508SAndroid Build Coastguard Worker
3846*aed3e508SAndroid Build Coastguard Worker Gesture *gesture;
3847*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(hardware_states); ++idx) {
3848*aed3e508SAndroid Build Coastguard Worker gesture = wrapper.SyncInterpret(hardware_states[idx], nullptr);
3849*aed3e508SAndroid Build Coastguard Worker // reset finger flags
3850*aed3e508SAndroid Build Coastguard Worker for (size_t fidx = 0; fidx < hardware_states[idx].finger_cnt; ++fidx)
3851*aed3e508SAndroid Build Coastguard Worker hardware_states[idx].fingers[fidx].flags = 0;
3852*aed3e508SAndroid Build Coastguard Worker }
3853*aed3e508SAndroid Build Coastguard Worker if (gesture)
3854*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(gesture->type, kGestureTypePinch);
3855*aed3e508SAndroid Build Coastguard Worker
3856*aed3e508SAndroid Build Coastguard Worker // For a semi_mt device, replay the same inputs should not generate
3857*aed3e508SAndroid Build Coastguard Worker // a pinch gesture.
3858*aed3e508SAndroid Build Coastguard Worker hwprops.support_semi_mt = 1;
3859*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(&ii, &hwprops);
3860*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(hardware_states); ++idx) {
3861*aed3e508SAndroid Build Coastguard Worker gesture = wrapper.SyncInterpret(hardware_states[idx], nullptr);
3862*aed3e508SAndroid Build Coastguard Worker // reset finger flags
3863*aed3e508SAndroid Build Coastguard Worker for (size_t fidx = 0; fidx < hardware_states[idx].finger_cnt; ++fidx)
3864*aed3e508SAndroid Build Coastguard Worker hardware_states[idx].fingers[fidx].flags = 0;
3865*aed3e508SAndroid Build Coastguard Worker }
3866*aed3e508SAndroid Build Coastguard Worker if (gesture)
3867*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(gesture->type, kGestureTypePinch);
3868*aed3e508SAndroid Build Coastguard Worker }
3869*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,WarpedFingersTappingTest)3870*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, WarpedFingersTappingTest) {
3871*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3872*aed3e508SAndroid Build Coastguard Worker
3873*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3874*aed3e508SAndroid Build Coastguard Worker .right = 90.404251,
3875*aed3e508SAndroid Build Coastguard Worker .bottom = 48.953846,
3876*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3877*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3878*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3879*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3880*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3881*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 3,
3882*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3883*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 1,
3884*aed3e508SAndroid Build Coastguard Worker .is_button_pad = true,
3885*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3886*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3887*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = false,
3888*aed3e508SAndroid Build Coastguard Worker };
3889*aed3e508SAndroid Build Coastguard Worker
3890*aed3e508SAndroid Build Coastguard Worker unsigned flags = GESTURES_FINGER_WARP_X_NON_MOVE |
3891*aed3e508SAndroid Build Coastguard Worker GESTURES_FINGER_WARP_Y_NON_MOVE |
3892*aed3e508SAndroid Build Coastguard Worker GESTURES_FINGER_WARP_X_TAP_MOVE |
3893*aed3e508SAndroid Build Coastguard Worker GESTURES_FINGER_WARP_Y_TAP_MOVE;
3894*aed3e508SAndroid Build Coastguard Worker
3895*aed3e508SAndroid Build Coastguard Worker FingerState finger_state[] = {
3896*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
3897*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.139996, 0, 46.106384, 39.800003, 0, flags }, // index 0
3898*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 42.139996, 0, 69.106384, 28.461538, 1, flags },
3899*aed3e508SAndroid Build Coastguard Worker
3900*aed3e508SAndroid Build Coastguard Worker // The finger 0 moves more than default threshold 2.0 in Y, but it should
3901*aed3e508SAndroid Build Coastguard Worker // still generate final right-click gesture as the WARP flag is set.
3902*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.350002, 0, 45.425529, 36.353844, 0, flags }, // index 2
3903*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.350002, 0, 69.063828, 28.507692, 1, flags },
3904*aed3e508SAndroid Build Coastguard Worker
3905*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 43.350002, 0, 69.085106, 28.307692, 1, flags }, // index 4
3906*aed3e508SAndroid Build Coastguard Worker };
3907*aed3e508SAndroid Build Coastguard Worker
3908*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
3909*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, touch count, finger states pointer
3910*aed3e508SAndroid Build Coastguard Worker make_hwstate(3897.124791, 0, 2, 2, &finger_state[0]),
3911*aed3e508SAndroid Build Coastguard Worker make_hwstate(3897.136733, 0, 2, 2, &finger_state[2]),
3912*aed3e508SAndroid Build Coastguard Worker make_hwstate(3897.148675, 0, 1, 1, &finger_state[4]),
3913*aed3e508SAndroid Build Coastguard Worker make_hwstate(3897.160675, 0, 0, 0, nullptr),
3914*aed3e508SAndroid Build Coastguard Worker };
3915*aed3e508SAndroid Build Coastguard Worker
3916*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 1;
3917*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3918*aed3e508SAndroid Build Coastguard Worker
3919*aed3e508SAndroid Build Coastguard Worker Gesture *gesture;
3920*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(hardware_states); ++idx)
3921*aed3e508SAndroid Build Coastguard Worker gesture = wrapper.SyncInterpret(hardware_states[idx], nullptr);
3922*aed3e508SAndroid Build Coastguard Worker
3923*aed3e508SAndroid Build Coastguard Worker ASSERT_NE(gesture, nullptr);
3924*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(gesture->type, kGestureTypeButtonsChange);
3925*aed3e508SAndroid Build Coastguard Worker }
3926*aed3e508SAndroid Build Coastguard Worker
3927*aed3e508SAndroid Build Coastguard Worker // Test that fling_buffer_depth controls the number of scroll samples to use
3928*aed3e508SAndroid Build Coastguard Worker // to compute fling.
TEST(ImmediateInterpreterTest,FlingDepthTest)3929*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, FlingDepthTest) {
3930*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
3931*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
3932*aed3e508SAndroid Build Coastguard Worker .right = 100,
3933*aed3e508SAndroid Build Coastguard Worker .bottom = 100,
3934*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
3935*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
3936*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
3937*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
3938*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
3939*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
3940*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
3941*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 1,
3942*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
3943*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
3944*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
3945*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
3946*aed3e508SAndroid Build Coastguard Worker };
3947*aed3e508SAndroid Build Coastguard Worker
3948*aed3e508SAndroid Build Coastguard Worker FingerState finger_states[] = {
3949*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
3950*aed3e508SAndroid Build Coastguard Worker // Consistent movement for 6 frames
3951*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 20, 1, 0}, // 0
3952*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 20, 2, 0},
3953*aed3e508SAndroid Build Coastguard Worker
3954*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 25, 1, 0}, // 2
3955*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 25, 2, 0},
3956*aed3e508SAndroid Build Coastguard Worker
3957*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 30, 1, 0}, // 4
3958*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 30, 2, 0},
3959*aed3e508SAndroid Build Coastguard Worker
3960*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 35, 1, 0}, // 6
3961*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 35, 2, 0},
3962*aed3e508SAndroid Build Coastguard Worker
3963*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 40, 1, 0}, // 8
3964*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 40, 2, 0},
3965*aed3e508SAndroid Build Coastguard Worker
3966*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 45, 1, 0}, // 10
3967*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 45, 2, 0},
3968*aed3e508SAndroid Build Coastguard Worker
3969*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 50, 1, 0}, // 12
3970*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 50, 2, 0},
3971*aed3e508SAndroid Build Coastguard Worker
3972*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 40, 55, 1, 0}, // 14
3973*aed3e508SAndroid Build Coastguard Worker {0, 0, 0, 0, 20, 0, 60, 55, 2, 0},
3974*aed3e508SAndroid Build Coastguard Worker };
3975*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
3976*aed3e508SAndroid Build Coastguard Worker // time, buttons, finger count, touch count, finger states pointer
3977*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.00, 0, 2, 2, &finger_states[0]),
3978*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.01, 0, 2, 2, &finger_states[2]),
3979*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.02, 0, 2, 2, &finger_states[4]),
3980*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.03, 0, 2, 2, &finger_states[6]),
3981*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.04, 0, 2, 2, &finger_states[8]),
3982*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.05, 0, 2, 2, &finger_states[10]),
3983*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.06, 0, 2, 2, &finger_states[12]),
3984*aed3e508SAndroid Build Coastguard Worker make_hwstate(1.07, 0, 2, 2, &finger_states[14]),
3985*aed3e508SAndroid Build Coastguard Worker };
3986*aed3e508SAndroid Build Coastguard Worker
3987*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
3988*aed3e508SAndroid Build Coastguard Worker
3989*aed3e508SAndroid Build Coastguard Worker ii.scroll_manager_.fling_buffer_depth_.val_ = 6;
3990*aed3e508SAndroid Build Coastguard Worker size_t fling_buffer_depth =
3991*aed3e508SAndroid Build Coastguard Worker (size_t)ii.scroll_manager_.fling_buffer_depth_.val_;
3992*aed3e508SAndroid Build Coastguard Worker
3993*aed3e508SAndroid Build Coastguard Worker // The unittest is only meaningful if there are enough hwstates
3994*aed3e508SAndroid Build Coastguard Worker ASSERT_GT(arraysize(hardware_states) - 1, fling_buffer_depth)
3995*aed3e508SAndroid Build Coastguard Worker << "Hardware state list must be > fling buffer depth + 1";
3996*aed3e508SAndroid Build Coastguard Worker
3997*aed3e508SAndroid Build Coastguard Worker // Fill scroll buffer with a set of scrolls
3998*aed3e508SAndroid Build Coastguard Worker ii.scroll_buffer_.Clear();
3999*aed3e508SAndroid Build Coastguard Worker const HardwareState* prev_hs = nullptr;
4000*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(hardware_states); ++idx) {
4001*aed3e508SAndroid Build Coastguard Worker const HardwareState* hs = &hardware_states[idx];
4002*aed3e508SAndroid Build Coastguard Worker if (prev_hs != nullptr) {
4003*aed3e508SAndroid Build Coastguard Worker // Cheating here, only using first finger to compute scroll
4004*aed3e508SAndroid Build Coastguard Worker const FingerState* fs = &hs->fingers[0];
4005*aed3e508SAndroid Build Coastguard Worker const FingerState* prev_fs = prev_hs->GetFingerState(fs->tracking_id);
4006*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(nullptr, prev_fs);
4007*aed3e508SAndroid Build Coastguard Worker float dx = fs->position_x - prev_fs->position_x;
4008*aed3e508SAndroid Build Coastguard Worker float dy = fs->position_y - prev_fs->position_y;
4009*aed3e508SAndroid Build Coastguard Worker float dt = hs->timestamp - prev_hs->timestamp;
4010*aed3e508SAndroid Build Coastguard Worker ii.scroll_buffer_.Insert(dx, dy, hs->timestamp, prev_hs->timestamp);
4011*aed3e508SAndroid Build Coastguard Worker // Enforce assumption that all scrolls are positive in Y only
4012*aed3e508SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(dx, 0);
4013*aed3e508SAndroid Build Coastguard Worker EXPECT_GT(dy, 0);
4014*aed3e508SAndroid Build Coastguard Worker EXPECT_GT(dt, 0);
4015*aed3e508SAndroid Build Coastguard Worker size_t expected_fling_events = std::min(idx, fling_buffer_depth);
4016*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(ii.scroll_manager_.ScrollEventsForFlingCount(ii.scroll_buffer_),
4017*aed3e508SAndroid Build Coastguard Worker expected_fling_events);
4018*aed3e508SAndroid Build Coastguard Worker }
4019*aed3e508SAndroid Build Coastguard Worker prev_hs = hs;
4020*aed3e508SAndroid Build Coastguard Worker }
4021*aed3e508SAndroid Build Coastguard Worker }
4022*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ScrollResetTapTest)4023*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ScrollResetTapTest) {
4024*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
4025*aed3e508SAndroid Build Coastguard Worker
4026*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
4027*aed3e508SAndroid Build Coastguard Worker .right = 96.085106,
4028*aed3e508SAndroid Build Coastguard Worker .bottom = 57.492310,
4029*aed3e508SAndroid Build Coastguard Worker .res_x = 1,
4030*aed3e508SAndroid Build Coastguard Worker .res_y = 1,
4031*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
4032*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
4033*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
4034*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 3,
4035*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
4036*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 1,
4037*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
4038*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
4039*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
4040*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
4041*aed3e508SAndroid Build Coastguard Worker };
4042*aed3e508SAndroid Build Coastguard Worker
4043*aed3e508SAndroid Build Coastguard Worker FingerState finger_state[] = {
4044*aed3e508SAndroid Build Coastguard Worker // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
4045*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 71.180000, 0, 58.446808, 24.000002, 0, 3 }, // index 0
4046*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 71.180000, 0, 75.042549, 23.676924, 1, 3 },
4047*aed3e508SAndroid Build Coastguard Worker
4048*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 82.070000, 0, 55.276596, 23.492308, 0, 3 }, // index 2
4049*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 82.070000, 0, 70.361702, 23.015387, 1, 3 },
4050*aed3e508SAndroid Build Coastguard Worker
4051*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 76.625000, 0, 58.542553, 23.030769, 0, 3 }, // index 4
4052*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 76.625000, 0, 59.127659, 22.500002, 1, 1 },
4053*aed3e508SAndroid Build Coastguard Worker
4054*aed3e508SAndroid Build Coastguard Worker // prev_result will be scroll, we expect the tap state will be idle
4055*aed3e508SAndroid Build Coastguard Worker // after the sample is processed.
4056*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 71.180000, 0, 61.808510, 22.569231, 0, 3 }, // index 6
4057*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 71.180000, 0, 47.893616, 21.984617, 1, 1 },
4058*aed3e508SAndroid Build Coastguard Worker
4059*aed3e508SAndroid Build Coastguard Worker { 0, 0, 0, 0, 16.730000, 0, 57.617020, 20.830770, 0, 3 }, // index 8
4060*aed3e508SAndroid Build Coastguard Worker };
4061*aed3e508SAndroid Build Coastguard Worker
4062*aed3e508SAndroid Build Coastguard Worker HardwareState hardware_states[] = {
4063*aed3e508SAndroid Build Coastguard Worker // time, buttons down, finger count, touch count, finger states pointer
4064*aed3e508SAndroid Build Coastguard Worker make_hwstate(1296.498245, 0, 2, 2, &finger_state[0]),
4065*aed3e508SAndroid Build Coastguard Worker make_hwstate(1296.510735, 0, 2, 2, &finger_state[2]),
4066*aed3e508SAndroid Build Coastguard Worker make_hwstate(1296.523224, 0, 2, 2, &finger_state[4]),
4067*aed3e508SAndroid Build Coastguard Worker make_hwstate(1296.535753, 0, 2, 2, &finger_state[6]),
4068*aed3e508SAndroid Build Coastguard Worker make_hwstate(1296.548282, 0, 1, 1, &finger_state[8]),
4069*aed3e508SAndroid Build Coastguard Worker };
4070*aed3e508SAndroid Build Coastguard Worker
4071*aed3e508SAndroid Build Coastguard Worker // SemiMt-specific properties
4072*aed3e508SAndroid Build Coastguard Worker ii.tapping_finger_min_separation_.val_ = 0.0;
4073*aed3e508SAndroid Build Coastguard Worker
4074*aed3e508SAndroid Build Coastguard Worker ii.tap_enable_.val_ = 1;
4075*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
4076*aed3e508SAndroid Build Coastguard Worker
4077*aed3e508SAndroid Build Coastguard Worker for (size_t idx = 0; idx < arraysize(hardware_states); ++idx) {
4078*aed3e508SAndroid Build Coastguard Worker Gesture* gs = wrapper.SyncInterpret(hardware_states[idx], nullptr);
4079*aed3e508SAndroid Build Coastguard Worker if (gs != nullptr) {
4080*aed3e508SAndroid Build Coastguard Worker if (idx == 2)
4081*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kGestureTypeScroll, gs->type);
4082*aed3e508SAndroid Build Coastguard Worker else
4083*aed3e508SAndroid Build Coastguard Worker EXPECT_NE(kGestureTypeButtonsChange, gs->type);
4084*aed3e508SAndroid Build Coastguard Worker }
4085*aed3e508SAndroid Build Coastguard Worker if (idx >= 3)
4086*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(kIdl, ii.tap_to_click_state_);
4087*aed3e508SAndroid Build Coastguard Worker }
4088*aed3e508SAndroid Build Coastguard Worker }
4089*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,ZeroClickInitializationTest)4090*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, ZeroClickInitializationTest) {
4091*aed3e508SAndroid Build Coastguard Worker ImmediateInterpreter ii(nullptr, nullptr);
4092*aed3e508SAndroid Build Coastguard Worker
4093*aed3e508SAndroid Build Coastguard Worker HardwareProperties hwprops = {
4094*aed3e508SAndroid Build Coastguard Worker .right = 1000,
4095*aed3e508SAndroid Build Coastguard Worker .bottom = 1000,
4096*aed3e508SAndroid Build Coastguard Worker .res_x = 500,
4097*aed3e508SAndroid Build Coastguard Worker .res_y = 500,
4098*aed3e508SAndroid Build Coastguard Worker .orientation_minimum = -1,
4099*aed3e508SAndroid Build Coastguard Worker .orientation_maximum = 2,
4100*aed3e508SAndroid Build Coastguard Worker .max_finger_cnt = 2,
4101*aed3e508SAndroid Build Coastguard Worker .max_touch_cnt = 5,
4102*aed3e508SAndroid Build Coastguard Worker .supports_t5r2 = 0,
4103*aed3e508SAndroid Build Coastguard Worker .support_semi_mt = 0,
4104*aed3e508SAndroid Build Coastguard Worker .is_button_pad = 1,
4105*aed3e508SAndroid Build Coastguard Worker .has_wheel = 0,
4106*aed3e508SAndroid Build Coastguard Worker .wheel_is_hi_res = 0,
4107*aed3e508SAndroid Build Coastguard Worker .is_haptic_pad = 0,
4108*aed3e508SAndroid Build Coastguard Worker };
4109*aed3e508SAndroid Build Coastguard Worker TestInterpreterWrapper wrapper(&ii, &hwprops);
4110*aed3e508SAndroid Build Coastguard Worker
4111*aed3e508SAndroid Build Coastguard Worker // Test touchpad with intergrated button switch.
4112*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(0, ii.zero_finger_click_enable_.val_);
4113*aed3e508SAndroid Build Coastguard Worker // Test touchpad with separate buttons.
4114*aed3e508SAndroid Build Coastguard Worker hwprops.is_button_pad = 0;
4115*aed3e508SAndroid Build Coastguard Worker wrapper.Reset(&ii, &hwprops);
4116*aed3e508SAndroid Build Coastguard Worker EXPECT_EQ(1, ii.zero_finger_click_enable_.val_);
4117*aed3e508SAndroid Build Coastguard Worker }
4118*aed3e508SAndroid Build Coastguard Worker
TEST(ImmediateInterpreterTest,PointTest)4119*aed3e508SAndroid Build Coastguard Worker TEST(ImmediateInterpreterTest, PointTest) {
4120*aed3e508SAndroid Build Coastguard Worker Point point;
4121*aed3e508SAndroid Build Coastguard Worker Point point_eq;
4122*aed3e508SAndroid Build Coastguard Worker Point point_ne0(42.0, 0.0);
4123*aed3e508SAndroid Build Coastguard Worker Point point_ne1(0.0, 42.0);
4124*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(point == point_eq);
4125*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(point == point_ne0);
4126*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(point == point_ne1);
4127*aed3e508SAndroid Build Coastguard Worker EXPECT_FALSE(point != point_eq);
4128*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(point != point_ne0);
4129*aed3e508SAndroid Build Coastguard Worker EXPECT_TRUE(point != point_ne1);
4130*aed3e508SAndroid Build Coastguard Worker }
4131*aed3e508SAndroid Build Coastguard Worker
4132*aed3e508SAndroid Build Coastguard Worker } // namespace gestures
4133