• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "cc/animation/keyframed_animation_curve.h"
6 
7 #include "cc/animation/transform_operations.h"
8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/gfx/animation/tween.h"
11 #include "ui/gfx/box_f.h"
12 #include "ui/gfx/test/color_util.h"
13 
14 namespace cc {
15 namespace {
16 
ExpectTranslateX(SkMScalar translate_x,const gfx::Transform & transform)17 void ExpectTranslateX(SkMScalar translate_x, const gfx::Transform& transform) {
18   EXPECT_FLOAT_EQ(translate_x, transform.matrix().get(0, 3));
19 }
20 
ExpectBrightness(double brightness,const FilterOperations & filter)21 void ExpectBrightness(double brightness, const FilterOperations& filter) {
22   EXPECT_EQ(1u, filter.size());
23   EXPECT_EQ(FilterOperation::BRIGHTNESS, filter.at(0).type());
24   EXPECT_FLOAT_EQ(brightness, filter.at(0).amount());
25 }
26 
27 // Tests that a color animation with one keyframe works as expected.
TEST(KeyframedAnimationCurveTest,OneColorKeyFrame)28 TEST(KeyframedAnimationCurveTest, OneColorKeyFrame) {
29   SkColor color = SkColorSetARGB(255, 255, 255, 255);
30   scoped_ptr<KeyframedColorAnimationCurve> curve(
31       KeyframedColorAnimationCurve::Create());
32   curve->AddKeyframe(
33       ColorKeyframe::Create(0.0, color, scoped_ptr<TimingFunction>()));
34 
35   EXPECT_SKCOLOR_EQ(color, curve->GetValue(-1.f));
36   EXPECT_SKCOLOR_EQ(color, curve->GetValue(0.f));
37   EXPECT_SKCOLOR_EQ(color, curve->GetValue(0.5f));
38   EXPECT_SKCOLOR_EQ(color, curve->GetValue(1.f));
39   EXPECT_SKCOLOR_EQ(color, curve->GetValue(2.f));
40 }
41 
42 // Tests that a color animation with two keyframes works as expected.
TEST(KeyframedAnimationCurveTest,TwoColorKeyFrame)43 TEST(KeyframedAnimationCurveTest, TwoColorKeyFrame) {
44   SkColor color_a = SkColorSetARGB(255, 255, 0, 0);
45   SkColor color_b = SkColorSetARGB(255, 0, 255, 0);
46   SkColor color_midpoint = gfx::Tween::ColorValueBetween(0.5, color_a, color_b);
47   scoped_ptr<KeyframedColorAnimationCurve> curve(
48       KeyframedColorAnimationCurve::Create());
49   curve->AddKeyframe(
50       ColorKeyframe::Create(0.0, color_a, scoped_ptr<TimingFunction>()));
51   curve->AddKeyframe(
52       ColorKeyframe::Create(1.0, color_b, scoped_ptr<TimingFunction>()));
53 
54   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(-1.f));
55   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(0.f));
56   EXPECT_SKCOLOR_EQ(color_midpoint, curve->GetValue(0.5f));
57   EXPECT_SKCOLOR_EQ(color_b, curve->GetValue(1.f));
58   EXPECT_SKCOLOR_EQ(color_b, curve->GetValue(2.f));
59 }
60 
61 // Tests that a color animation with three keyframes works as expected.
TEST(KeyframedAnimationCurveTest,ThreeColorKeyFrame)62 TEST(KeyframedAnimationCurveTest, ThreeColorKeyFrame) {
63   SkColor color_a = SkColorSetARGB(255, 255, 0, 0);
64   SkColor color_b = SkColorSetARGB(255, 0, 255, 0);
65   SkColor color_c = SkColorSetARGB(255, 0, 0, 255);
66   SkColor color_midpoint1 =
67       gfx::Tween::ColorValueBetween(0.5, color_a, color_b);
68   SkColor color_midpoint2 =
69       gfx::Tween::ColorValueBetween(0.5, color_b, color_c);
70   scoped_ptr<KeyframedColorAnimationCurve> curve(
71       KeyframedColorAnimationCurve::Create());
72   curve->AddKeyframe(
73       ColorKeyframe::Create(0.0, color_a, scoped_ptr<TimingFunction>()));
74   curve->AddKeyframe(
75       ColorKeyframe::Create(1.0, color_b, scoped_ptr<TimingFunction>()));
76   curve->AddKeyframe(
77       ColorKeyframe::Create(2.0, color_c, scoped_ptr<TimingFunction>()));
78 
79   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(-1.f));
80   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(0.f));
81   EXPECT_SKCOLOR_EQ(color_midpoint1, curve->GetValue(0.5f));
82   EXPECT_SKCOLOR_EQ(color_b, curve->GetValue(1.f));
83   EXPECT_SKCOLOR_EQ(color_midpoint2, curve->GetValue(1.5f));
84   EXPECT_SKCOLOR_EQ(color_c, curve->GetValue(2.f));
85   EXPECT_SKCOLOR_EQ(color_c, curve->GetValue(3.f));
86 }
87 
88 // Tests that a colro animation with multiple keys at a given time works sanely.
TEST(KeyframedAnimationCurveTest,RepeatedColorKeyFrame)89 TEST(KeyframedAnimationCurveTest, RepeatedColorKeyFrame) {
90   SkColor color_a = SkColorSetARGB(255, 64, 0, 0);
91   SkColor color_b = SkColorSetARGB(255, 192, 0, 0);
92 
93   scoped_ptr<KeyframedColorAnimationCurve> curve(
94       KeyframedColorAnimationCurve::Create());
95   curve->AddKeyframe(
96       ColorKeyframe::Create(0.0, color_a, scoped_ptr<TimingFunction>()));
97   curve->AddKeyframe(
98       ColorKeyframe::Create(1.0, color_a, scoped_ptr<TimingFunction>()));
99   curve->AddKeyframe(
100       ColorKeyframe::Create(1.0, color_b, scoped_ptr<TimingFunction>()));
101   curve->AddKeyframe(
102       ColorKeyframe::Create(2.0, color_b, scoped_ptr<TimingFunction>()));
103 
104   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(-1.f));
105   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(0.f));
106   EXPECT_SKCOLOR_EQ(color_a, curve->GetValue(0.5f));
107 
108   SkColor value = curve->GetValue(1.0f);
109   EXPECT_EQ(255u, SkColorGetA(value));
110   int red_value = SkColorGetR(value);
111   EXPECT_LE(64, red_value);
112   EXPECT_GE(192, red_value);
113 
114   EXPECT_SKCOLOR_EQ(color_b, curve->GetValue(1.5f));
115   EXPECT_SKCOLOR_EQ(color_b, curve->GetValue(2.f));
116   EXPECT_SKCOLOR_EQ(color_b, curve->GetValue(3.f));
117 }
118 
119 // Tests that a float animation with one keyframe works as expected.
TEST(KeyframedAnimationCurveTest,OneFloatKeyframe)120 TEST(KeyframedAnimationCurveTest, OneFloatKeyframe) {
121   scoped_ptr<KeyframedFloatAnimationCurve> curve(
122       KeyframedFloatAnimationCurve::Create());
123   curve->AddKeyframe(
124       FloatKeyframe::Create(0.0, 2.f, scoped_ptr<TimingFunction>()));
125   EXPECT_FLOAT_EQ(2.f, curve->GetValue(-1.f));
126   EXPECT_FLOAT_EQ(2.f, curve->GetValue(0.f));
127   EXPECT_FLOAT_EQ(2.f, curve->GetValue(0.5f));
128   EXPECT_FLOAT_EQ(2.f, curve->GetValue(1.f));
129   EXPECT_FLOAT_EQ(2.f, curve->GetValue(2.f));
130 }
131 
132 // Tests that a float animation with two keyframes works as expected.
TEST(KeyframedAnimationCurveTest,TwoFloatKeyframe)133 TEST(KeyframedAnimationCurveTest, TwoFloatKeyframe) {
134   scoped_ptr<KeyframedFloatAnimationCurve> curve(
135       KeyframedFloatAnimationCurve::Create());
136   curve->AddKeyframe(
137       FloatKeyframe::Create(0.0, 2.f, scoped_ptr<TimingFunction>()));
138   curve->AddKeyframe(
139       FloatKeyframe::Create(1.0, 4.f, scoped_ptr<TimingFunction>()));
140   EXPECT_FLOAT_EQ(2.f, curve->GetValue(-1.f));
141   EXPECT_FLOAT_EQ(2.f, curve->GetValue(0.f));
142   EXPECT_FLOAT_EQ(3.f, curve->GetValue(0.5f));
143   EXPECT_FLOAT_EQ(4.f, curve->GetValue(1.f));
144   EXPECT_FLOAT_EQ(4.f, curve->GetValue(2.f));
145 }
146 
147 // Tests that a float animation with three keyframes works as expected.
TEST(KeyframedAnimationCurveTest,ThreeFloatKeyframe)148 TEST(KeyframedAnimationCurveTest, ThreeFloatKeyframe) {
149   scoped_ptr<KeyframedFloatAnimationCurve> curve(
150       KeyframedFloatAnimationCurve::Create());
151   curve->AddKeyframe(
152       FloatKeyframe::Create(0.0, 2.f, scoped_ptr<TimingFunction>()));
153   curve->AddKeyframe(
154       FloatKeyframe::Create(1.0, 4.f, scoped_ptr<TimingFunction>()));
155   curve->AddKeyframe(
156       FloatKeyframe::Create(2.0, 8.f, scoped_ptr<TimingFunction>()));
157   EXPECT_FLOAT_EQ(2.f, curve->GetValue(-1.f));
158   EXPECT_FLOAT_EQ(2.f, curve->GetValue(0.f));
159   EXPECT_FLOAT_EQ(3.f, curve->GetValue(0.5f));
160   EXPECT_FLOAT_EQ(4.f, curve->GetValue(1.f));
161   EXPECT_FLOAT_EQ(6.f, curve->GetValue(1.5f));
162   EXPECT_FLOAT_EQ(8.f, curve->GetValue(2.f));
163   EXPECT_FLOAT_EQ(8.f, curve->GetValue(3.f));
164 }
165 
166 // Tests that a float animation with multiple keys at a given time works sanely.
TEST(KeyframedAnimationCurveTest,RepeatedFloatKeyTimes)167 TEST(KeyframedAnimationCurveTest, RepeatedFloatKeyTimes) {
168   scoped_ptr<KeyframedFloatAnimationCurve> curve(
169       KeyframedFloatAnimationCurve::Create());
170   curve->AddKeyframe(
171       FloatKeyframe::Create(0.0, 4.f, scoped_ptr<TimingFunction>()));
172   curve->AddKeyframe(
173       FloatKeyframe::Create(1.0, 4.f, scoped_ptr<TimingFunction>()));
174   curve->AddKeyframe(
175       FloatKeyframe::Create(1.0, 6.f, scoped_ptr<TimingFunction>()));
176   curve->AddKeyframe(
177       FloatKeyframe::Create(2.0, 6.f, scoped_ptr<TimingFunction>()));
178 
179   EXPECT_FLOAT_EQ(4.f, curve->GetValue(-1.f));
180   EXPECT_FLOAT_EQ(4.f, curve->GetValue(0.f));
181   EXPECT_FLOAT_EQ(4.f, curve->GetValue(0.5f));
182 
183   // There is a discontinuity at 1. Any value between 4 and 6 is valid.
184   float value = curve->GetValue(1.f);
185   EXPECT_TRUE(value >= 4 && value <= 6);
186 
187   EXPECT_FLOAT_EQ(6.f, curve->GetValue(1.5f));
188   EXPECT_FLOAT_EQ(6.f, curve->GetValue(2.f));
189   EXPECT_FLOAT_EQ(6.f, curve->GetValue(3.f));
190 }
191 
192 // Tests that a transform animation with one keyframe works as expected.
TEST(KeyframedAnimationCurveTest,OneTransformKeyframe)193 TEST(KeyframedAnimationCurveTest, OneTransformKeyframe) {
194   scoped_ptr<KeyframedTransformAnimationCurve> curve(
195       KeyframedTransformAnimationCurve::Create());
196   TransformOperations operations;
197   operations.AppendTranslate(2.f, 0.f, 0.f);
198   curve->AddKeyframe(
199       TransformKeyframe::Create(0.f, operations, scoped_ptr<TimingFunction>()));
200 
201   ExpectTranslateX(2.f, curve->GetValue(-1.f));
202   ExpectTranslateX(2.f, curve->GetValue(0.f));
203   ExpectTranslateX(2.f, curve->GetValue(0.5f));
204   ExpectTranslateX(2.f, curve->GetValue(1.f));
205   ExpectTranslateX(2.f, curve->GetValue(2.f));
206 }
207 
208 // Tests that a transform animation with two keyframes works as expected.
TEST(KeyframedAnimationCurveTest,TwoTransformKeyframe)209 TEST(KeyframedAnimationCurveTest, TwoTransformKeyframe) {
210   scoped_ptr<KeyframedTransformAnimationCurve> curve(
211       KeyframedTransformAnimationCurve::Create());
212   TransformOperations operations1;
213   operations1.AppendTranslate(2.f, 0.f, 0.f);
214   TransformOperations operations2;
215   operations2.AppendTranslate(4.f, 0.f, 0.f);
216 
217   curve->AddKeyframe(TransformKeyframe::Create(
218       0.f, operations1, scoped_ptr<TimingFunction>()));
219   curve->AddKeyframe(TransformKeyframe::Create(
220       1.f, operations2, scoped_ptr<TimingFunction>()));
221   ExpectTranslateX(2.f, curve->GetValue(-1.f));
222   ExpectTranslateX(2.f, curve->GetValue(0.f));
223   ExpectTranslateX(3.f, curve->GetValue(0.5f));
224   ExpectTranslateX(4.f, curve->GetValue(1.f));
225   ExpectTranslateX(4.f, curve->GetValue(2.f));
226 }
227 
228 // Tests that a transform animation with three keyframes works as expected.
TEST(KeyframedAnimationCurveTest,ThreeTransformKeyframe)229 TEST(KeyframedAnimationCurveTest, ThreeTransformKeyframe) {
230   scoped_ptr<KeyframedTransformAnimationCurve> curve(
231       KeyframedTransformAnimationCurve::Create());
232   TransformOperations operations1;
233   operations1.AppendTranslate(2.f, 0.f, 0.f);
234   TransformOperations operations2;
235   operations2.AppendTranslate(4.f, 0.f, 0.f);
236   TransformOperations operations3;
237   operations3.AppendTranslate(8.f, 0.f, 0.f);
238   curve->AddKeyframe(TransformKeyframe::Create(
239       0.f, operations1, scoped_ptr<TimingFunction>()));
240   curve->AddKeyframe(TransformKeyframe::Create(
241       1.f, operations2, scoped_ptr<TimingFunction>()));
242   curve->AddKeyframe(TransformKeyframe::Create(
243       2.f, operations3, scoped_ptr<TimingFunction>()));
244   ExpectTranslateX(2.f, curve->GetValue(-1.f));
245   ExpectTranslateX(2.f, curve->GetValue(0.f));
246   ExpectTranslateX(3.f, curve->GetValue(0.5f));
247   ExpectTranslateX(4.f, curve->GetValue(1.f));
248   ExpectTranslateX(6.f, curve->GetValue(1.5f));
249   ExpectTranslateX(8.f, curve->GetValue(2.f));
250   ExpectTranslateX(8.f, curve->GetValue(3.f));
251 }
252 
253 // Tests that a transform animation with multiple keys at a given time works
254 // sanely.
TEST(KeyframedAnimationCurveTest,RepeatedTransformKeyTimes)255 TEST(KeyframedAnimationCurveTest, RepeatedTransformKeyTimes) {
256   scoped_ptr<KeyframedTransformAnimationCurve> curve(
257       KeyframedTransformAnimationCurve::Create());
258   // A step function.
259   TransformOperations operations1;
260   operations1.AppendTranslate(4.f, 0.f, 0.f);
261   TransformOperations operations2;
262   operations2.AppendTranslate(4.f, 0.f, 0.f);
263   TransformOperations operations3;
264   operations3.AppendTranslate(6.f, 0.f, 0.f);
265   TransformOperations operations4;
266   operations4.AppendTranslate(6.f, 0.f, 0.f);
267   curve->AddKeyframe(TransformKeyframe::Create(
268       0.f, operations1, scoped_ptr<TimingFunction>()));
269   curve->AddKeyframe(TransformKeyframe::Create(
270       1.f, operations2, scoped_ptr<TimingFunction>()));
271   curve->AddKeyframe(TransformKeyframe::Create(
272       1.f, operations3, scoped_ptr<TimingFunction>()));
273   curve->AddKeyframe(TransformKeyframe::Create(
274       2.f, operations4, scoped_ptr<TimingFunction>()));
275 
276   ExpectTranslateX(4.f, curve->GetValue(-1.f));
277   ExpectTranslateX(4.f, curve->GetValue(0.f));
278   ExpectTranslateX(4.f, curve->GetValue(0.5f));
279 
280   // There is a discontinuity at 1. Any value between 4 and 6 is valid.
281   gfx::Transform value = curve->GetValue(1.f);
282   EXPECT_GE(value.matrix().get(0, 3), 4.f);
283   EXPECT_LE(value.matrix().get(0, 3), 6.f);
284 
285   ExpectTranslateX(6.f, curve->GetValue(1.5f));
286   ExpectTranslateX(6.f, curve->GetValue(2.f));
287   ExpectTranslateX(6.f, curve->GetValue(3.f));
288 }
289 
290 // Tests that a filter animation with one keyframe works as expected.
TEST(KeyframedAnimationCurveTest,OneFilterKeyframe)291 TEST(KeyframedAnimationCurveTest, OneFilterKeyframe) {
292   scoped_ptr<KeyframedFilterAnimationCurve> curve(
293       KeyframedFilterAnimationCurve::Create());
294   FilterOperations operations;
295   operations.Append(FilterOperation::CreateBrightnessFilter(2.f));
296   curve->AddKeyframe(
297       FilterKeyframe::Create(0.f, operations, scoped_ptr<TimingFunction>()));
298 
299   ExpectBrightness(2.f, curve->GetValue(-1.f));
300   ExpectBrightness(2.f, curve->GetValue(0.f));
301   ExpectBrightness(2.f, curve->GetValue(0.5f));
302   ExpectBrightness(2.f, curve->GetValue(1.f));
303   ExpectBrightness(2.f, curve->GetValue(2.f));
304 }
305 
306 // Tests that a filter animation with two keyframes works as expected.
TEST(KeyframedAnimationCurveTest,TwoFilterKeyframe)307 TEST(KeyframedAnimationCurveTest, TwoFilterKeyframe) {
308   scoped_ptr<KeyframedFilterAnimationCurve> curve(
309       KeyframedFilterAnimationCurve::Create());
310   FilterOperations operations1;
311   operations1.Append(FilterOperation::CreateBrightnessFilter(2.f));
312   FilterOperations operations2;
313   operations2.Append(FilterOperation::CreateBrightnessFilter(4.f));
314 
315   curve->AddKeyframe(FilterKeyframe::Create(
316       0.f, operations1, scoped_ptr<TimingFunction>()));
317   curve->AddKeyframe(FilterKeyframe::Create(
318       1.f, operations2, scoped_ptr<TimingFunction>()));
319   ExpectBrightness(2.f, curve->GetValue(-1.f));
320   ExpectBrightness(2.f, curve->GetValue(0.f));
321   ExpectBrightness(3.f, curve->GetValue(0.5f));
322   ExpectBrightness(4.f, curve->GetValue(1.f));
323   ExpectBrightness(4.f, curve->GetValue(2.f));
324 }
325 
326 // Tests that a filter animation with three keyframes works as expected.
TEST(KeyframedAnimationCurveTest,ThreeFilterKeyframe)327 TEST(KeyframedAnimationCurveTest, ThreeFilterKeyframe) {
328   scoped_ptr<KeyframedFilterAnimationCurve> curve(
329       KeyframedFilterAnimationCurve::Create());
330   FilterOperations operations1;
331   operations1.Append(FilterOperation::CreateBrightnessFilter(2.f));
332   FilterOperations operations2;
333   operations2.Append(FilterOperation::CreateBrightnessFilter(4.f));
334   FilterOperations operations3;
335   operations3.Append(FilterOperation::CreateBrightnessFilter(8.f));
336   curve->AddKeyframe(FilterKeyframe::Create(
337       0.f, operations1, scoped_ptr<TimingFunction>()));
338   curve->AddKeyframe(FilterKeyframe::Create(
339       1.f, operations2, scoped_ptr<TimingFunction>()));
340   curve->AddKeyframe(FilterKeyframe::Create(
341       2.f, operations3, scoped_ptr<TimingFunction>()));
342   ExpectBrightness(2.f, curve->GetValue(-1.f));
343   ExpectBrightness(2.f, curve->GetValue(0.f));
344   ExpectBrightness(3.f, curve->GetValue(0.5f));
345   ExpectBrightness(4.f, curve->GetValue(1.f));
346   ExpectBrightness(6.f, curve->GetValue(1.5f));
347   ExpectBrightness(8.f, curve->GetValue(2.f));
348   ExpectBrightness(8.f, curve->GetValue(3.f));
349 }
350 
351 // Tests that a filter animation with multiple keys at a given time works
352 // sanely.
TEST(KeyframedAnimationCurveTest,RepeatedFilterKeyTimes)353 TEST(KeyframedAnimationCurveTest, RepeatedFilterKeyTimes) {
354   scoped_ptr<KeyframedFilterAnimationCurve> curve(
355       KeyframedFilterAnimationCurve::Create());
356   // A step function.
357   FilterOperations operations1;
358   operations1.Append(FilterOperation::CreateBrightnessFilter(4.f));
359   FilterOperations operations2;
360   operations2.Append(FilterOperation::CreateBrightnessFilter(4.f));
361   FilterOperations operations3;
362   operations3.Append(FilterOperation::CreateBrightnessFilter(6.f));
363   FilterOperations operations4;
364   operations4.Append(FilterOperation::CreateBrightnessFilter(6.f));
365   curve->AddKeyframe(FilterKeyframe::Create(
366       0.f, operations1, scoped_ptr<TimingFunction>()));
367   curve->AddKeyframe(FilterKeyframe::Create(
368       1.f, operations2, scoped_ptr<TimingFunction>()));
369   curve->AddKeyframe(FilterKeyframe::Create(
370       1.f, operations3, scoped_ptr<TimingFunction>()));
371   curve->AddKeyframe(FilterKeyframe::Create(
372       2.f, operations4, scoped_ptr<TimingFunction>()));
373 
374   ExpectBrightness(4.f, curve->GetValue(-1.f));
375   ExpectBrightness(4.f, curve->GetValue(0.f));
376   ExpectBrightness(4.f, curve->GetValue(0.5f));
377 
378   // There is a discontinuity at 1. Any value between 4 and 6 is valid.
379   FilterOperations value = curve->GetValue(1.f);
380   EXPECT_EQ(1u, value.size());
381   EXPECT_EQ(FilterOperation::BRIGHTNESS, value.at(0).type());
382   EXPECT_GE(value.at(0).amount(), 4);
383   EXPECT_LE(value.at(0).amount(), 6);
384 
385   ExpectBrightness(6.f, curve->GetValue(1.5f));
386   ExpectBrightness(6.f, curve->GetValue(2.f));
387   ExpectBrightness(6.f, curve->GetValue(3.f));
388 }
389 
390 // Tests that the keyframes may be added out of order.
TEST(KeyframedAnimationCurveTest,UnsortedKeyframes)391 TEST(KeyframedAnimationCurveTest, UnsortedKeyframes) {
392   scoped_ptr<KeyframedFloatAnimationCurve> curve(
393       KeyframedFloatAnimationCurve::Create());
394   curve->AddKeyframe(
395       FloatKeyframe::Create(2.0, 8.f, scoped_ptr<TimingFunction>()));
396   curve->AddKeyframe(
397       FloatKeyframe::Create(0.0, 2.f, scoped_ptr<TimingFunction>()));
398   curve->AddKeyframe(
399       FloatKeyframe::Create(1.0, 4.f, scoped_ptr<TimingFunction>()));
400   EXPECT_FLOAT_EQ(2.f, curve->GetValue(-1.f));
401   EXPECT_FLOAT_EQ(2.f, curve->GetValue(0.f));
402   EXPECT_FLOAT_EQ(3.f, curve->GetValue(0.5f));
403   EXPECT_FLOAT_EQ(4.f, curve->GetValue(1.f));
404   EXPECT_FLOAT_EQ(6.f, curve->GetValue(1.5f));
405   EXPECT_FLOAT_EQ(8.f, curve->GetValue(2.f));
406   EXPECT_FLOAT_EQ(8.f, curve->GetValue(3.f));
407 }
408 
409 // Tests that a cubic bezier timing function works as expected.
TEST(KeyframedAnimationCurveTest,CubicBezierTimingFunction)410 TEST(KeyframedAnimationCurveTest, CubicBezierTimingFunction) {
411   scoped_ptr<KeyframedFloatAnimationCurve> curve(
412       KeyframedFloatAnimationCurve::Create());
413   curve->AddKeyframe(FloatKeyframe::Create(
414       0.0,
415       0.f,
416       CubicBezierTimingFunction::Create(0.25f, 0.f, 0.75f, 1.f)
417           .PassAs<TimingFunction>()));
418   curve->AddKeyframe(
419       FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>()));
420 
421   EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f));
422   EXPECT_LT(0.f, curve->GetValue(0.25f));
423   EXPECT_GT(0.25f, curve->GetValue(0.25f));
424   EXPECT_NEAR(curve->GetValue(0.5f), 0.5f, 0.00015f);
425   EXPECT_LT(0.75f, curve->GetValue(0.75f));
426   EXPECT_GT(1.f, curve->GetValue(0.75f));
427   EXPECT_FLOAT_EQ(1.f, curve->GetValue(1.f));
428 }
429 
430 // Tests that animated bounds are computed as expected.
TEST(KeyframedAnimationCurveTest,AnimatedBounds)431 TEST(KeyframedAnimationCurveTest, AnimatedBounds) {
432   scoped_ptr<KeyframedTransformAnimationCurve> curve(
433       KeyframedTransformAnimationCurve::Create());
434 
435   TransformOperations operations1;
436   curve->AddKeyframe(TransformKeyframe::Create(
437       0.0, operations1, scoped_ptr<TimingFunction>()));
438   operations1.AppendTranslate(2.0, 3.0, -1.0);
439   curve->AddKeyframe(TransformKeyframe::Create(
440       0.5, operations1, scoped_ptr<TimingFunction>()));
441   TransformOperations operations2;
442   operations2.AppendTranslate(4.0, 1.0, 2.0);
443   curve->AddKeyframe(TransformKeyframe::Create(
444       1.0, operations2, EaseTimingFunction::Create()));
445 
446   gfx::BoxF box(2.f, 3.f, 4.f, 1.f, 3.f, 2.f);
447   gfx::BoxF bounds;
448 
449   EXPECT_TRUE(curve->AnimatedBoundsForBox(box, &bounds));
450   EXPECT_EQ(gfx::BoxF(2.f, 3.f, 3.f, 5.f, 6.f, 5.f).ToString(),
451             bounds.ToString());
452 }
453 
454 }  // namespace
455 }  // namespace cc
456