Upstream version 5.34.98.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / animation / KeyframeEffectModelTest.cpp
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/css/CSSPrimitiveValue.h"
37 #include <gtest/gtest.h>
38
39 using namespace WebCore;
40
41 namespace {
42
43 AnimatableValue* unknownAnimatableValue(double n)
44 {
45     return AnimatableUnknown::create(CSSPrimitiveValue::create(n, CSSPrimitiveValue::CSS_UNKNOWN).get()).leakRef();
46 }
47
48 AnimatableValue* pixelAnimatableValue(double n)
49 {
50     return AnimatableLength::create(CSSPrimitiveValue::create(n, CSSPrimitiveValue::CSS_PX).get()).leakRef();
51 }
52
53 KeyframeEffectModel::KeyframeVector keyframesAtZeroAndOne(AnimatableValue* zeroValue, AnimatableValue* oneValue)
54 {
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);
62     return keyframes;
63 }
64
65 void expectDoubleValue(double expectedValue, PassRefPtr<AnimatableValue> value)
66 {
67     ASSERT_TRUE(value->isLength() || value->isUnknown());
68
69     double actualValue;
70     if (value->isLength())
71         actualValue = toCSSPrimitiveValue(toAnimatableLength(value.get())->toCSSValue().get())->getDoubleValue();
72     else
73         actualValue = toCSSPrimitiveValue(toAnimatableUnknown(value.get())->toCSSValue().get())->getDoubleValue();
74
75     EXPECT_FLOAT_EQ(static_cast<float>(expectedValue), actualValue);
76 }
77
78 const AnimationEffect::CompositableValue* findValue(const AnimationEffect::CompositableValueList& values, CSSPropertyID id)
79 {
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();
84     }
85     return 0;
86 }
87
88
89 TEST(AnimationKeyframeEffectModel, BasicOperation)
90 {
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)));
97 }
98
99 TEST(AnimationKeyframeEffectModel, CompositeReplaceNonInterpolable)
100 {
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)));
106 }
107
108 TEST(AnimationKeyframeEffectModel, CompositeReplace)
109 {
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)));
115 }
116
117 TEST(AnimationKeyframeEffectModel, CompositeAdd)
118 {
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)));
124 }
125
126 TEST(AnimationKeyframeEffectModel, ExtrapolateReplaceNonInterpolable)
127 {
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)));
133 }
134
135 TEST(AnimationKeyframeEffectModel, ExtrapolateReplace)
136 {
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)));
142 }
143
144 TEST(AnimationKeyframeEffectModel, ExtrapolateAdd)
145 {
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)));
151 }
152
153 TEST(AnimationKeyframeEffectModel, ZeroKeyframes)
154 {
155     RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(KeyframeEffectModel::KeyframeVector());
156     EXPECT_TRUE(effect->sample(0, 0.5)->isEmpty());
157 }
158
159 TEST(AnimationKeyframeEffectModel, SingleKeyframeAtOffsetZero)
160 {
161     KeyframeEffectModel::KeyframeVector keyframes(1);
162     keyframes[0] = Keyframe::create();
163     keyframes[0]->setOffset(0.0);
164     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
165
166     RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
167     expectDoubleValue(3.0, effect->sample(0, 0.6)->at(0).second->compositeOnto(unknownAnimatableValue(7.0)));
168 }
169
170 TEST(AnimationKeyframeEffectModel, SingleKeyframeAtOffsetOne)
171 {
172     KeyframeEffectModel::KeyframeVector keyframes(1);
173     keyframes[0] = Keyframe::create();
174     keyframes[0]->setOffset(1.0);
175     keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0));
176
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)));
179 }
180
181 TEST(AnimationKeyframeEffectModel, MoreThanTwoKeyframes)
182 {
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));
193
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)));
197 }
198
199 TEST(AnimationKeyframeEffectModel, EndKeyframeOffsetsUnspecified)
200 {
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));
209
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)));
214 }
215
216 TEST(AnimationKeyframeEffectModel, SampleOnKeyframe)
217 {
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));
228
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)));
233 }
234
235 // Note that this tests an implementation detail, not behaviour defined by the spec.
236 TEST(AnimationKeyframeEffectModel, SampleReturnsSameAnimatableValueInstance)
237 {
238     AnimatableValue* threePixelsValue = unknownAnimatableValue(3.0);
239     AnimatableValue* fourPixelsValue = unknownAnimatableValue(4.0);
240     AnimatableValue* fivePixelsValue = unknownAnimatableValue(5.0);
241
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);
252
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)));
261 }
262
263 TEST(AnimationKeyframeEffectModel, MultipleKeyframesWithSameOffset)
264 {
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));
287
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)));
296 }
297
298 TEST(AnimationKeyframeEffectModel, PerKeyframeComposite)
299 {
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);
308
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)));
311 }
312
313 TEST(AnimationKeyframeEffectModel, MultipleProperties)
314 {
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));
324
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)));
334 }
335
336 TEST(AnimationKeyframeEffectModel, RecompositeCompositableValue)
337 {
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)));
345 }
346
347 TEST(AnimationKeyframeEffectModel, MultipleIterations)
348 {
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)));
354 }
355
356 TEST(AnimationKeyframeEffectModel, DependsOnUnderlyingValue)
357 {
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));
369
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());
380 }
381
382 TEST(AnimationKeyframeEffectModel, ToKeyframeEffectModel)
383 {
384     KeyframeEffectModel::KeyframeVector keyframes(0);
385     RefPtr<KeyframeEffectModel> effect = KeyframeEffectModel::create(keyframes);
386
387     AnimationEffect* baseEffect = effect.get();
388     EXPECT_TRUE(toKeyframeEffectModel(baseEffect));
389 }
390
391 } // namespace
392
393 namespace WebCore {
394
395 class KeyframeEffectModelTest : public ::testing::Test {
396 public:
397     typedef KeyframeEffectModel::KeyframeVector KeyframeVector;
398
399     static KeyframeVector normalizedKeyframes(const KeyframeVector& keyframes)
400     {
401         return KeyframeEffectModel::normalizedKeyframes(keyframes);
402     }
403 };
404
405 TEST_F(KeyframeEffectModelTest, NotLooselySorted)
406 {
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);
414
415     const KeyframeVector result = normalizedKeyframes(keyframes);
416     EXPECT_EQ(0U, result.size());
417 }
418
419 TEST_F(KeyframeEffectModelTest, LastOne)
420 {
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);
427
428     const KeyframeVector result = normalizedKeyframes(keyframes);
429     EXPECT_EQ(1U, result.size());
430     EXPECT_DOUBLE_EQ(1.0, result[0]->offset());
431 }
432
433 TEST_F(KeyframeEffectModelTest, FirstZero)
434 {
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);
441
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());
446 }
447
448 TEST_F(KeyframeEffectModelTest, EvenlyDistributed1)
449 {
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);
458
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());
466 }
467
468 TEST_F(KeyframeEffectModelTest, EvenlyDistributed2)
469 {
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);
482
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());
491 }
492
493 TEST_F(KeyframeEffectModelTest, EvenlyDistributed3)
494 {
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();
511
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());
526 }
527
528 } // namespace WebCore