1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
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 "base/basictypes.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7 #include "ui/events/gestures/velocity_calculator.h"
8
9 namespace ui {
10 namespace test {
11
12 namespace {
13
AddPoints(VelocityCalculator * velocity_calculator,float x_increment,float y_increment,float time_increment_seconds,int num_points)14 static void AddPoints(VelocityCalculator* velocity_calculator,
15 float x_increment,
16 float y_increment,
17 float time_increment_seconds,
18 int num_points) {
19 float x = 0;
20 float y = 0;
21 double time = 0;
22
23 for (int i = 0; i < num_points; ++i) {
24 velocity_calculator->PointSeen(x, y, time);
25 x += x_increment;
26 y += y_increment;
27 time += time_increment_seconds * 1000000;
28 }
29 }
30
31 } // namespace
32
33 // Test that the velocity returned is reasonable
TEST(VelocityCalculatorTest,ReturnsReasonableVelocity)34 TEST(VelocityCalculatorTest, ReturnsReasonableVelocity) {
35 VelocityCalculator velocity_calculator(5);
36 AddPoints(&velocity_calculator, 10, -10, 1, 7);
37
38 EXPECT_GT(velocity_calculator.XVelocity(), 9.9);
39 EXPECT_LT(velocity_calculator.XVelocity(), 10.1);
40 EXPECT_GT(velocity_calculator.YVelocity(), -10.1);
41 EXPECT_LT(velocity_calculator.YVelocity(), -9.9);
42
43 velocity_calculator.PointSeen(9, -11, 5500000);
44 velocity_calculator.PointSeen(21, -19, 6000000);
45 velocity_calculator.PointSeen(30, -32, 6500000);
46 velocity_calculator.PointSeen(38, -40, 7000000);
47 velocity_calculator.PointSeen(50, -51, 7500000);
48
49 EXPECT_GT(velocity_calculator.XVelocity(), 19);
50 EXPECT_LT(velocity_calculator.XVelocity(), 21);
51 EXPECT_GT(velocity_calculator.YVelocity(), -21);
52 EXPECT_LT(velocity_calculator.YVelocity(), -19);
53
54 // Significantly larger difference in position
55 velocity_calculator.PointSeen(70, -70, 8000000);
56
57 EXPECT_GT(velocity_calculator.XVelocity(), 20);
58 EXPECT_LT(velocity_calculator.XVelocity(), 25);
59 EXPECT_GT(velocity_calculator.YVelocity(), -25);
60 EXPECT_LT(velocity_calculator.YVelocity(), -20);
61 }
62
TEST(VelocityCalculatorTest,IsAccurateWithLargeTimes)63 TEST(VelocityCalculatorTest, IsAccurateWithLargeTimes) {
64 VelocityCalculator velocity_calculator(5);
65 int64 start_time = 0;
66 velocity_calculator.PointSeen(9, -11, start_time);
67 velocity_calculator.PointSeen(21, -19, start_time + 8);
68 velocity_calculator.PointSeen(30, -32, start_time + 16);
69 velocity_calculator.PointSeen(38, -40, start_time + 24);
70 velocity_calculator.PointSeen(50, -51, start_time + 32);
71
72 EXPECT_GT(velocity_calculator.XVelocity(), 1230000);
73 EXPECT_LT(velocity_calculator.XVelocity(), 1260000);
74 EXPECT_GT(velocity_calculator.YVelocity(), -1270000);
75 EXPECT_LT(velocity_calculator.YVelocity(), -1240000);
76
77 start_time = GG_LONGLONG(1223372036800000000);
78 velocity_calculator.PointSeen(9, -11, start_time);
79 velocity_calculator.PointSeen(21, -19, start_time + 8);
80 velocity_calculator.PointSeen(30, -32, start_time + 16);
81 velocity_calculator.PointSeen(38, -40, start_time + 24);
82 velocity_calculator.PointSeen(50, -51, start_time + 32);
83
84 EXPECT_GT(velocity_calculator.XVelocity(), 1230000);
85 EXPECT_LT(velocity_calculator.XVelocity(), 1260000);
86 EXPECT_GT(velocity_calculator.YVelocity(), -1270000);
87 EXPECT_LT(velocity_calculator.YVelocity(), -124000);
88 }
89
90 // Check that the right values are returned for insufficient data.
TEST(VelocityCalculatorTest,RequiresEnoughData)91 TEST(VelocityCalculatorTest, RequiresEnoughData) {
92 VelocityCalculator velocity_calculator(3);
93 int64 start_time = 0;
94
95 // Zero points is zero velocity.
96 EXPECT_EQ(velocity_calculator.XVelocity(), 0);
97 EXPECT_EQ(velocity_calculator.YVelocity(), 0);
98
99 // 1point is still zero velocity.
100 velocity_calculator.PointSeen(10, 10, start_time);
101 EXPECT_EQ(velocity_calculator.XVelocity(), 0);
102 EXPECT_EQ(velocity_calculator.YVelocity(), 0);
103
104 // 2 points has non-zero velocity.
105 velocity_calculator.PointSeen(20, 20, start_time + 5);
106 EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 1923077.f);
107 EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 1923077.f);
108
109 velocity_calculator.PointSeen(30, 30, start_time + 10);
110 velocity_calculator.PointSeen(40, 40, start_time + 15);
111 EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 2000000.f);
112 EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 2000000.f);
113
114 velocity_calculator.PointSeen(50, 50, start_time + 20);
115 EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 2000000.f);
116 EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 2000000.f);
117 }
118
119 // Ensures ClearHistory behaves correctly
TEST(VelocityCalculatorTest,ClearsHistory)120 TEST(VelocityCalculatorTest, ClearsHistory) {
121 VelocityCalculator velocity_calculator(5);
122 AddPoints(&velocity_calculator, 10, -10, 1, 7);
123
124 EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 10.f);
125 EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), -10.f);
126
127 velocity_calculator.ClearHistory();
128
129 EXPECT_EQ(velocity_calculator.XVelocity(), 0);
130 EXPECT_EQ(velocity_calculator.YVelocity(), 0);
131 }
132
133 // Ensure data older than the buffer size is ignored
TEST(VelocityCalculatorTest,IgnoresOldData)134 TEST(VelocityCalculatorTest, IgnoresOldData) {
135 VelocityCalculator velocity_calculator(5);
136 AddPoints(&velocity_calculator, 10, -10, 1, 7);
137
138 EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 10.f);
139 EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), -10.f);
140
141 AddPoints(&velocity_calculator, 0, 0, 1, 5);
142
143 EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 0);
144 EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 0);
145 }
146
147 } // namespace test
148 } // namespace ui
149