Home | History | Annotate | Download | only in gestures
      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 
     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
     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 
     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 = 1223372036800000000LL;
     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.
     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
    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
    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