Home | History | Annotate | Download | only in animation
      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/KeyframeAnimationEffect.h"
     33 
     34 #include "core/animation/AnimatableNumber.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 AnimatableNumber::create(CSSPrimitiveValue::create(n, CSSPrimitiveValue::CSS_PX).get()).leakRef();
     51 }
     52 
     53 KeyframeAnimationEffect::KeyframeVector keyframesAtZeroAndOne(AnimatableValue* zeroValue, AnimatableValue* oneValue)
     54 {
     55     KeyframeAnimationEffect::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->isNumber() || value->isUnknown());
     68 
     69     double actualValue;
     70     if (value->isNumber())
     71         actualValue = toCSSPrimitiveValue(toAnimatableNumber(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 
     79 TEST(KeyframeAnimationEffect, BasicOperation)
     80 {
     81     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0));
     82     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
     83     OwnPtr<AnimationEffect::CompositableValueMap> values = effect->sample(0, 0.6);
     84     ASSERT_EQ(1, values->size());
     85     EXPECT_EQ(CSSPropertyLeft, values->begin()->key);
     86     expectDoubleValue(5.0, values->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
     87 }
     88 
     89 TEST(KeyframeAnimationEffect, CompositeReplaceNonInterpolable)
     90 {
     91     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0));
     92     keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
     93     keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
     94     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
     95     expectDoubleValue(5.0, effect->sample(0, 0.6)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
     96 }
     97 
     98 TEST(KeyframeAnimationEffect, CompositeReplace)
     99 {
    100     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
    101     keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
    102     keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
    103     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    104     expectDoubleValue(3.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    105 }
    106 
    107 TEST(KeyframeAnimationEffect, CompositeAdd)
    108 {
    109     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
    110     keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
    111     keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
    112     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    113     expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6)->begin()->value->compositeOnto(pixelAnimatableValue(7.0)));
    114 }
    115 
    116 TEST(KeyframeAnimationEffect, ExtrapolateReplaceNonInterpolable)
    117 {
    118     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(unknownAnimatableValue(3.0), unknownAnimatableValue(5.0));
    119     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    120     keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
    121     keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
    122     expectDoubleValue(5.0, effect->sample(0, 1.6)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    123 }
    124 
    125 TEST(KeyframeAnimationEffect, ExtrapolateReplace)
    126 {
    127     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
    128     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    129     keyframes[0]->setComposite(AnimationEffect::CompositeReplace);
    130     keyframes[1]->setComposite(AnimationEffect::CompositeReplace);
    131     expectDoubleValue(3.0 * -0.6 + 5.0 * 1.6, effect->sample(0, 1.6)->begin()->value->compositeOnto(pixelAnimatableValue(7.0)));
    132 }
    133 
    134 TEST(KeyframeAnimationEffect, ExtrapolateAdd)
    135 {
    136     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
    137     keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
    138     keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
    139     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    140     expectDoubleValue((7.0 + 3.0) * -0.6 + (7.0 + 5.0) * 1.6, effect->sample(0, 1.6)->begin()->value->compositeOnto(pixelAnimatableValue(7.0)));
    141 }
    142 
    143 TEST(KeyframeAnimationEffect, ZeroKeyframes)
    144 {
    145     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(KeyframeAnimationEffect::KeyframeVector());
    146     EXPECT_TRUE(effect->sample(0, 0.5)->isEmpty());
    147 }
    148 
    149 TEST(KeyframeAnimationEffect, SingleKeyframeAtOffsetZero)
    150 {
    151     KeyframeAnimationEffect::KeyframeVector keyframes(1);
    152     keyframes[0] = Keyframe::create();
    153     keyframes[0]->setOffset(0.0);
    154     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
    155 
    156     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    157     expectDoubleValue(3.0, effect->sample(0, 0.6)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    158 }
    159 
    160 TEST(KeyframeAnimationEffect, SingleKeyframeAtOffsetOne)
    161 {
    162     KeyframeAnimationEffect::KeyframeVector keyframes(1);
    163     keyframes[0] = Keyframe::create();
    164     keyframes[0]->setOffset(1.0);
    165     keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0));
    166 
    167     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    168     expectDoubleValue(7.0 * 0.4 + 5.0 * 0.6, effect->sample(0, 0.6)->begin()->value->compositeOnto(pixelAnimatableValue(7.0)));
    169 }
    170 
    171 TEST(KeyframeAnimationEffect, MoreThanTwoKeyframes)
    172 {
    173     KeyframeAnimationEffect::KeyframeVector keyframes(3);
    174     keyframes[0] = Keyframe::create();
    175     keyframes[0]->setOffset(0.0);
    176     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
    177     keyframes[1] = Keyframe::create();
    178     keyframes[1]->setOffset(0.5);
    179     keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
    180     keyframes[2] = Keyframe::create();
    181     keyframes[2]->setOffset(1.0);
    182     keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
    183 
    184     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    185     expectDoubleValue(4.0, effect->sample(0, 0.3)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    186     expectDoubleValue(5.0, effect->sample(0, 0.8)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    187 }
    188 
    189 TEST(KeyframeAnimationEffect, EndKeyframeOffsetsUnspecified)
    190 {
    191     KeyframeAnimationEffect::KeyframeVector keyframes(3);
    192     keyframes[0] = Keyframe::create();
    193     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
    194     keyframes[1] = Keyframe::create();
    195     keyframes[1]->setOffset(0.5);
    196     keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
    197     keyframes[2] = Keyframe::create();
    198     keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
    199 
    200     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    201     expectDoubleValue(3.0, effect->sample(0, 0.1)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    202     expectDoubleValue(4.0, effect->sample(0, 0.6)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    203     expectDoubleValue(5.0, effect->sample(0, 0.9)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    204 }
    205 
    206 TEST(KeyframeAnimationEffect, SampleOnKeyframe)
    207 {
    208     KeyframeAnimationEffect::KeyframeVector keyframes(3);
    209     keyframes[0] = Keyframe::create();
    210     keyframes[0]->setOffset(0.0);
    211     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
    212     keyframes[1] = Keyframe::create();
    213     keyframes[1]->setOffset(0.5);
    214     keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
    215     keyframes[2] = Keyframe::create();
    216     keyframes[2]->setOffset(1.0);
    217     keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
    218 
    219     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    220     expectDoubleValue(3.0, effect->sample(0, 0.0)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    221     expectDoubleValue(4.0, effect->sample(0, 0.5)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    222     expectDoubleValue(5.0, effect->sample(0, 1.0)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    223 }
    224 
    225 // Note that this tests an implementation detail, not behaviour defined by the spec.
    226 TEST(KeyframeAnimationEffect, SampleReturnsSameAnimatableValueInstance)
    227 {
    228     AnimatableValue* threePixelsValue = unknownAnimatableValue(3.0);
    229     AnimatableValue* fourPixelsValue = unknownAnimatableValue(4.0);
    230     AnimatableValue* fivePixelsValue = unknownAnimatableValue(5.0);
    231 
    232     KeyframeAnimationEffect::KeyframeVector keyframes(3);
    233     keyframes[0] = Keyframe::create();
    234     keyframes[0]->setOffset(0.0);
    235     keyframes[0]->setPropertyValue(CSSPropertyLeft, threePixelsValue);
    236     keyframes[1] = Keyframe::create();
    237     keyframes[1]->setOffset(0.5);
    238     keyframes[1]->setPropertyValue(CSSPropertyLeft, fourPixelsValue);
    239     keyframes[2] = Keyframe::create();
    240     keyframes[2]->setOffset(1.0);
    241     keyframes[2]->setPropertyValue(CSSPropertyLeft, fivePixelsValue);
    242 
    243     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    244     EXPECT_EQ(threePixelsValue, effect->sample(0, 0.0)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    245     EXPECT_EQ(threePixelsValue, effect->sample(0, 0.1)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    246     EXPECT_EQ(fourPixelsValue, effect->sample(0, 0.4)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    247     EXPECT_EQ(fourPixelsValue, effect->sample(0, 0.5)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    248     EXPECT_EQ(fourPixelsValue, effect->sample(0, 0.6)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    249     EXPECT_EQ(fivePixelsValue, effect->sample(0, 0.9)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    250     EXPECT_EQ(fivePixelsValue, effect->sample(0, 1.0)->begin()->value->compositeOnto(unknownAnimatableValue(7.0)));
    251 }
    252 
    253 TEST(KeyframeAnimationEffect, MultipleKeyframesWithSameOffset)
    254 {
    255     KeyframeAnimationEffect::KeyframeVector keyframes(7);
    256     keyframes[0] = Keyframe::create();
    257     keyframes[0]->setOffset(0.1);
    258     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(1.0));
    259     keyframes[1] = Keyframe::create();
    260     keyframes[1]->setOffset(0.1);
    261     keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(2.0));
    262     keyframes[2] = Keyframe::create();
    263     keyframes[2]->setOffset(0.5);
    264     keyframes[2]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
    265     keyframes[3] = Keyframe::create();
    266     keyframes[3]->setOffset(0.5);
    267     keyframes[3]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(4.0));
    268     keyframes[4] = Keyframe::create();
    269     keyframes[4]->setOffset(0.5);
    270     keyframes[4]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
    271     keyframes[5] = Keyframe::create();
    272     keyframes[5]->setOffset(0.9);
    273     keyframes[5]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(6.0));
    274     keyframes[6] = Keyframe::create();
    275     keyframes[6]->setOffset(0.9);
    276     keyframes[6]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(7.0));
    277 
    278     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    279     expectDoubleValue(2.0, effect->sample(0, 0.0)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    280     expectDoubleValue(2.0, effect->sample(0, 0.2)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    281     expectDoubleValue(3.0, effect->sample(0, 0.4)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    282     expectDoubleValue(5.0, effect->sample(0, 0.5)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    283     expectDoubleValue(5.0, effect->sample(0, 0.6)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    284     expectDoubleValue(6.0, effect->sample(0, 0.8)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    285     expectDoubleValue(6.0, effect->sample(0, 1.0)->begin()->value->compositeOnto(unknownAnimatableValue(8.0)));
    286 }
    287 
    288 TEST(KeyframeAnimationEffect, PerKeyframeComposite)
    289 {
    290     KeyframeAnimationEffect::KeyframeVector keyframes(2);
    291     keyframes[0] = Keyframe::create();
    292     keyframes[0]->setOffset(0.0);
    293     keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(3.0));
    294     keyframes[1] = Keyframe::create();
    295     keyframes[1]->setOffset(1.0);
    296     keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(5.0));
    297     keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
    298 
    299     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    300     expectDoubleValue(3.0 * 0.4 + (7.0 + 5.0) * 0.6, effect->sample(0, 0.6)->begin()->value->compositeOnto(pixelAnimatableValue(7.0)));
    301 }
    302 
    303 TEST(KeyframeAnimationEffect, MultipleProperties)
    304 {
    305     KeyframeAnimationEffect::KeyframeVector keyframes(2);
    306     keyframes[0] = Keyframe::create();
    307     keyframes[0]->setOffset(0.0);
    308     keyframes[0]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(3.0));
    309     keyframes[0]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(4.0));
    310     keyframes[1] = Keyframe::create();
    311     keyframes[1]->setOffset(1.0);
    312     keyframes[1]->setPropertyValue(CSSPropertyLeft, unknownAnimatableValue(5.0));
    313     keyframes[1]->setPropertyValue(CSSPropertyRight, unknownAnimatableValue(6.0));
    314 
    315     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    316     OwnPtr<AnimationEffect::CompositableValueMap> values = effect->sample(0, 0.6);
    317     ASSERT_EQ(2, values->size());
    318     ASSERT_TRUE(values->contains(CSSPropertyLeft));
    319     expectDoubleValue(5.0, values->get(CSSPropertyLeft)->compositeOnto(unknownAnimatableValue(7.0)));
    320     ASSERT_TRUE(values->contains(CSSPropertyRight));
    321     expectDoubleValue(6.0, values->get(CSSPropertyRight)->compositeOnto(unknownAnimatableValue(7.0)));
    322 }
    323 
    324 TEST(KeyframeAnimationEffect, RecompositeCompositableValue)
    325 {
    326     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(3.0), pixelAnimatableValue(5.0));
    327     keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
    328     keyframes[1]->setComposite(AnimationEffect::CompositeAdd);
    329     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    330     OwnPtr<AnimationEffect::CompositableValueMap> values = effect->sample(0, 0.6);
    331     expectDoubleValue((7.0 + 3.0) * 0.4 + (7.0 + 5.0) * 0.6, values->begin()->value->compositeOnto(pixelAnimatableValue(7.0)));
    332     expectDoubleValue((9.0 + 3.0) * 0.4 + (9.0 + 5.0) * 0.6, values->begin()->value->compositeOnto(pixelAnimatableValue(9.0)));
    333 }
    334 
    335 TEST(KeyframeAnimationEffect, MultipleIterations)
    336 {
    337     KeyframeAnimationEffect::KeyframeVector keyframes = keyframesAtZeroAndOne(pixelAnimatableValue(1.0), pixelAnimatableValue(3.0));
    338     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    339     expectDoubleValue(2.0, effect->sample(0, 0.5)->begin()->value->compositeOnto(unknownAnimatableValue(0.0)));
    340     expectDoubleValue(2.0, effect->sample(1, 0.5)->begin()->value->compositeOnto(unknownAnimatableValue(0.0)));
    341     expectDoubleValue(2.0, effect->sample(2, 0.5)->begin()->value->compositeOnto(unknownAnimatableValue(0.0)));
    342 }
    343 
    344 TEST(KeyframeAnimationEffect, DependsOnUnderlyingValue)
    345 {
    346     KeyframeAnimationEffect::KeyframeVector keyframes(3);
    347     keyframes[0] = Keyframe::create();
    348     keyframes[0]->setOffset(0.0);
    349     keyframes[0]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0));
    350     keyframes[0]->setComposite(AnimationEffect::CompositeAdd);
    351     keyframes[1] = Keyframe::create();
    352     keyframes[1]->setOffset(0.5);
    353     keyframes[1]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0));
    354     keyframes[2] = Keyframe::create();
    355     keyframes[2]->setOffset(1.0);
    356     keyframes[2]->setPropertyValue(CSSPropertyLeft, pixelAnimatableValue(1.0));
    357 
    358     RefPtr<KeyframeAnimationEffect> effect = KeyframeAnimationEffect::create(keyframes);
    359     EXPECT_TRUE(effect->sample(0, 0)->begin()->value->dependsOnUnderlyingValue());
    360     EXPECT_TRUE(effect->sample(0, 0.1)->begin()->value->dependsOnUnderlyingValue());
    361     EXPECT_TRUE(effect->sample(0, 0.25)->begin()->value->dependsOnUnderlyingValue());
    362     EXPECT_TRUE(effect->sample(0, 0.4)->begin()->value->dependsOnUnderlyingValue());
    363     EXPECT_FALSE(effect->sample(0, 0.5)->begin()->value->dependsOnUnderlyingValue());
    364     EXPECT_FALSE(effect->sample(0, 0.6)->begin()->value->dependsOnUnderlyingValue());
    365     EXPECT_FALSE(effect->sample(0, 0.75)->begin()->value->dependsOnUnderlyingValue());
    366     EXPECT_FALSE(effect->sample(0, 0.8)->begin()->value->dependsOnUnderlyingValue());
    367     EXPECT_FALSE(effect->sample(0, 1)->begin()->value->dependsOnUnderlyingValue());
    368 }
    369 
    370 } // namespace
    371