Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(334)

Side by Side Diff: sky/engine/core/animation/KeyframeEffectModelTest.cpp

Issue 1229273004: Remove Animations and Transitions. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 "sky/engine/core/animation/KeyframeEffectModel.h"
32
33 #include <gtest/gtest.h>
34 #include "sky/engine/core/animation/LegacyStyleInterpolation.h"
35 #include "sky/engine/core/animation/animatable/AnimatableLength.h"
36 #include "sky/engine/core/animation/animatable/AnimatableUnknown.h"
37 #include "sky/engine/core/css/CSSPrimitiveValue.h"
38 #include "sky/engine/core/css/parser/BisonCSSParser.h"
39 #include "sky/engine/core/css/resolver/CSSToStyleMap.h"
40
41 using namespace blink;
42
43 namespace {
44
45 const double duration = 1.0;
46
47 PassRefPtr<AnimatableValue> unknownAnimatableValue(double n)
48 {
49 return AnimatableUnknown::create(CSSPrimitiveValue::create(n, CSSPrimitiveVa lue::CSS_UNKNOWN).get());
50 }
51
52 PassRefPtr<AnimatableValue> pixelAnimatableValue(double n)
53 {
54 return AnimatableLength::create(Length(n, Fixed));
55 }
56
57 AnimatableValueKeyframeVector keyframesAtZeroAndOne(PassRefPtr<AnimatableValue> zeroValue, PassRefPtr<AnimatableValue> oneValue)
58 {
59 AnimatableValueKeyframeVector keyframes(2);
60 keyframes[0] = AnimatableValueKeyframe::create();
61 keyframes[0]->setOffset(0.0);
62 keyframes[0]->setPropertyValue(CSSPropertyLeft, zeroValue.get());
63 keyframes[1] = AnimatableValueKeyframe::create();
64 keyframes[1]->setOffset(1.0);
65 keyframes[1]->setPropertyValue(CSSPropertyLeft, oneValue.get());
66 return keyframes;
67 }
68
69 void expectProperty(CSSPropertyID property, PassRefPtr<Interpolation> interpolat ionValue)
70 {
71 LegacyStyleInterpolation* interpolation = toLegacyStyleInterpolation(interpo lationValue.get());
72 ASSERT_EQ(property, interpolation->id());
73 }
74
75 void expectDoubleValue(double expectedValue, PassRefPtr<Interpolation> interpola tionValue)
76 {
77 LegacyStyleInterpolation* interpolation = toLegacyStyleInterpolation(interpo lationValue.get());
78 RefPtr<AnimatableValue> value = interpolation->currentValue();
79
80 ASSERT_TRUE(value->isLength() || value->isUnknown());
81
82 double actualValue;
83 if (value->isLength())
84 actualValue = toAnimatableLength(value.get())->length(1, ValueRangeAll). value();
85 else
86 actualValue = toCSSPrimitiveValue(toAnimatableUnknown(value.get())->toCS SValue().get())->getDoubleValue();
87
88 EXPECT_FLOAT_EQ(static_cast<float>(expectedValue), actualValue);
89 }
90
91 Interpolation* findValue(Vector<RefPtr<Interpolation> >& values, CSSPropertyID i d)
92 {
93 for (size_t i = 0; i < values.size(); ++i) {
94 LegacyStyleInterpolation* value = toLegacyStyleInterpolation(values.at(i ).get());
95 if (value->id() == id)
96 return value;
97 }
98 return 0;
99 }
100
101
102 TEST(AnimationKeyframeEffectModel, BasicOperation)
103 {
104 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnima tableValue(3.0), unknownAnimatableValue(5.0));
105 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
106 OwnPtr<Vector<RefPtr<Interpolation> > > values = effect->sample(0, 0.6, dura tion);
107 ASSERT_EQ(1UL, values->size());
108 expectProperty(CSSPropertyLeft, values->at(0));
109 expectDoubleValue(5.0, values->at(0));
110 }
111
112 TEST(AnimationKeyframeEffectModel, CompositeReplaceNonInterpolable)
113 {
114 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnima tableValue(3.0), unknownAnimatableValue(5.0));
115 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
116 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
117 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
118 expectDoubleValue(5.0, effect->sample(0, 0.6, duration)->at(0));
119 }
120
121 TEST(AnimationKeyframeEffectModel, CompositeReplace)
122 {
123 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
124 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
125 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
126 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
127 expectDoubleValue(3.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6, duration)->a t(0));
128 }
129
130 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
131 TEST(AnimationKeyframeEffectModel, DISABLED_CompositeAdd)
132 {
133 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
134 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
135 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
136 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
137 expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0 .6, duration)->at(0));
138 }
139
140 TEST(AnimationKeyframeEffectModel, CompositeEaseIn)
141 {
142 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
143 RefPtr<CSSValue> timingFunction = BisonCSSParser::parseAnimationTimingFuncti onValue("ease-in");
144 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
145 keyframes[0]->setEasing(CSSToStyleMap::mapAnimationTimingFunction(timingFunc tion.get(), true));
146 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
147 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
148 expectDoubleValue(3.8579516, effect->sample(0, 0.6, duration)->at(0));
149 expectDoubleValue(3.8582394, effect->sample(0, 0.6, duration * 100)->at(0));
150 }
151
152 TEST(AnimationKeyframeEffectModel, CompositeCubicBezier)
153 {
154 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
155 RefPtr<CSSValue> timingFunction = BisonCSSParser::parseAnimationTimingFuncti onValue("cubic-bezier(0.42, 0, 0.58, 1)");
156 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
157 keyframes[0]->setEasing(CSSToStyleMap::mapAnimationTimingFunction(timingFunc tion.get(), true));
158 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
159 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
160 expectDoubleValue(4.3363357, effect->sample(0, 0.6, duration)->at(0));
161 expectDoubleValue(4.3362322, effect->sample(0, 0.6, duration * 1000)->at(0)) ;
162 }
163
164 TEST(AnimationKeyframeEffectModel, ExtrapolateReplaceNonInterpolable)
165 {
166 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnima tableValue(3.0), unknownAnimatableValue(5.0));
167 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
168 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
169 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
170 expectDoubleValue(5.0, effect->sample(0, 1.6, duration)->at(0));
171 }
172
173 TEST(AnimationKeyframeEffectModel, ExtrapolateReplace)
174 {
175 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
176 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
177 keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
178 keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
179 expectDoubleValue(3.0 * -0.6 + 5.0 * 1.6, effect->sample(0, 1.6, duration)-> at(0));
180 }
181
182 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
183 TEST(AnimationKeyframeEffectModel, DISABLED_ExtrapolateAdd)
184 {
185 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
186 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
187 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
188 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
189 expectDoubleValue((7.0 + 3.0) * -0.6 + (7.0 + 5.0) * 1.6, effect->sample(0, 1.6, duration)->at(0));
190 }
191
192 TEST(AnimationKeyframeEffectModel, ZeroKeyframes)
193 {
194 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(AnimatableValueKeyframeVector());
195 EXPECT_TRUE(effect->sample(0, 0.5, duration)->isEmpty());
196 }
197
198 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
199 TEST(AnimationKeyframeEffectModel, DISABLED_SingleKeyframeAtOffsetZero)
200 {
201 AnimatableValueKeyframeVector keyframes(1);
202 keyframes[0] = AnimatableValueKeyframe::create();
203 keyframes[0]->setOffset(0.0);
204 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0). get());
205
206 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
207 expectDoubleValue(3.0, effect->sample(0, 0.6, duration)->at(0));
208 }
209
210 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
211 TEST(AnimationKeyframeEffectModel, DISABLED_SingleKeyframeAtOffsetOne)
212 {
213 AnimatableValueKeyframeVector keyframes(1);
214 keyframes[0] = AnimatableValueKeyframe::create();
215 keyframes[0]->setOffset(1.0);
216 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0).ge t());
217
218 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
219 expectDoubleValue(7.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6, duration)->a t(0));
220 }
221
222 TEST(AnimationKeyframeEffectModel, MoreThanTwoKeyframes)
223 {
224 AnimatableValueKeyframeVector keyframes(3);
225 keyframes[0] = AnimatableValueKeyframe::create();
226 keyframes[0]->setOffset(0.0);
227 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0). get());
228 keyframes[1] = AnimatableValueKeyframe::create();
229 keyframes[1]->setOffset(0.5);
230 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0). get());
231 keyframes[2] = AnimatableValueKeyframe::create();
232 keyframes[2]->setOffset(1.0);
233 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0). get());
234
235 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
236 expectDoubleValue(4.0, effect->sample(0, 0.3, duration)->at(0));
237 expectDoubleValue(5.0, effect->sample(0, 0.8, duration)->at(0));
238 }
239
240 TEST(AnimationKeyframeEffectModel, EndKeyframeOffsetsUnspecified)
241 {
242 AnimatableValueKeyframeVector keyframes(3);
243 keyframes[0] = AnimatableValueKeyframe::create();
244 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0). get());
245 keyframes[1] = AnimatableValueKeyframe::create();
246 keyframes[1]->setOffset(0.5);
247 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0). get());
248 keyframes[2] = AnimatableValueKeyframe::create();
249 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0). get());
250
251 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
252 expectDoubleValue(3.0, effect->sample(0, 0.1, duration)->at(0));
253 expectDoubleValue(4.0, effect->sample(0, 0.6, duration)->at(0));
254 expectDoubleValue(5.0, effect->sample(0, 0.9, duration)->at(0));
255 }
256
257 TEST(AnimationKeyframeEffectModel, SampleOnKeyframe)
258 {
259 AnimatableValueKeyframeVector keyframes(3);
260 keyframes[0] = AnimatableValueKeyframe::create();
261 keyframes[0]->setOffset(0.0);
262 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0). get());
263 keyframes[1] = AnimatableValueKeyframe::create();
264 keyframes[1]->setOffset(0.5);
265 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0). get());
266 keyframes[2] = AnimatableValueKeyframe::create();
267 keyframes[2]->setOffset(1.0);
268 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0). get());
269
270 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
271 expectDoubleValue(3.0, effect->sample(0, 0.0, duration)->at(0));
272 expectDoubleValue(4.0, effect->sample(0, 0.5, duration)->at(0));
273 expectDoubleValue(5.0, effect->sample(0, 1.0, duration)->at(0));
274 }
275
276 TEST(AnimationKeyframeEffectModel, MultipleKeyframesWithSameOffset)
277 {
278 AnimatableValueKeyframeVector keyframes(9);
279 keyframes[0] = AnimatableValueKeyframe::create();
280 keyframes[0]->setOffset(0.0);
281 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(0.0). get());
282 keyframes[1] = AnimatableValueKeyframe::create();
283 keyframes[1]->setOffset(0.1);
284 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(1.0). get());
285 keyframes[2] = AnimatableValueKeyframe::create();
286 keyframes[2]->setOffset(0.1);
287 keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(2.0). get());
288 keyframes[3] = AnimatableValueKeyframe::create();
289 keyframes[3]->setOffset(0.5);
290 keyframes[3]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0). get());
291 keyframes[4] = AnimatableValueKeyframe::create();
292 keyframes[4]->setOffset(0.5);
293 keyframes[4]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0). get());
294 keyframes[5] = AnimatableValueKeyframe::create();
295 keyframes[5]->setOffset(0.5);
296 keyframes[5]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0). get());
297 keyframes[6] = AnimatableValueKeyframe::create();
298 keyframes[6]->setOffset(0.9);
299 keyframes[6]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(6.0). get());
300 keyframes[7] = AnimatableValueKeyframe::create();
301 keyframes[7]->setOffset(0.9);
302 keyframes[7]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(7.0). get());
303 keyframes[8] = AnimatableValueKeyframe::create();
304 keyframes[8]->setOffset(1.0);
305 keyframes[8]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(7.0). get());
306
307 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
308 expectDoubleValue(0.0, effect->sample(0, 0.0, duration)->at(0));
309 expectDoubleValue(2.0, effect->sample(0, 0.2, duration)->at(0));
310 expectDoubleValue(3.0, effect->sample(0, 0.4, duration)->at(0));
311 expectDoubleValue(5.0, effect->sample(0, 0.5, duration)->at(0));
312 expectDoubleValue(5.0, effect->sample(0, 0.6, duration)->at(0));
313 expectDoubleValue(6.0, effect->sample(0, 0.8, duration)->at(0));
314 expectDoubleValue(7.0, effect->sample(0, 1.0, duration)->at(0));
315 }
316
317 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
318 TEST(AnimationKeyframeEffectModel, DISABLED_PerKeyframeComposite)
319 {
320 AnimatableValueKeyframeVector keyframes(2);
321 keyframes[0] = AnimatableValueKeyframe::create();
322 keyframes[0]->setOffset(0.0);
323 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(3.0).ge t());
324 keyframes[1] = AnimatableValueKeyframe::create();
325 keyframes[1]->setOffset(1.0);
326 keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0).ge t());
327 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
328
329 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
330 expectDoubleValue(3.0 * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6, dura tion)->at(0));
331 }
332
333 TEST(AnimationKeyframeEffectModel, MultipleProperties)
334 {
335 AnimatableValueKeyframeVector keyframes(2);
336 keyframes[0] = AnimatableValueKeyframe::create();
337 keyframes[0]->setOffset(0.0);
338 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0). get());
339 keyframes[0]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(4.0) .get());
340 keyframes[1] = AnimatableValueKeyframe::create();
341 keyframes[1]->setOffset(1.0);
342 keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0). get());
343 keyframes[1]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(6.0) .get());
344
345 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
346 OwnPtr<Vector<RefPtr<Interpolation> > > values = effect->sample(0, 0.6, dura tion);
347 EXPECT_EQ(2UL, values->size());
348 Interpolation* leftValue = findValue(*values.get(), CSSPropertyLeft);
349 ASSERT_TRUE(leftValue);
350 expectDoubleValue(5.0, leftValue);
351 Interpolation* rightValue = findValue(*values.get(), CSSPropertyRight);
352 ASSERT_TRUE(rightValue);
353 expectDoubleValue(6.0, rightValue);
354 }
355
356 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
357 TEST(AnimationKeyframeEffectModel, DISABLED_RecompositeCompositableValue)
358 {
359 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(3.0), pixelAnimatableValue(5.0));
360 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
361 keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
362 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
363 OwnPtr<Vector<RefPtr<Interpolation> > > values = effect->sample(0, 0.6, dura tion);
364 expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, values->at(0));
365 expectDoubleValue((9.0 + 3.0) * 0.4 + (9.0 + 5.0) * 0.6, values->at(0));
366 }
367
368 TEST(AnimationKeyframeEffectModel, MultipleIterations)
369 {
370 AnimatableValueKeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimata bleValue(1.0), pixelAnimatableValue(3.0));
371 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
372 expectDoubleValue(2.0, effect->sample(0, 0.5, duration)->at(0));
373 expectDoubleValue(2.0, effect->sample(1, 0.5, duration)->at(0));
374 expectDoubleValue(2.0, effect->sample(2, 0.5, duration)->at(0));
375 }
376
377 // FIXME: Re-enable this test once compositing of CompositeAdd is supported.
378 TEST(AnimationKeyframeEffectModel, DISABLED_DependsOnUnderlyingValue)
379 {
380 AnimatableValueKeyframeVector keyframes(3);
381 keyframes[0] = AnimatableValueKeyframe::create();
382 keyframes[0]->setOffset(0.0);
383 keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0).ge t());
384 keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
385 keyframes[1] = AnimatableValueKeyframe::create();
386 keyframes[1]->setOffset(0.5);
387 keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0).ge t());
388 keyframes[2] = AnimatableValueKeyframe::create();
389 keyframes[2]->setOffset(1.0);
390 keyframes[2]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0).ge t());
391
392 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
393 EXPECT_TRUE(effect->sample(0, 0, duration)->at(0));
394 EXPECT_TRUE(effect->sample(0, 0.1, duration)->at(0));
395 EXPECT_TRUE(effect->sample(0, 0.25, duration)->at(0));
396 EXPECT_TRUE(effect->sample(0, 0.4, duration)->at(0));
397 EXPECT_FALSE(effect->sample(0, 0.5, duration)->at(0));
398 EXPECT_FALSE(effect->sample(0, 0.6, duration)->at(0));
399 EXPECT_FALSE(effect->sample(0, 0.75, duration)->at(0));
400 EXPECT_FALSE(effect->sample(0, 0.8, duration)->at(0));
401 EXPECT_FALSE(effect->sample(0, 1, duration)->at(0));
402 }
403
404 TEST(AnimationKeyframeEffectModel, AddSyntheticKeyframes)
405 {
406 AnimatableValueKeyframeVector keyframes(1);
407 keyframes[0] = AnimatableValueKeyframe::create();
408 keyframes[0]->setOffset(0.5);
409 keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0). get());
410
411 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
412 const AnimatableValuePropertySpecificKeyframeVector& propertySpecificKeyfram es = effect->getPropertySpecificKeyframes(CSSPropertyLeft);
413 EXPECT_EQ(3U, propertySpecificKeyframes.size());
414 EXPECT_DOUBLE_EQ(0.0, propertySpecificKeyframes[0]->offset());
415 EXPECT_DOUBLE_EQ(0.5, propertySpecificKeyframes[1]->offset());
416 EXPECT_DOUBLE_EQ(1.0, propertySpecificKeyframes[2]->offset());
417 }
418
419 TEST(AnimationKeyframeEffectModel, ToKeyframeEffectModel)
420 {
421 AnimatableValueKeyframeVector keyframes(0);
422 RefPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeE ffectModel::create(keyframes);
423
424 AnimationEffect* baseEffect = effect.get();
425 EXPECT_TRUE(toAnimatableValueKeyframeEffectModel(baseEffect));
426 }
427
428 } // namespace
429
430 namespace blink {
431
432 class KeyframeEffectModelTest : public ::testing::Test {
433 public:
434 static KeyframeVector normalizedKeyframes(const KeyframeVector& keyframes)
435 {
436 return KeyframeEffectModelBase::normalizedKeyframes(keyframes);
437 }
438 };
439
440 TEST_F(KeyframeEffectModelTest, EvenlyDistributed1)
441 {
442 KeyframeVector keyframes(5);
443 keyframes[0] = AnimatableValueKeyframe::create();
444 keyframes[0]->setOffset(0.125);
445 keyframes[1] = AnimatableValueKeyframe::create();
446 keyframes[2] = AnimatableValueKeyframe::create();
447 keyframes[3] = AnimatableValueKeyframe::create();
448 keyframes[4] = AnimatableValueKeyframe::create();
449 keyframes[4]->setOffset(0.625);
450
451 const KeyframeVector result = normalizedKeyframes(keyframes);
452 EXPECT_EQ(5U, result.size());
453 EXPECT_DOUBLE_EQ(0.125, result[0]->offset());
454 EXPECT_DOUBLE_EQ(0.25, result[1]->offset());
455 EXPECT_DOUBLE_EQ(0.375, result[2]->offset());
456 EXPECT_DOUBLE_EQ(0.5, result[3]->offset());
457 EXPECT_DOUBLE_EQ(0.625, result[4]->offset());
458 }
459
460 TEST_F(KeyframeEffectModelTest, EvenlyDistributed2)
461 {
462 KeyframeVector keyframes(6);
463 keyframes[0] = AnimatableValueKeyframe::create();
464 keyframes[1] = AnimatableValueKeyframe::create();
465 keyframes[2] = AnimatableValueKeyframe::create();
466 keyframes[3] = AnimatableValueKeyframe::create();
467 keyframes[3]->setOffset(0.75);
468 keyframes[4] = AnimatableValueKeyframe::create();
469 keyframes[5] = AnimatableValueKeyframe::create();
470
471 const KeyframeVector result = normalizedKeyframes(keyframes);
472 EXPECT_EQ(6U, result.size());
473 EXPECT_DOUBLE_EQ(0.0, result[0]->offset());
474 EXPECT_DOUBLE_EQ(0.25, result[1]->offset());
475 EXPECT_DOUBLE_EQ(0.5, result[2]->offset());
476 EXPECT_DOUBLE_EQ(0.75, result[3]->offset());
477 EXPECT_DOUBLE_EQ(0.875, result[4]->offset());
478 EXPECT_DOUBLE_EQ(1.0, result[5]->offset());
479 }
480
481 TEST_F(KeyframeEffectModelTest, EvenlyDistributed3)
482 {
483 KeyframeVector keyframes(12);
484 keyframes[0] = AnimatableValueKeyframe::create();
485 keyframes[0]->setOffset(0);
486 keyframes[1] = AnimatableValueKeyframe::create();
487 keyframes[2] = AnimatableValueKeyframe::create();
488 keyframes[3] = AnimatableValueKeyframe::create();
489 keyframes[4] = AnimatableValueKeyframe::create();
490 keyframes[4]->setOffset(0.5);
491 keyframes[5] = AnimatableValueKeyframe::create();
492 keyframes[6] = AnimatableValueKeyframe::create();
493 keyframes[7] = AnimatableValueKeyframe::create();
494 keyframes[7]->setOffset(0.8);
495 keyframes[8] = AnimatableValueKeyframe::create();
496 keyframes[9] = AnimatableValueKeyframe::create();
497 keyframes[10] = AnimatableValueKeyframe::create();
498 keyframes[11] = AnimatableValueKeyframe::create();
499
500 const KeyframeVector result = normalizedKeyframes(keyframes);
501 EXPECT_EQ(12U, result.size());
502 EXPECT_DOUBLE_EQ(0.0, result[0]->offset());
503 EXPECT_DOUBLE_EQ(0.125, result[1]->offset());
504 EXPECT_DOUBLE_EQ(0.25, result[2]->offset());
505 EXPECT_DOUBLE_EQ(0.375, result[3]->offset());
506 EXPECT_DOUBLE_EQ(0.5, result[4]->offset());
507 EXPECT_DOUBLE_EQ(0.6, result[5]->offset());
508 EXPECT_DOUBLE_EQ(0.7, result[6]->offset());
509 EXPECT_DOUBLE_EQ(0.8, result[7]->offset());
510 EXPECT_DOUBLE_EQ(0.85, result[8]->offset());
511 EXPECT_DOUBLE_EQ(0.9, result[9]->offset());
512 EXPECT_DOUBLE_EQ(0.95, result[10]->offset());
513 EXPECT_DOUBLE_EQ(1.0, result[11]->offset());
514 }
515
516 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/core/animation/KeyframeEffectModel.cpp ('k') | sky/engine/core/animation/LegacyStyleInterpolation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698