| 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 "core/animation/DoubleStyleInterpolation.h" | 5 #include "core/animation/DoubleStyleInterpolation.h" |
| 6 | 6 |
| 7 #include "core/css/CSSPrimitiveValue.h" | 7 #include "core/css/CSSPrimitiveValue.h" |
| 8 #include "core/css/CSSValueList.h" | 8 #include "core/css/CSSValueList.h" |
| 9 #include "core/css/StylePropertySet.h" | 9 #include "core/css/StylePropertySet.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "wtf/MathExtras.h" | 11 #include "wtf/MathExtras.h" |
| 12 | 12 |
| 13 namespace blink { | 13 namespace blink { |
| 14 | 14 |
| 15 class AnimationDoubleStyleInterpolationTest : public ::testing::Test { | 15 class AnimationDoubleStyleInterpolationTest : public ::testing::Test { |
| 16 protected: | 16 protected: |
| 17 static PassOwnPtr<InterpolableValue> doubleToInterpolableValue(const CSSValu
e& value) | 17 static PassOwnPtr<InterpolableValue> doubleToInterpolableValue(const CSSValu
e& value) |
| 18 { | 18 { |
| 19 return DoubleStyleInterpolation::doubleToInterpolableValue(value); | 19 return DoubleStyleInterpolation::doubleToInterpolableValue(value); |
| 20 } | 20 } |
| 21 | 21 |
| 22 static PassOwnPtr<InterpolableValue> motionRotationToInterpolableValue(const
CSSValue& value) | 22 static PassOwnPtr<InterpolableValue> motionRotationToInterpolableValue(const
CSSValue& value) |
| 23 { | 23 { |
| 24 return DoubleStyleInterpolation::motionRotationToInterpolableValue(value
); | 24 return DoubleStyleInterpolation::motionRotationToInterpolableValue(value
); |
| 25 } | 25 } |
| 26 | 26 |
| 27 static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToDouble(Interpolab
leValue* value, bool isNumber, InterpolationRange clamp) | 27 static RawPtr<CSSValue> interpolableValueToDouble(InterpolableValue* value,
bool isNumber, InterpolationRange clamp) |
| 28 { | 28 { |
| 29 return DoubleStyleInterpolation::interpolableValueToDouble(value, isNumb
er, clamp); | 29 return DoubleStyleInterpolation::interpolableValueToDouble(value, isNumb
er, clamp); |
| 30 } | 30 } |
| 31 | 31 |
| 32 static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToMotionRotation(In
terpolableValue* value, bool flag) | 32 static RawPtr<CSSValue> interpolableValueToMotionRotation(InterpolableValue*
value, bool flag) |
| 33 { | 33 { |
| 34 return DoubleStyleInterpolation::interpolableValueToMotionRotation(value
, flag); | 34 return DoubleStyleInterpolation::interpolableValueToMotionRotation(value
, flag); |
| 35 } | 35 } |
| 36 | 36 |
| 37 static PassRefPtrWillBeRawPtr<CSSValue> roundTrip(PassRefPtrWillBeRawPtr<CSS
Value> value) | 37 static RawPtr<CSSValue> roundTrip(RawPtr<CSSValue> value) |
| 38 { | 38 { |
| 39 return interpolableValueToDouble(doubleToInterpolableValue(*value).get()
, toCSSPrimitiveValue(value.get())->isNumber(), RangeAll); | 39 return interpolableValueToDouble(doubleToInterpolableValue(*value).get()
, toCSSPrimitiveValue(value.get())->isNumber(), RangeAll); |
| 40 } | 40 } |
| 41 | 41 |
| 42 static PassRefPtrWillBeRawPtr<CSSValue> roundTripMotionRotation(PassRefPtrWi
llBeRawPtr<CSSValue> value, bool flag) | 42 static RawPtr<CSSValue> roundTripMotionRotation(RawPtr<CSSValue> value, bool
flag) |
| 43 { | 43 { |
| 44 return interpolableValueToMotionRotation(motionRotationToInterpolableVal
ue(*value).get(), flag); | 44 return interpolableValueToMotionRotation(motionRotationToInterpolableVal
ue(*value).get(), flag); |
| 45 } | 45 } |
| 46 | 46 |
| 47 static void testPrimitiveValue(RefPtrWillBeRawPtr<CSSValue> value, double do
ubleValue, CSSPrimitiveValue::UnitType unitType) | 47 static void testPrimitiveValue(RawPtr<CSSValue> value, double doubleValue, C
SSPrimitiveValue::UnitType unitType) |
| 48 { | 48 { |
| 49 EXPECT_TRUE(value->isPrimitiveValue()); | 49 EXPECT_TRUE(value->isPrimitiveValue()); |
| 50 EXPECT_EQ(doubleValue, toCSSPrimitiveValue(value.get())->getDoubleValue(
)); | 50 EXPECT_EQ(doubleValue, toCSSPrimitiveValue(value.get())->getDoubleValue(
)); |
| 51 EXPECT_EQ(unitType, toCSSPrimitiveValue(value.get())->typeWithCalcResolv
ed()); | 51 EXPECT_EQ(unitType, toCSSPrimitiveValue(value.get())->typeWithCalcResolv
ed()); |
| 52 } | 52 } |
| 53 | 53 |
| 54 static void testValueListMotionRotation(RefPtrWillBeRawPtr<CSSValue> value,
double doubleValue, bool flag) | 54 static void testValueListMotionRotation(RawPtr<CSSValue> value, double doubl
eValue, bool flag) |
| 55 { | 55 { |
| 56 EXPECT_TRUE(value->isValueList()); | 56 EXPECT_TRUE(value->isValueList()); |
| 57 const CSSValueList& list = toCSSValueList(*value); | 57 const CSSValueList& list = toCSSValueList(*value); |
| 58 const CSSValue* item; | 58 const CSSValue* item; |
| 59 if (flag) { | 59 if (flag) { |
| 60 EXPECT_EQ(2U, list.length()); | 60 EXPECT_EQ(2U, list.length()); |
| 61 item = list.item(0); | 61 item = list.item(0); |
| 62 EXPECT_TRUE(item->isPrimitiveValue()); | 62 EXPECT_TRUE(item->isPrimitiveValue()); |
| 63 EXPECT_EQ(CSSValueAuto, toCSSPrimitiveValue(item)->getValueID()); | 63 EXPECT_EQ(CSSValueAuto, toCSSPrimitiveValue(item)->getValueID()); |
| 64 item = list.item(1); | 64 item = list.item(1); |
| 65 } else { | 65 } else { |
| 66 EXPECT_EQ(1U, list.length()); | 66 EXPECT_EQ(1U, list.length()); |
| 67 item = list.item(0); | 67 item = list.item(0); |
| 68 } | 68 } |
| 69 EXPECT_TRUE(item->isPrimitiveValue()); | 69 EXPECT_TRUE(item->isPrimitiveValue()); |
| 70 EXPECT_EQ(doubleValue, toCSSPrimitiveValue(item)->getDoubleValue()); | 70 EXPECT_EQ(doubleValue, toCSSPrimitiveValue(item)->getDoubleValue()); |
| 71 EXPECT_EQ(CSSPrimitiveValue::UnitType::Degrees, toCSSPrimitiveValue(item
)->typeWithCalcResolved()); | 71 EXPECT_EQ(CSSPrimitiveValue::UnitType::Degrees, toCSSPrimitiveValue(item
)->typeWithCalcResolved()); |
| 72 } | 72 } |
| 73 | 73 |
| 74 static InterpolableValue* getCachedValue(Interpolation& interpolation) | 74 static InterpolableValue* getCachedValue(Interpolation& interpolation) |
| 75 { | 75 { |
| 76 return interpolation.getCachedValueForTesting(); | 76 return interpolation.getCachedValueForTesting(); |
| 77 } | 77 } |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 TEST_F(AnimationDoubleStyleInterpolationTest, ZeroValue) | 80 TEST_F(AnimationDoubleStyleInterpolationTest, ZeroValue) |
| 81 { | 81 { |
| 82 RefPtrWillBeRawPtr<CSSValue> value = roundTrip(CSSPrimitiveValue::create(0,
CSSPrimitiveValue::UnitType::Number)); | 82 RawPtr<CSSValue> value = roundTrip(CSSPrimitiveValue::create(0, CSSPrimitive
Value::UnitType::Number)); |
| 83 testPrimitiveValue(value, 0, CSSPrimitiveValue::UnitType::Number); | 83 testPrimitiveValue(value, 0, CSSPrimitiveValue::UnitType::Number); |
| 84 } | 84 } |
| 85 | 85 |
| 86 TEST_F(AnimationDoubleStyleInterpolationTest, AngleValue) | 86 TEST_F(AnimationDoubleStyleInterpolationTest, AngleValue) |
| 87 { | 87 { |
| 88 RefPtrWillBeRawPtr<CSSValue> value = roundTrip(CSSPrimitiveValue::create(10,
CSSPrimitiveValue::UnitType::Degrees)); | 88 RawPtr<CSSValue> value = roundTrip(CSSPrimitiveValue::create(10, CSSPrimitiv
eValue::UnitType::Degrees)); |
| 89 testPrimitiveValue(value, 10, CSSPrimitiveValue::UnitType::Degrees); | 89 testPrimitiveValue(value, 10, CSSPrimitiveValue::UnitType::Degrees); |
| 90 | 90 |
| 91 value = roundTrip(CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType:
:Radians)); | 91 value = roundTrip(CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType:
:Radians)); |
| 92 testPrimitiveValue(value, rad2deg(10.0), CSSPrimitiveValue::UnitType::Degree
s); | 92 testPrimitiveValue(value, rad2deg(10.0), CSSPrimitiveValue::UnitType::Degree
s); |
| 93 | 93 |
| 94 value = roundTrip(CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType:
:Gradians)); | 94 value = roundTrip(CSSPrimitiveValue::create(10, CSSPrimitiveValue::UnitType:
:Gradians)); |
| 95 testPrimitiveValue(value, grad2deg(10.0), CSSPrimitiveValue::UnitType::Degre
es); | 95 testPrimitiveValue(value, grad2deg(10.0), CSSPrimitiveValue::UnitType::Degre
es); |
| 96 } | 96 } |
| 97 | 97 |
| 98 TEST_F(AnimationDoubleStyleInterpolationTest, Clamping) | 98 TEST_F(AnimationDoubleStyleInterpolationTest, Clamping) |
| 99 { | 99 { |
| 100 RefPtr<Interpolation> interpolableDouble = DoubleStyleInterpolation::create( | 100 RefPtr<Interpolation> interpolableDouble = DoubleStyleInterpolation::create( |
| 101 *CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Number), | 101 *CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Number), |
| 102 *CSSPrimitiveValue::create(0.6, CSSPrimitiveValue::UnitType::Number), | 102 *CSSPrimitiveValue::create(0.6, CSSPrimitiveValue::UnitType::Number), |
| 103 CSSPropertyLineHeight, | 103 CSSPropertyLineHeight, |
| 104 true, | 104 true, |
| 105 RangeAll); | 105 RangeAll); |
| 106 interpolableDouble->interpolate(0, 0.4); | 106 interpolableDouble->interpolate(0, 0.4); |
| 107 // progVal = start*(1-prog) + end*prog | 107 // progVal = start*(1-prog) + end*prog |
| 108 EXPECT_EQ(0.24, toInterpolableNumber(getCachedValue(*interpolableDouble))->v
alue()); | 108 EXPECT_EQ(0.24, toInterpolableNumber(getCachedValue(*interpolableDouble))->v
alue()); |
| 109 } | 109 } |
| 110 | 110 |
| 111 TEST_F(AnimationDoubleStyleInterpolationTest, ZeroValueFixedMotionRotation) | 111 TEST_F(AnimationDoubleStyleInterpolationTest, ZeroValueFixedMotionRotation) |
| 112 { | 112 { |
| 113 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | 113 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
| 114 list->append(CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Degre
es)); | 114 list->append(CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Degre
es)); |
| 115 RefPtrWillBeRawPtr<CSSValue> value = roundTripMotionRotation(list.release(),
false); | 115 RawPtr<CSSValue> value = roundTripMotionRotation(list.release(), false); |
| 116 testValueListMotionRotation(value, 0, false); | 116 testValueListMotionRotation(value, 0, false); |
| 117 } | 117 } |
| 118 | 118 |
| 119 TEST_F(AnimationDoubleStyleInterpolationTest, ZeroValueAutoMotionRotation) | 119 TEST_F(AnimationDoubleStyleInterpolationTest, ZeroValueAutoMotionRotation) |
| 120 { | 120 { |
| 121 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | 121 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
| 122 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAuto)); | 122 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAuto)); |
| 123 list->append(CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Degre
es)); | 123 list->append(CSSPrimitiveValue::create(0, CSSPrimitiveValue::UnitType::Degre
es)); |
| 124 RefPtrWillBeRawPtr<CSSValue> value = roundTripMotionRotation(list.release(),
true); | 124 RawPtr<CSSValue> value = roundTripMotionRotation(list.release(), true); |
| 125 testValueListMotionRotation(value, 0, true); | 125 testValueListMotionRotation(value, 0, true); |
| 126 } | 126 } |
| 127 | 127 |
| 128 TEST_F(AnimationDoubleStyleInterpolationTest, ValueFixedMotionRotation) | 128 TEST_F(AnimationDoubleStyleInterpolationTest, ValueFixedMotionRotation) |
| 129 { | 129 { |
| 130 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | 130 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
| 131 list->append(CSSPrimitiveValue::create(90, CSSPrimitiveValue::UnitType::Degr
ees)); | 131 list->append(CSSPrimitiveValue::create(90, CSSPrimitiveValue::UnitType::Degr
ees)); |
| 132 RefPtrWillBeRawPtr<CSSValue> value = roundTripMotionRotation(list.release(),
false); | 132 RawPtr<CSSValue> value = roundTripMotionRotation(list.release(), false); |
| 133 testValueListMotionRotation(value, 90, false); | 133 testValueListMotionRotation(value, 90, false); |
| 134 } | 134 } |
| 135 | 135 |
| 136 TEST_F(AnimationDoubleStyleInterpolationTest, ValueAutoMotionRotation) | 136 TEST_F(AnimationDoubleStyleInterpolationTest, ValueAutoMotionRotation) |
| 137 { | 137 { |
| 138 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | 138 RawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
| 139 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAuto)); | 139 list->append(CSSPrimitiveValue::createIdentifier(CSSValueAuto)); |
| 140 list->append(CSSPrimitiveValue::create(90, CSSPrimitiveValue::UnitType::Degr
ees)); | 140 list->append(CSSPrimitiveValue::create(90, CSSPrimitiveValue::UnitType::Degr
ees)); |
| 141 RefPtrWillBeRawPtr<CSSValue> value = roundTripMotionRotation(list.release(),
true); | 141 RawPtr<CSSValue> value = roundTripMotionRotation(list.release(), true); |
| 142 testValueListMotionRotation(value, 90, true); | 142 testValueListMotionRotation(value, 90, true); |
| 143 } | 143 } |
| 144 | 144 |
| 145 } // namespace blink | 145 } // namespace blink |
| OLD | NEW |