Home | History | Annotate | Download | only in animation
      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 
     17 void ExpectTranslateX(SkMScalar translate_x, const gfx::Transform& transform) {
     18   EXPECT_FLOAT_EQ(translate_x, transform.matrix().get(0, 3));
     19 }
     20 
     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.
     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.
     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.
     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.
     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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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