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