1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "config.h" 6#include "core/animation/InterpolableValue.h" 7 8#include "core/animation/Interpolation.h" 9 10#include <gtest/gtest.h> 11 12namespace blink { 13 14class AnimationInterpolableValueTest : public ::testing::Test { 15protected: 16 InterpolableValue* interpolationValue(Interpolation& interpolation) 17 { 18 return interpolation.getCachedValueForTesting(); 19 } 20 21 double interpolateNumbers(double a, double b, double progress) 22 { 23 RefPtrWillBeRawPtr<Interpolation> i = Interpolation::create(InterpolableNumber::create(a), InterpolableNumber::create(b)); 24 i->interpolate(0, progress); 25 return toInterpolableNumber(interpolationValue(*i.get()))->value(); 26 } 27 28 bool interpolateBools(bool a, bool b, double progress) 29 { 30 RefPtrWillBeRawPtr<Interpolation> i = Interpolation::create(InterpolableBool::create(a), InterpolableBool::create(b)); 31 i->interpolate(0, progress); 32 return toInterpolableBool(interpolationValue(*i.get()))->value(); 33 } 34 35 PassRefPtrWillBeRawPtr<Interpolation> interpolateLists(PassOwnPtrWillBeRawPtr<InterpolableList> listA, PassOwnPtrWillBeRawPtr<InterpolableList> listB, double progress) 36 { 37 RefPtrWillBeRawPtr<Interpolation> i = Interpolation::create(listA, listB); 38 i->interpolate(0, progress); 39 return i; 40 } 41}; 42 43TEST_F(AnimationInterpolableValueTest, InterpolateNumbers) 44{ 45 EXPECT_FLOAT_EQ(126, interpolateNumbers(42, 0, -2)); 46 EXPECT_FLOAT_EQ(42, interpolateNumbers(42, 0, 0)); 47 EXPECT_FLOAT_EQ(29.4f, interpolateNumbers(42, 0, 0.3)); 48 EXPECT_FLOAT_EQ(21, interpolateNumbers(42, 0, 0.5)); 49 EXPECT_FLOAT_EQ(0, interpolateNumbers(42, 0, 1)); 50 EXPECT_FLOAT_EQ(-21, interpolateNumbers(42, 0, 1.5)); 51} 52 53TEST_F(AnimationInterpolableValueTest, InterpolateBools) 54{ 55 EXPECT_FALSE(interpolateBools(false, true, -1)); 56 EXPECT_FALSE(interpolateBools(false, true, 0)); 57 EXPECT_FALSE(interpolateBools(false, true, 0.3)); 58 EXPECT_TRUE(interpolateBools(false, true, 0.5)); 59 EXPECT_TRUE(interpolateBools(false, true, 1)); 60 EXPECT_TRUE(interpolateBools(false, true, 2)); 61} 62 63TEST_F(AnimationInterpolableValueTest, SimpleList) 64{ 65 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); 66 listA->set(0, InterpolableNumber::create(0)); 67 listA->set(1, InterpolableNumber::create(42)); 68 listA->set(2, InterpolableNumber::create(20.5)); 69 70 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); 71 listB->set(0, InterpolableNumber::create(100)); 72 listB->set(1, InterpolableNumber::create(-200)); 73 listB->set(2, InterpolableNumber::create(300)); 74 75 RefPtrWillBeRawPtr<Interpolation> i = interpolateLists(listA.release(), listB.release(), 0.3); 76 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get())); 77 EXPECT_FLOAT_EQ(30, toInterpolableNumber(outList->get(0))->value()); 78 EXPECT_FLOAT_EQ(-30.6f, toInterpolableNumber(outList->get(1))->value()); 79 EXPECT_FLOAT_EQ(104.35f, toInterpolableNumber(outList->get(2))->value()); 80} 81 82TEST_F(AnimationInterpolableValueTest, NestedList) 83{ 84 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); 85 listA->set(0, InterpolableNumber::create(0)); 86 OwnPtrWillBeRawPtr<InterpolableList> subListA = InterpolableList::create(1); 87 subListA->set(0, InterpolableNumber::create(100)); 88 listA->set(1, subListA.release()); 89 listA->set(2, InterpolableBool::create(false)); 90 91 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); 92 listB->set(0, InterpolableNumber::create(100)); 93 OwnPtrWillBeRawPtr<InterpolableList> subListB = InterpolableList::create(1); 94 subListB->set(0, InterpolableNumber::create(50)); 95 listB->set(1, subListB.release()); 96 listB->set(2, InterpolableBool::create(true)); 97 98 RefPtrWillBeRawPtr<Interpolation> i = interpolateLists(listA.release(), listB.release(), 0.5); 99 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get())); 100 EXPECT_FLOAT_EQ(50, toInterpolableNumber(outList->get(0))->value()); 101 EXPECT_FLOAT_EQ(75, toInterpolableNumber(toInterpolableList(outList->get(1))->get(0))->value()); 102 EXPECT_TRUE(toInterpolableBool(outList->get(2))->value()); 103} 104 105} 106