1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/animation/scroll_offset_animation_curve.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/animation/timing_function.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace cc { 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST(ScrollOffsetAnimationCurveTest, Duration) { 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Vector2dF target_value(100.f, 200.f); 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ScrollOffsetAnimationCurve> curve( 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ScrollOffsetAnimationCurve::Create( 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) target_value, 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EaseInOutTimingFunction::Create().Pass())); 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(target_value); 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.0, curve->Duration()); 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x decreases, y stays the same. 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(136.f, 200.f)); 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.1, curve->Duration()); 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x increases, y stays the same. 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(19.f, 200.f)); 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.15, curve->Duration()); 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x stays the same, y decreases. 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(100.f, 344.f)); 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.2, curve->Duration()); 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x stays the same, y increases. 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(100.f, 191.f)); 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.05, curve->Duration()); 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x decreases, y decreases. 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(32500.f, 500.f)); 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(3.0, curve->Duration()); 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x decreases, y increases. 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(150.f, 119.f)); 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.15, curve->Duration()); 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x increases, y decreases. 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(0.f, 14600.f)); 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(2.0, curve->Duration()); 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // x increases, y increases. 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(gfx::Vector2dF(95.f, 191.f)); 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.05, curve->Duration()); 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(ScrollOffsetAnimationCurveTest, GetValue) { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF initial_value(2.f, 40.f); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF target_value(10.f, 20.f); 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<ScrollOffsetAnimationCurve> curve( 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScrollOffsetAnimationCurve::Create( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_value, 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EaseInOutTimingFunction::Create().Pass())); 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(initial_value); 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double duration = curve->Duration(); 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_GT(curve->Duration(), 0); 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_LT(curve->Duration(), 0.1); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(AnimationCurve::ScrollOffset, curve->Type()); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(duration, curve->Duration()); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(initial_value, curve->GetValue(-1.0)); 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(initial_value, curve->GetValue(0.0)); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(gfx::Vector2dF(6.f, 30.f), curve->GetValue(duration/2.0)); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(target_value, curve->GetValue(duration)); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(target_value, curve->GetValue(duration+1.0)); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Verify that GetValue takes the timing function into account. 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF value = curve->GetValue(duration/4.0); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NEAR(3.0333f, value.x(), 0.00015f); 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NEAR(37.4168f, value.y(), 0.00015f); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Verify that a clone behaves exactly like the original. 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(ScrollOffsetAnimationCurveTest, Clone) { 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF initial_value(2.f, 40.f); 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF target_value(10.f, 20.f); 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<ScrollOffsetAnimationCurve> curve( 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScrollOffsetAnimationCurve::Create( 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_value, 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EaseInOutTimingFunction::Create().Pass())); 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) curve->SetInitialValue(initial_value); 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double duration = curve->Duration(); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<AnimationCurve> clone(curve->Clone().Pass()); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(AnimationCurve::ScrollOffset, clone->Type()); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(duration, clone->Duration()); 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(initial_value, 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clone->ToScrollOffsetAnimationCurve()->GetValue(-1.0)); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ(initial_value, 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clone->ToScrollOffsetAnimationCurve()->GetValue(0.0)); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ( 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF(6.f, 30.f), 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clone->ToScrollOffsetAnimationCurve()->GetValue(duration / 2.0)); 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ( 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_value, 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clone->ToScrollOffsetAnimationCurve()->GetValue(duration)); 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_VECTOR2DF_EQ( 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_value, 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clone->ToScrollOffsetAnimationCurve()->GetValue(duration + 1.0)); 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Verify that the timing function was cloned correctly. 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2dF value = 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clone->ToScrollOffsetAnimationCurve()->GetValue(duration / 4.0); 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NEAR(3.0333f, value.x(), 0.00015f); 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NEAR(37.4168f, value.y(), 0.00015f); 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(ScrollOffsetAnimationCurveTest, UpdateTarget) { 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Vector2dF initial_value(0.f, 0.f); 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Vector2dF target_value(0.f, 3600.f); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ScrollOffsetAnimationCurve> curve( 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScrollOffsetAnimationCurve::Create( 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) target_value, EaseInOutTimingFunction::Create().Pass())); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) curve->SetInitialValue(initial_value); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1.0, curve->Duration()); 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1800.0, curve->GetValue(0.5).y()); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3600.0, curve->GetValue(1.0).y()); 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) curve->UpdateTarget(0.5, gfx::Vector2dF(0.0, 9900.0)); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2.0, curve->Duration()); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1800.0, curve->GetValue(0.5).y()); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NEAR(5566.49, curve->GetValue(1.0).y(), 0.01); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(9900.0, curve->GetValue(2.0).y()); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) curve->UpdateTarget(1.0, gfx::Vector2dF(0.0, 7200.0)); 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NEAR(1.674, curve->Duration(), 0.01); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NEAR(5566.49, curve->GetValue(1.0).y(), 0.01); 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(7200.0, curve->GetValue(1.674).y()); 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace cc 149