Index: ui/aura/gestures/velocity_calculator_unittest.cc |
diff --git a/ui/aura/gestures/velocity_calculator_unittest.cc b/ui/aura/gestures/velocity_calculator_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..26bad465c80a53f6a8e50582f13abba6600ef42b |
--- /dev/null |
+++ b/ui/aura/gestures/velocity_calculator_unittest.cc |
@@ -0,0 +1,146 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/basictypes.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/aura/gestures/velocity_calculator.h" |
+#include "ui/aura/test/aura_test_base.h" |
+ |
+namespace aura { |
+namespace test { |
+ |
+namespace { |
+ |
+static void AddPoints(VelocityCalculator* velocity_calculator, |
+ float x_increment, |
+ float y_increment, |
+ float time_increment_seconds, |
+ int num_points) { |
+ float x = 0; |
+ float y = 0; |
+ double time = 0; |
+ |
+ for (int i = 0; i < num_points; ++i) { |
+ velocity_calculator->PointSeen(x, y, time); |
+ x += x_increment; |
+ y += y_increment; |
+ time += time_increment_seconds * 1000000; |
+ } |
+} |
+ |
+} // namespace |
+ |
+typedef AuraTestBase VelocityCalculatorTest; |
+ |
+// Test that the velocity returned is reasonable |
+TEST_F(VelocityCalculatorTest, ReturnsReasonableVelocity) { |
+ VelocityCalculator velocity_calculator(5); |
+ AddPoints(&velocity_calculator, 10, -10, 1, 7); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 9.9); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 10.1); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -10.1); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -9.9); |
+ |
+ velocity_calculator.PointSeen(9, -11, 5500000); |
+ velocity_calculator.PointSeen(21, -19, 6000000); |
+ velocity_calculator.PointSeen(30, -32, 6500000); |
+ velocity_calculator.PointSeen(38, -40, 7000000); |
+ velocity_calculator.PointSeen(50, -51, 7500000); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 19); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 21); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -21); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -19); |
+ |
+ // Significantly larger difference in position |
+ velocity_calculator.PointSeen(70, -70, 8000000); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 20); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 25); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -25); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -20); |
+} |
+ |
+TEST_F(VelocityCalculatorTest, IsAccurateWithLargeTimes) { |
+ VelocityCalculator velocity_calculator(5); |
+ int64 start_time = 0; |
+ velocity_calculator.PointSeen(9, -11, start_time); |
+ velocity_calculator.PointSeen(21, -19, start_time + 8); |
+ velocity_calculator.PointSeen(30, -32, start_time + 16); |
+ velocity_calculator.PointSeen(38, -40, start_time + 24); |
+ velocity_calculator.PointSeen(50, -51, start_time + 32); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 1230000); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 1260000); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -1270000); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -1240000); |
+ |
+ start_time = 1223372036800000000; |
+ velocity_calculator.PointSeen(9, -11, start_time); |
+ velocity_calculator.PointSeen(21, -19, start_time + 8); |
+ velocity_calculator.PointSeen(30, -32, start_time + 16); |
+ velocity_calculator.PointSeen(38, -40, start_time + 24); |
+ velocity_calculator.PointSeen(50, -51, start_time + 32); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 1230000); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 1260000); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -1270000); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -124000); |
+} |
+ |
+// Check that the velocity returned is 0 if the velocity calculator |
+// doesn't have enough data |
+TEST_F(VelocityCalculatorTest, RequiresEnoughData) { |
+ VelocityCalculator velocity_calculator(5); |
+ EXPECT_EQ(velocity_calculator.XVelocity(), 0); |
+ EXPECT_EQ(velocity_calculator.YVelocity(), 0); |
+ |
+ AddPoints(&velocity_calculator, 10, 10, 1, 4); |
+ |
+ // We've only seen 4 points, the buffer size is 5 |
+ // Since the buffer isn't full, return 0 |
+ EXPECT_EQ(velocity_calculator.XVelocity(), 0); |
+ EXPECT_EQ(velocity_calculator.YVelocity(), 0); |
+ |
+ AddPoints(&velocity_calculator, 10, 10, 1, 1); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 9.9); |
+ EXPECT_GT(velocity_calculator.YVelocity(), 9.9); |
+} |
+ |
+// Ensures ClearHistory behaves correctly |
+TEST_F(VelocityCalculatorTest, ClearsHistory) { |
+ VelocityCalculator velocity_calculator(5); |
+ AddPoints(&velocity_calculator, 10, -10, 1, 7); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 9.9); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 10.1); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -10.1); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -9.9); |
+ |
+ velocity_calculator.ClearHistory(); |
+ |
+ EXPECT_EQ(velocity_calculator.XVelocity(), 0); |
+ EXPECT_EQ(velocity_calculator.YVelocity(), 0); |
+} |
+ |
+// Ensure data older than the buffer size is ignored |
+TEST_F(VelocityCalculatorTest, IgnoresOldData) { |
+ VelocityCalculator velocity_calculator(5); |
+ AddPoints(&velocity_calculator, 10, -10, 1, 7); |
+ |
+ EXPECT_GT(velocity_calculator.XVelocity(), 9.9); |
+ EXPECT_LT(velocity_calculator.XVelocity(), 10.1); |
+ EXPECT_GT(velocity_calculator.YVelocity(), -10.1); |
+ EXPECT_LT(velocity_calculator.YVelocity(), -9.9); |
+ |
+ AddPoints(&velocity_calculator, 0, 0, 1, 5); |
+ |
+ EXPECT_EQ(velocity_calculator.XVelocity(), 0); |
+ EXPECT_EQ(velocity_calculator.YVelocity(), 0); |
+} |
+ |
+} // namespace test |
+} // namespace aura |