1 /* 2 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "core/animation/KeyframeEffectModel.h" 33 34 #include "core/animation/AnimatableLength.h" 35 #include "core/animation/AnimatableUnknown.h" 36 #include "core/animation/interpolation/LegacyStyleInterpolation.h" 37 #include "core/css/CSSPrimitiveValue.h" 38 #include "core/css/parser/BisonCSSParser.h" 39 #include "core/css/resolver/CSSToStyleMap.h" 40 #include <gtest/gtest.h> 41 42 using namespace WebCore; 43 44 namespace { 45 46 const double duration = 1.0; 47 48 PassRefPtrWillBeRawPtr<AnimatableValue> unknownAnimatableValue(double n) 49 { 50 return AnimatableUnknown::create(CSSPrimitiveValue::create(n, CSSPrimitiveValue::CSS_UNKNOWN).get()); 51 } 52 53 PassRefPtrWillBeRawPtr<AnimatableValue> pixelAnimatableValue(double n) 54 { 55 return AnimatableLength::create(Length(n, Fixed), 1); 56 } 57 58 AnimatableValueKeyframeVector keyframesAtZeroAndOne(PassRefPtrWillBeRawPtr<AnimatableValue> zeroValue, PassRefPtrWillBeRawPtr<AnimatableValue> oneValue) 59 { 60 AnimatableValueKeyframeVector keyframes(2); 61 keyframes[0] = AnimatableValueKeyframe::create(); 62 keyframes[0]->setOffset(0.0); 63 keyframes[0]->setPropertyValue(CSSPropertyLeft, zeroValue.get()); 64 keyframes[1] = AnimatableValueKeyframe::create(); 65 keyframes[1]->setOffset(1.0); 66 keyframes[1]->setPropertyValue(CSSPropertyLeft, oneValue.get()); 67 return keyframes; 68 } 69 70 void expectProperty(CSSPropertyID property, PassRefPtrWillBeRawPtr<Interpolation> interpolationValue) 71 { 72 LegacyStyleInterpolation* interpolation = toLegacyStyleInterpolation(interpolationValue.get()); 73 ASSERT_EQ(property, interpolation->id()); 74 } 75 76 void expectDoubleValue(double expectedValue, PassRefPtrWillBeRawPtr<Interpolation> interpolationValue) 77 { 78 LegacyStyleInterpolation* interpolation = toLegacyStyleInterpolation(interpolationValue.get()); 79 RefPtrWillBeRawPtr<AnimatableValue> value = interpolation->currentValue(); 80 81 ASSERT_TRUE(value->isLength() || value->isUnknown()); 82 83 double actualValue; 84 if (value->isLength()) 85 actualValue = toAnimatableLength(value.get())->length(1, ValueRangeAll).value(); 86 else 87 actualValue = toCSSPrimitiveValue(toAnimatableUnknown(value.get())->toCSSValue().get())->getDoubleValue(); 88 89 EXPECT_FLOAT_EQ(static_cast<float>(expectedValue), actualValue); 90 } 91 92 Interpolation* findValue(WillBeHeapVector<RefPtrWillBeMember<Interpolation> >& values, CSSPropertyID id) 93 { 94 for (size_t i = 0; i < values.size(); ++i) { 95 LegacyStyleInterpolation* value = toLegacyStyleInterpolation(values.at(i).get()); 96 if (value->id() == id) 97 return value; 98 } 99 return 0; 100 } 101 102 103 TEST(AnimationKeyframeEffectModel, BasicOperation) 104 { 105 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0)); 106 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 107 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > values = effect->sample(0, 0.6, duration); 108 ASSERT_EQ(1UL, values->size()); 109 expectProperty(CSSPropertyLeft, values->at(0)); 110 expectDoubleValue(5.0, values->at(0)); 111 } 112 113 TEST(AnimationKeyframeEffectModel, CompositeReplaceNonInterpolable) 114 { 115 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0)); 116 keyframes[0]->setComposite(AnimationEffect::CompositeReplace); 117 keyframes[1]->setComposite(AnimationEffect::CompositeReplace); 118 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 119 expectDoubleValue(5.0, effect->sample(0, 0.6, duration)->at(0)); 120 } 121 122 TEST(AnimationKeyframeEffectModel, CompositeReplace) 123 { 124 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 125 keyframes[0]->setComposite(AnimationEffect::CompositeReplace); 126 keyframes[1]->setComposite(AnimationEffect::CompositeReplace); 127 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 128 expectDoubleValue(3.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6, duration)->at(0)); 129 } 130 131 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 132 TEST(AnimationKeyframeEffectModel, DISABLED_CompositeAdd) 133 { 134 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 135 keyframes[0]->setComposite(AnimationEffect::CompositeAdd); 136 keyframes[1]->setComposite(AnimationEffect::CompositeAdd); 137 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 138 expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6, duration)->at(0)); 139 } 140 141 TEST(AnimationKeyframeEffectModel, CompositeEaseIn) 142 { 143 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 144 RefPtrWillBeRawPtr<CSSValue> timingFunction = BisonCSSParser::parseAnimationTimingFunctionValue("ease-in"); 145 keyframes[0]->setComposite(AnimationEffect::CompositeReplace); 146 keyframes[0]->setEasing(CSSToStyleMap::mapAnimationTimingFunction(timingFunction.get(), true)); 147 keyframes[1]->setComposite(AnimationEffect::CompositeReplace); 148 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 149 expectDoubleValue(3.8579516, effect->sample(0, 0.6, duration)->at(0)); 150 expectDoubleValue(3.8582394, effect->sample(0, 0.6, duration * 100)->at(0)); 151 } 152 153 TEST(AnimationKeyframeEffectModel, CompositeCubicBezier) 154 { 155 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 156 RefPtrWillBeRawPtr<CSSValue> timingFunction = BisonCSSParser::parseAnimationTimingFunctionValue("cubic-bezier(0.42, 0, 0.58, 1)"); 157 keyframes[0]->setComposite(AnimationEffect::CompositeReplace); 158 keyframes[0]->setEasing(CSSToStyleMap::mapAnimationTimingFunction(timingFunction.get(), true)); 159 keyframes[1]->setComposite(AnimationEffect::CompositeReplace); 160 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 161 expectDoubleValue(4.3363357, effect->sample(0, 0.6, duration)->at(0)); 162 expectDoubleValue(4.3362322, effect->sample(0, 0.6, duration * 1000)->at(0)); 163 } 164 165 TEST(AnimationKeyframeEffectModel, ExtrapolateReplaceNonInterpolable) 166 { 167 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0)); 168 keyframes[0]->setComposite(AnimationEffect::CompositeReplace); 169 keyframes[1]->setComposite(AnimationEffect::CompositeReplace); 170 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 171 expectDoubleValue(5.0, effect->sample(0, 1.6, duration)->at(0)); 172 } 173 174 TEST(AnimationKeyframeEffectModel, ExtrapolateReplace) 175 { 176 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 177 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 178 keyframes[0]->setComposite(AnimationEffect::CompositeReplace); 179 keyframes[1]->setComposite(AnimationEffect::CompositeReplace); 180 expectDoubleValue(3.0 * -0.6 + 5.0 * 1.6, effect->sample(0, 1.6, duration)->at(0)); 181 } 182 183 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 184 TEST(AnimationKeyframeEffectModel, DISABLED_ExtrapolateAdd) 185 { 186 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 187 keyframes[0]->setComposite(AnimationEffect::CompositeAdd); 188 keyframes[1]->setComposite(AnimationEffect::CompositeAdd); 189 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 190 expectDoubleValue((7.0 + 3.0) * -0.6 + (7.0 + 5.0) * 1.6, effect->sample(0, 1.6, duration)->at(0)); 191 } 192 193 TEST(AnimationKeyframeEffectModel, ZeroKeyframes) 194 { 195 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(AnimatableValueKeyframeVector()); 196 EXPECT_TRUE(effect->sample(0, 0.5, duration)->isEmpty()); 197 } 198 199 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 200 TEST(AnimationKeyframeEffectModel, DISABLED_SingleKeyframeAtOffsetZero) 201 { 202 AnimatableValueKeyframeVector keyframes(1); 203 keyframes[0] = AnimatableValueKeyframe::create(); 204 keyframes[0]->setOffset(0.0); 205 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); 206 207 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 208 expectDoubleValue(3.0, effect->sample(0, 0.6, duration)->at(0)); 209 } 210 211 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 212 TEST(AnimationKeyframeEffectModel, DISABLED_SingleKeyframeAtOffsetOne) 213 { 214 AnimatableValueKeyframeVector keyframes(1); 215 keyframes[0] = AnimatableValueKeyframe::create(); 216 keyframes[0]->setOffset(1.0); 217 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0).get()); 218 219 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 220 expectDoubleValue(7.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6, duration)->at(0)); 221 } 222 223 TEST(AnimationKeyframeEffectModel, MoreThanTwoKeyframes) 224 { 225 AnimatableValueKeyframeVector keyframes(3); 226 keyframes[0] = AnimatableValueKeyframe::create(); 227 keyframes[0]->setOffset(0.0); 228 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); 229 keyframes[1] = AnimatableValueKeyframe::create(); 230 keyframes[1]->setOffset(0.5); 231 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0).get()); 232 keyframes[2] = AnimatableValueKeyframe::create(); 233 keyframes[2]->setOffset(1.0); 234 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); 235 236 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 237 expectDoubleValue(4.0, effect->sample(0, 0.3, duration)->at(0)); 238 expectDoubleValue(5.0, effect->sample(0, 0.8, duration)->at(0)); 239 } 240 241 TEST(AnimationKeyframeEffectModel, EndKeyframeOffsetsUnspecified) 242 { 243 AnimatableValueKeyframeVector keyframes(3); 244 keyframes[0] = AnimatableValueKeyframe::create(); 245 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); 246 keyframes[1] = AnimatableValueKeyframe::create(); 247 keyframes[1]->setOffset(0.5); 248 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0).get()); 249 keyframes[2] = AnimatableValueKeyframe::create(); 250 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); 251 252 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 253 expectDoubleValue(3.0, effect->sample(0, 0.1, duration)->at(0)); 254 expectDoubleValue(4.0, effect->sample(0, 0.6, duration)->at(0)); 255 expectDoubleValue(5.0, effect->sample(0, 0.9, duration)->at(0)); 256 } 257 258 TEST(AnimationKeyframeEffectModel, SampleOnKeyframe) 259 { 260 AnimatableValueKeyframeVector keyframes(3); 261 keyframes[0] = AnimatableValueKeyframe::create(); 262 keyframes[0]->setOffset(0.0); 263 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); 264 keyframes[1] = AnimatableValueKeyframe::create(); 265 keyframes[1]->setOffset(0.5); 266 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0).get()); 267 keyframes[2] = AnimatableValueKeyframe::create(); 268 keyframes[2]->setOffset(1.0); 269 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); 270 271 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 272 expectDoubleValue(3.0, effect->sample(0, 0.0, duration)->at(0)); 273 expectDoubleValue(4.0, effect->sample(0, 0.5, duration)->at(0)); 274 expectDoubleValue(5.0, effect->sample(0, 1.0, duration)->at(0)); 275 } 276 277 TEST(AnimationKeyframeEffectModel, MultipleKeyframesWithSameOffset) 278 { 279 AnimatableValueKeyframeVector keyframes(9); 280 keyframes[0] = AnimatableValueKeyframe::create(); 281 keyframes[0]->setOffset(0.0); 282 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(0.0).get()); 283 keyframes[1] = AnimatableValueKeyframe::create(); 284 keyframes[1]->setOffset(0.1); 285 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(1.0).get()); 286 keyframes[2] = AnimatableValueKeyframe::create(); 287 keyframes[2]->setOffset(0.1); 288 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(2.0).get()); 289 keyframes[3] = AnimatableValueKeyframe::create(); 290 keyframes[3]->setOffset(0.5); 291 keyframes[3]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); 292 keyframes[4] = AnimatableValueKeyframe::create(); 293 keyframes[4]->setOffset(0.5); 294 keyframes[4]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0).get()); 295 keyframes[5] = AnimatableValueKeyframe::create(); 296 keyframes[5]->setOffset(0.5); 297 keyframes[5]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); 298 keyframes[6] = AnimatableValueKeyframe::create(); 299 keyframes[6]->setOffset(0.9); 300 keyframes[6]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(6.0).get()); 301 keyframes[7] = AnimatableValueKeyframe::create(); 302 keyframes[7]->setOffset(0.9); 303 keyframes[7]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(7.0).get()); 304 keyframes[8] = AnimatableValueKeyframe::create(); 305 keyframes[8]->setOffset(1.0); 306 keyframes[8]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(7.0).get()); 307 308 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 309 expectDoubleValue(0.0, effect->sample(0, 0.0, duration)->at(0)); 310 expectDoubleValue(2.0, effect->sample(0, 0.2, duration)->at(0)); 311 expectDoubleValue(3.0, effect->sample(0, 0.4, duration)->at(0)); 312 expectDoubleValue(5.0, effect->sample(0, 0.5, duration)->at(0)); 313 expectDoubleValue(5.0, effect->sample(0, 0.6, duration)->at(0)); 314 expectDoubleValue(6.0, effect->sample(0, 0.8, duration)->at(0)); 315 expectDoubleValue(7.0, effect->sample(0, 1.0, duration)->at(0)); 316 } 317 318 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 319 TEST(AnimationKeyframeEffectModel, DISABLED_PerKeyframeComposite) 320 { 321 AnimatableValueKeyframeVector keyframes(2); 322 keyframes[0] = AnimatableValueKeyframe::create(); 323 keyframes[0]->setOffset(0.0); 324 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(3.0).get()); 325 keyframes[1] = AnimatableValueKeyframe::create(); 326 keyframes[1]->setOffset(1.0); 327 keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0).get()); 328 keyframes[1]->setComposite(AnimationEffect::CompositeAdd); 329 330 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 331 expectDoubleValue(3.0 * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6, duration)->at(0)); 332 } 333 334 TEST(AnimationKeyframeEffectModel, MultipleProperties) 335 { 336 AnimatableValueKeyframeVector keyframes(2); 337 keyframes[0] = AnimatableValueKeyframe::create(); 338 keyframes[0]->setOffset(0.0); 339 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0).get()); 340 keyframes[0]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(4.0).get()); 341 keyframes[1] = AnimatableValueKeyframe::create(); 342 keyframes[1]->setOffset(1.0); 343 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0).get()); 344 keyframes[1]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(6.0).get()); 345 346 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 347 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > values = effect->sample(0, 0.6, duration); 348 EXPECT_EQ(2UL, values->size()); 349 Interpolation* leftValue = findValue(*values.get(), CSSPropertyLeft); 350 ASSERT_TRUE(leftValue); 351 expectDoubleValue(5.0, leftValue); 352 Interpolation* rightValue = findValue(*values.get(), CSSPropertyRight); 353 ASSERT_TRUE(rightValue); 354 expectDoubleValue(6.0, rightValue); 355 } 356 357 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 358 TEST(AnimationKeyframeEffectModel, DISABLED_RecompositeCompositableValue) 359 { 360 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0)); 361 keyframes[0]->setComposite(AnimationEffect::CompositeAdd); 362 keyframes[1]->setComposite(AnimationEffect::CompositeAdd); 363 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 364 OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > values = effect->sample(0, 0.6, duration); 365 expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, values->at(0)); 366 expectDoubleValue((9.0 + 3.0) * 0.4 + (9.0 + 5.0) * 0.6, values->at(0)); 367 } 368 369 TEST(AnimationKeyframeEffectModel, MultipleIterations) 370 { 371 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(1.0), pixelAnimatableValue(3.0)); 372 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 373 expectDoubleValue(2.0, effect->sample(0, 0.5, duration)->at(0)); 374 expectDoubleValue(2.0, effect->sample(1, 0.5, duration)->at(0)); 375 expectDoubleValue(2.0, effect->sample(2, 0.5, duration)->at(0)); 376 } 377 378 // FIXME: Re-enable this test once compositing of CompositeAdd is supported. 379 TEST(AnimationKeyframeEffectModel, DISABLED_DependsOnUnderlyingValue) 380 { 381 AnimatableValueKeyframeVector keyframes(3); 382 keyframes[0] = AnimatableValueKeyframe::create(); 383 keyframes[0]->setOffset(0.0); 384 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0).get()); 385 keyframes[0]->setComposite(AnimationEffect::CompositeAdd); 386 keyframes[1] = AnimatableValueKeyframe::create(); 387 keyframes[1]->setOffset(0.5); 388 keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0).get()); 389 keyframes[2] = AnimatableValueKeyframe::create(); 390 keyframes[2]->setOffset(1.0); 391 keyframes[2]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0).get()); 392 393 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 394 EXPECT_TRUE(effect->sample(0, 0, duration)->at(0)); 395 EXPECT_TRUE(effect->sample(0, 0.1, duration)->at(0)); 396 EXPECT_TRUE(effect->sample(0, 0.25, duration)->at(0)); 397 EXPECT_TRUE(effect->sample(0, 0.4, duration)->at(0)); 398 EXPECT_FALSE(effect->sample(0, 0.5, duration)->at(0)); 399 EXPECT_FALSE(effect->sample(0, 0.6, duration)->at(0)); 400 EXPECT_FALSE(effect->sample(0, 0.75, duration)->at(0)); 401 EXPECT_FALSE(effect->sample(0, 0.8, duration)->at(0)); 402 EXPECT_FALSE(effect->sample(0, 1, duration)->at(0)); 403 } 404 405 TEST(AnimationKeyframeEffectModel, AddSyntheticKeyframes) 406 { 407 AnimatableValueKeyframeVector keyframes(1); 408 keyframes[0] = AnimatableValueKeyframe::create(); 409 keyframes[0]->setOffset(0.5); 410 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0).get()); 411 412 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 413 const AnimatableValuePropertySpecificKeyframeVector& propertySpecificKeyframes = effect->getPropertySpecificKeyframes(CSSPropertyLeft); 414 EXPECT_EQ(3U, propertySpecificKeyframes.size()); 415 EXPECT_DOUBLE_EQ(0.0, propertySpecificKeyframes[0]->offset()); 416 EXPECT_DOUBLE_EQ(0.5, propertySpecificKeyframes[1]->offset()); 417 EXPECT_DOUBLE_EQ(1.0, propertySpecificKeyframes[2]->offset()); 418 } 419 420 TEST(AnimationKeyframeEffectModel, ToKeyframeEffectModel) 421 { 422 AnimatableValueKeyframeVector keyframes(0); 423 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(keyframes); 424 425 AnimationEffect* baseEffect = effect.get(); 426 EXPECT_TRUE(toAnimatableValueKeyframeEffectModel(baseEffect)); 427 } 428 429 } // namespace 430 431 namespace WebCore { 432 433 class KeyframeEffectModelTest : public ::testing::Test { 434 public: 435 static KeyframeVector normalizedKeyframes(const KeyframeVector& keyframes) 436 { 437 return KeyframeEffectModelBase::normalizedKeyframes(keyframes); 438 } 439 }; 440 441 TEST_F(KeyframeEffectModelTest, NotLooselySorted) 442 { 443 KeyframeVector keyframes(4); 444 keyframes[0] = AnimatableValueKeyframe::create(); 445 keyframes[1] = AnimatableValueKeyframe::create(); 446 keyframes[1]->setOffset(9); 447 keyframes[2] = AnimatableValueKeyframe::create(); 448 keyframes[3] = AnimatableValueKeyframe::create(); 449 keyframes[3]->setOffset(1); 450 451 const KeyframeVector result = normalizedKeyframes(keyframes); 452 EXPECT_EQ(0U, result.size()); 453 } 454 455 TEST_F(KeyframeEffectModelTest, LastOne) 456 { 457 KeyframeVector keyframes(3); 458 keyframes[0] = AnimatableValueKeyframe::create(); 459 keyframes[0]->setOffset(-1); 460 keyframes[1] = AnimatableValueKeyframe::create(); 461 keyframes[2] = AnimatableValueKeyframe::create(); 462 keyframes[2]->setOffset(2); 463 464 const KeyframeVector result = normalizedKeyframes(keyframes); 465 EXPECT_EQ(1U, result.size()); 466 EXPECT_DOUBLE_EQ(1.0, result[0]->offset()); 467 } 468 469 TEST_F(KeyframeEffectModelTest, FirstZero) 470 { 471 KeyframeVector keyframes(3); 472 keyframes[0] = AnimatableValueKeyframe::create(); 473 keyframes[0]->setOffset(-1); 474 keyframes[1] = AnimatableValueKeyframe::create(); 475 keyframes[2] = AnimatableValueKeyframe::create(); 476 keyframes[2]->setOffset(0.25); 477 478 const KeyframeVector result = normalizedKeyframes(keyframes); 479 EXPECT_EQ(2U, result.size()); 480 EXPECT_DOUBLE_EQ(0.0, result[0]->offset()); 481 EXPECT_DOUBLE_EQ(0.25, result[1]->offset()); 482 } 483 484 TEST_F(KeyframeEffectModelTest, EvenlyDistributed1) 485 { 486 KeyframeVector keyframes(5); 487 keyframes[0] = AnimatableValueKeyframe::create(); 488 keyframes[0]->setOffset(0.125); 489 keyframes[1] = AnimatableValueKeyframe::create(); 490 keyframes[2] = AnimatableValueKeyframe::create(); 491 keyframes[3] = AnimatableValueKeyframe::create(); 492 keyframes[4] = AnimatableValueKeyframe::create(); 493 keyframes[4]->setOffset(0.625); 494 495 const KeyframeVector result = normalizedKeyframes(keyframes); 496 EXPECT_EQ(5U, result.size()); 497 EXPECT_DOUBLE_EQ(0.125, result[0]->offset()); 498 EXPECT_DOUBLE_EQ(0.25, result[1]->offset()); 499 EXPECT_DOUBLE_EQ(0.375, result[2]->offset()); 500 EXPECT_DOUBLE_EQ(0.5, result[3]->offset()); 501 EXPECT_DOUBLE_EQ(0.625, result[4]->offset()); 502 } 503 504 TEST_F(KeyframeEffectModelTest, EvenlyDistributed2) 505 { 506 KeyframeVector keyframes(8); 507 keyframes[0] = AnimatableValueKeyframe::create(); 508 keyframes[0]->setOffset(-0.1); 509 keyframes[1] = AnimatableValueKeyframe::create(); 510 keyframes[2] = AnimatableValueKeyframe::create(); 511 keyframes[3] = AnimatableValueKeyframe::create(); 512 keyframes[4] = AnimatableValueKeyframe::create(); 513 keyframes[4]->setOffset(0.75); 514 keyframes[5] = AnimatableValueKeyframe::create(); 515 keyframes[6] = AnimatableValueKeyframe::create(); 516 keyframes[7] = AnimatableValueKeyframe::create(); 517 keyframes[7]->setOffset(1.1); 518 519 const KeyframeVector result = normalizedKeyframes(keyframes); 520 EXPECT_EQ(6U, result.size()); 521 EXPECT_DOUBLE_EQ(0.0, result[0]->offset()); 522 EXPECT_DOUBLE_EQ(0.25, result[1]->offset()); 523 EXPECT_DOUBLE_EQ(0.5, result[2]->offset()); 524 EXPECT_DOUBLE_EQ(0.75, result[3]->offset()); 525 EXPECT_DOUBLE_EQ(0.875, result[4]->offset()); 526 EXPECT_DOUBLE_EQ(1.0, result[5]->offset()); 527 } 528 529 TEST_F(KeyframeEffectModelTest, EvenlyDistributed3) 530 { 531 KeyframeVector keyframes(12); 532 keyframes[0] = AnimatableValueKeyframe::create(); 533 keyframes[0]->setOffset(0); 534 keyframes[1] = AnimatableValueKeyframe::create(); 535 keyframes[2] = AnimatableValueKeyframe::create(); 536 keyframes[3] = AnimatableValueKeyframe::create(); 537 keyframes[4] = AnimatableValueKeyframe::create(); 538 keyframes[4]->setOffset(0.5); 539 keyframes[5] = AnimatableValueKeyframe::create(); 540 keyframes[6] = AnimatableValueKeyframe::create(); 541 keyframes[7] = AnimatableValueKeyframe::create(); 542 keyframes[7]->setOffset(0.8); 543 keyframes[8] = AnimatableValueKeyframe::create(); 544 keyframes[9] = AnimatableValueKeyframe::create(); 545 keyframes[10] = AnimatableValueKeyframe::create(); 546 keyframes[11] = AnimatableValueKeyframe::create(); 547 548 const KeyframeVector result = normalizedKeyframes(keyframes); 549 EXPECT_EQ(12U, result.size()); 550 EXPECT_DOUBLE_EQ(0.0, result[0]->offset()); 551 EXPECT_DOUBLE_EQ(0.125, result[1]->offset()); 552 EXPECT_DOUBLE_EQ(0.25, result[2]->offset()); 553 EXPECT_DOUBLE_EQ(0.375, result[3]->offset()); 554 EXPECT_DOUBLE_EQ(0.5, result[4]->offset()); 555 EXPECT_DOUBLE_EQ(0.6, result[5]->offset()); 556 EXPECT_DOUBLE_EQ(0.7, result[6]->offset()); 557 EXPECT_DOUBLE_EQ(0.8, result[7]->offset()); 558 EXPECT_DOUBLE_EQ(0.85, result[8]->offset()); 559 EXPECT_DOUBLE_EQ(0.9, result[9]->offset()); 560 EXPECT_DOUBLE_EQ(0.95, result[10]->offset()); 561 EXPECT_DOUBLE_EQ(1.0, result[11]->offset()); 562 } 563 564 } // namespace WebCore 565