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