| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/animation/InterpolableValue.h" | 6 #include "core/animation/InterpolableValue.h" |
| 7 | 7 |
| 8 #include "core/animation/Interpolation.h" | 8 #include "core/animation/Interpolation.h" |
| 9 #include "core/animation/PropertyHandle.h" | 9 #include "core/animation/PropertyHandle.h" |
| 10 | 10 |
| 11 #include <gtest/gtest.h> | 11 #include <gtest/gtest.h> |
| 12 | 12 |
| 13 namespace blink { | 13 namespace blink { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 class SampleInterpolation : public Interpolation { | 17 class SampleInterpolation : public Interpolation { |
| 18 public: | 18 public: |
| 19 static PassRefPtrWillBeRawPtr<Interpolation> create(PassOwnPtrWillBeRawPtr<I
nterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end) | 19 static PassRefPtr<Interpolation> create(PassOwnPtr<InterpolableValue> start,
PassOwnPtr<InterpolableValue> end) |
| 20 { | 20 { |
| 21 return adoptRefWillBeNoop(new SampleInterpolation(start, end)); | 21 return adoptRef(new SampleInterpolation(start, end)); |
| 22 } | 22 } |
| 23 | 23 |
| 24 PropertyHandle property() const override | 24 PropertyHandle property() const override |
| 25 { | 25 { |
| 26 return PropertyHandle(CSSPropertyBackgroundColor); | 26 return PropertyHandle(CSSPropertyBackgroundColor); |
| 27 } | 27 } |
| 28 private: | 28 private: |
| 29 SampleInterpolation(PassOwnPtrWillBeRawPtr<InterpolableValue> start, PassOwn
PtrWillBeRawPtr<InterpolableValue> end) | 29 SampleInterpolation(PassOwnPtr<InterpolableValue> start, PassOwnPtr<Interpol
ableValue> end) |
| 30 : Interpolation(start, end) | 30 : Interpolation(start, end) |
| 31 { | 31 { |
| 32 } | 32 } |
| 33 }; | 33 }; |
| 34 | 34 |
| 35 } // namespace | 35 } // namespace |
| 36 | 36 |
| 37 class AnimationInterpolableValueTest : public ::testing::Test { | 37 class AnimationInterpolableValueTest : public ::testing::Test { |
| 38 protected: | 38 protected: |
| 39 InterpolableValue* interpolationValue(Interpolation& interpolation) | 39 InterpolableValue* interpolationValue(Interpolation& interpolation) |
| 40 { | 40 { |
| 41 return interpolation.getCachedValueForTesting(); | 41 return interpolation.getCachedValueForTesting(); |
| 42 } | 42 } |
| 43 | 43 |
| 44 double interpolateNumbers(double a, double b, double progress) | 44 double interpolateNumbers(double a, double b, double progress) |
| 45 { | 45 { |
| 46 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(Interp
olableNumber::create(a), InterpolableNumber::create(b)); | 46 RefPtr<Interpolation> i = SampleInterpolation::create(InterpolableNumber
::create(a), InterpolableNumber::create(b)); |
| 47 i->interpolate(0, progress); | 47 i->interpolate(0, progress); |
| 48 return toInterpolableNumber(interpolationValue(*i.get()))->value(); | 48 return toInterpolableNumber(interpolationValue(*i.get()))->value(); |
| 49 } | 49 } |
| 50 | 50 |
| 51 bool interpolateBools(bool a, bool b, double progress) | 51 bool interpolateBools(bool a, bool b, double progress) |
| 52 { | 52 { |
| 53 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(Interp
olableBool::create(a), InterpolableBool::create(b)); | 53 RefPtr<Interpolation> i = SampleInterpolation::create(InterpolableBool::
create(a), InterpolableBool::create(b)); |
| 54 i->interpolate(0, progress); | 54 i->interpolate(0, progress); |
| 55 return toInterpolableBool(interpolationValue(*i.get()))->value(); | 55 return toInterpolableBool(interpolationValue(*i.get()))->value(); |
| 56 } | 56 } |
| 57 | 57 |
| 58 void scaleAndAdd(InterpolableValue& base, double scale, const InterpolableVa
lue& add) | 58 void scaleAndAdd(InterpolableValue& base, double scale, const InterpolableVa
lue& add) |
| 59 { | 59 { |
| 60 base.scaleAndAdd(scale, add); | 60 base.scaleAndAdd(scale, add); |
| 61 } | 61 } |
| 62 | 62 |
| 63 PassRefPtrWillBeRawPtr<Interpolation> interpolateLists(PassOwnPtrWillBeRawPt
r<InterpolableList> listA, PassOwnPtrWillBeRawPtr<InterpolableList> listB, doubl
e progress) | 63 PassRefPtr<Interpolation> interpolateLists(PassOwnPtr<InterpolableList> list
A, PassOwnPtr<InterpolableList> listB, double progress) |
| 64 { | 64 { |
| 65 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(listA,
listB); | 65 RefPtr<Interpolation> i = SampleInterpolation::create(listA, listB); |
| 66 i->interpolate(0, progress); | 66 i->interpolate(0, progress); |
| 67 return i; | 67 return i; |
| 68 } | 68 } |
| 69 }; | 69 }; |
| 70 | 70 |
| 71 TEST_F(AnimationInterpolableValueTest, InterpolateNumbers) | 71 TEST_F(AnimationInterpolableValueTest, InterpolateNumbers) |
| 72 { | 72 { |
| 73 EXPECT_FLOAT_EQ(126, interpolateNumbers(42, 0, -2)); | 73 EXPECT_FLOAT_EQ(126, interpolateNumbers(42, 0, -2)); |
| 74 EXPECT_FLOAT_EQ(42, interpolateNumbers(42, 0, 0)); | 74 EXPECT_FLOAT_EQ(42, interpolateNumbers(42, 0, 0)); |
| 75 EXPECT_FLOAT_EQ(29.4f, interpolateNumbers(42, 0, 0.3)); | 75 EXPECT_FLOAT_EQ(29.4f, interpolateNumbers(42, 0, 0.3)); |
| 76 EXPECT_FLOAT_EQ(21, interpolateNumbers(42, 0, 0.5)); | 76 EXPECT_FLOAT_EQ(21, interpolateNumbers(42, 0, 0.5)); |
| 77 EXPECT_FLOAT_EQ(0, interpolateNumbers(42, 0, 1)); | 77 EXPECT_FLOAT_EQ(0, interpolateNumbers(42, 0, 1)); |
| 78 EXPECT_FLOAT_EQ(-21, interpolateNumbers(42, 0, 1.5)); | 78 EXPECT_FLOAT_EQ(-21, interpolateNumbers(42, 0, 1.5)); |
| 79 } | 79 } |
| 80 | 80 |
| 81 TEST_F(AnimationInterpolableValueTest, InterpolateBools) | 81 TEST_F(AnimationInterpolableValueTest, InterpolateBools) |
| 82 { | 82 { |
| 83 EXPECT_FALSE(interpolateBools(false, true, -1)); | 83 EXPECT_FALSE(interpolateBools(false, true, -1)); |
| 84 EXPECT_FALSE(interpolateBools(false, true, 0)); | 84 EXPECT_FALSE(interpolateBools(false, true, 0)); |
| 85 EXPECT_FALSE(interpolateBools(false, true, 0.3)); | 85 EXPECT_FALSE(interpolateBools(false, true, 0.3)); |
| 86 EXPECT_TRUE(interpolateBools(false, true, 0.5)); | 86 EXPECT_TRUE(interpolateBools(false, true, 0.5)); |
| 87 EXPECT_TRUE(interpolateBools(false, true, 1)); | 87 EXPECT_TRUE(interpolateBools(false, true, 1)); |
| 88 EXPECT_TRUE(interpolateBools(false, true, 2)); | 88 EXPECT_TRUE(interpolateBools(false, true, 2)); |
| 89 } | 89 } |
| 90 | 90 |
| 91 TEST_F(AnimationInterpolableValueTest, SimpleList) | 91 TEST_F(AnimationInterpolableValueTest, SimpleList) |
| 92 { | 92 { |
| 93 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); | 93 OwnPtr<InterpolableList> listA = InterpolableList::create(3); |
| 94 listA->set(0, InterpolableNumber::create(0)); | 94 listA->set(0, InterpolableNumber::create(0)); |
| 95 listA->set(1, InterpolableNumber::create(42)); | 95 listA->set(1, InterpolableNumber::create(42)); |
| 96 listA->set(2, InterpolableNumber::create(20.5)); | 96 listA->set(2, InterpolableNumber::create(20.5)); |
| 97 | 97 |
| 98 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); | 98 OwnPtr<InterpolableList> listB = InterpolableList::create(3); |
| 99 listB->set(0, InterpolableNumber::create(100)); | 99 listB->set(0, InterpolableNumber::create(100)); |
| 100 listB->set(1, InterpolableNumber::create(-200)); | 100 listB->set(1, InterpolableNumber::create(-200)); |
| 101 listB->set(2, InterpolableNumber::create(300)); | 101 listB->set(2, InterpolableNumber::create(300)); |
| 102 | 102 |
| 103 RefPtrWillBeRawPtr<Interpolation> i = interpolateLists(listA.release(), list
B.release(), 0.3); | 103 RefPtr<Interpolation> i = interpolateLists(listA.release(), listB.release(),
0.3); |
| 104 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get()))
; | 104 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get()))
; |
| 105 EXPECT_FLOAT_EQ(30, toInterpolableNumber(outList->get(0))->value()); | 105 EXPECT_FLOAT_EQ(30, toInterpolableNumber(outList->get(0))->value()); |
| 106 EXPECT_FLOAT_EQ(-30.6f, toInterpolableNumber(outList->get(1))->value()); | 106 EXPECT_FLOAT_EQ(-30.6f, toInterpolableNumber(outList->get(1))->value()); |
| 107 EXPECT_FLOAT_EQ(104.35f, toInterpolableNumber(outList->get(2))->value()); | 107 EXPECT_FLOAT_EQ(104.35f, toInterpolableNumber(outList->get(2))->value()); |
| 108 } | 108 } |
| 109 | 109 |
| 110 TEST_F(AnimationInterpolableValueTest, NestedList) | 110 TEST_F(AnimationInterpolableValueTest, NestedList) |
| 111 { | 111 { |
| 112 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); | 112 OwnPtr<InterpolableList> listA = InterpolableList::create(3); |
| 113 listA->set(0, InterpolableNumber::create(0)); | 113 listA->set(0, InterpolableNumber::create(0)); |
| 114 OwnPtrWillBeRawPtr<InterpolableList> subListA = InterpolableList::create(1); | 114 OwnPtr<InterpolableList> subListA = InterpolableList::create(1); |
| 115 subListA->set(0, InterpolableNumber::create(100)); | 115 subListA->set(0, InterpolableNumber::create(100)); |
| 116 listA->set(1, subListA.release()); | 116 listA->set(1, subListA.release()); |
| 117 listA->set(2, InterpolableBool::create(false)); | 117 listA->set(2, InterpolableBool::create(false)); |
| 118 | 118 |
| 119 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); | 119 OwnPtr<InterpolableList> listB = InterpolableList::create(3); |
| 120 listB->set(0, InterpolableNumber::create(100)); | 120 listB->set(0, InterpolableNumber::create(100)); |
| 121 OwnPtrWillBeRawPtr<InterpolableList> subListB = InterpolableList::create(1); | 121 OwnPtr<InterpolableList> subListB = InterpolableList::create(1); |
| 122 subListB->set(0, InterpolableNumber::create(50)); | 122 subListB->set(0, InterpolableNumber::create(50)); |
| 123 listB->set(1, subListB.release()); | 123 listB->set(1, subListB.release()); |
| 124 listB->set(2, InterpolableBool::create(true)); | 124 listB->set(2, InterpolableBool::create(true)); |
| 125 | 125 |
| 126 RefPtrWillBeRawPtr<Interpolation> i = interpolateLists(listA.release(), list
B.release(), 0.5); | 126 RefPtr<Interpolation> i = interpolateLists(listA.release(), listB.release(),
0.5); |
| 127 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get()))
; | 127 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get()))
; |
| 128 EXPECT_FLOAT_EQ(50, toInterpolableNumber(outList->get(0))->value()); | 128 EXPECT_FLOAT_EQ(50, toInterpolableNumber(outList->get(0))->value()); |
| 129 EXPECT_FLOAT_EQ(75, toInterpolableNumber(toInterpolableList(outList->get(1))
->get(0))->value()); | 129 EXPECT_FLOAT_EQ(75, toInterpolableNumber(toInterpolableList(outList->get(1))
->get(0))->value()); |
| 130 EXPECT_TRUE(toInterpolableBool(outList->get(2))->value()); | 130 EXPECT_TRUE(toInterpolableBool(outList->get(2))->value()); |
| 131 } | 131 } |
| 132 | 132 |
| 133 TEST_F(AnimationInterpolableValueTest, ScaleAndAddNumbers) | 133 TEST_F(AnimationInterpolableValueTest, ScaleAndAddNumbers) |
| 134 { | 134 { |
| 135 OwnPtrWillBeRawPtr<InterpolableNumber> base = InterpolableNumber::create(10)
; | 135 OwnPtr<InterpolableNumber> base = InterpolableNumber::create(10); |
| 136 scaleAndAdd(*base, 2, *InterpolableNumber::create(1)); | 136 scaleAndAdd(*base, 2, *InterpolableNumber::create(1)); |
| 137 EXPECT_FLOAT_EQ(21, base->value()); | 137 EXPECT_FLOAT_EQ(21, base->value()); |
| 138 | 138 |
| 139 base = InterpolableNumber::create(10); | 139 base = InterpolableNumber::create(10); |
| 140 scaleAndAdd(*base, 0, *InterpolableNumber::create(5)); | 140 scaleAndAdd(*base, 0, *InterpolableNumber::create(5)); |
| 141 EXPECT_FLOAT_EQ(5, base->value()); | 141 EXPECT_FLOAT_EQ(5, base->value()); |
| 142 | 142 |
| 143 base = InterpolableNumber::create(10); | 143 base = InterpolableNumber::create(10); |
| 144 scaleAndAdd(*base, -1, *InterpolableNumber::create(8)); | 144 scaleAndAdd(*base, -1, *InterpolableNumber::create(8)); |
| 145 EXPECT_FLOAT_EQ(-2, base->value()); | 145 EXPECT_FLOAT_EQ(-2, base->value()); |
| 146 } | 146 } |
| 147 | 147 |
| 148 TEST_F(AnimationInterpolableValueTest, ScaleAndAddLists) | 148 TEST_F(AnimationInterpolableValueTest, ScaleAndAddLists) |
| 149 { | 149 { |
| 150 OwnPtrWillBeRawPtr<InterpolableList> baseList = InterpolableList::create(3); | 150 OwnPtr<InterpolableList> baseList = InterpolableList::create(3); |
| 151 baseList->set(0, InterpolableNumber::create(5)); | 151 baseList->set(0, InterpolableNumber::create(5)); |
| 152 baseList->set(1, InterpolableNumber::create(10)); | 152 baseList->set(1, InterpolableNumber::create(10)); |
| 153 baseList->set(2, InterpolableNumber::create(15)); | 153 baseList->set(2, InterpolableNumber::create(15)); |
| 154 OwnPtrWillBeRawPtr<InterpolableList> addList = InterpolableList::create(3); | 154 OwnPtr<InterpolableList> addList = InterpolableList::create(3); |
| 155 addList->set(0, InterpolableNumber::create(1)); | 155 addList->set(0, InterpolableNumber::create(1)); |
| 156 addList->set(1, InterpolableNumber::create(2)); | 156 addList->set(1, InterpolableNumber::create(2)); |
| 157 addList->set(2, InterpolableNumber::create(3)); | 157 addList->set(2, InterpolableNumber::create(3)); |
| 158 scaleAndAdd(*baseList, 2, *addList); | 158 scaleAndAdd(*baseList, 2, *addList); |
| 159 EXPECT_FLOAT_EQ(11, toInterpolableNumber(baseList->get(0))->value()); | 159 EXPECT_FLOAT_EQ(11, toInterpolableNumber(baseList->get(0))->value()); |
| 160 EXPECT_FLOAT_EQ(22, toInterpolableNumber(baseList->get(1))->value()); | 160 EXPECT_FLOAT_EQ(22, toInterpolableNumber(baseList->get(1))->value()); |
| 161 EXPECT_FLOAT_EQ(33, toInterpolableNumber(baseList->get(2))->value()); | 161 EXPECT_FLOAT_EQ(33, toInterpolableNumber(baseList->get(2))->value()); |
| 162 } | 162 } |
| 163 | 163 |
| 164 } | 164 } |
| OLD | NEW |