2 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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
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.
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.
32 #include "core/animation/KeyframeEffectModel.h"
34 #include "core/animation/AnimatableLength.h"
35 #include "core/animation/AnimatableUnknown.h"
36 #include "core/css/CSSPrimitiveValue.h"
37 #include <gtest/gtest.h>
39 using namespace WebCore;
43 AnimatableValue* unknownAnimatableValue(double n)
45 return AnimatableUnknown::create(CSSPrimitiveValue::create(n, CSSPrimitiveValue::CSS_UNKNOWN).get()).leakRef();
48 AnimatableValue* pixelAnimatableValue(double n)
50 return AnimatableLength::create(CSSPrimitiveValue::create(n, CSSPrimitiveValue::CSS_PX).get()).leakRef();
53 KeyframeEffectModel::KeyframeVector keyframesAtZeroAndOne(AnimatableValue* zeroValue, AnimatableValue* oneValue)
55 KeyframeEffectModel::KeyframeVector keyframes(2);
56 keyframes[0] = Keyframe::create();
57 keyframes[0]->setOffset(0.0);
58 keyframes[0]->setPropertyValue(CSSPropertyLeft, zeroValue);
59 keyframes[1] = Keyframe::create();
60 keyframes[1]->setOffset(1.0);
61 keyframes[1]->setPropertyValue(CSSPropertyLeft, oneValue);
65 void expectDoubleValue(double expectedValue, PassRefPtr<AnimatableValue> value)
67 ASSERT_TRUE(value->isLength() || value->isUnknown());
70 if (value->isLength())
71 actualValue = toCSSPrimitiveValue(toAnimatableLength(value.get())->toCSSValue().get())->getDoubleValue();
73 actualValue = toCSSPrimitiveValue(toAnimatableUnknown(value.get())->toCSSValue().get())->getDoubleValue();
75 EXPECT_FLOAT_EQ(static_cast<float>(expectedValue), actualValue);
78 const AnimationEffect::CompositableValue* findValue(const AnimationEffect::CompositableValueList& values, CSSPropertyID id)
80 for (size_t i = 0; i < values.size(); ++i) {
81 const std::pair<CSSPropertyID, RefPtr<AnimationEffect::CompositableValue> >& value = values.at(i);
82 if (value.first == id)
83 return value.second.get();
89 TEST(AnimationKeyframeEffectModel, BasicOperation)
91 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0));
92 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
93 OwnPtr<AnimationEffect::CompositableValueList> values = effect->sample(0, 0.6);
94 ASSERT_EQ(1UL, values->size());
95 EXPECT_EQ(CSSPropertyLeft, values->at(0).first);
96 expectDoubleValue(5.0, values->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
99 TEST(AnimationKeyframeEffectModel, CompositeReplaceNonInterpolable)
101 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0));
102 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
103 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
104 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
105 expectDoubleValue(5.0, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
108 TEST(AnimationKeyframeEffectModel, CompositeReplace)
110 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
111 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
112 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
113 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
114 expectDoubleValue(3.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
117 TEST(AnimationKeyframeEffectModel, CompositeAdd)
119 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
120 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
121 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
122 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
123 expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6)->at(0).second->compositeOnto(pixelAnimatableValue(7.0)));
126 TEST(AnimationKeyframeEffectModel, ExtrapolateReplaceNonInterpolable)
128 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0));
129 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
130 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
131 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
132 expectDoubleValue(5.0, effect->sample(0, 1.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
135 TEST(AnimationKeyframeEffectModel, ExtrapolateReplace)
137 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
138 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
139 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
140 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
141 expectDoubleValue(3.0 * -0.6 + 5.0 * 1.6, effect->sample(0, 1.6)->at(0).second->compositeOnto(pixelAnimatableValue(7.0)));
144 TEST(AnimationKeyframeEffectModel, ExtrapolateAdd)
146 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
147 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
148 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
149 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
150 expectDoubleValue((7.0 + 3.0) * -0.6 + (7.0 + 5.0) * 1.6, effect->sample(0, 1.6)->at(0).second->compositeOnto(pixelAnimatableValue(7.0)));
153 TEST(AnimationKeyframeEffectModel, ZeroKeyframes)
155 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(KeyframeEffectModel::KeyframeVector());
156 EXPECT_TRUE(effect->sample(0, 0.5)->isEmpty());
159 TEST(AnimationKeyframeEffectModel, SingleKeyframeAtOffsetZero)
161 KeyframeEffectModel::KeyframeVector keyframes(1);
162 keyframes[0] = Keyframe::create();
163 keyframes[0]->setOffset(0.0);
164 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
166 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
167 expectDoubleValue(3.0, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
170 TEST(AnimationKeyframeEffectModel, SingleKeyframeAtOffsetOne)
172 KeyframeEffectModel::KeyframeVector keyframes(1);
173 keyframes[0] = Keyframe::create();
174 keyframes[0]->setOffset(1.0);
175 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0));
177 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
178 expectDoubleValue(7.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6)->at(0).second->compositeOnto(pixelAnimatableValue(7.0)));
181 TEST(AnimationKeyframeEffectModel, MoreThanTwoKeyframes)
183 KeyframeEffectModel::KeyframeVector keyframes(3);
184 keyframes[0] = Keyframe::create();
185 keyframes[0]->setOffset(0.0);
186 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
187 keyframes[1] = Keyframe::create();
188 keyframes[1]->setOffset(0.5);
189 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
190 keyframes[2] = Keyframe::create();
191 keyframes[2]->setOffset(1.0);
192 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
194 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
195 expectDoubleValue(4.0, effect->sample(0, 0.3)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
196 expectDoubleValue(5.0, effect->sample(0, 0.8)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
199 TEST(AnimationKeyframeEffectModel, EndKeyframeOffsetsUnspecified)
201 KeyframeEffectModel::KeyframeVector keyframes(3);
202 keyframes[0] = Keyframe::create();
203 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
204 keyframes[1] = Keyframe::create();
205 keyframes[1]->setOffset(0.5);
206 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
207 keyframes[2] = Keyframe::create();
208 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
210 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
211 expectDoubleValue(3.0, effect->sample(0, 0.1)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
212 expectDoubleValue(4.0, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
213 expectDoubleValue(5.0, effect->sample(0, 0.9)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
216 TEST(AnimationKeyframeEffectModel, SampleOnKeyframe)
218 KeyframeEffectModel::KeyframeVector keyframes(3);
219 keyframes[0] = Keyframe::create();
220 keyframes[0]->setOffset(0.0);
221 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
222 keyframes[1] = Keyframe::create();
223 keyframes[1]->setOffset(0.5);
224 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
225 keyframes[2] = Keyframe::create();
226 keyframes[2]->setOffset(1.0);
227 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
229 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
230 expectDoubleValue(3.0, effect->sample(0, 0.0)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
231 expectDoubleValue(4.0, effect->sample(0, 0.5)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
232 expectDoubleValue(5.0, effect->sample(0, 1.0)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
235 // Note that this tests an implementation detail, not behaviour defined by the spec.
236 TEST(AnimationKeyframeEffectModel, SampleReturnsSameAnimatableValueInstance)
238 AnimatableValue* threePixelsValue = unknownAnimatableValue(3.0);
239 AnimatableValue* fourPixelsValue = unknownAnimatableValue(4.0);
240 AnimatableValue* fivePixelsValue = unknownAnimatableValue(5.0);
242 KeyframeEffectModel::KeyframeVector keyframes(3);
243 keyframes[0] = Keyframe::create();
244 keyframes[0]->setOffset(0.0);
245 keyframes[0]->setPropertyValue(CSSPropertyLeft, threePixelsValue);
246 keyframes[1] = Keyframe::create();
247 keyframes[1]->setOffset(0.5);
248 keyframes[1]->setPropertyValue(CSSPropertyLeft, fourPixelsValue);
249 keyframes[2] = Keyframe::create();
250 keyframes[2]->setOffset(1.0);
251 keyframes[2]->setPropertyValue(CSSPropertyLeft, fivePixelsValue);
253 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
254 EXPECT_EQ(threePixelsValue, effect->sample(0, 0.0)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
255 EXPECT_EQ(threePixelsValue, effect->sample(0, 0.1)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
256 EXPECT_EQ(fourPixelsValue, effect->sample(0, 0.4)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
257 EXPECT_EQ(fourPixelsValue, effect->sample(0, 0.5)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
258 EXPECT_EQ(fourPixelsValue, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
259 EXPECT_EQ(fivePixelsValue, effect->sample(0, 0.9)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
260 EXPECT_EQ(fivePixelsValue, effect->sample(0, 1.0)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
263 TEST(AnimationKeyframeEffectModel, MultipleKeyframesWithSameOffset)
265 KeyframeEffectModel::KeyframeVector keyframes(7);
266 keyframes[0] = Keyframe::create();
267 keyframes[0]->setOffset(0.1);
268 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(1.0));
269 keyframes[1] = Keyframe::create();
270 keyframes[1]->setOffset(0.1);
271 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(2.0));
272 keyframes[2] = Keyframe::create();
273 keyframes[2]->setOffset(0.5);
274 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
275 keyframes[3] = Keyframe::create();
276 keyframes[3]->setOffset(0.5);
277 keyframes[3]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
278 keyframes[4] = Keyframe::create();
279 keyframes[4]->setOffset(0.5);
280 keyframes[4]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
281 keyframes[5] = Keyframe::create();
282 keyframes[5]->setOffset(0.9);
283 keyframes[5]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(6.0));
284 keyframes[6] = Keyframe::create();
285 keyframes[6]->setOffset(0.9);
286 keyframes[6]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(7.0));
288 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
289 expectDoubleValue(2.0, effect->sample(0, 0.0)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
290 expectDoubleValue(2.0, effect->sample(0, 0.2)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
291 expectDoubleValue(3.0, effect->sample(0, 0.4)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
292 expectDoubleValue(5.0, effect->sample(0, 0.5)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
293 expectDoubleValue(5.0, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
294 expectDoubleValue(6.0, effect->sample(0, 0.8)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
295 expectDoubleValue(6.0, effect->sample(0, 1.0)->at(0).second->compositeOnto(unknownAnimatableValue(8.0)));
298 TEST(AnimationKeyframeEffectModel, PerKeyframeComposite)
300 KeyframeEffectModel::KeyframeVector keyframes(2);
301 keyframes[0] = Keyframe::create();
302 keyframes[0]->setOffset(0.0);
303 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(3.0));
304 keyframes[1] = Keyframe::create();
305 keyframes[1]->setOffset(1.0);
306 keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0));
307 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
309 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
310 expectDoubleValue(3.0 * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6)->at(0).second->compositeOnto(pixelAnimatableValue(7.0)));
313 TEST(AnimationKeyframeEffectModel, MultipleProperties)
315 KeyframeEffectModel::KeyframeVector keyframes(2);
316 keyframes[0] = Keyframe::create();
317 keyframes[0]->setOffset(0.0);
318 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
319 keyframes[0]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(4.0));
320 keyframes[1] = Keyframe::create();
321 keyframes[1]->setOffset(1.0);
322 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
323 keyframes[1]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(6.0));
325 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
326 OwnPtr<AnimationEffect::CompositableValueList> values = effect->sample(0, 0.6);
327 EXPECT_EQ(2UL, values->size());
328 const AnimationEffect::CompositableValue* leftValue = findValue(*values.get(), CSSPropertyLeft);
329 ASSERT_TRUE(leftValue);
330 expectDoubleValue(5.0, leftValue->compositeOnto(unknownAnimatableValue(7.0)));
331 const AnimationEffect::CompositableValue* rightValue = findValue(*values.get(), CSSPropertyRight);
332 ASSERT_TRUE(rightValue);
333 expectDoubleValue(6.0, rightValue->compositeOnto(unknownAnimatableValue(7.0)));
336 TEST(AnimationKeyframeEffectModel, RecompositeCompositableValue)
338 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
339 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
340 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
341 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
342 OwnPtr<AnimationEffect::CompositableValueList> values = effect->sample(0, 0.6);
343 expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, values->at(0).second->compositeOnto(pixelAnimatableValue(7.0)));
344 expectDoubleValue((9.0 + 3.0) * 0.4 + (9.0 + 5.0) * 0.6, values->at(0).second->compositeOnto(pixelAnimatableValue(9.0)));
347 TEST(AnimationKeyframeEffectModel, MultipleIterations)
349 KeyframeEffectModel::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(1.0), pixelAnimatableValue(3.0));
350 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
351 expectDoubleValue(2.0, effect->sample(0, 0.5)->at(0).second->compositeOnto(unknownAnimatableValue(0.0)));
352 expectDoubleValue(2.0, effect->sample(1, 0.5)->at(0).second->compositeOnto(unknownAnimatableValue(0.0)));
353 expectDoubleValue(2.0, effect->sample(2, 0.5)->at(0).second->compositeOnto(unknownAnimatableValue(0.0)));
356 TEST(AnimationKeyframeEffectModel, DependsOnUnderlyingValue)
358 KeyframeEffectModel::KeyframeVector keyframes(3);
359 keyframes[0] = Keyframe::create();
360 keyframes[0]->setOffset(0.0);
361 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0));
362 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
363 keyframes[1] = Keyframe::create();
364 keyframes[1]->setOffset(0.5);
365 keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0));
366 keyframes[2] = Keyframe::create();
367 keyframes[2]->setOffset(1.0);
368 keyframes[2]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0));
370 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
371 EXPECT_TRUE(effect->sample(0, 0)->at(0).second->dependsOnUnderlyingValue());
372 EXPECT_TRUE(effect->sample(0, 0.1)->at(0).second->dependsOnUnderlyingValue());
373 EXPECT_TRUE(effect->sample(0, 0.25)->at(0).second->dependsOnUnderlyingValue());
374 EXPECT_TRUE(effect->sample(0, 0.4)->at(0).second->dependsOnUnderlyingValue());
375 EXPECT_FALSE(effect->sample(0, 0.5)->at(0).second->dependsOnUnderlyingValue());
376 EXPECT_FALSE(effect->sample(0, 0.6)->at(0).second->dependsOnUnderlyingValue());
377 EXPECT_FALSE(effect->sample(0, 0.75)->at(0).second->dependsOnUnderlyingValue());
378 EXPECT_FALSE(effect->sample(0, 0.8)->at(0).second->dependsOnUnderlyingValue());
379 EXPECT_FALSE(effect->sample(0, 1)->at(0).second->dependsOnUnderlyingValue());
382 TEST(AnimationKeyframeEffectModel, ToKeyframeEffectModel)
384 KeyframeEffectModel::KeyframeVector keyframes(0);
385 RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
387 AnimationEffect* baseEffect = effect.get();
388 EXPECT_TRUE(toKeyframeEffectModel(baseEffect));
395 class KeyframeEffectModelTest : public ::testing::Test {
397 typedef KeyframeEffectModel::KeyframeVector KeyframeVector;
399 static KeyframeVector normalizedKeyframes(const KeyframeVector& keyframes)
401 return KeyframeEffectModel::normalizedKeyframes(keyframes);
405 TEST_F(KeyframeEffectModelTest, NotLooselySorted)
407 KeyframeEffectModel::KeyframeVector keyframes(4);
408 keyframes[0] = Keyframe::create();
409 keyframes[1] = Keyframe::create();
410 keyframes[1]->setOffset(9);
411 keyframes[2] = Keyframe::create();
412 keyframes[3] = Keyframe::create();
413 keyframes[3]->setOffset(1);
415 const KeyframeVector result = normalizedKeyframes(keyframes);
416 EXPECT_EQ(0U, result.size());
419 TEST_F(KeyframeEffectModelTest, LastOne)
421 KeyframeEffectModel::KeyframeVector keyframes(3);
422 keyframes[0] = Keyframe::create();
423 keyframes[0]->setOffset(-1);
424 keyframes[1] = Keyframe::create();
425 keyframes[2] = Keyframe::create();
426 keyframes[2]->setOffset(2);
428 const KeyframeVector result = normalizedKeyframes(keyframes);
429 EXPECT_EQ(1U, result.size());
430 EXPECT_DOUBLE_EQ(1.0, result[0]->offset());
433 TEST_F(KeyframeEffectModelTest, FirstZero)
435 KeyframeEffectModel::KeyframeVector keyframes(3);
436 keyframes[0] = Keyframe::create();
437 keyframes[0]->setOffset(-1);
438 keyframes[1] = Keyframe::create();
439 keyframes[2] = Keyframe::create();
440 keyframes[2]->setOffset(0.25);
442 const KeyframeVector result = normalizedKeyframes(keyframes);
443 EXPECT_EQ(2U, result.size());
444 EXPECT_DOUBLE_EQ(0.0, result[0]->offset());
445 EXPECT_DOUBLE_EQ(0.25, result[1]->offset());
448 TEST_F(KeyframeEffectModelTest, EvenlyDistributed1)
450 KeyframeEffectModel::KeyframeVector keyframes(5);
451 keyframes[0] = Keyframe::create();
452 keyframes[0]->setOffset(0.125);
453 keyframes[1] = Keyframe::create();
454 keyframes[2] = Keyframe::create();
455 keyframes[3] = Keyframe::create();
456 keyframes[4] = Keyframe::create();
457 keyframes[4]->setOffset(0.625);
459 const KeyframeVector result = normalizedKeyframes(keyframes);
460 EXPECT_EQ(5U, result.size());
461 EXPECT_DOUBLE_EQ(0.125, result[0]->offset());
462 EXPECT_DOUBLE_EQ(0.25, result[1]->offset());
463 EXPECT_DOUBLE_EQ(0.375, result[2]->offset());
464 EXPECT_DOUBLE_EQ(0.5, result[3]->offset());
465 EXPECT_DOUBLE_EQ(0.625, result[4]->offset());
468 TEST_F(KeyframeEffectModelTest, EvenlyDistributed2)
470 KeyframeEffectModel::KeyframeVector keyframes(8);
471 keyframes[0] = Keyframe::create();
472 keyframes[0]->setOffset(-0.1);
473 keyframes[1] = Keyframe::create();
474 keyframes[2] = Keyframe::create();
475 keyframes[3] = Keyframe::create();
476 keyframes[4] = Keyframe::create();
477 keyframes[4]->setOffset(0.75);
478 keyframes[5] = Keyframe::create();
479 keyframes[6] = Keyframe::create();
480 keyframes[7] = Keyframe::create();
481 keyframes[7]->setOffset(1.1);
483 const KeyframeVector result = normalizedKeyframes(keyframes);
484 EXPECT_EQ(6U, result.size());
485 EXPECT_DOUBLE_EQ(0.0, result[0]->offset());
486 EXPECT_DOUBLE_EQ(0.25, result[1]->offset());
487 EXPECT_DOUBLE_EQ(0.5, result[2]->offset());
488 EXPECT_DOUBLE_EQ(0.75, result[3]->offset());
489 EXPECT_DOUBLE_EQ(0.875, result[4]->offset());
490 EXPECT_DOUBLE_EQ(1.0, result[5]->offset());
493 TEST_F(KeyframeEffectModelTest, EvenlyDistributed3)
495 KeyframeEffectModel::KeyframeVector keyframes(12);
496 keyframes[0] = Keyframe::create();
497 keyframes[0]->setOffset(0);
498 keyframes[1] = Keyframe::create();
499 keyframes[2] = Keyframe::create();
500 keyframes[3] = Keyframe::create();
501 keyframes[4] = Keyframe::create();
502 keyframes[4]->setOffset(0.5);
503 keyframes[5] = Keyframe::create();
504 keyframes[6] = Keyframe::create();
505 keyframes[7] = Keyframe::create();
506 keyframes[7]->setOffset(0.8);
507 keyframes[8] = Keyframe::create();
508 keyframes[9] = Keyframe::create();
509 keyframes[10] = Keyframe::create();
510 keyframes[11] = Keyframe::create();
512 const KeyframeVector result = normalizedKeyframes(keyframes);
513 EXPECT_EQ(12U, result.size());
514 EXPECT_DOUBLE_EQ(0.0, result[0]->offset());
515 EXPECT_DOUBLE_EQ(0.125, result[1]->offset());
516 EXPECT_DOUBLE_EQ(0.25, result[2]->offset());
517 EXPECT_DOUBLE_EQ(0.375, result[3]->offset());
518 EXPECT_DOUBLE_EQ(0.5, result[4]->offset());
519 EXPECT_DOUBLE_EQ(0.6, result[5]->offset());
520 EXPECT_DOUBLE_EQ(0.7, result[6]->offset());
521 EXPECT_DOUBLE_EQ(0.8, result[7]->offset());
522 EXPECT_DOUBLE_EQ(0.85, result[8]->offset());
523 EXPECT_DOUBLE_EQ(0.9, result[9]->offset());
524 EXPECT_DOUBLE_EQ(0.95, result[10]->offset());
525 EXPECT_DOUBLE_EQ(1.0, result[11]->offset());
528 } // namespace WebCore