• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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