2 * Copyright (C) 2010 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 // Tests for the ScrollAnimatorNone class.
30 #include "platform/scroll/ScrollAnimatorNone.h"
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>
40 using namespace blink;
42 using testing::AtLeast;
43 using testing::Return;
46 class MockScrollableArea : public ScrollableArea {
48 MockScrollableArea(bool scrollAnimatorEnabled)
49 : m_scrollAnimatorEnabled(scrollAnimatorEnabled) { }
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());
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; }
78 bool m_scrollAnimatorEnabled;
81 class MockScrollAnimatorNone : public ScrollAnimatorNone {
83 MockScrollAnimatorNone(ScrollableArea* scrollableArea)
84 : ScrollAnimatorNone(scrollableArea) { }
86 float currentX() { return m_currentPosX; }
87 float currentY() { return m_currentPosY; }
94 stopAnimationTimerIfNeeded();
97 m_horizontalData.reset();
98 m_verticalData.reset();
99 m_fp = FloatPoint::zero();
103 virtual void fireUpAnAnimation(FloatPoint fp)
109 MOCK_METHOD1(scrollToOffsetWithoutAnimation, void(const FloatPoint&));
112 TEST(ScrollAnimatorEnabled, Enabled)
114 MockScrollableArea scrollableArea(true);
115 MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea);
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);
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();
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();
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();
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();
147 TEST(ScrollAnimatorEnabled, Disabled)
149 MockScrollableArea scrollableArea(false);
150 MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea);
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);
156 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);
157 EXPECT_EQ(100, scrollAnimatorNone.currentX());
158 EXPECT_EQ(0, scrollAnimatorNone.currentY());
159 scrollAnimatorNone.reset();
161 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);
162 EXPECT_EQ(100, scrollAnimatorNone.currentX());
163 EXPECT_EQ(0, scrollAnimatorNone.currentY());
164 scrollAnimatorNone.reset();
166 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByDocument, 100, 1);
167 EXPECT_EQ(100, scrollAnimatorNone.currentX());
168 EXPECT_EQ(0, scrollAnimatorNone.currentY());
169 scrollAnimatorNone.reset();
171 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 100, 1);
172 EXPECT_EQ(100, scrollAnimatorNone.currentX());
173 EXPECT_EQ(0, scrollAnimatorNone.currentY());
174 scrollAnimatorNone.reset();
177 class ScrollAnimatorNoneTest : public testing::Test {
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)
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;
201 bool operator==(const SavePerAxisData& other) const
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;
205 MockScrollableArea m_mockScrollableArea;
206 MockScrollAnimatorNone m_mockScrollAnimatorNone;
209 ScrollAnimatorNoneTest()
210 : m_mockScrollableArea(true)
211 , m_mockScrollAnimatorNone(&m_mockScrollableArea)
217 m_currentPosition = 100;
218 m_data = new ScrollAnimatorNone::PerAxisData(&m_mockScrollAnimatorNone, &m_currentPosition, 768);
220 virtual void TearDown()
226 bool updateDataFromParameters(float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters*);
227 bool animateScroll(double currentTime);
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);
235 void curveTestInner(ScrollAnimatorNone::Curve, double step, double time);
236 void curveTest(ScrollAnimatorNone::Curve);
238 void checkDesiredPosition(float expectedPosition);
239 void checkSoftLanding(float expectedPosition);
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;
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;
257 void ScrollAnimatorNoneTest::reset()
260 m_scrollingDown = true;
263 bool ScrollAnimatorNoneTest::updateDataFromParameters(float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters* parameters)
265 if (step * multiplier)
266 m_scrollingDown = (step * multiplier > 0);
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);
273 EXPECT_LE(oldVelocity, m_data->m_currentVelocity);
275 EXPECT_GE(oldVelocity, m_data->m_currentVelocity);
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);
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;
288 EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
290 EXPECT_GE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
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);
300 bool ScrollAnimatorNoneTest::animateScroll(double currentTime)
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;
305 bool result = m_data->animateScroll(currentTime);
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;
314 if (m_scrollingDown) {
315 EXPECT_LE(0, m_data->m_currentVelocity);
316 EXPECT_LE(oldPosition, *m_data->m_currentPosition);
318 EXPECT_GE(0, m_data->m_currentVelocity);
319 EXPECT_GE(oldPosition, *m_data->m_currentPosition);
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));
328 double ScrollAnimatorNoneTest::attackArea(ScrollAnimatorNone::Curve curve, double startT, double endT)
330 return ScrollAnimatorNone::PerAxisData::attackArea(curve, startT, endT);
333 double ScrollAnimatorNoneTest::releaseArea(ScrollAnimatorNone::Curve curve, double startT, double endT)
335 return ScrollAnimatorNone::PerAxisData::releaseArea(curve, startT, endT);
338 double ScrollAnimatorNoneTest::attackCurve(ScrollAnimatorNone::Curve curve, double deltaT, double curveT, double startPosition, double attackPosition)
340 return ScrollAnimatorNone::PerAxisData::attackCurve(curve, deltaT, curveT, startPosition, attackPosition);
343 double ScrollAnimatorNoneTest::releaseCurve(ScrollAnimatorNone::Curve curve, double deltaT, double curveT, double releasePosition, double desiredPosition)
345 return ScrollAnimatorNone::PerAxisData::releaseCurve(curve, deltaT, curveT, releasePosition, desiredPosition);
348 double ScrollAnimatorNoneTest::coastCurve(ScrollAnimatorNone::Curve curve, double factor)
350 return ScrollAnimatorNone::PerAxisData::coastCurve(curve, factor);
353 void ScrollAnimatorNoneTest::curveTestInner(ScrollAnimatorNone::Curve curve, double step, double time)
355 const double kPosition = 1000;
358 double oldVelocity = 0;
359 double accumulate = 0;
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;
367 accumulate += (oldPos + newPos) / 2 * (step / time);
369 oldVelocity = velocity;
370 if (curve != ScrollAnimatorNone::Bounce) {
371 EXPECT_LE(-.0001, velocityDelta);
375 double area = attackArea(curve, 0, t / time) * kPosition;
377 EXPECT_NEAR(accumulate, area, 1.0);
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;
389 accumulate -= (kPosition - (oldPos + newPos) / 2) * (step / time);
391 oldVelocity = velocity;
392 if (curve != ScrollAnimatorNone::Bounce) {
393 EXPECT_GE(0.01, velocityDelta);
397 double area = releaseArea(curve, t / time, 1) * kPosition;
399 EXPECT_NEAR(accumulate, area, 1.0);
403 void ScrollAnimatorNoneTest::curveTest(ScrollAnimatorNone::Curve curve)
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);
412 void ScrollAnimatorNoneTest::checkDesiredPosition(float expectedPosition)
414 EXPECT_EQ(expectedPosition, m_data->m_desiredPosition);
417 void ScrollAnimatorNoneTest::checkSoftLanding(float expectedPosition)
419 EXPECT_EQ(expectedPosition, m_currentPosition);
420 EXPECT_LE(m_data->m_desiredVelocity / 2, m_data->m_currentVelocity);
423 TEST_F(ScrollAnimatorNoneTest, CurveMathLinear)
425 curveTest(ScrollAnimatorNone::Linear);
428 TEST_F(ScrollAnimatorNoneTest, CurveMathQuadratic)
430 curveTest(ScrollAnimatorNone::Quadratic);
433 TEST_F(ScrollAnimatorNoneTest, CurveMathCubic)
435 curveTest(ScrollAnimatorNone::Cubic);
438 TEST_F(ScrollAnimatorNoneTest, CurveMathQuartic)
440 curveTest(ScrollAnimatorNone::Quartic);
443 TEST_F(ScrollAnimatorNoneTest, CurveMathBounce)
445 curveTest(ScrollAnimatorNone::Bounce);
448 TEST_F(ScrollAnimatorNoneTest, CurveMathCoast)
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));
460 TEST_F(ScrollAnimatorNoneTest, ScrollOnceLinear)
462 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
464 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
466 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
467 result = animateScroll(t);
470 TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuadratic)
472 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
474 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
476 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
477 result = animateScroll(t);
480 TEST_F(ScrollAnimatorNoneTest, ScrollLongQuadratic)
482 ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
484 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
486 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
487 result = animateScroll(t);
490 TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticNoSustain)
492 ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Linear, 0);
494 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
496 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
497 result = animateScroll(t);
500 TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticSmoothed)
502 ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Linear, 0);
504 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
506 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
507 result = animateScroll(t);
510 TEST_F(ScrollAnimatorNoneTest, ScrollOnceCubic)
512 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
514 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
516 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
517 result = animateScroll(t);
520 TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuartic)
522 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quartic, 3 * kTickTime, ScrollAnimatorNone::Quartic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
524 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
526 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
527 result = animateScroll(t);
530 TEST_F(ScrollAnimatorNoneTest, ScrollOnceShort)
532 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
534 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
536 for (double t = kStartTime; result && t < kEndTime; t += kTickTime)
537 result = animateScroll(t);
540 TEST_F(ScrollAnimatorNoneTest, ScrollTwiceQuadratic)
542 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
544 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
547 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
548 result = animateScroll(t);
550 result = result && animateScroll(t);
551 double before = m_currentPosition;
552 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
553 result = result && animateScroll(t);
554 double after = m_currentPosition;
555 EXPECT_NEAR(before, after, 10);
559 result = result && animateScroll(t);
560 before = m_currentPosition;
561 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
562 result = result && animateScroll(t);
563 after = m_currentPosition;
564 EXPECT_NEAR(before, after, 10);
567 for (; result && t < kEndTime; t += kAnimationTime)
568 result = animateScroll(t);
571 TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadratic)
573 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
575 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
578 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
579 result = animateScroll(t);
581 for (int i = 0; i < 20; ++i) {
583 result = result && animateScroll(t);
584 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
588 for (; result && t < kEndTime; t += kAnimationTime)
589 result = result && animateScroll(t);
592 TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadraticSmoothed)
594 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
596 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
599 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
600 result = animateScroll(t);
602 for (int i = 0; i < 20; ++i) {
604 result = result && animateScroll(t);
605 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
609 for (; result && t < kEndTime; t += kAnimationTime)
610 result = result && animateScroll(t);
613 TEST_F(ScrollAnimatorNoneTest, ScrollTwiceCubic)
615 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
617 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
620 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
621 result = animateScroll(t);
623 result = result && animateScroll(t);
624 double before = m_currentPosition;
625 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
626 result = result && animateScroll(t);
627 double after = m_currentPosition;
628 EXPECT_NEAR(before, after, 10);
632 result = result && animateScroll(t);
633 before = m_currentPosition;
634 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
635 result = result && animateScroll(t);
636 after = m_currentPosition;
637 EXPECT_NEAR(before, after, 10);
640 for (; result && t < kEndTime; t += kAnimationTime)
641 result = animateScroll(t);
644 TEST_F(ScrollAnimatorNoneTest, ScrollLotsCubic)
646 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
648 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
651 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
652 result = animateScroll(t);
654 for (int i = 0; i < 20; ++i) {
656 result = result && animateScroll(t);
657 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
661 for (; result && t < kEndTime; t += kAnimationTime)
662 result = result && animateScroll(t);
665 TEST_F(ScrollAnimatorNoneTest, ScrollLotsCubicSmoothed)
667 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
669 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
672 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
673 result = animateScroll(t);
675 for (int i = 0; i < 20; ++i) {
677 result = result && animateScroll(t);
678 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
682 for (; result && t < kEndTime; t += kAnimationTime)
683 result = result && animateScroll(t);
686 TEST_F(ScrollAnimatorNoneTest, ScrollWheelTrace)
688 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
690 // Constructed from an actual scroll wheel trace that exhibited a glitch.
691 bool result = updateDataFromParameters(1, 53.33f, 1000, 100.5781f, ¶meters);
692 result = animateScroll(100.5933);
693 result = result && animateScroll(100.6085);
694 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6485f, ¶meters);
695 result = result && animateScroll(100.6515);
696 result = result && animateScroll(100.6853);
697 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6863f, ¶meters);
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, ¶meters);
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, ¶meters);
706 for (double t = 100.7928; result && t < 200; t += 0.015)
707 result = result && animateScroll(t);
710 TEST_F(ScrollAnimatorNoneTest, ScrollWheelTraceSmoothed)
712 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
714 // Constructed from an actual scroll wheel trace that exhibited a glitch.
715 bool result = updateDataFromParameters(1, 53.33f, 1000, 100.5781f, ¶meters);
716 result = animateScroll(100.5933);
717 result = result && animateScroll(100.6085);
718 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6485f, ¶meters);
719 result = result && animateScroll(100.6515);
720 result = result && animateScroll(100.6853);
721 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6863f, ¶meters);
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, ¶meters);
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, ¶meters);
730 for (double t = 100.7928; result && t < 200; t += 0.015)
731 result = result && animateScroll(t);
734 TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTrace)
736 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
738 bool result = updateDataFromParameters(1.00, 60.00, 1000, 100.6863, ¶meters);
739 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.6897, ¶meters);
740 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7001, ¶meters);
741 result = result && animateScroll(100.7015);
742 result = result && animateScroll(100.7169);
743 result = result && updateDataFromParameters(1.00, 40.00, 1000, 100.7179, ¶meters);
744 result = result && animateScroll(100.7322);
745 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7332, ¶meters);
746 result = result && animateScroll(100.7491);
747 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7519, ¶meters);
748 result = result && animateScroll(100.7676);
749 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7698, ¶meters);
750 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7830, ¶meters);
751 result = result && animateScroll(100.7834);
752 result = result && animateScroll(100.7997);
753 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8019, ¶meters);
754 result = result && animateScroll(100.8154);
755 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8241, ¶meters);
756 result = result && animateScroll(100.8335);
757 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8465, ¶meters);
758 result = result && animateScroll(100.8513);
759 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8623, ¶meters);
760 for (double t = 100.8674; result && t < 200; t += 0.015)
761 result = result && animateScroll(t);
764 TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTraceSmoothed)
766 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
768 bool result = updateDataFromParameters(1.00, 60.00, 1000, 100.6863, ¶meters);
769 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.6897, ¶meters);
770 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7001, ¶meters);
771 result = result && animateScroll(100.7015);
772 result = result && animateScroll(100.7169);
773 result = result && updateDataFromParameters(1.00, 40.00, 1000, 100.7179, ¶meters);
774 result = result && animateScroll(100.7322);
775 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7332, ¶meters);
776 result = result && animateScroll(100.7491);
777 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7519, ¶meters);
778 result = result && animateScroll(100.7676);
779 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7698, ¶meters);
780 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7830, ¶meters);
781 result = result && animateScroll(100.7834);
782 result = result && animateScroll(100.7997);
783 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8019, ¶meters);
784 result = result && animateScroll(100.8154);
785 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8241, ¶meters);
786 result = result && animateScroll(100.8335);
787 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8465, ¶meters);
788 result = result && animateScroll(100.8513);
789 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8623, ¶meters);
790 for (double t = 100.8674; result && t < 200; t += 0.015)
791 result = result && animateScroll(t);
794 TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumper)
796 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
798 EXPECT_TRUE(updateDataFromParameters(1, 20, 200, kStartTime, ¶meters));
800 double t = kStartTime;
801 for (int i = 0; i < 10; ++i) {
803 result = result && animateScroll(t);
804 updateDataFromParameters(1, 20, 200, t, ¶meters);
806 checkDesiredPosition(200);
809 for (; result && t < kEndTime; t += kAnimationTime)
810 result = result && animateScroll(t);
811 checkSoftLanding(200);
814 TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumper)
816 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
818 EXPECT_TRUE(updateDataFromParameters(1, -20, 200, kStartTime, ¶meters));
820 double t = kStartTime;
821 for (int i = 0; i < 10; ++i) {
823 result = result && animateScroll(t);
824 updateDataFromParameters(1, -20, 200, t, ¶meters);
826 checkDesiredPosition(0);
829 for (; result && t < kEndTime; t += kAnimationTime)
830 result = result && animateScroll(t);
834 TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumperCoast)
836 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 2 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 1);
838 m_currentPosition = 40000;
839 EXPECT_TRUE(updateDataFromParameters(1, -10000, 50000, kStartTime, ¶meters));
841 double t = kStartTime;
842 for (int i = 0; i < 10; ++i) {
844 result = result && animateScroll(t);
845 updateDataFromParameters(1, -10000, 50000, t, ¶meters);
847 checkDesiredPosition(0);
850 for (; result && t < kEndTime; t += kAnimationTime)
851 result = result && animateScroll(t);
855 TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumperCoast)
857 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 2 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 1);
859 m_currentPosition = 10000;
860 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
862 double t = kStartTime;
863 for (int i = 0; i < 10; ++i) {
865 result = result && animateScroll(t);
866 updateDataFromParameters(1, 10000, 50000, t, ¶meters);
868 checkDesiredPosition(50000);
871 for (; result && t < kEndTime; t += kAnimationTime)
872 result = result && animateScroll(t);
873 checkSoftLanding(50000);
876 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalency)
878 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 0);
881 EXPECT_TRUE(updateDataFromParameters(1, 300, 50000, kStartTime, ¶meters));
882 SavePerAxisData dataSingle(*m_data);
885 EXPECT_TRUE(updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters));
886 EXPECT_TRUE(updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters));
887 SavePerAxisData dataDouble(*m_data);
890 EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters));
891 EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters));
892 EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters));
893 SavePerAxisData dataTriple(*m_data);
896 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
897 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
898 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
899 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
900 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
901 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
902 SavePerAxisData dataMany(*m_data);
904 EXPECT_EQ(dataSingle, dataDouble);
905 EXPECT_EQ(dataSingle, dataTriple);
906 EXPECT_EQ(dataSingle, dataMany);
909 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoast)
911 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 1);
914 updateDataFromParameters(1, 300, 50000, kStartTime, ¶meters);
915 SavePerAxisData dataSingle(*m_data);
918 updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters);
919 updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters);
920 SavePerAxisData dataDouble(*m_data);
923 updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters);
924 updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters);
925 updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters);
926 SavePerAxisData dataTriple(*m_data);
929 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
930 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
931 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
932 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
933 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
934 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
935 SavePerAxisData dataMany(*m_data);
937 EXPECT_EQ(dataSingle, dataDouble);
938 EXPECT_EQ(dataSingle, dataTriple);
939 EXPECT_EQ(dataSingle, dataMany);
942 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoastLarge)
944 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 1);
947 EXPECT_TRUE(updateDataFromParameters(1, 30000, 50000, kStartTime, ¶meters));
948 SavePerAxisData dataSingle(*m_data);
951 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
952 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
953 SavePerAxisData dataDouble(*m_data);
956 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
957 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
958 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
959 SavePerAxisData dataTriple(*m_data);
962 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
963 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
964 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
965 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
966 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
967 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
968 SavePerAxisData dataMany(*m_data);
970 EXPECT_EQ(dataSingle, dataDouble);
971 EXPECT_EQ(dataSingle, dataTriple);
972 EXPECT_EQ(dataSingle, dataMany);
975 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoastSteep)
977 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Quadratic, 1);
980 EXPECT_TRUE(updateDataFromParameters(1, 30000, 50000, kStartTime, ¶meters));
981 SavePerAxisData dataSingle(*m_data);
984 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
985 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
986 SavePerAxisData dataDouble(*m_data);
989 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
990 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
991 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
992 SavePerAxisData dataTriple(*m_data);
995 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
996 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
997 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
998 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
999 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
1000 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
1001 SavePerAxisData dataMany(*m_data);
1003 EXPECT_EQ(dataSingle, dataDouble);
1004 EXPECT_EQ(dataSingle, dataTriple);
1005 EXPECT_EQ(dataSingle, dataMany);
1008 TEST_F(ScrollAnimatorNoneTest, ScrollStopInMiddle)
1010 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
1012 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
1015 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
1016 result = animateScroll(t);
1018 result = result && animateScroll(t);
1019 EXPECT_TRUE(result);
1020 double before = m_currentPosition;
1021 result = result && updateDataFromParameters(0, 0, 1000, t, ¶meters);
1022 EXPECT_FALSE(result);
1023 result = result && animateScroll(t);
1024 double after = m_currentPosition;
1025 EXPECT_EQ(before, after);
1026 checkDesiredPosition(after);
1029 TEST_F(ScrollAnimatorNoneTest, ReverseInMiddle)
1031 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
1033 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
1036 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
1037 result = animateScroll(t);
1039 result = result && animateScroll(t);
1040 EXPECT_TRUE(result);
1041 double before = m_currentPosition;
1042 result = result && updateDataFromParameters(1, -10, 1000, t, ¶meters);
1043 EXPECT_TRUE(result);
1044 result = result && animateScroll(t);
1045 double after = m_currentPosition;
1046 EXPECT_GE(before, after);
1048 t += kAnimationTime;
1049 for (; result && t < kEndTime; t += kAnimationTime)
1050 result = result && animateScroll(t);
1051 EXPECT_GE(before, m_currentPosition);