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>
41 using namespace WebCore;
43 using testing::AtLeast;
44 using testing::Return;
47 class MockScrollableArea : public ScrollableArea {
49 MockScrollableArea(bool scrollAnimatorEnabled)
50 : m_scrollAnimatorEnabled(scrollAnimatorEnabled) { }
52 MOCK_CONST_METHOD0(isActive, bool());
53 MOCK_CONST_METHOD1(scrollSize, int(ScrollbarOrientation));
54 MOCK_METHOD2(invalidateScrollbar, void(Scrollbar*, const IntRect&));
55 MOCK_CONST_METHOD0(isScrollCornerVisible, bool());
56 MOCK_CONST_METHOD0(scrollCornerRect, IntRect());
57 MOCK_METHOD1(setScrollOffset, void(const IntPoint&));
58 MOCK_METHOD2(invalidateScrollbarRect, void(Scrollbar*, const IntRect&));
59 MOCK_METHOD1(invalidateScrollCornerRect, void(const IntRect&));
60 MOCK_METHOD1(setScrollOffsetFromAnimation, void(const IntPoint&));
61 MOCK_CONST_METHOD0(enclosingScrollableArea, ScrollableArea*());
62 MOCK_CONST_METHOD0(minimumScrollPosition, IntPoint());
63 MOCK_CONST_METHOD0(maximumScrollPosition, IntPoint());
64 MOCK_CONST_METHOD1(visibleContentRect, IntRect(IncludeScrollbarsInRect));
65 MOCK_CONST_METHOD0(contentsSize, IntSize());
66 MOCK_CONST_METHOD0(overhangAmount, IntSize());
67 MOCK_CONST_METHOD0(scrollbarsCanBeActive, bool());
68 MOCK_CONST_METHOD0(scrollableAreaBoundingBox, IntRect());
70 virtual bool userInputScrollable(ScrollbarOrientation) const OVERRIDE { return true; }
71 virtual bool shouldPlaceVerticalScrollbarOnLeft() const OVERRIDE { return false; }
72 virtual IntPoint scrollPosition() const OVERRIDE { return IntPoint(); }
73 virtual int visibleHeight() const OVERRIDE { return 768; }
74 virtual int visibleWidth() const OVERRIDE { return 1024; }
75 virtual bool scrollAnimatorEnabled() const OVERRIDE { return m_scrollAnimatorEnabled; }
76 virtual int pageStep(ScrollbarOrientation) const OVERRIDE { return 0; }
79 bool m_scrollAnimatorEnabled;
82 class MockScrollAnimatorNone : public ScrollAnimatorNone {
84 MockScrollAnimatorNone(ScrollableArea* scrollableArea)
85 : ScrollAnimatorNone(scrollableArea) { }
87 float currentX() { return m_currentPosX; }
88 float currentY() { return m_currentPosY; }
95 stopAnimationTimerIfNeeded();
98 m_horizontalData.reset();
99 m_verticalData.reset();
100 m_fp = FloatPoint::zero();
104 virtual void fireUpAnAnimation(FloatPoint fp)
110 MOCK_METHOD1(scrollToOffsetWithoutAnimation, void(const FloatPoint&));
113 TEST(ScrollAnimatorEnabled, Enabled)
115 MockScrollableArea scrollableArea(true);
116 MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea);
118 EXPECT_CALL(scrollableArea, scrollSize(_)).Times(AtLeast(1)).WillRepeatedly(Return(1000));
119 EXPECT_CALL(scrollableArea, minimumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint()));
120 EXPECT_CALL(scrollableArea, maximumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint(1000, 1000)));
121 EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times(4);
123 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);
124 EXPECT_NE(100, scrollAnimatorNone.currentX());
125 EXPECT_NE(0, scrollAnimatorNone.currentX());
126 EXPECT_EQ(0, scrollAnimatorNone.currentY());
127 scrollAnimatorNone.reset();
129 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);
130 EXPECT_NE(100, scrollAnimatorNone.currentX());
131 EXPECT_NE(0, scrollAnimatorNone.currentX());
132 EXPECT_EQ(0, scrollAnimatorNone.currentY());
133 scrollAnimatorNone.reset();
135 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 4, 25);
136 EXPECT_NE(100, scrollAnimatorNone.currentX());
137 EXPECT_NE(0, scrollAnimatorNone.currentX());
138 EXPECT_EQ(0, scrollAnimatorNone.currentY());
139 scrollAnimatorNone.reset();
141 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPrecisePixel, 4, 25);
142 EXPECT_EQ(100, scrollAnimatorNone.currentX());
143 EXPECT_NE(0, scrollAnimatorNone.currentX());
144 EXPECT_EQ(0, scrollAnimatorNone.currentY());
145 scrollAnimatorNone.reset();
148 TEST(ScrollAnimatorEnabled, Disabled)
150 MockScrollableArea scrollableArea(false);
151 MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea);
153 EXPECT_CALL(scrollableArea, minimumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint()));
154 EXPECT_CALL(scrollableArea, maximumScrollPosition()).Times(AtLeast(1)).WillRepeatedly(Return(IntPoint(1000, 1000)));
155 EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times(4);
157 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);
158 EXPECT_EQ(100, scrollAnimatorNone.currentX());
159 EXPECT_EQ(0, scrollAnimatorNone.currentY());
160 scrollAnimatorNone.reset();
162 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);
163 EXPECT_EQ(100, scrollAnimatorNone.currentX());
164 EXPECT_EQ(0, scrollAnimatorNone.currentY());
165 scrollAnimatorNone.reset();
167 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByDocument, 100, 1);
168 EXPECT_EQ(100, scrollAnimatorNone.currentX());
169 EXPECT_EQ(0, scrollAnimatorNone.currentY());
170 scrollAnimatorNone.reset();
172 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 100, 1);
173 EXPECT_EQ(100, scrollAnimatorNone.currentX());
174 EXPECT_EQ(0, scrollAnimatorNone.currentY());
175 scrollAnimatorNone.reset();
178 class ScrollAnimatorNoneTest : public testing::Test {
180 struct SavePerAxisData : public ScrollAnimatorNone::PerAxisData {
181 SavePerAxisData(const ScrollAnimatorNone::PerAxisData& data)
182 : ScrollAnimatorNone::PerAxisData(&m_mockScrollAnimatorNone, 0, 768)
183 , m_mockScrollableArea(true)
184 , m_mockScrollAnimatorNone(&m_mockScrollableArea)
186 this->m_currentVelocity = data.m_currentVelocity;
187 this->m_desiredPosition = data.m_desiredPosition;
188 this->m_desiredVelocity = data.m_desiredVelocity;
189 this->m_startPosition = data.m_startPosition;
190 this->m_startTime = data.m_startTime;
191 this->m_startVelocity = data.m_startVelocity;
192 this->m_animationTime = data.m_animationTime;
193 this->m_lastAnimationTime = data.m_lastAnimationTime;
194 this->m_attackPosition = data.m_attackPosition;
195 this->m_attackTime = data.m_attackTime;
196 this->m_attackCurve = data.m_attackCurve;
197 this->m_releasePosition = data.m_releasePosition;
198 this->m_releaseTime = data.m_releaseTime;
199 this->m_releaseCurve = data.m_releaseCurve;
202 bool operator==(const SavePerAxisData& other) const
204 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;
206 MockScrollableArea m_mockScrollableArea;
207 MockScrollAnimatorNone m_mockScrollAnimatorNone;
210 ScrollAnimatorNoneTest()
211 : m_mockScrollableArea(true)
212 , m_mockScrollAnimatorNone(&m_mockScrollableArea)
218 m_currentPosition = 100;
219 m_data = new ScrollAnimatorNone::PerAxisData(&m_mockScrollAnimatorNone, &m_currentPosition, 768);
221 virtual void TearDown()
227 bool updateDataFromParameters(float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters*);
228 bool animateScroll(double currentTime);
230 double attackArea(ScrollAnimatorNone::Curve, double startT, double endT);
231 double releaseArea(ScrollAnimatorNone::Curve, double startT, double endT);
232 double attackCurve(ScrollAnimatorNone::Curve, double deltaT, double curveT, double startPosition, double attackPosition);
233 double releaseCurve(ScrollAnimatorNone::Curve, double deltaT, double curveT, double releasePosition, double desiredPosition);
234 double coastCurve(ScrollAnimatorNone::Curve, double factor);
236 void curveTestInner(ScrollAnimatorNone::Curve, double step, double time);
237 void curveTest(ScrollAnimatorNone::Curve);
239 void checkDesiredPosition(float expectedPosition);
240 void checkSoftLanding(float expectedPosition);
242 static double kTickTime;
243 static double kAnimationTime;
244 static double kStartTime;
245 static double kEndTime;
246 float m_currentPosition;
247 MockScrollableArea m_mockScrollableArea;
248 MockScrollAnimatorNone m_mockScrollAnimatorNone;
249 bool m_scrollingDown;
250 ScrollAnimatorNone::PerAxisData* m_data;
253 double ScrollAnimatorNoneTest::kTickTime = 1 / 60.0;
254 double ScrollAnimatorNoneTest::kAnimationTime = 0.01;
255 double ScrollAnimatorNoneTest::kStartTime = 10.0;
256 double ScrollAnimatorNoneTest::kEndTime = 20.0;
258 void ScrollAnimatorNoneTest::reset()
261 m_scrollingDown = true;
264 bool ScrollAnimatorNoneTest::updateDataFromParameters(float step, float multiplier, float scrollableSize, double currentTime, ScrollAnimatorNone::Parameters* parameters)
266 if (step * multiplier)
267 m_scrollingDown = (step * multiplier > 0);
269 double oldVelocity = m_data->m_currentVelocity;
270 double oldDesiredVelocity = m_data->m_desiredVelocity;
271 double oldTimeLeft = m_data->m_animationTime - (m_data->m_lastAnimationTime - m_data->m_startTime);
272 bool result = m_data->updateDataFromParameters(step, multiplier, scrollableSize, currentTime, parameters);
274 EXPECT_LE(oldVelocity, m_data->m_currentVelocity);
276 EXPECT_GE(oldVelocity, m_data->m_currentVelocity);
278 double deltaTime = m_data->m_lastAnimationTime - m_data->m_startTime;
279 double timeLeft = m_data->m_animationTime - deltaTime;
280 double releaseTimeLeft = min(timeLeft, m_data->m_releaseTime);
281 double attackTimeLeft = max(0., m_data->m_attackTime - deltaTime);
282 double sustainTimeLeft = max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
284 // If we're getting near the finish, the desired velocity can decrease since the time left gets increased.
285 if (step * multiplier) {
286 double allowedVelocityDecreaseFactor = 0.99 * oldTimeLeft / timeLeft;
287 allowedVelocityDecreaseFactor *= allowedVelocityDecreaseFactor;
289 EXPECT_LE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
291 EXPECT_GE(oldDesiredVelocity * allowedVelocityDecreaseFactor, m_data->m_desiredVelocity);
293 double startPosition = attackTimeLeft ? m_data->m_attackPosition : m_currentPosition;
294 double expectedReleasePosition = startPosition + sustainTimeLeft * m_data->m_desiredVelocity;
295 EXPECT_NEAR(expectedReleasePosition, m_data->m_releasePosition, result ? .0001 : 1);
301 bool ScrollAnimatorNoneTest::animateScroll(double currentTime)
303 double oldPosition = *m_data->m_currentPosition;
304 bool testEstimatedMaxVelocity = m_data->m_startTime + m_data->m_animationTime - m_data->m_lastAnimationTime > m_data->m_releaseTime;
306 bool result = m_data->animateScroll(currentTime);
308 double deltaTime = m_data->m_lastAnimationTime - m_data->m_startTime;
309 double timeLeft = m_data->m_animationTime - deltaTime;
310 double releaseTimeLeft = min(timeLeft, m_data->m_releaseTime);
311 double attackTimeLeft = max(0., m_data->m_attackTime - deltaTime);
312 double sustainTimeLeft = max(0., timeLeft - releaseTimeLeft - attackTimeLeft);
313 double distanceLeft = m_data->m_desiredPosition - *m_data->m_currentPosition;
315 if (m_scrollingDown) {
316 EXPECT_LE(0, m_data->m_currentVelocity);
317 EXPECT_LE(oldPosition, *m_data->m_currentPosition);
319 EXPECT_GE(0, m_data->m_currentVelocity);
320 EXPECT_GE(oldPosition, *m_data->m_currentPosition);
322 EXPECT_GE(fabs(m_data->m_desiredVelocity) * 2, fabs(m_data->m_currentVelocity));
323 if (testEstimatedMaxVelocity)
324 EXPECT_GE(fabs(distanceLeft / sustainTimeLeft) * 1.2, fabs(m_data->m_currentVelocity));
329 double ScrollAnimatorNoneTest::attackArea(ScrollAnimatorNone::Curve curve, double startT, double endT)
331 return ScrollAnimatorNone::PerAxisData::attackArea(curve, startT, endT);
334 double ScrollAnimatorNoneTest::releaseArea(ScrollAnimatorNone::Curve curve, double startT, double endT)
336 return ScrollAnimatorNone::PerAxisData::releaseArea(curve, startT, endT);
339 double ScrollAnimatorNoneTest::attackCurve(ScrollAnimatorNone::Curve curve, double deltaT, double curveT, double startPosition, double attackPosition)
341 return ScrollAnimatorNone::PerAxisData::attackCurve(curve, deltaT, curveT, startPosition, attackPosition);
344 double ScrollAnimatorNoneTest::releaseCurve(ScrollAnimatorNone::Curve curve, double deltaT, double curveT, double releasePosition, double desiredPosition)
346 return ScrollAnimatorNone::PerAxisData::releaseCurve(curve, deltaT, curveT, releasePosition, desiredPosition);
349 double ScrollAnimatorNoneTest::coastCurve(ScrollAnimatorNone::Curve curve, double factor)
351 return ScrollAnimatorNone::PerAxisData::coastCurve(curve, factor);
354 void ScrollAnimatorNoneTest::curveTestInner(ScrollAnimatorNone::Curve curve, double step, double time)
356 const double kPosition = 1000;
359 double oldVelocity = 0;
360 double accumulate = 0;
362 for (double t = step ; t <= time ; t += step) {
363 double newPos = attackCurve(curve, t, time, 0, kPosition);
364 double delta = newPos - oldPos;
365 double velocity = delta / step;
366 double velocityDelta = velocity - oldVelocity;
368 accumulate += (oldPos + newPos) / 2 * (step / time);
370 oldVelocity = velocity;
371 if (curve != ScrollAnimatorNone::Bounce) {
372 EXPECT_LE(-.0001, velocityDelta);
376 double area = attackArea(curve, 0, t / time) * kPosition;
378 EXPECT_NEAR(accumulate, area, 1.0);
383 accumulate = releaseArea(curve, 0, 1) * kPosition;
384 for (double t = step ; t <= time ; t += step) {
385 double newPos = releaseCurve(curve, t, time, 0, kPosition);
386 double delta = newPos - oldPos;
387 double velocity = delta / step;
388 double velocityDelta = velocity - oldVelocity;
390 accumulate -= (kPosition - (oldPos + newPos) / 2) * (step / time);
392 oldVelocity = velocity;
393 if (curve != ScrollAnimatorNone::Bounce) {
394 EXPECT_GE(0.01, velocityDelta);
398 double area = releaseArea(curve, t / time, 1) * kPosition;
400 EXPECT_NEAR(accumulate, area, 1.0);
404 void ScrollAnimatorNoneTest::curveTest(ScrollAnimatorNone::Curve curve)
406 curveTestInner(curve, 0.01, 0.25);
407 curveTestInner(curve, 0.2, 10);
408 curveTestInner(curve, 0.025, 10);
409 curveTestInner(curve, 0.01, 1);
410 curveTestInner(curve, 0.25, 40);
413 void ScrollAnimatorNoneTest::checkDesiredPosition(float expectedPosition)
415 EXPECT_EQ(expectedPosition, m_data->m_desiredPosition);
418 void ScrollAnimatorNoneTest::checkSoftLanding(float expectedPosition)
420 EXPECT_EQ(expectedPosition, m_currentPosition);
421 EXPECT_LE(m_data->m_desiredVelocity / 2, m_data->m_currentVelocity);
424 TEST_F(ScrollAnimatorNoneTest, CurveMathLinear)
426 curveTest(ScrollAnimatorNone::Linear);
429 TEST_F(ScrollAnimatorNoneTest, CurveMathQuadratic)
431 curveTest(ScrollAnimatorNone::Quadratic);
434 TEST_F(ScrollAnimatorNoneTest, CurveMathCubic)
436 curveTest(ScrollAnimatorNone::Cubic);
439 TEST_F(ScrollAnimatorNoneTest, CurveMathQuartic)
441 curveTest(ScrollAnimatorNone::Quartic);
444 TEST_F(ScrollAnimatorNoneTest, CurveMathBounce)
446 curveTest(ScrollAnimatorNone::Bounce);
449 TEST_F(ScrollAnimatorNoneTest, CurveMathCoast)
451 for (double t = .25; t < 1; t += .25) {
452 EXPECT_EQ(t, coastCurve(ScrollAnimatorNone::Linear, t));
453 EXPECT_LT(t, coastCurve(ScrollAnimatorNone::Quadratic, t));
454 EXPECT_LT(t, coastCurve(ScrollAnimatorNone::Cubic, t));
455 EXPECT_LT(coastCurve(ScrollAnimatorNone::Quadratic, t), coastCurve(ScrollAnimatorNone::Cubic, t));
456 EXPECT_LT(t, coastCurve(ScrollAnimatorNone::Quartic, t));
457 EXPECT_LT(coastCurve(ScrollAnimatorNone::Cubic, t), coastCurve(ScrollAnimatorNone::Quartic, t));
461 TEST_F(ScrollAnimatorNoneTest, ScrollOnceLinear)
463 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
465 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
467 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
468 result = animateScroll(t);
471 TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuadratic)
473 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
475 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
477 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
478 result = animateScroll(t);
481 TEST_F(ScrollAnimatorNoneTest, ScrollLongQuadratic)
483 ScrollAnimatorNone::Parameters parameters(true, 20 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
485 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
487 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
488 result = animateScroll(t);
491 TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticNoSustain)
493 ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Linear, 0);
495 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
497 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
498 result = animateScroll(t);
501 TEST_F(ScrollAnimatorNoneTest, ScrollQuadraticSmoothed)
503 ScrollAnimatorNone::Parameters parameters(true, 8 * kTickTime, 8 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Quadratic, 4 * kTickTime, ScrollAnimatorNone::Linear, 0);
505 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
507 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
508 result = animateScroll(t);
511 TEST_F(ScrollAnimatorNoneTest, ScrollOnceCubic)
513 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
515 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
517 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
518 result = animateScroll(t);
521 TEST_F(ScrollAnimatorNoneTest, ScrollOnceQuartic)
523 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quartic, 3 * kTickTime, ScrollAnimatorNone::Quartic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
525 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
527 for (double t = kStartTime; result && t < kEndTime; t += kAnimationTime)
528 result = animateScroll(t);
531 TEST_F(ScrollAnimatorNoneTest, ScrollOnceShort)
533 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
535 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
537 for (double t = kStartTime; result && t < kEndTime; t += kTickTime)
538 result = animateScroll(t);
541 TEST_F(ScrollAnimatorNoneTest, ScrollTwiceQuadratic)
543 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
545 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
548 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
549 result = animateScroll(t);
551 result = result && animateScroll(t);
552 double before = m_currentPosition;
553 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
554 result = result && animateScroll(t);
555 double after = m_currentPosition;
556 EXPECT_NEAR(before, after, 10);
560 result = result && animateScroll(t);
561 before = m_currentPosition;
562 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
563 result = result && animateScroll(t);
564 after = m_currentPosition;
565 EXPECT_NEAR(before, after, 10);
568 for (; result && t < kEndTime; t += kAnimationTime)
569 result = animateScroll(t);
572 TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadratic)
574 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
576 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
579 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
580 result = animateScroll(t);
582 for (int i = 0; i < 20; ++i) {
584 result = result && animateScroll(t);
585 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
589 for (; result && t < kEndTime; t += kAnimationTime)
590 result = result && animateScroll(t);
593 TEST_F(ScrollAnimatorNoneTest, ScrollLotsQuadraticSmoothed)
595 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Quadratic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
597 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
600 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
601 result = animateScroll(t);
603 for (int i = 0; i < 20; ++i) {
605 result = result && animateScroll(t);
606 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
610 for (; result && t < kEndTime; t += kAnimationTime)
611 result = result && animateScroll(t);
614 TEST_F(ScrollAnimatorNoneTest, ScrollTwiceCubic)
616 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
618 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
621 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
622 result = animateScroll(t);
624 result = result && animateScroll(t);
625 double before = m_currentPosition;
626 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
627 result = result && animateScroll(t);
628 double after = m_currentPosition;
629 EXPECT_NEAR(before, after, 10);
633 result = result && animateScroll(t);
634 before = m_currentPosition;
635 result = result && updateDataFromParameters(1, 40, 1000, t, ¶meters);
636 result = result && animateScroll(t);
637 after = m_currentPosition;
638 EXPECT_NEAR(before, after, 10);
641 for (; result && t < kEndTime; t += kAnimationTime)
642 result = animateScroll(t);
645 TEST_F(ScrollAnimatorNoneTest, ScrollLotsCubic)
647 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
649 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
652 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
653 result = animateScroll(t);
655 for (int i = 0; i < 20; ++i) {
657 result = result && animateScroll(t);
658 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
662 for (; result && t < kEndTime; t += kAnimationTime)
663 result = result && animateScroll(t);
666 TEST_F(ScrollAnimatorNoneTest, ScrollLotsCubicSmoothed)
668 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 6 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
670 EXPECT_TRUE(updateDataFromParameters(1, 40, 10000, kStartTime, ¶meters));
673 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
674 result = animateScroll(t);
676 for (int i = 0; i < 20; ++i) {
678 result = result && animateScroll(t);
679 result = result && updateDataFromParameters(3, 40, 10000, t, ¶meters);
683 for (; result && t < kEndTime; t += kAnimationTime)
684 result = result && animateScroll(t);
687 TEST_F(ScrollAnimatorNoneTest, ScrollWheelTrace)
689 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
691 // Constructed from an actual scroll wheel trace that exhibited a glitch.
692 bool result = updateDataFromParameters(1, 53.33f, 1000, 100.5781f, ¶meters);
693 result = animateScroll(100.5933);
694 result = result && animateScroll(100.6085);
695 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6485f, ¶meters);
696 result = result && animateScroll(100.6515);
697 result = result && animateScroll(100.6853);
698 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6863f, ¶meters);
699 result = result && animateScroll(100.7005);
700 result = result && animateScroll(100.7157);
701 result = result && animateScroll(100.7312);
702 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7379f, ¶meters);
703 result = result && animateScroll(100.7464);
704 result = result && animateScroll(100.7617);
705 result = result && animateScroll(100.7775);
706 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7779f, ¶meters);
707 for (double t = 100.7928; result && t < 200; t += 0.015)
708 result = result && animateScroll(t);
711 TEST_F(ScrollAnimatorNoneTest, ScrollWheelTraceSmoothed)
713 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
715 // Constructed from an actual scroll wheel trace that exhibited a glitch.
716 bool result = updateDataFromParameters(1, 53.33f, 1000, 100.5781f, ¶meters);
717 result = animateScroll(100.5933);
718 result = result && animateScroll(100.6085);
719 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6485f, ¶meters);
720 result = result && animateScroll(100.6515);
721 result = result && animateScroll(100.6853);
722 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.6863f, ¶meters);
723 result = result && animateScroll(100.7005);
724 result = result && animateScroll(100.7157);
725 result = result && animateScroll(100.7312);
726 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7379f, ¶meters);
727 result = result && animateScroll(100.7464);
728 result = result && animateScroll(100.7617);
729 result = result && animateScroll(100.7775);
730 result = result && updateDataFromParameters(1, 53.33f, 1000, 100.7779f, ¶meters);
731 for (double t = 100.7928; result && t < 200; t += 0.015)
732 result = result && animateScroll(t);
735 TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTrace)
737 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
739 bool result = updateDataFromParameters(1.00, 60.00, 1000, 100.6863, ¶meters);
740 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.6897, ¶meters);
741 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7001, ¶meters);
742 result = result && animateScroll(100.7015);
743 result = result && animateScroll(100.7169);
744 result = result && updateDataFromParameters(1.00, 40.00, 1000, 100.7179, ¶meters);
745 result = result && animateScroll(100.7322);
746 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7332, ¶meters);
747 result = result && animateScroll(100.7491);
748 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7519, ¶meters);
749 result = result && animateScroll(100.7676);
750 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7698, ¶meters);
751 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7830, ¶meters);
752 result = result && animateScroll(100.7834);
753 result = result && animateScroll(100.7997);
754 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8019, ¶meters);
755 result = result && animateScroll(100.8154);
756 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8241, ¶meters);
757 result = result && animateScroll(100.8335);
758 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8465, ¶meters);
759 result = result && animateScroll(100.8513);
760 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8623, ¶meters);
761 for (double t = 100.8674; result && t < 200; t += 0.015)
762 result = result && animateScroll(t);
765 TEST_F(ScrollAnimatorNoneTest, LinuxTrackPadTraceSmoothed)
767 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
769 bool result = updateDataFromParameters(1.00, 60.00, 1000, 100.6863, ¶meters);
770 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.6897, ¶meters);
771 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7001, ¶meters);
772 result = result && animateScroll(100.7015);
773 result = result && animateScroll(100.7169);
774 result = result && updateDataFromParameters(1.00, 40.00, 1000, 100.7179, ¶meters);
775 result = result && animateScroll(100.7322);
776 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7332, ¶meters);
777 result = result && animateScroll(100.7491);
778 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7519, ¶meters);
779 result = result && animateScroll(100.7676);
780 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7698, ¶meters);
781 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.7830, ¶meters);
782 result = result && animateScroll(100.7834);
783 result = result && animateScroll(100.7997);
784 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8019, ¶meters);
785 result = result && animateScroll(100.8154);
786 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8241, ¶meters);
787 result = result && animateScroll(100.8335);
788 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8465, ¶meters);
789 result = result && animateScroll(100.8513);
790 result = result && updateDataFromParameters(1.00, 20.00, 1000, 100.8623, ¶meters);
791 for (double t = 100.8674; result && t < 200; t += 0.015)
792 result = result && animateScroll(t);
795 TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumper)
797 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
799 EXPECT_TRUE(updateDataFromParameters(1, 20, 200, kStartTime, ¶meters));
801 double t = kStartTime;
802 for (int i = 0; i < 10; ++i) {
804 result = result && animateScroll(t);
805 updateDataFromParameters(1, 20, 200, t, ¶meters);
807 checkDesiredPosition(200);
810 for (; result && t < kEndTime; t += kAnimationTime)
811 result = result && animateScroll(t);
812 checkSoftLanding(200);
815 TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumper)
817 ScrollAnimatorNone::Parameters parameters(true, 10 * kTickTime, 7 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
819 EXPECT_TRUE(updateDataFromParameters(1, -20, 200, kStartTime, ¶meters));
821 double t = kStartTime;
822 for (int i = 0; i < 10; ++i) {
824 result = result && animateScroll(t);
825 updateDataFromParameters(1, -20, 200, t, ¶meters);
827 checkDesiredPosition(0);
830 for (; result && t < kEndTime; t += kAnimationTime)
831 result = result && animateScroll(t);
835 TEST_F(ScrollAnimatorNoneTest, ScrollUpToBumperCoast)
837 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 2 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 1);
839 m_currentPosition = 40000;
840 EXPECT_TRUE(updateDataFromParameters(1, -10000, 50000, kStartTime, ¶meters));
842 double t = kStartTime;
843 for (int i = 0; i < 10; ++i) {
845 result = result && animateScroll(t);
846 updateDataFromParameters(1, -10000, 50000, t, ¶meters);
848 checkDesiredPosition(0);
851 for (; result && t < kEndTime; t += kAnimationTime)
852 result = result && animateScroll(t);
856 TEST_F(ScrollAnimatorNoneTest, ScrollDownToBumperCoast)
858 ScrollAnimatorNone::Parameters parameters(true, 11 * kTickTime, 2 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 1);
860 m_currentPosition = 10000;
861 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
863 double t = kStartTime;
864 for (int i = 0; i < 10; ++i) {
866 result = result && animateScroll(t);
867 updateDataFromParameters(1, 10000, 50000, t, ¶meters);
869 checkDesiredPosition(50000);
872 for (; result && t < kEndTime; t += kAnimationTime)
873 result = result && animateScroll(t);
874 checkSoftLanding(50000);
877 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalency)
879 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 0);
882 EXPECT_TRUE(updateDataFromParameters(1, 300, 50000, kStartTime, ¶meters));
883 SavePerAxisData dataSingle(*m_data);
886 EXPECT_TRUE(updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters));
887 EXPECT_TRUE(updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters));
888 SavePerAxisData dataDouble(*m_data);
891 EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters));
892 EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters));
893 EXPECT_TRUE(updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters));
894 SavePerAxisData dataTriple(*m_data);
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 EXPECT_TRUE(updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters));
903 SavePerAxisData dataMany(*m_data);
905 EXPECT_EQ(dataSingle, dataDouble);
906 EXPECT_EQ(dataSingle, dataTriple);
907 EXPECT_EQ(dataSingle, dataMany);
910 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoast)
912 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 1);
915 updateDataFromParameters(1, 300, 50000, kStartTime, ¶meters);
916 SavePerAxisData dataSingle(*m_data);
919 updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters);
920 updateDataFromParameters(1, 150, 50000, kStartTime, ¶meters);
921 SavePerAxisData dataDouble(*m_data);
924 updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters);
925 updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters);
926 updateDataFromParameters(1, 100, 50000, kStartTime, ¶meters);
927 SavePerAxisData dataTriple(*m_data);
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 updateDataFromParameters(1, 50, 50000, kStartTime, ¶meters);
936 SavePerAxisData dataMany(*m_data);
938 EXPECT_EQ(dataSingle, dataDouble);
939 EXPECT_EQ(dataSingle, dataTriple);
940 EXPECT_EQ(dataSingle, dataMany);
943 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoastLarge)
945 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Linear, 1);
948 EXPECT_TRUE(updateDataFromParameters(1, 30000, 50000, kStartTime, ¶meters));
949 SavePerAxisData dataSingle(*m_data);
952 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
953 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
954 SavePerAxisData dataDouble(*m_data);
957 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
958 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
959 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
960 SavePerAxisData dataTriple(*m_data);
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 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
969 SavePerAxisData dataMany(*m_data);
971 EXPECT_EQ(dataSingle, dataDouble);
972 EXPECT_EQ(dataSingle, dataTriple);
973 EXPECT_EQ(dataSingle, dataMany);
976 TEST_F(ScrollAnimatorNoneTest, VaryingInputsEquivalencyCoastSteep)
978 ScrollAnimatorNone::Parameters parameters(true, 15 * kTickTime, 10 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Cubic, 5 * kTickTime, ScrollAnimatorNone::Quadratic, 1);
981 EXPECT_TRUE(updateDataFromParameters(1, 30000, 50000, kStartTime, ¶meters));
982 SavePerAxisData dataSingle(*m_data);
985 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
986 EXPECT_TRUE(updateDataFromParameters(1, 15000, 50000, kStartTime, ¶meters));
987 SavePerAxisData dataDouble(*m_data);
990 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
991 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
992 EXPECT_TRUE(updateDataFromParameters(1, 10000, 50000, kStartTime, ¶meters));
993 SavePerAxisData dataTriple(*m_data);
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 EXPECT_TRUE(updateDataFromParameters(1, 5000, 50000, kStartTime, ¶meters));
1002 SavePerAxisData dataMany(*m_data);
1004 EXPECT_EQ(dataSingle, dataDouble);
1005 EXPECT_EQ(dataSingle, dataTriple);
1006 EXPECT_EQ(dataSingle, dataMany);
1009 TEST_F(ScrollAnimatorNoneTest, ScrollStopInMiddle)
1011 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
1013 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
1016 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
1017 result = animateScroll(t);
1019 result = result && animateScroll(t);
1020 EXPECT_TRUE(result);
1021 double before = m_currentPosition;
1022 result = result && updateDataFromParameters(0, 0, 1000, t, ¶meters);
1023 EXPECT_FALSE(result);
1024 result = result && animateScroll(t);
1025 double after = m_currentPosition;
1026 EXPECT_EQ(before, after);
1027 checkDesiredPosition(after);
1030 TEST_F(ScrollAnimatorNoneTest, ReverseInMiddle)
1032 ScrollAnimatorNone::Parameters parameters(true, 7 * kTickTime, 0, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Cubic, 3 * kTickTime, ScrollAnimatorNone::Linear, 0);
1034 EXPECT_TRUE(updateDataFromParameters(1, 40, 1000, kStartTime, ¶meters));
1037 for (t = kStartTime; result && t < kStartTime + 1.5 * kTickTime; t += kAnimationTime)
1038 result = animateScroll(t);
1040 result = result && animateScroll(t);
1041 EXPECT_TRUE(result);
1042 double before = m_currentPosition;
1043 result = result && updateDataFromParameters(1, -10, 1000, t, ¶meters);
1044 EXPECT_TRUE(result);
1045 result = result && animateScroll(t);
1046 double after = m_currentPosition;
1047 EXPECT_GE(before, after);
1049 t += kAnimationTime;
1050 for (; result && t < kEndTime; t += kAnimationTime)
1051 result = result && animateScroll(t);
1052 EXPECT_GE(before, m_currentPosition);