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