// 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/events/gestures/velocity_calculator.h" namespace ui { 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 // Test that the velocity returned is reasonable TEST(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(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 = GG_LONGLONG(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 right values are returned for insufficient data. TEST(VelocityCalculatorTest, RequiresEnoughData) { VelocityCalculator velocity_calculator(3); int64 start_time = 0; // Zero points is zero velocity. EXPECT_EQ(velocity_calculator.XVelocity(), 0); EXPECT_EQ(velocity_calculator.YVelocity(), 0); // 1point is still zero velocity. velocity_calculator.PointSeen(10, 10, start_time); EXPECT_EQ(velocity_calculator.XVelocity(), 0); EXPECT_EQ(velocity_calculator.YVelocity(), 0); // 2 points has non-zero velocity. velocity_calculator.PointSeen(20, 20, start_time + 5); EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 1923077.f); EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 1923077.f); velocity_calculator.PointSeen(30, 30, start_time + 10); velocity_calculator.PointSeen(40, 40, start_time + 15); EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 2000000.f); EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 2000000.f); velocity_calculator.PointSeen(50, 50, start_time + 20); EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 2000000.f); EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 2000000.f); } // Ensures ClearHistory behaves correctly TEST(VelocityCalculatorTest, ClearsHistory) { VelocityCalculator velocity_calculator(5); AddPoints(&velocity_calculator, 10, -10, 1, 7); EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 10.f); EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), -10.f); 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(VelocityCalculatorTest, IgnoresOldData) { VelocityCalculator velocity_calculator(5); AddPoints(&velocity_calculator, 10, -10, 1, 7); EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 10.f); EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), -10.f); AddPoints(&velocity_calculator, 0, 0, 1, 5); EXPECT_FLOAT_EQ(velocity_calculator.XVelocity(), 0); EXPECT_FLOAT_EQ(velocity_calculator.YVelocity(), 0); } } // namespace test } // namespace ui