• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2011 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <deque>
6 #include <math.h>
7 #include <utility>
8 #include <vector>
9 
10 #include <gtest/gtest.h>
11 
12 #include "include/accel_filter_interpreter.h"
13 #include "include/gestures.h"
14 #include "include/macros.h"
15 #include "include/unittest_util.h"
16 #include "include/util.h"
17 
18 using std::deque;
19 using std::make_pair;
20 using std::pair;
21 using std::vector;
22 
23 namespace gestures {
24 
25 class AccelFilterInterpreterTest : public ::testing::Test {};
26 
27 class AccelFilterInterpreterTestInterpreter : public Interpreter {
28  public:
AccelFilterInterpreterTestInterpreter()29   AccelFilterInterpreterTestInterpreter() : Interpreter(NULL, NULL, false) {}
30 
SyncInterpret(HardwareState * hwstate,stime_t * timeout)31   virtual void SyncInterpret(HardwareState* hwstate, stime_t* timeout) {
32     if (return_values_.empty())
33       return;
34     return_value_ = return_values_.front();
35     return_values_.pop_front();
36     if (return_value_.type == kGestureTypeNull)
37       return;
38     ProduceGesture(return_value_);
39   }
40 
HandleTimer(stime_t now,stime_t * timeout)41   virtual void HandleTimer(stime_t now, stime_t* timeout) {
42     return SyncInterpret(NULL, NULL);
43   }
44 
45   Gesture return_value_;
46   deque<Gesture> return_values_;
47 };
48 
TEST(AccelFilterInterpreterTest,SimpleTest)49 TEST(AccelFilterInterpreterTest, SimpleTest) {
50   AccelFilterInterpreterTestInterpreter* base_interpreter =
51       new AccelFilterInterpreterTestInterpreter;
52   AccelFilterInterpreter accel_interpreter(NULL, base_interpreter, NULL);
53   TestInterpreterWrapper interpreter(&accel_interpreter);
54 
55   accel_interpreter.scroll_x_out_scale_.val_ =
56       accel_interpreter.scroll_y_out_scale_.val_ = 1.0;
57 
58   float last_move_dx = 0.0;
59   float last_move_dy = 0.0;
60   float last_scroll_dx = 0.0;
61   float last_scroll_dy = 0.0;
62   float last_fling_vx = 0.0;
63   float last_fling_vy = 0.0;
64 
65   for (int i = 1; i <= 5; ++i) {
66     accel_interpreter.pointer_sensitivity_.val_ = i;
67     accel_interpreter.scroll_sensitivity_.val_ = i;
68 
69     base_interpreter->return_values_.push_back(Gesture());  // Null type
70     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
71                                                        1,  // start time
72                                                        1.001,  // end time
73                                                        -4,  // dx
74                                                        2.8));  // dy
75     base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
76                                                        2,  // start time
77                                                        2.1,  // end time
78                                                        4.1,  // dx
79                                                        -10.3));  // dy
80     base_interpreter->return_values_.push_back(Gesture(kGestureFling,
81                                                        3,  // start time
82                                                        3.1,  // end time
83                                                        100.1,  // vx
84                                                        -10.3,  // vy
85                                                        0));  // state
86 
87     Gesture* out = interpreter.SyncInterpret(NULL, NULL);
88     ASSERT_EQ(reinterpret_cast<Gesture*>(NULL), out);
89     out = interpreter.SyncInterpret(NULL, NULL);
90     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
91     EXPECT_EQ(kGestureTypeMove, out->type);
92     if (i == 1) {
93       // Expect no acceleration
94       EXPECT_FLOAT_EQ(-4.0, out->details.move.dx) << "i = " << i;
95       EXPECT_FLOAT_EQ(2.8, out->details.move.dy);
96     } else {
97       // Expect increasing acceleration
98       EXPECT_GT(fabsf(out->details.move.dx), fabsf(last_move_dx));
99       EXPECT_GT(fabsf(out->details.move.dy), fabsf(last_move_dy));
100     }
101     last_move_dx = out->details.move.dx;
102     last_move_dy = out->details.move.dy;
103 
104     out = interpreter.SyncInterpret(NULL, NULL);
105     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
106     EXPECT_EQ(kGestureTypeScroll, out->type);
107     if (i == 1) {
108       // Expect no acceleration
109       EXPECT_FLOAT_EQ(4.1, out->details.scroll.dx);
110       EXPECT_FLOAT_EQ(-10.3, out->details.scroll.dy);
111     } else if (i > 2) {
112       // Expect increasing acceleration
113       EXPECT_GT(fabsf(out->details.scroll.dx), fabsf(last_scroll_dx));
114       EXPECT_GT(fabsf(out->details.scroll.dy), fabsf(last_scroll_dy));
115     }
116     last_scroll_dx = out->details.scroll.dx;
117     last_scroll_dy = out->details.scroll.dy;
118     out = interpreter.SyncInterpret(NULL, NULL);
119     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
120     EXPECT_EQ(kGestureTypeFling, out->type);
121     if (i == 1) {
122       // Expect no acceleration
123       EXPECT_FLOAT_EQ(100.1, out->details.fling.vx);
124       EXPECT_FLOAT_EQ(-10.3, out->details.fling.vy);
125     } else if (i > 2) {
126       // Expect increasing acceleration
127       EXPECT_GT(fabsf(out->details.fling.vx), fabsf(last_fling_vx));
128       EXPECT_GT(fabsf(out->details.fling.vy), fabsf(last_fling_vy));
129     }
130     last_fling_vx = out->details.fling.vx;
131     last_fling_vy = out->details.fling.vy;
132   }
133 }
134 
TEST(AccelFilterInterpreterTest,TinyMoveTest)135 TEST(AccelFilterInterpreterTest, TinyMoveTest) {
136   AccelFilterInterpreterTestInterpreter* base_interpreter =
137       new AccelFilterInterpreterTestInterpreter;
138   AccelFilterInterpreter accel_interpreter(NULL, base_interpreter, NULL);
139   TestInterpreterWrapper interpreter(&accel_interpreter);
140   accel_interpreter.scroll_x_out_scale_.val_ =
141       accel_interpreter.scroll_y_out_scale_.val_ = 1.0;
142 
143   base_interpreter->return_values_.push_back(Gesture(kGestureMove,
144                                                      1,  // start time
145                                                      2,  // end time
146                                                      4,  // dx
147                                                      0));  // dy
148   base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
149                                                      2,  // start time
150                                                      3,  // end time
151                                                      4,  // dx
152                                                      0));  // dy
153   base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
154                                                      2,  // start time
155                                                      3,  // end time
156                                                      4,  // dx
157                                                      0));  // dy
158 
159   Gesture* out = interpreter.SyncInterpret(NULL, NULL);
160   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
161   EXPECT_EQ(kGestureTypeMove, out->type);
162   EXPECT_GT(fabsf(out->details.move.dx), 2);
163   out = interpreter.SyncInterpret(NULL, NULL);
164   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
165   EXPECT_EQ(kGestureTypeScroll, out->type);
166   EXPECT_GT(fabsf(out->details.scroll.dx), 2);
167   float orig_x_scroll = out->details.scroll.dx;
168   accel_interpreter.scroll_x_out_scale_.val_ = 2.0;
169   out = interpreter.SyncInterpret(NULL, NULL);
170   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
171   EXPECT_EQ(kGestureTypeScroll, out->type);
172   EXPECT_FLOAT_EQ(orig_x_scroll * accel_interpreter.scroll_x_out_scale_.val_,
173                   out->details.scroll.dx);
174 }
175 
TEST(AccelFilterInterpreterTest,TimingTest)176 TEST(AccelFilterInterpreterTest, TimingTest) {
177   AccelFilterInterpreterTestInterpreter* base_interpreter =
178       new AccelFilterInterpreterTestInterpreter;
179   AccelFilterInterpreter accel_interpreter(NULL, base_interpreter, NULL);
180   TestInterpreterWrapper interpreter(&accel_interpreter);
181   accel_interpreter.scroll_x_out_scale_.val_ =
182       accel_interpreter.scroll_y_out_scale_.val_ = 1.0;
183   accel_interpreter.min_reasonable_dt_.val_ = 0.0;
184   accel_interpreter.max_reasonable_dt_.val_ = INFINITY;
185 
186   accel_interpreter.pointer_sensitivity_.val_ = 3;  // standard sensitivity
187   accel_interpreter.scroll_sensitivity_.val_ = 3;  // standard sensitivity
188 
189   float last_dx = 0.0;
190   float last_dy = 0.0;
191 
192   base_interpreter->return_values_.push_back(Gesture());  // Null type
193   base_interpreter->return_values_.push_back(Gesture(kGestureMove,
194                                                      1,  // start time
195                                                      1.001,  // end time
196                                                      -4,  // dx
197                                                      2.8));  // dy
198   base_interpreter->return_values_.push_back(Gesture(kGestureMove,
199                                                      2,  // start time
200                                                      3,  // end time
201                                                      -4,  // dx
202                                                      2.8));  // dy
203   base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
204                                                      3,  // start time
205                                                      3.001,  // end time
206                                                      4.1,  // dx
207                                                      -10.3));  // dy
208   base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
209                                                      4,  // start time
210                                                      5,  // end time
211                                                      4.1,  // dx
212                                                      -10.3));  // dy
213 
214   Gesture* out = interpreter.SyncInterpret(NULL, NULL);
215   ASSERT_EQ(reinterpret_cast<Gesture*>(NULL), out);
216   out = interpreter.SyncInterpret(NULL, NULL);
217   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
218   EXPECT_EQ(kGestureTypeMove, out->type);
219   // Expect less accel for same movement over more time
220   last_dx = out->details.move.dx;
221   last_dy = out->details.move.dy;
222   out = interpreter.SyncInterpret(NULL, NULL);
223   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
224   EXPECT_EQ(kGestureTypeMove, out->type);
225   EXPECT_GT(fabsf(last_dx), fabsf(out->details.move.dx));
226   EXPECT_GT(fabsf(last_dy), fabsf(out->details.move.dy));
227 
228 
229   out = interpreter.SyncInterpret(NULL, NULL);
230   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
231   EXPECT_EQ(kGestureTypeScroll, out->type);
232   // Expect less accel for same movement over more time
233   last_dx = out->details.scroll.dx;
234   last_dy = out->details.scroll.dy;
235   out = interpreter.SyncInterpret(NULL, NULL);
236   ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out);
237   EXPECT_EQ(kGestureTypeScroll, out->type);
238   EXPECT_GT(fabsf(last_dx), fabsf(out->details.scroll.dx));
239   EXPECT_GT(fabsf(last_dy), fabsf(out->details.scroll.dy));
240 }
241 
TEST(AccelFilterInterpreterTest,CurveSegmentInitializerTest)242 TEST(AccelFilterInterpreterTest, CurveSegmentInitializerTest) {
243   AccelFilterInterpreter::CurveSegment temp1 =
244       AccelFilterInterpreter::CurveSegment(INFINITY, 0.0, 2.0, -2.0);
245   AccelFilterInterpreter::CurveSegment temp2 =
246       AccelFilterInterpreter::CurveSegment(temp1);
247 
248   ASSERT_EQ(temp1.x_, temp2.x_);
249 
250   temp1 = AccelFilterInterpreter::CurveSegment(0.0, 0.0, 0.0, 0.0);
251   ASSERT_NE(temp1.x_, temp2.x_);
252 }
253 
TEST(AccelFilterInterpreterTest,CustomAccelTest)254 TEST(AccelFilterInterpreterTest, CustomAccelTest) {
255   AccelFilterInterpreterTestInterpreter* base_interpreter =
256       new AccelFilterInterpreterTestInterpreter;
257   AccelFilterInterpreter accel_interpreter(NULL, base_interpreter, NULL);
258   TestInterpreterWrapper interpreter(&accel_interpreter);
259   accel_interpreter.scroll_x_out_scale_.val_ =
260       accel_interpreter.scroll_y_out_scale_.val_ = 1.0;
261   accel_interpreter.min_reasonable_dt_.val_ = 0.0;
262   accel_interpreter.max_reasonable_dt_.val_ = INFINITY;
263 
264   // custom sensitivity
265   accel_interpreter.use_custom_tp_point_curve_.val_ = 1;
266   accel_interpreter.use_custom_tp_scroll_curve_.val_ = 1;
267   accel_interpreter.tp_custom_point_[0] =
268       AccelFilterInterpreter::CurveSegment(2.0, 0.0, 0.5, 0.0);
269   accel_interpreter.tp_custom_point_[1] =
270       AccelFilterInterpreter::CurveSegment(3.0, 0.0, 2.0, -3.0);
271   accel_interpreter.tp_custom_point_[2] =
272       AccelFilterInterpreter::CurveSegment(INFINITY, 0.0, 0.0, 3.0);
273   accel_interpreter.tp_custom_scroll_[0] =
274       AccelFilterInterpreter::CurveSegment(0.5, 0.0, 2.0, 0.0);
275   accel_interpreter.tp_custom_scroll_[1] =
276       AccelFilterInterpreter::CurveSegment(1.0, 0.0, 2.0, 0.0);
277   accel_interpreter.tp_custom_scroll_[2] =
278       AccelFilterInterpreter::CurveSegment(2.0, 0.0, 0.0, 2.0);
279   accel_interpreter.tp_custom_scroll_[3] =
280       AccelFilterInterpreter::CurveSegment(INFINITY, 0.0, 2.0, -2.0);
281 
282   float move_in[]  = { 1.0, 2.5, 3.5, 5.0 };
283   float move_out[] = { 0.5, 2.0, 3.0, 3.0 };
284 
285   for (size_t i = 0; i < arraysize(move_in); ++i) {
286     float dist = move_in[i];
287     float expected = move_out[i];
288     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
289                                                        1,  // start time
290                                                        2,  // end time
291                                                        dist,  // dx
292                                                        0));  // dy
293     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
294                                                        1,  // start time
295                                                        2,  // end time
296                                                        0,  // dx
297                                                        dist));  // dy
298     // half time, half distance = same speed
299     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
300                                                        1,  // start time
301                                                        1.5,  // end time
302                                                        dist / 2.0,  // dx
303                                                        0));  // dy
304     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
305                                                        1,  // start time
306                                                        1.5,  // end time
307                                                        0,  // dx
308                                                        dist / 2.0));  // dy
309 
310     Gesture* out = interpreter.SyncInterpret(NULL, NULL);
311     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
312     EXPECT_EQ(kGestureTypeMove, out->type) << "i=" << i;
313     EXPECT_FLOAT_EQ(expected, out->details.move.dx) << "i=" << i;
314     EXPECT_FLOAT_EQ(0, out->details.move.dy) << "i=" << i;
315 
316     out = interpreter.SyncInterpret(NULL, NULL);
317     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
318     EXPECT_EQ(kGestureTypeMove, out->type) << "i=" << i;
319     EXPECT_FLOAT_EQ(0, out->details.move.dx) << "i=" << i;
320     EXPECT_FLOAT_EQ(expected, out->details.move.dy) << "i=" << i;
321 
322     out = interpreter.SyncInterpret(NULL, NULL);
323     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
324     EXPECT_EQ(kGestureTypeMove, out->type) << "i=" << i;
325     EXPECT_FLOAT_EQ(expected / 2.0, out->details.move.dx) << "i=" << i;
326     EXPECT_FLOAT_EQ(0, out->details.move.dy) << "i=" << i;
327 
328     out = interpreter.SyncInterpret(NULL, NULL);
329     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
330     EXPECT_EQ(kGestureTypeMove, out->type) << "i=" << i;
331     EXPECT_FLOAT_EQ(0, out->details.move.dx) << "i=" << i;
332     EXPECT_FLOAT_EQ(expected / 2.0, out->details.move.dy) << "i=" << i;
333   }
334 
335   float swipe_in[]  = { 1.0, 2.5, 3.5, 5.0 };
336   float swipe_out[] = { 0.5, 2.0, 3.0, 3.0 };
337 
338   for (size_t i = 0; i < arraysize(swipe_in); ++i) {
339     float dist = swipe_in[i];
340     float expected = swipe_out[i];
341     base_interpreter->return_values_.push_back(Gesture(kGestureSwipe,
342                                                        1,  // start time
343                                                        2,  // end time
344                                                        dist,  // dx
345                                                        0));  // dy
346     base_interpreter->return_values_.push_back(Gesture(kGestureSwipe,
347                                                        1,  // start time
348                                                        2,  // end time
349                                                        0,  // dx
350                                                        dist));  // dy
351     // half time, half distance = same speed
352     base_interpreter->return_values_.push_back(Gesture(kGestureSwipe,
353                                                        1,  // start time
354                                                        1.5,  // end time
355                                                        dist / 2.0,  // dx
356                                                        0));  // dy
357     base_interpreter->return_values_.push_back(Gesture(kGestureSwipe,
358                                                        1,  // start time
359                                                        1.5,  // end time
360                                                        0,  // dx
361                                                        dist / 2.0));  // dy
362 
363     Gesture* out = interpreter.SyncInterpret(NULL, NULL);
364     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
365     EXPECT_EQ(kGestureTypeSwipe, out->type) << "i=" << i;
366     EXPECT_FLOAT_EQ(expected, out->details.move.dx) << "i=" << i;
367     EXPECT_FLOAT_EQ(0, out->details.move.dy) << "i=" << i;
368 
369     out = interpreter.SyncInterpret(NULL, NULL);
370     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
371     EXPECT_EQ(kGestureTypeSwipe, out->type) << "i=" << i;
372     EXPECT_FLOAT_EQ(0, out->details.move.dx) << "i=" << i;
373     EXPECT_FLOAT_EQ(expected, out->details.move.dy) << "i=" << i;
374 
375     out = interpreter.SyncInterpret(NULL, NULL);
376     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
377     EXPECT_EQ(kGestureTypeSwipe, out->type) << "i=" << i;
378     EXPECT_FLOAT_EQ(expected / 2.0, out->details.move.dx) << "i=" << i;
379     EXPECT_FLOAT_EQ(0, out->details.move.dy) << "i=" << i;
380 
381     out = interpreter.SyncInterpret(NULL, NULL);
382     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
383     EXPECT_EQ(kGestureTypeSwipe, out->type) << "i=" << i;
384     EXPECT_FLOAT_EQ(0, out->details.move.dx) << "i=" << i;
385     EXPECT_FLOAT_EQ(expected / 2.0, out->details.move.dy) << "i=" << i;
386   }
387 
388   float swipe4_in[]  = { 1.0, 2.5, 3.5, 5.0 };
389   float swipe4_out[] = { 0.5, 2.0, 3.0, 3.0 };
390 
391   for (size_t i = 0; i < arraysize(swipe4_in); ++i) {
392     float dist = swipe4_in[i];
393     float expected = swipe4_out[i];
394     base_interpreter->return_values_.push_back(Gesture(kGestureFourFingerSwipe,
395                                                        1,  // start time
396                                                        2,  // end time
397                                                        dist,  // dx
398                                                        0));  // dy
399     base_interpreter->return_values_.push_back(Gesture(kGestureFourFingerSwipe,
400                                                        1,  // start time
401                                                        2,  // end time
402                                                        0,  // dx
403                                                        dist));  // dy
404     // half time, half distance = same speed
405     base_interpreter->return_values_.push_back(Gesture(kGestureFourFingerSwipe,
406                                                        1,  // start time
407                                                        1.5,  // end time
408                                                        dist / 2.0,  // dx
409                                                        0));  // dy
410     base_interpreter->return_values_.push_back(Gesture(kGestureFourFingerSwipe,
411                                                        1,  // start time
412                                                        1.5,  // end time
413                                                        0,  // dx
414                                                        dist / 2.0));  // dy
415 
416     Gesture* out = interpreter.SyncInterpret(NULL, NULL);
417     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
418     EXPECT_EQ(kGestureTypeFourFingerSwipe, out->type) << "i=" << i;
419     EXPECT_FLOAT_EQ(expected, out->details.move.dx) << "i=" << i;
420     EXPECT_FLOAT_EQ(0, out->details.move.dy) << "i=" << i;
421 
422     out = interpreter.SyncInterpret(NULL, NULL);
423     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
424     EXPECT_EQ(kGestureTypeFourFingerSwipe, out->type) << "i=" << i;
425     EXPECT_FLOAT_EQ(0, out->details.move.dx) << "i=" << i;
426     EXPECT_FLOAT_EQ(expected, out->details.move.dy) << "i=" << i;
427 
428     out = interpreter.SyncInterpret(NULL, NULL);
429     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
430     EXPECT_EQ(kGestureTypeFourFingerSwipe, out->type) << "i=" << i;
431     EXPECT_FLOAT_EQ(expected / 2.0, out->details.move.dx) << "i=" << i;
432     EXPECT_FLOAT_EQ(0, out->details.move.dy) << "i=" << i;
433 
434     out = interpreter.SyncInterpret(NULL, NULL);
435     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
436     EXPECT_EQ(kGestureTypeFourFingerSwipe, out->type) << "i=" << i;
437     EXPECT_FLOAT_EQ(0, out->details.move.dx) << "i=" << i;
438     EXPECT_FLOAT_EQ(expected / 2.0, out->details.move.dy) << "i=" << i;
439   }
440 
441   float scroll_in[]  = { 0.25, 0.5, 0.75, 1.5, 2.5, 3.0, 3.5 };
442   float scroll_out[] = { 0.5,  1.0, 1.5,  2.0, 3.0, 4.0, 5.0 };
443 
444   for (size_t i = 0; i < arraysize(scroll_in); ++i) {
445     float dist = scroll_in[i];
446     float expected = scroll_out[i];
447     base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
448                                                        1,  // start time
449                                                        2,  // end time
450                                                        dist,  // dx
451                                                        0));  // dy
452     base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
453                                                        1,  // start time
454                                                        2,  // end time
455                                                        0,  // dx
456                                                        dist));  // dy
457     // half time, half distance = same speed
458     base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
459                                                        1,  // start time
460                                                        1.5,  // end time
461                                                        dist / 2.0,  // dx
462                                                        0));  // dy
463     base_interpreter->return_values_.push_back(Gesture(kGestureScroll,
464                                                        1,  // start time
465                                                        1.5,  // end time
466                                                        0,  // dx
467                                                        dist / 2.0));  // dy
468 
469     Gesture* out = interpreter.SyncInterpret(NULL, NULL);
470     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
471     EXPECT_EQ(kGestureTypeScroll, out->type) << "i=" << i;
472     EXPECT_FLOAT_EQ(expected, out->details.scroll.dx) << "i=" << i;
473     EXPECT_FLOAT_EQ(0, out->details.scroll.dy) << "i=" << i;
474 
475     out = interpreter.SyncInterpret(NULL, NULL);
476     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
477     EXPECT_EQ(kGestureTypeScroll, out->type) << "i=" << i;
478     EXPECT_FLOAT_EQ(0, out->details.scroll.dx) << "i=" << i;
479     EXPECT_FLOAT_EQ(expected, out->details.scroll.dy) << "i=" << i;
480 
481     out = interpreter.SyncInterpret(NULL, NULL);
482     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
483     EXPECT_EQ(kGestureTypeScroll, out->type) << "i=" << i;
484     EXPECT_FLOAT_EQ(expected / 2.0, out->details.scroll.dx) << "i=" << i;
485     EXPECT_FLOAT_EQ(0, out->details.scroll.dy) << "i=" << i;
486 
487     out = interpreter.SyncInterpret(NULL, NULL);
488     ASSERT_NE(reinterpret_cast<Gesture*>(NULL), out) << "i=" << i;
489     EXPECT_EQ(kGestureTypeScroll, out->type) << "i=" << i;
490     EXPECT_FLOAT_EQ(0, out->details.scroll.dx) << "i=" << i;
491     EXPECT_FLOAT_EQ(expected / 2.0, out->details.scroll.dy) << "i=" << i;
492   }
493 }
494 
TEST(AccelFilterInterpreterTest,UnacceleratedMouseTest)495 TEST(AccelFilterInterpreterTest, UnacceleratedMouseTest) {
496   AccelFilterInterpreterTestInterpreter* base_interpreter =
497       new AccelFilterInterpreterTestInterpreter;
498   AccelFilterInterpreter accel_interpreter(NULL, base_interpreter, NULL);
499   TestInterpreterWrapper interpreter(&accel_interpreter);
500 
501   accel_interpreter.use_mouse_point_curves_.val_ = true;
502   accel_interpreter.pointer_acceleration_.val_ = false;
503 
504   const float dx = 3;
505   const float dy = 5;
506   const float unaccel_slopes[] = { 2.0, 4.0, 8.0, 16.0, 24.0 };
507 
508   for (int i = 1; i <= 5; ++i) {
509     accel_interpreter.pointer_sensitivity_.val_ = i;
510 
511     base_interpreter->return_values_.push_back(Gesture());  // Null type
512     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
513                                                        1,  // start time
514                                                        1.001,  // end time
515                                                        dx,  // dx
516                                                        dy));  // dy
517 
518     Gesture* out = interpreter.SyncInterpret(nullptr, nullptr);
519     ASSERT_EQ(nullptr, out);
520     out = interpreter.SyncInterpret(nullptr, nullptr);
521     ASSERT_NE(nullptr, out);
522     EXPECT_EQ(kGestureTypeMove, out->type);
523 
524     // Output should be scaled by a constant value.
525     EXPECT_FLOAT_EQ(dx * unaccel_slopes[i - 1], out->details.move.dx);
526     EXPECT_FLOAT_EQ(dy * unaccel_slopes[i - 1], out->details.move.dy);
527   }
528 }
529 
TEST(AccelFilterInterpreterTest,UnacceleratedTouchpadTest)530 TEST(AccelFilterInterpreterTest, UnacceleratedTouchpadTest) {
531   AccelFilterInterpreterTestInterpreter* base_interpreter =
532       new AccelFilterInterpreterTestInterpreter;
533   AccelFilterInterpreter accel_interpreter(NULL, base_interpreter, NULL);
534   TestInterpreterWrapper interpreter(&accel_interpreter);
535 
536   accel_interpreter.use_mouse_point_curves_.val_ = false;
537   accel_interpreter.pointer_acceleration_.val_ = false;
538 
539   const float dx = 3;
540   const float dy = 5;
541   const float unaccel_slopes[] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
542 
543   for (int i = 1; i <= 5; ++i) {
544     accel_interpreter.pointer_sensitivity_.val_ = i;
545 
546     base_interpreter->return_values_.push_back(Gesture());  // Null type
547     base_interpreter->return_values_.push_back(Gesture(kGestureMove,
548                                                        1,  // start time
549                                                        1.001,  // end time
550                                                        dx,  // dx
551                                                        dy));  // dy
552 
553     Gesture* out = interpreter.SyncInterpret(nullptr, nullptr);
554     ASSERT_EQ(nullptr, out);
555     out = interpreter.SyncInterpret(nullptr, nullptr);
556     ASSERT_NE(nullptr, out);
557     EXPECT_EQ(kGestureTypeMove, out->type);
558 
559     // Output should be scaled by a constant value.
560     EXPECT_FLOAT_EQ(dx * unaccel_slopes[i - 1], out->details.move.dx);
561     EXPECT_FLOAT_EQ(dy * unaccel_slopes[i - 1], out->details.move.dy);
562   }
563 }
564 
565 }  // namespace gestures
566