Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2010 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 // Tests for the ScrollAnimatorNone class.
     27 
     28 #include "config.h"
     29 
     30 #include "platform/scroll/ScrollAnimatorNone.h"
     31 
     32 #include "platform/Logging.h"
     33 #include "platform/geometry/FloatPoint.h"
     34 #include "platform/geometry/IntRect.h"
     35 #include "platform/scroll/ScrollAnimator.h"
     36 #include "platform/scroll/ScrollableArea.h"
     37 #include <gmock/gmock.h>
     38 #include <gtest/gtest.h>
     39 
     40 using namespace blink;
     41 
     42 using testing::AtLeast;
     43 using testing::Return;
     44 using testing::_;
     45 
     46 class MockScrollableArea : public ScrollableArea {
     47 public:
     48     MockScrollableArea(bool scrollAnimatorEnabled)
     49         : m_scrollAnimatorEnabled(scrollAnimatorEnabled) { }
     50 
     51     MOCK_CONST_METHOD0(isActive, bool());
     52     MOCK_CONST_METHOD1(scrollSize, int(ScrollbarOrientation));
     53     MOCK_METHOD2(invalidateScrollbar, void(Scrollbar*, const IntRect&));
     54     MOCK_CONST_METHOD0(isScrollCornerVisible, bool());
     55     MOCK_CONST_METHOD0(scrollCornerRect, IntRect());
     56     MOCK_METHOD1(setScrollOffset, void(const IntPoint&));
     57     MOCK_METHOD2(invalidateScrollbarRect, void(Scrollbar*, const IntRect&));
     58     MOCK_METHOD1(invalidateScrollCornerRect, void(const IntRect&));
     59     MOCK_METHOD1(setScrollOffsetFromAnimation, void(const IntPoint&));
     60     MOCK_CONST_METHOD0(enclosingScrollableArea, ScrollableArea*());
     61     MOCK_CONST_METHOD0(minimumScrollPosition, IntPoint());
     62     MOCK_CONST_METHOD0(maximumScrollPosition, IntPoint());
     63     MOCK_CONST_METHOD1(visibleContentRect, IntRect(IncludeScrollbarsInRect));
     64     MOCK_CONST_METHOD0(contentsSize, IntSize());
     65     MOCK_CONST_METHOD0(overhangAmount, IntSize());
     66     MOCK_CONST_METHOD0(scrollbarsCanBeActive, bool());
     67     MOCK_CONST_METHOD0(scrollableAreaBoundingBox, IntRect());
     68 
     69     virtual bool userInputScrollable(ScrollbarOrientation) const OVERRIDE { return true; }
     70     virtual bool shouldPlaceVerticalScrollbarOnLeft() const OVERRIDE { return false; }
     71     virtual IntPoint scrollPosition() const OVERRIDE { return IntPoint(); }
     72     virtual int visibleHeight() const OVERRIDE { return 768; }
     73     virtual int visibleWidth() const OVERRIDE { return 1024; }
     74     virtual bool scrollAnimatorEnabled() const OVERRIDE { return m_scrollAnimatorEnabled; }
     75     virtual int pageStep(ScrollbarOrientation) const OVERRIDE { return 0; }
     76 
     77 private:
     78     bool m_scrollAnimatorEnabled;
     79 };
     80 
     81 class MockScrollAnimatorNone : public ScrollAnimatorNone {
     82 public:
     83     MockScrollAnimatorNone(ScrollableArea* scrollableArea)
     84         : ScrollAnimatorNone(scrollableArea) { }
     85 
     86     float currentX() { return m_currentPosX; }
     87     float currentY() { return m_currentPosY; }
     88 
     89     FloatPoint m_fp;
     90     int m_count;
     91 
     92     void reset()
     93     {
     94         stopAnimationTimerIfNeeded();
     95         m_currentPosX = 0;
     96         m_currentPosY = 0;
     97         m_horizontalData.reset();
     98         m_verticalData.reset();
     99         m_fp = FloatPoint::zero();
    100         m_count = 0;
    101     }
    102 
    103     virtual void fireUpAnAnimation(FloatPoint fp)
    104     {
    105         m_fp = fp;
    106         m_count++;
    107     }
    108 
    109     MOCK_METHOD1(scrollToOffsetWithoutAnimation, void(const FloatPoint&));
    110 };
    111 
    112 TEST(ScrollAnimatorEnabled, Enabled)
    113 {
    114     MockScrollableArea scrollableArea(true);
    115     MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea);
    116 
    117     EXPECT_CALL(scrollableArea, scrollSize(_)).Times(AtLeast(1)).WillRepeatedly(Return(1000));
    118     EXPECT_CALL(scrollableArea, minimumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint()));
    119     EXPECT_CALL(scrollableArea, maximumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint(1000, 1000)));
    120     EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times(4);
    121 
    122     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);
    123     EXPECT_NE(100, scrollAnimatorNone.currentX());
    124     EXPECT_NE(0, scrollAnimatorNone.currentX());
    125     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    126     scrollAnimatorNone.reset();
    127 
    128     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);
    129     EXPECT_NE(100, scrollAnimatorNone.currentX());
    130     EXPECT_NE(0, scrollAnimatorNone.currentX());
    131     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    132     scrollAnimatorNone.reset();
    133 
    134     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 4, 25);
    135     EXPECT_NE(100, scrollAnimatorNone.currentX());
    136     EXPECT_NE(0, scrollAnimatorNone.currentX());
    137     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    138     scrollAnimatorNone.reset();
    139 
    140     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPrecisePixel, 4, 25);
    141     EXPECT_EQ(100, scrollAnimatorNone.currentX());
    142     EXPECT_NE(0, scrollAnimatorNone.currentX());
    143     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    144     scrollAnimatorNone.reset();
    145 }
    146 
    147 TEST(ScrollAnimatorEnabled, Disabled)
    148 {
    149     MockScrollableArea scrollableArea(false);
    150     MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea);
    151 
    152     EXPECT_CALL(scrollableArea, minimumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint()));
    153     EXPECT_CALL(scrollableArea, maximumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint(1000, 1000)));
    154     EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times(4);
    155 
    156     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);
    157     EXPECT_EQ(100, scrollAnimatorNone.currentX());
    158     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    159     scrollAnimatorNone.reset();
    160 
    161     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);
    162     EXPECT_EQ(100, scrollAnimatorNone.currentX());
    163     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    164     scrollAnimatorNone.reset();
    165 
    166     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByDocument, 100, 1);
    167     EXPECT_EQ(100, scrollAnimatorNone.currentX());
    168     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    169     scrollAnimatorNone.reset();
    170 
    171     scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 100, 1);
    172     EXPECT_EQ(100, scrollAnimatorNone.currentX());
    173     EXPECT_EQ(0, scrollAnimatorNone.currentY());
    174     scrollAnimatorNone.reset();
    175 }
    176 
    177 class ScrollAnimatorNoneTest : public testing::Test {
    178 public:
    179     struct SavePerAxisData : public ScrollAnimatorNone::PerAxisData {
    180         SavePerAxisData(const ScrollAnimatorNone::PerAxisData& data)
    181             : ScrollAnimatorNone::PerAxisData(&m_mockScrollAnimatorNone, 0, 768)
    182             , m_mockScrollableArea(true)
    183             , m_mockScrollAnimatorNone(&m_mockScrollableArea)
    184         {
    185             this->m_currentVelocity = data.m_currentVelocity;
    186             this->m_desiredPosition = data.m_desiredPosition;
    187             this->m_desiredVelocity = data.m_desiredVelocity;
    188             this->m_startPosition = data.m_startPosition;
    189             this->m_startTime = data.m_startTime;
    190             this->m_startVelocity = data.m_startVelocity;
    191             this->m_animationTime = data.m_animationTime;
    192             this->m_lastAnimationTime = data.m_lastAnimationTime;
    193             this->m_attackPosition = data.m_attackPosition;
    194             this->m_attackTime = data.m_attackTime;
    195             this->m_attackCurve = data.m_attackCurve;
    196             this->m_releasePosition = data.m_releasePosition;
    197             this->m_releaseTime = data.m_releaseTime;
    198             this->m_releaseCurve = data.m_releaseCurve;
    199         }
    200 
    201         bool operator==(const SavePerAxisData& other) const
    202         {
    203             return m_currentVelocity == other.m_currentVelocity && m_desiredPosition == other.m_desiredPosition && m_desiredVelocity == other.m_desiredVelocity && m_startPosition == other.m_startPosition && m_startTime == other.m_startTime && m_startVelocity == other.m_startVelocity && m_animationTime == other.m_animationTime && m_lastAnimationTime == other.m_lastAnimationTime && m_attackPosition == other.m_attackPosition && m_attackTime == other.m_attackTime && m_attackCurve == other.m_attackCurve && m_releasePosition == other.m_releasePosition && m_releaseTime == other.m_releaseTime && m_releaseCurve == other.m_releaseCurve;
    204         }
    205         MockScrollableArea m_mockScrollableArea;
    206         MockScrollAnimatorNone m_mockScrollAnimatorNone;
    207     };
    208 
    209     ScrollAnimatorNoneTest()
    210         : m_mockScrollableArea(true)
    211         , m_mockScrollAnimatorNone(&m_mockScrollableArea)
    212     {
    213     }
    214 
    215     virtual void SetUp()
    216     {
    217         m_currentPosition = 100;
    218         m_data = new ScrollAnimatorNone::PerAxisData(&m_mockScrollAnimatorNone, &m_currentPosition, 768);
    219     }
    220     virtual void TearDown()
    221     {
    222         delete m_data;
    223     }
    224 
    225     void reset();
    226     bool updateDataFromParameters(float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters*);
    227     bool animateScroll(double currentTime);
    228 
    229     double attackArea(ScrollAnimatorNone::Curve, double startT, double endT);
    230     double releaseArea(ScrollAnimatorNone::Curve, double startT, double endT);
    231     double attackCurve(ScrollAnimatorNone::Curve, double deltaT, double curveT, double startPosition, double attackPosition);
    232     double releaseCurve(ScrollAnimatorNone::Curve, double deltaT, double curveT, double releasePosition, double desiredPosition);
    233     double coastCurve(ScrollAnimatorNone::Curve, double factor);
    234 
    235     void curveTestInner(ScrollAnimatorNone::Curve, double step, double time);
    236     void curveTest(ScrollAnimatorNone::Curve);
    237 
    238     void checkDesiredPosition(float expectedPosition);
    239     void checkSoftLanding(float expectedPosition);
    240 
    241     static double kTickTime;
    242     static double kAnimationTime;
    243     static double kStartTime;
    244     static double kEndTime;
    245     float m_currentPosition;
    246     MockScrollableArea m_mockScrollableArea;
    247     MockScrollAnimatorNone m_mockScrollAnimatorNone;
    248     bool m_scrollingDown;
    249     ScrollAnimatorNone::PerAxisData* m_data;
    250 };
    251 
    252 double ScrollAnimatorNoneTest::kTickTime = 1 / 60.0;
    253 double ScrollAnimatorNoneTest::kAnimationTime = 0.01;
    254 double ScrollAnimatorNoneTest::kStartTime = 10.0;
    255 double ScrollAnimatorNoneTest::kEndTime = 20.0;
    256 
    257 void ScrollAnimatorNoneTest::reset()
    258 {
    259     m_data->reset();
    260     m_scrollingDown = true;
    261 }
    262 
    263 bool ScrollAnimatorNoneTest::updateDataFromParameters(float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters* parameters)
    264 {
    265     if (step * multiplier)
    266         m_scrollingDown = (step * multiplier > 0);
    267 
    268     double oldVelocity = m_data->m_currentVelocity;
    269     double oldDesiredVelocity = m_data->m_desiredVelocity;
    270     double oldTimeLeft = m_data->m_animationTime - (m_data->m_lastAnimationTime - m_data->m_startTime);
    271     bool result = m_data->updateDataFromParameters(step, multiplier, scrollableSize, currentTime, parameters);
    272     if (m_scrollingDown)
    273         EXPECT_LE(oldVelocity, m_data->m_currentVelocity);
    274     else
    275         EXPECT_GE(oldVelocity, m_data->m_currentVelocity);
    276 
    277     double deltaTime = m_data->m_lastAnimationTime - m_data->m_startTime;
    278     double timeLeft = m_data->m_animationTime - deltaTime;
    279     double releaseTimeLeft = std::min(timeLeft, m_data->m_releaseTime);
    280     double attackTimeLeft = std::max(0., m_data->m_attackTime - deltaTime);
    281     double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
    282 
    283     // If we're getting near the finish, the desired velocity can decrease since the time left gets increased.
    284     if (step * multiplier) {
    285         double allowedVelocityDecreaseFactor = 0.99 * oldTimeLeft / timeLeft;
    286         allowedVelocityDecreaseFactor *= allowedVelocityDecreaseFactor;
    287         if (m_scrollingDown)
    288             EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
    289         else
    290             EXPECT_GE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
    291 
    292         double startPosition = attackTimeLeft ? m_data->m_attackPosition : m_currentPosition;
    293         double expectedReleasePosition = startPosition + sustainTimeLeft * m_data->m_desiredVelocity;
    294         EXPECT_NEAR(expectedReleasePosition, m_data->m_releasePosition, result ? .0001 : 1);
    295     }
    296 
    297     return result;
    298 }
    299 
    300 bool ScrollAnimatorNoneTest::animateScroll(double currentTime)
    301 {
    302     double oldPosition = *m_data->m_currentPosition;
    303     bool testEstimatedMaxVelocity = m_data->m_startTime + m_data->m_animationTime - m_data->m_lastAnimationTime > m_data->m_releaseTime;
    304 
    305     bool result = m_data->animateScroll(currentTime);
    306 
    307     double deltaTime = m_data->m_lastAnimationTime - m_data->m_startTime;
    308     double timeLeft = m_data->m_animationTime - deltaTime;
    309     double releaseTimeLeft = std::min(timeLeft, m_data->m_releaseTime);
    310     double attackTimeLeft = std::max(0., m_data->m_attackTime - deltaTime);
    311     double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
    312     double distanceLeft = m_data->m_desiredPosition - *m_data->m_currentPosition;
    313 
    314     if (m_scrollingDown) {
    315         EXPECT_LE(0, m_data->m_currentVelocity);
    316         EXPECT_LE(oldPosition, *m_data->m_currentPosition);
    317     } else {
    318         EXPECT_GE(0, m_data->m_currentVelocity);
    319         EXPECT_GE(oldPosition, *m_data->m_currentPosition);
    320     }
    321     EXPECT_GE(fabs(m_data->m_desiredVelocity) * 2, fabs(m_data->m_currentVelocity));
    322     if (testEstimatedMaxVelocity)
    323         EXPECT_GE(fabs(distanceLeft / sustainTimeLeft) * 1.2, fabs(m_data->m_currentVelocity));
    324 
    325     return result;
    326 }
    327 
    328 double ScrollAnimatorNoneTest::attackArea(ScrollAnimatorNone::Curve curve, double startT, double endT)
    329 {
    330     return ScrollAnimatorNone::PerAxisData::attackArea(curve, startT, endT);
    331 }
    332 
    333 double ScrollAnimatorNoneTest::releaseArea(ScrollAnimatorNone::Curve curve, double startT, double endT)
    334 {
    335     return ScrollAnimatorNone::PerAxisData::releaseArea(curve, startT, endT);
    336 }
    337 
    338 double ScrollAnimatorNoneTest::attackCurve(ScrollAnimatorNone::Curve curve, double deltaT, double curveT, double startPosition, double attackPosition)
    339 {
    340     return ScrollAnimatorNone::PerAxisData::attackCurve(curve, deltaT, curveT, startPosition, attackPosition);
    341 }
    342 
    343 double ScrollAnimatorNoneTest::releaseCurve(ScrollAnimatorNone::Curve curve, double deltaT, double curveT, double releasePosition, double desiredPosition)
    344 {
    345     return ScrollAnimatorNone::PerAxisData::releaseCurve(curve, deltaT, curveT, releasePosition, desiredPosition);
    346 }
    347 
    348 double ScrollAnimatorNoneTest::coastCurve(ScrollAnimatorNone::Curve curve, double factor)
    349 {
    350     return ScrollAnimatorNone::PerAxisData::coastCurve(curve, factor);
    351 }
    352 
    353 void ScrollAnimatorNoneTest::curveTestInner(ScrollAnimatorNone::Curve curve, double step, double time)
    354 {
    355     const double kPosition = 1000;
    356 
    357     double oldPos = 0;
    358     double oldVelocity = 0;
    359     double accumulate = 0;
    360 
    361     for (double t = step ; t <= time ; t += step) {
    362         double newPos = attackCurve(curve, t, time, 0, kPosition);
    363         double delta = newPos - oldPos;
    364         double velocity = delta / step;
    365         double velocityDelta = velocity - oldVelocity;
    366 
    367         accumulate += (oldPos + newPos) / 2 * (step / time);
    368         oldPos = newPos;
    369         oldVelocity = velocity;
    370         if (curve != ScrollAnimatorNone::Bounce) {
    371             EXPECT_LE(-.0001, velocityDelta);
    372             EXPECT_LT(0, delta);
    373         }
    374 
    375         double area = attackArea(curve, 0, t / time) * kPosition;
    376         EXPECT_LE(0, area);
    377         EXPECT_NEAR(accumulate, area, 1.0);
    378     }
    379 
    380     oldPos = 0;
    381     oldVelocity *= 2;
    382     accumulate = releaseArea(curve, 0, 1) * kPosition;
    383     for (double t = step ; t <= time ; t += step) {
    384         double newPos = releaseCurve(curve, t, time, 0, kPosition);
    385         double delta = newPos - oldPos;
    386         double velocity = delta / step;
    387         double velocityDelta = velocity - oldVelocity;
    388 
    389         accumulate -= (kPosition - (oldPos + newPos) / 2) * (step / time);
    390         oldPos = newPos;
    391         oldVelocity = velocity;
    392         if (curve != ScrollAnimatorNone::Bounce) {
    393             EXPECT_GE(0.01, velocityDelta);
    394             EXPECT_LT(0, delta);
    395         }
    396 
    397         double area = releaseArea(curve, t / time, 1) * kPosition;
    398         EXPECT_LE(0, area);
    399         EXPECT_NEAR(accumulate, area, 1.0);
    400     }
    401 }
    402 
    403 void ScrollAnimatorNoneTest::curveTest(ScrollAnimatorNone::Curve curve)
    404 {
    405     curveTestInner(curve, 0.01, 0.25);
    406     curveTestInner(curve, 0.2, 10);
    407     curveTestInner(curve, 0.025, 10);
    408     curveTestInner(curve, 0.01, 1);
    409     curveTestInner(curve, 0.25, 40);
    410 }
    411 
    412 void ScrollAnimatorNoneTest::checkDesiredPosition(float expectedPosition)
    413 {
    414     EXPECT_EQ(expectedPosition, m_data->m_desiredPosition);
    415 }
    416 
    417 void ScrollAnimatorNoneTest::checkSoftLanding(float expectedPosition)
    418 {
    419     EXPECT_EQ(expectedPosition, m_currentPosition);
    420     EXPECT_LE(m_data->m_desiredVelocity / 2, m_data->m_currentVelocity);
    421 }
    422 
    423 TEST_F(ScrollAnimatorNoneTest, CurveMathLinear)
    424 {
    425     curveTest(ScrollAnimatorNone::Linear);
    426 }
    427 
    428 TEST_F(ScrollAnimatorNoneTest, CurveMathQuadratic)
    429 {
    430     curveTest(ScrollAnimatorNone::Quadratic);
    431 }
    432 
    433 TEST_F(ScrollAnimatorNoneTest, CurveMathCubic)
    434 {
    435     curveTest(ScrollAnimatorNone::Cubic);
    436 }
    437 
    438 TEST_F(ScrollAnimatorNoneTest, CurveMathQuartic)
    439 {
    440     curveTest(ScrollAnimatorNone::Quartic);
    441 }
    442 
    443 TEST_F(ScrollAnimatorNoneTest, CurveMathBounce)
    444 {
    445     curveTest(ScrollAnimatorNone::Bounce);
    446 }
    447 
    448 TEST_F(ScrollAnimatorNoneTest, CurveMathCoast)
    449 {
    450     for (double t = .25; t < 1; t += .25) {
    451         EXPECT_EQ(t, coastCurve(ScrollAnimatorNone::Linear, t));
    452         EXPECT_LT(t, coastCurve(ScrollAnimatorNone::Quadratic, t));
    453         EXPECT_LT(t, coastCurve(ScrollAnimatorNone::Cubic, t));
    454         EXPECT_LT(coastCurve(ScrollAnimatorNone::Quadratic, t), coastCurve(ScrollAnimatorNone::Cubic, t));
    455         EXPECT_LT(t, coastCurve(ScrollAnimatorNone::Quartic, t));
    456         EXPECT_LT(coastCurve(ScrollAnimatorNone::Cubic, t), coastCurve(ScrollAnimatorNone::Quartic, t));
    457     }
    458 }
    459 
    460 TEST_F(ScrollAnimatorNoneTest, ScrollOnceLinear)
    461 {
    462     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    463 
    464     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    465     bool result = true;
    466     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    467         result = animateScroll(t);
    468 }
    469 
    470 TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuadratic)
    471 {
    472     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    473 
    474     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    475     bool result = true;
    476     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    477         result = animateScroll(t);
    478 }
    479 
    480 TEST_F(ScrollAnimatorNoneTest, ScrollLongQuadratic)
    481 {
    482     ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    483 
    484     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    485     bool result = true;
    486     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    487         result = animateScroll(t);
    488 }
    489 
    490 TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticNoSustain)
    491 {
    492     ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Linear, 0);
    493 
    494     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    495     bool result = true;
    496     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    497         result = animateScroll(t);
    498 }
    499 
    500 TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticSmoothed)
    501 {
    502     ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Linear, 0);
    503 
    504     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    505     bool result = true;
    506     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    507         result = animateScroll(t);
    508 }
    509 
    510 TEST_F(ScrollAnimatorNoneTest, ScrollOnceCubic)
    511 {
    512     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    513 
    514     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    515     bool result = true;
    516     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    517         result = animateScroll(t);
    518 }
    519 
    520 TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuartic)
    521 {
    522     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quartic, 3 * kTickTime, ScrollAnimatorNone::Quartic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    523 
    524     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    525     bool result = true;
    526     for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
    527         result = animateScroll(t);
    528 }
    529 
    530 TEST_F(ScrollAnimatorNoneTest, ScrollOnceShort)
    531 {
    532     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    533 
    534     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    535     bool result = true;
    536     for (double t = kStartTime; result && t < kEndTime; t += kTickTime)
    537         result = animateScroll(t);
    538 }
    539 
    540 TEST_F(ScrollAnimatorNoneTest, ScrollTwiceQuadratic)
    541 {
    542     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    543 
    544     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    545     bool result = true;
    546     double t;
    547     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
    548         result = animateScroll(t);
    549 
    550     result = result && animateScroll(t);
    551     double before = m_currentPosition;
    552     result = result && updateDataFromParameters(1, 40, 1000, t, &parameters);
    553     result = result && animateScroll(t);
    554     double after = m_currentPosition;
    555     EXPECT_NEAR(before, after, 10);
    556 
    557     t += kAnimationTime;
    558 
    559     result = result && animateScroll(t);
    560     before = m_currentPosition;
    561     result = result && updateDataFromParameters(1, 40, 1000, t, &parameters);
    562     result = result && animateScroll(t);
    563     after = m_currentPosition;
    564     EXPECT_NEAR(before, after, 10);
    565 
    566     t += kAnimationTime;
    567     for (; result && t < kEndTime; t += kAnimationTime)
    568         result = animateScroll(t);
    569 }
    570 
    571 TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadratic)
    572 {
    573     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    574 
    575     EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, &parameters));
    576     bool result = true;
    577     double t;
    578     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
    579         result = animateScroll(t);
    580 
    581     for (int i = 0; i < 20; ++i) {
    582         t += kAnimationTime;
    583         result = result && animateScroll(t);
    584         result = result && updateDataFromParameters(3, 40, 10000, t, &parameters);
    585     }
    586 
    587     t += kAnimationTime;
    588     for (; result && t < kEndTime; t += kAnimationTime)
    589         result = result && animateScroll(t);
    590 }
    591 
    592 TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadraticSmoothed)
    593 {
    594     ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    595 
    596     EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, &parameters));
    597     bool result = true;
    598     double t;
    599     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
    600         result = animateScroll(t);
    601 
    602     for (int i = 0; i < 20; ++i) {
    603         t += kAnimationTime;
    604         result = result && animateScroll(t);
    605         result = result && updateDataFromParameters(3, 40, 10000, t, &parameters);
    606     }
    607 
    608     t += kAnimationTime;
    609     for (; result && t < kEndTime; t += kAnimationTime)
    610         result = result && animateScroll(t);
    611 }
    612 
    613 TEST_F(ScrollAnimatorNoneTest, ScrollTwiceCubic)
    614 {
    615     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    616 
    617     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
    618     bool result = true;
    619     double t;
    620     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
    621         result = animateScroll(t);
    622 
    623     result = result && animateScroll(t);
    624     double before = m_currentPosition;
    625     result = result && updateDataFromParameters(1, 40, 1000, t, &parameters);
    626     result = result && animateScroll(t);
    627     double after = m_currentPosition;
    628     EXPECT_NEAR(before, after, 10);
    629 
    630     t += kAnimationTime;
    631 
    632     result = result && animateScroll(t);
    633     before = m_currentPosition;
    634     result = result && updateDataFromParameters(1, 40, 1000, t, &parameters);
    635     result = result && animateScroll(t);
    636     after = m_currentPosition;
    637     EXPECT_NEAR(before, after, 10);
    638 
    639     t += kAnimationTime;
    640     for (; result && t < kEndTime; t += kAnimationTime)
    641         result = animateScroll(t);
    642 }
    643 
    644 TEST_F(ScrollAnimatorNoneTest, ScrollLotsCubic)
    645 {
    646     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    647 
    648     EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, &parameters));
    649     bool result = true;
    650     double t;
    651     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
    652         result = animateScroll(t);
    653 
    654     for (int i = 0; i < 20; ++i) {
    655         t += kAnimationTime;
    656         result = result && animateScroll(t);
    657         result = result && updateDataFromParameters(3, 40, 10000, t, &parameters);
    658     }
    659 
    660     t += kAnimationTime;
    661     for (; result && t < kEndTime; t += kAnimationTime)
    662         result = result && animateScroll(t);
    663 }
    664 
    665 TEST_F(ScrollAnimatorNoneTest, ScrollLotsCubicSmoothed)
    666 {
    667     ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    668 
    669     EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, &parameters));
    670     bool result = true;
    671     double t;
    672     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
    673         result = animateScroll(t);
    674 
    675     for (int i = 0; i < 20; ++i) {
    676         t += kAnimationTime;
    677         result = result && animateScroll(t);
    678         result = result && updateDataFromParameters(3, 40, 10000, t, &parameters);
    679     }
    680 
    681     t += kAnimationTime;
    682     for (; result && t < kEndTime; t += kAnimationTime)
    683         result = result && animateScroll(t);
    684 }
    685 
    686 TEST_F(ScrollAnimatorNoneTest, ScrollWheelTrace)
    687 {
    688     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    689 
    690     // Constructed from an actual scroll wheel trace that exhibited a glitch.
    691     bool result = updateDataFromParameters(1, 53.33f, 1000, 100.5781f, &parameters);
    692     result = animateScroll(100.5933);
    693     result = result && animateScroll(100.6085);
    694     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6485f, &parameters);
    695     result = result && animateScroll(100.6515);
    696     result = result && animateScroll(100.6853);
    697     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6863f, &parameters);
    698     result = result && animateScroll(100.7005);
    699     result = result && animateScroll(100.7157);
    700     result = result && animateScroll(100.7312);
    701     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7379f, &parameters);
    702     result = result && animateScroll(100.7464);
    703     result = result && animateScroll(100.7617);
    704     result = result && animateScroll(100.7775);
    705     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7779f, &parameters);
    706     for (double t = 100.7928; result && t < 200; t += 0.015)
    707         result = result && animateScroll(t);
    708 }
    709 
    710 TEST_F(ScrollAnimatorNoneTest, ScrollWheelTraceSmoothed)
    711 {
    712     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    713 
    714     // Constructed from an actual scroll wheel trace that exhibited a glitch.
    715     bool result = updateDataFromParameters(1, 53.33f, 1000, 100.5781f, &parameters);
    716     result = animateScroll(100.5933);
    717     result = result && animateScroll(100.6085);
    718     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6485f, &parameters);
    719     result = result && animateScroll(100.6515);
    720     result = result && animateScroll(100.6853);
    721     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6863f, &parameters);
    722     result = result && animateScroll(100.7005);
    723     result = result && animateScroll(100.7157);
    724     result = result && animateScroll(100.7312);
    725     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7379f, &parameters);
    726     result = result && animateScroll(100.7464);
    727     result = result && animateScroll(100.7617);
    728     result = result && animateScroll(100.7775);
    729     result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7779f, &parameters);
    730     for (double t = 100.7928; result && t < 200; t += 0.015)
    731         result = result && animateScroll(t);
    732 }
    733 
    734 TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTrace)
    735 {
    736     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    737 
    738     bool result = updateDataFromParameters(1.00, 60.00, 1000, 100.6863, &parameters);
    739     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.6897, &parameters);
    740     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7001, &parameters);
    741     result = result && animateScroll(100.7015);
    742     result = result && animateScroll(100.7169);
    743     result = result && updateDataFromParameters(1.00, 40.00, 1000, 100.7179, &parameters);
    744     result = result && animateScroll(100.7322);
    745     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7332, &parameters);
    746     result = result && animateScroll(100.7491);
    747     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7519, &parameters);
    748     result = result && animateScroll(100.7676);
    749     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7698, &parameters);
    750     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7830, &parameters);
    751     result = result && animateScroll(100.7834);
    752     result = result && animateScroll(100.7997);
    753     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8019, &parameters);
    754     result = result && animateScroll(100.8154);
    755     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8241, &parameters);
    756     result = result && animateScroll(100.8335);
    757     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8465, &parameters);
    758     result = result && animateScroll(100.8513);
    759     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8623, &parameters);
    760     for (double t = 100.8674; result && t < 200; t += 0.015)
    761         result = result && animateScroll(t);
    762 }
    763 
    764 TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTraceSmoothed)
    765 {
    766     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    767 
    768     bool result = updateDataFromParameters(1.00, 60.00, 1000, 100.6863, &parameters);
    769     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.6897, &parameters);
    770     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7001, &parameters);
    771     result = result && animateScroll(100.7015);
    772     result = result && animateScroll(100.7169);
    773     result = result && updateDataFromParameters(1.00, 40.00, 1000, 100.7179, &parameters);
    774     result = result && animateScroll(100.7322);
    775     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7332, &parameters);
    776     result = result && animateScroll(100.7491);
    777     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7519, &parameters);
    778     result = result && animateScroll(100.7676);
    779     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7698, &parameters);
    780     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7830, &parameters);
    781     result = result && animateScroll(100.7834);
    782     result = result && animateScroll(100.7997);
    783     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8019, &parameters);
    784     result = result && animateScroll(100.8154);
    785     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8241, &parameters);
    786     result = result && animateScroll(100.8335);
    787     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8465, &parameters);
    788     result = result && animateScroll(100.8513);
    789     result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8623, &parameters);
    790     for (double t = 100.8674; result && t < 200; t += 0.015)
    791         result = result && animateScroll(t);
    792 }
    793 
    794 TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumper)
    795 {
    796     ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    797 
    798     EXPECT_TRUE(updateDataFromParameters(1, 20, 200, kStartTime, &parameters));
    799     bool result = true;
    800     double t = kStartTime;
    801     for (int i = 0; i < 10; ++i) {
    802         t += kAnimationTime;
    803         result = result && animateScroll(t);
    804         updateDataFromParameters(1, 20, 200, t, &parameters);
    805     }
    806     checkDesiredPosition(200);
    807 
    808     t += kAnimationTime;
    809     for (; result && t < kEndTime; t += kAnimationTime)
    810         result = result && animateScroll(t);
    811     checkSoftLanding(200);
    812 }
    813 
    814 TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumper)
    815 {
    816     ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
    817 
    818     EXPECT_TRUE(updateDataFromParameters(1, -20, 200, kStartTime, &parameters));
    819     bool result = true;
    820     double t = kStartTime;
    821     for (int i = 0; i < 10; ++i) {
    822         t += kAnimationTime;
    823         result = result && animateScroll(t);
    824         updateDataFromParameters(1, -20, 200, t, &parameters);
    825     }
    826     checkDesiredPosition(0);
    827 
    828     t += kAnimationTime;
    829     for (; result && t < kEndTime; t += kAnimationTime)
    830         result = result && animateScroll(t);
    831     checkSoftLanding(0);
    832 }
    833 
    834 TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumperCoast)
    835 {
    836     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 2 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 1);
    837 
    838     m_currentPosition = 40000;
    839     EXPECT_TRUE(updateDataFromParameters(1, -10000, 50000, kStartTime, &parameters));
    840     bool result = true;
    841     double t = kStartTime;
    842     for (int i = 0; i < 10; ++i) {
    843         t += kAnimationTime;
    844         result = result && animateScroll(t);
    845         updateDataFromParameters(1, -10000, 50000, t, &parameters);
    846     }
    847     checkDesiredPosition(0);
    848 
    849     t += kAnimationTime;
    850     for (; result && t < kEndTime; t += kAnimationTime)
    851         result = result && animateScroll(t);
    852     checkSoftLanding(0);
    853 }
    854 
    855 TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumperCoast)
    856 {
    857     ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 2 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 1);
    858 
    859     m_currentPosition = 10000;
    860     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    861     bool result = true;
    862     double t = kStartTime;
    863     for (int i = 0; i < 10; ++i) {
    864         t += kAnimationTime;
    865         result = result && animateScroll(t);
    866         updateDataFromParameters(1, 10000, 50000, t, &parameters);
    867     }
    868     checkDesiredPosition(50000);
    869 
    870     t += kAnimationTime;
    871     for (; result && t < kEndTime; t += kAnimationTime)
    872         result = result && animateScroll(t);
    873     checkSoftLanding(50000);
    874 }
    875 
    876 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalency)
    877 {
    878     ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 0);
    879 
    880     reset();
    881     EXPECT_TRUE(updateDataFromParameters(1, 300, 50000, kStartTime, &parameters));
    882     SavePerAxisData dataSingle(*m_data);
    883 
    884     reset();
    885     EXPECT_TRUE(updateDataFromParameters(1, 150, 50000, kStartTime, &parameters));
    886     EXPECT_TRUE(updateDataFromParameters(1, 150, 50000, kStartTime, &parameters));
    887     SavePerAxisData dataDouble(*m_data);
    888 
    889     reset();
    890     EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, &parameters));
    891     EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, &parameters));
    892     EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, &parameters));
    893     SavePerAxisData dataTriple(*m_data);
    894 
    895     reset();
    896     EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, &parameters));
    897     EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, &parameters));
    898     EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, &parameters));
    899     EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, &parameters));
    900     EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, &parameters));
    901     EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, &parameters));
    902     SavePerAxisData dataMany(*m_data);
    903 
    904     EXPECT_EQ(dataSingle, dataDouble);
    905     EXPECT_EQ(dataSingle, dataTriple);
    906     EXPECT_EQ(dataSingle, dataMany);
    907 }
    908 
    909 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoast)
    910 {
    911     ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 1);
    912 
    913     reset();
    914     updateDataFromParameters(1, 300, 50000, kStartTime, &parameters);
    915     SavePerAxisData dataSingle(*m_data);
    916 
    917     reset();
    918     updateDataFromParameters(1, 150, 50000, kStartTime, &parameters);
    919     updateDataFromParameters(1, 150, 50000, kStartTime, &parameters);
    920     SavePerAxisData dataDouble(*m_data);
    921 
    922     reset();
    923     updateDataFromParameters(1, 100, 50000, kStartTime, &parameters);
    924     updateDataFromParameters(1, 100, 50000, kStartTime, &parameters);
    925     updateDataFromParameters(1, 100, 50000, kStartTime, &parameters);
    926     SavePerAxisData dataTriple(*m_data);
    927 
    928     reset();
    929     updateDataFromParameters(1, 50, 50000, kStartTime, &parameters);
    930     updateDataFromParameters(1, 50, 50000, kStartTime, &parameters);
    931     updateDataFromParameters(1, 50, 50000, kStartTime, &parameters);
    932     updateDataFromParameters(1, 50, 50000, kStartTime, &parameters);
    933     updateDataFromParameters(1, 50, 50000, kStartTime, &parameters);
    934     updateDataFromParameters(1, 50, 50000, kStartTime, &parameters);
    935     SavePerAxisData dataMany(*m_data);
    936 
    937     EXPECT_EQ(dataSingle, dataDouble);
    938     EXPECT_EQ(dataSingle, dataTriple);
    939     EXPECT_EQ(dataSingle, dataMany);
    940 }
    941 
    942 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoastLarge)
    943 {
    944     ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 1);
    945 
    946     reset();
    947     EXPECT_TRUE(updateDataFromParameters(1, 30000, 50000, kStartTime, &parameters));
    948     SavePerAxisData dataSingle(*m_data);
    949 
    950     reset();
    951     EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, &parameters));
    952     EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, &parameters));
    953     SavePerAxisData dataDouble(*m_data);
    954 
    955     reset();
    956     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    957     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    958     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    959     SavePerAxisData dataTriple(*m_data);
    960 
    961     reset();
    962     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    963     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    964     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    965     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    966     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    967     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    968     SavePerAxisData dataMany(*m_data);
    969 
    970     EXPECT_EQ(dataSingle, dataDouble);
    971     EXPECT_EQ(dataSingle, dataTriple);
    972     EXPECT_EQ(dataSingle, dataMany);
    973 }
    974 
    975 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoastSteep)
    976 {
    977     ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Quadratic, 1);
    978 
    979     reset();
    980     EXPECT_TRUE(updateDataFromParameters(1, 30000, 50000, kStartTime, &parameters));
    981     SavePerAxisData dataSingle(*m_data);
    982 
    983     reset();
    984     EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, &parameters));
    985     EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, &parameters));
    986     SavePerAxisData dataDouble(*m_data);
    987 
    988     reset();
    989     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    990     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    991     EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, &parameters));
    992     SavePerAxisData dataTriple(*m_data);
    993 
    994     reset();
    995     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    996     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    997     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    998     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
    999     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
   1000     EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, &parameters));
   1001     SavePerAxisData dataMany(*m_data);
   1002 
   1003     EXPECT_EQ(dataSingle, dataDouble);
   1004     EXPECT_EQ(dataSingle, dataTriple);
   1005     EXPECT_EQ(dataSingle, dataMany);
   1006 }
   1007 
   1008 TEST_F(ScrollAnimatorNoneTest, ScrollStopInMiddle)
   1009 {
   1010     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
   1011 
   1012     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
   1013     bool result = true;
   1014     double t;
   1015     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
   1016         result = animateScroll(t);
   1017 
   1018     result = result && animateScroll(t);
   1019     EXPECT_TRUE(result);
   1020     double before = m_currentPosition;
   1021     result = result && updateDataFromParameters(0, 0, 1000, t, &parameters);
   1022     EXPECT_FALSE(result);
   1023     result = result && animateScroll(t);
   1024     double after = m_currentPosition;
   1025     EXPECT_EQ(before, after);
   1026     checkDesiredPosition(after);
   1027 }
   1028 
   1029 TEST_F(ScrollAnimatorNoneTest, ReverseInMiddle)
   1030 {
   1031     ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
   1032 
   1033     EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, &parameters));
   1034     bool result = true;
   1035     double t;
   1036     for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
   1037         result = animateScroll(t);
   1038 
   1039     result = result && animateScroll(t);
   1040     EXPECT_TRUE(result);
   1041     double before = m_currentPosition;
   1042     result = result && updateDataFromParameters(1, -10, 1000, t, &parameters);
   1043     EXPECT_TRUE(result);
   1044     result = result && animateScroll(t);
   1045     double after = m_currentPosition;
   1046     EXPECT_GE(before, after);
   1047 
   1048     t += kAnimationTime;
   1049     for (; result && t < kEndTime; t += kAnimationTime)
   1050         result = result && animateScroll(t);
   1051     EXPECT_GE(before, m_currentPosition);
   1052 }
   1053