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/AnimationNode.h"
     33 
     34 #include <gtest/gtest.h>
     35 
     36 using namespace blink;
     37 
     38 namespace {
     39 
     40 class TestAnimationNodeEventDelegate : public AnimationNode::EventDelegate {
     41 public:
     42     virtual void onEventCondition(const AnimationNode* animationNode) OVERRIDE
     43     {
     44         m_eventTriggered = true;
     45 
     46     }
     47     void reset()
     48     {
     49         m_eventTriggered = false;
     50     }
     51     bool eventTriggered() { return m_eventTriggered; }
     52 
     53 private:
     54     bool m_eventTriggered;
     55 };
     56 
     57 class TestAnimationNode : public AnimationNode {
     58 public:
     59     static PassRefPtrWillBeRawPtr<TestAnimationNode> create(const Timing& specified)
     60     {
     61         return adoptRefWillBeNoop(new TestAnimationNode(specified, new TestAnimationNodeEventDelegate()));
     62     }
     63 
     64     void updateInheritedTime(double time)
     65     {
     66         updateInheritedTime(time, TimingUpdateForAnimationFrame);
     67     }
     68 
     69     void updateInheritedTime(double time, TimingUpdateReason reason)
     70     {
     71         m_eventDelegate->reset();
     72         AnimationNode::updateInheritedTime(time, reason);
     73     }
     74 
     75     virtual void updateChildrenAndEffects() const OVERRIDE { }
     76     void willDetach() { }
     77     TestAnimationNodeEventDelegate* eventDelegate() { return m_eventDelegate.get(); }
     78     virtual double calculateTimeToEffectChange(bool forwards, double localTime, double timeToNextIteration) const OVERRIDE
     79     {
     80         m_localTime = localTime;
     81         m_timeToNextIteration = timeToNextIteration;
     82         return -1;
     83     }
     84     double takeLocalTime()
     85     {
     86         const double result = m_localTime;
     87         m_localTime = nullValue();
     88         return result;
     89     }
     90 
     91     double takeTimeToNextIteration()
     92     {
     93         const double result = m_timeToNextIteration;
     94         m_timeToNextIteration = nullValue();
     95         return result;
     96     }
     97 
     98     virtual void trace(Visitor* visitor) OVERRIDE
     99     {
    100         visitor->trace(m_eventDelegate);
    101         AnimationNode::trace(visitor);
    102     }
    103 
    104 private:
    105     TestAnimationNode(const Timing& specified, TestAnimationNodeEventDelegate* eventDelegate)
    106         : AnimationNode(specified, adoptPtrWillBeNoop(eventDelegate))
    107         , m_eventDelegate(eventDelegate)
    108     {
    109     }
    110 
    111     RawPtrWillBeMember<TestAnimationNodeEventDelegate> m_eventDelegate;
    112     mutable double m_localTime;
    113     mutable double m_timeToNextIteration;
    114 };
    115 
    116 TEST(AnimationAnimationNodeTest, Sanity)
    117 {
    118     Timing timing;
    119     timing.iterationDuration = 2;
    120     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    121 
    122     EXPECT_EQ(0, animationNode->startTime());
    123 
    124     animationNode->updateInheritedTime(0);
    125 
    126     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    127     EXPECT_TRUE(animationNode->isInPlay());
    128     EXPECT_TRUE(animationNode->isCurrent());
    129     EXPECT_TRUE(animationNode->isInEffect());
    130     EXPECT_EQ(0, animationNode->currentIteration());
    131     EXPECT_EQ(0, animationNode->startTime());
    132     EXPECT_EQ(2, animationNode->activeDurationInternal());
    133     EXPECT_EQ(0, animationNode->timeFraction());
    134 
    135     animationNode->updateInheritedTime(1);
    136 
    137     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    138     EXPECT_TRUE(animationNode->isInPlay());
    139     EXPECT_TRUE(animationNode->isCurrent());
    140     EXPECT_TRUE(animationNode->isInEffect());
    141     EXPECT_EQ(0, animationNode->currentIteration());
    142     EXPECT_EQ(0, animationNode->startTime());
    143     EXPECT_EQ(2, animationNode->activeDurationInternal());
    144     EXPECT_EQ(0.5, animationNode->timeFraction());
    145 
    146     animationNode->updateInheritedTime(2);
    147 
    148     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    149     EXPECT_FALSE(animationNode->isInPlay());
    150     EXPECT_FALSE(animationNode->isCurrent());
    151     EXPECT_TRUE(animationNode->isInEffect());
    152     EXPECT_EQ(0, animationNode->currentIteration());
    153     EXPECT_EQ(0, animationNode->startTime());
    154     EXPECT_EQ(2, animationNode->activeDurationInternal());
    155     EXPECT_EQ(1, animationNode->timeFraction());
    156 
    157     animationNode->updateInheritedTime(3);
    158 
    159     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    160     EXPECT_FALSE(animationNode->isInPlay());
    161     EXPECT_FALSE(animationNode->isCurrent());
    162     EXPECT_TRUE(animationNode->isInEffect());
    163     EXPECT_EQ(0, animationNode->currentIteration());
    164     EXPECT_EQ(0, animationNode->startTime());
    165     EXPECT_EQ(2, animationNode->activeDurationInternal());
    166     EXPECT_EQ(1, animationNode->timeFraction());
    167 }
    168 
    169 TEST(AnimationAnimationNodeTest, FillAuto)
    170 {
    171     Timing timing;
    172     timing.iterationDuration = 1;
    173     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    174 
    175     animationNode->updateInheritedTime(-1);
    176     EXPECT_EQ(0, animationNode->timeFraction());
    177 
    178     animationNode->updateInheritedTime(2);
    179     EXPECT_EQ(1, animationNode->timeFraction());
    180 }
    181 
    182 TEST(AnimationAnimationNodeTest, FillForwards)
    183 {
    184     Timing timing;
    185     timing.iterationDuration = 1;
    186     timing.fillMode = Timing::FillModeForwards;
    187     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    188 
    189     animationNode->updateInheritedTime(-1);
    190     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    191 
    192     animationNode->updateInheritedTime(2);
    193     EXPECT_EQ(1, animationNode->timeFraction());
    194 }
    195 
    196 TEST(AnimationAnimationNodeTest, FillBackwards)
    197 {
    198     Timing timing;
    199     timing.iterationDuration = 1;
    200     timing.fillMode = Timing::FillModeBackwards;
    201     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    202 
    203     animationNode->updateInheritedTime(-1);
    204     EXPECT_EQ(0, animationNode->timeFraction());
    205 
    206     animationNode->updateInheritedTime(2);
    207     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    208 }
    209 
    210 TEST(AnimationAnimationNodeTest, FillBoth)
    211 {
    212     Timing timing;
    213     timing.iterationDuration = 1;
    214     timing.fillMode = Timing::FillModeBoth;
    215     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    216 
    217     animationNode->updateInheritedTime(-1);
    218     EXPECT_EQ(0, animationNode->timeFraction());
    219 
    220     animationNode->updateInheritedTime(2);
    221     EXPECT_EQ(1, animationNode->timeFraction());
    222 }
    223 
    224 TEST(AnimationAnimationNodeTest, StartDelay)
    225 {
    226     Timing timing;
    227     timing.iterationDuration = 1;
    228     timing.fillMode = Timing::FillModeForwards;
    229     timing.startDelay = 0.5;
    230     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    231 
    232     animationNode->updateInheritedTime(0);
    233     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    234 
    235     animationNode->updateInheritedTime(0.5);
    236     EXPECT_EQ(0, animationNode->timeFraction());
    237 
    238     animationNode->updateInheritedTime(1.5);
    239     EXPECT_EQ(1, animationNode->timeFraction());
    240 }
    241 
    242 TEST(AnimationAnimationNodeTest, ZeroIteration)
    243 {
    244     Timing timing;
    245     timing.iterationDuration = 1;
    246     timing.fillMode = Timing::FillModeForwards;
    247     timing.iterationCount = 0;
    248     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    249 
    250     animationNode->updateInheritedTime(-1);
    251     EXPECT_EQ(0, animationNode->activeDurationInternal());
    252     EXPECT_TRUE(isNull(animationNode->currentIteration()));
    253     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    254 
    255     animationNode->updateInheritedTime(0);
    256     EXPECT_EQ(0, animationNode->activeDurationInternal());
    257     EXPECT_EQ(0, animationNode->currentIteration());
    258     EXPECT_EQ(0, animationNode->timeFraction());
    259 }
    260 
    261 TEST(AnimationAnimationNodeTest, InfiniteIteration)
    262 {
    263     Timing timing;
    264     timing.iterationDuration = 1;
    265     timing.fillMode = Timing::FillModeForwards;
    266     timing.iterationCount = std::numeric_limits<double>::infinity();
    267     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    268 
    269     animationNode->updateInheritedTime(-1);
    270     EXPECT_TRUE(isNull(animationNode->currentIteration()));
    271     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    272 
    273     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    274 
    275     animationNode->updateInheritedTime(0);
    276     EXPECT_EQ(0, animationNode->currentIteration());
    277     EXPECT_EQ(0, animationNode->timeFraction());
    278 }
    279 
    280 TEST(AnimationAnimationNodeTest, Iteration)
    281 {
    282     Timing timing;
    283     timing.iterationCount = 2;
    284     timing.iterationDuration = 2;
    285     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    286 
    287     animationNode->updateInheritedTime(0);
    288     EXPECT_EQ(0, animationNode->currentIteration());
    289     EXPECT_EQ(0, animationNode->timeFraction());
    290 
    291     animationNode->updateInheritedTime(1);
    292     EXPECT_EQ(0, animationNode->currentIteration());
    293     EXPECT_EQ(0.5, animationNode->timeFraction());
    294 
    295     animationNode->updateInheritedTime(2);
    296     EXPECT_EQ(1, animationNode->currentIteration());
    297     EXPECT_EQ(0, animationNode->timeFraction());
    298 
    299     animationNode->updateInheritedTime(2);
    300     EXPECT_EQ(1, animationNode->currentIteration());
    301     EXPECT_EQ(0, animationNode->timeFraction());
    302 
    303     animationNode->updateInheritedTime(5);
    304     EXPECT_EQ(1, animationNode->currentIteration());
    305     EXPECT_EQ(1, animationNode->timeFraction());
    306 }
    307 
    308 TEST(AnimationAnimationNodeTest, IterationStart)
    309 {
    310     Timing timing;
    311     timing.iterationStart = 1.2;
    312     timing.iterationCount = 2.2;
    313     timing.iterationDuration = 1;
    314     timing.fillMode = Timing::FillModeBoth;
    315     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    316 
    317     animationNode->updateInheritedTime(-1);
    318     EXPECT_EQ(1, animationNode->currentIteration());
    319     EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001);
    320 
    321     animationNode->updateInheritedTime(0);
    322     EXPECT_EQ(1, animationNode->currentIteration());
    323     EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001);
    324 
    325     animationNode->updateInheritedTime(10);
    326     EXPECT_EQ(3, animationNode->currentIteration());
    327     EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001);
    328 }
    329 
    330 TEST(AnimationAnimationNodeTest, IterationAlternate)
    331 {
    332     Timing timing;
    333     timing.iterationCount = 10;
    334     timing.iterationDuration = 1;
    335     timing.direction = Timing::PlaybackDirectionAlternate;
    336     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    337 
    338     animationNode->updateInheritedTime(0.75);
    339     EXPECT_EQ(0, animationNode->currentIteration());
    340     EXPECT_EQ(0.75, animationNode->timeFraction());
    341 
    342     animationNode->updateInheritedTime(1.75);
    343     EXPECT_EQ(1, animationNode->currentIteration());
    344     EXPECT_EQ(0.25, animationNode->timeFraction());
    345 
    346     animationNode->updateInheritedTime(2.75);
    347     EXPECT_EQ(2, animationNode->currentIteration());
    348     EXPECT_EQ(0.75, animationNode->timeFraction());
    349 }
    350 
    351 TEST(AnimationAnimationNodeTest, IterationAlternateReverse)
    352 {
    353     Timing timing;
    354     timing.iterationCount = 10;
    355     timing.iterationDuration = 1;
    356     timing.direction = Timing::PlaybackDirectionAlternateReverse;
    357     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    358 
    359     animationNode->updateInheritedTime(0.75);
    360     EXPECT_EQ(0, animationNode->currentIteration());
    361     EXPECT_EQ(0.25, animationNode->timeFraction());
    362 
    363     animationNode->updateInheritedTime(1.75);
    364     EXPECT_EQ(1, animationNode->currentIteration());
    365     EXPECT_EQ(0.75, animationNode->timeFraction());
    366 
    367     animationNode->updateInheritedTime(2.75);
    368     EXPECT_EQ(2, animationNode->currentIteration());
    369     EXPECT_EQ(0.25, animationNode->timeFraction());
    370 }
    371 
    372 TEST(AnimationAnimationNodeTest, ZeroDurationSanity)
    373 {
    374     Timing timing;
    375     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    376 
    377     EXPECT_EQ(0, animationNode->startTime());
    378 
    379     animationNode->updateInheritedTime(0);
    380 
    381     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    382     EXPECT_FALSE(animationNode->isInPlay());
    383     EXPECT_FALSE(animationNode->isCurrent());
    384     EXPECT_TRUE(animationNode->isInEffect());
    385     EXPECT_EQ(0, animationNode->currentIteration());
    386     EXPECT_EQ(0, animationNode->startTime());
    387     EXPECT_EQ(0, animationNode->activeDurationInternal());
    388     EXPECT_EQ(1, animationNode->timeFraction());
    389 
    390     animationNode->updateInheritedTime(1);
    391 
    392     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    393     EXPECT_FALSE(animationNode->isInPlay());
    394     EXPECT_FALSE(animationNode->isCurrent());
    395     EXPECT_TRUE(animationNode->isInEffect());
    396     EXPECT_EQ(0, animationNode->currentIteration());
    397     EXPECT_EQ(0, animationNode->startTime());
    398     EXPECT_EQ(0, animationNode->activeDurationInternal());
    399     EXPECT_EQ(1, animationNode->timeFraction());
    400 }
    401 
    402 TEST(AnimationAnimationNodeTest, ZeroDurationFillForwards)
    403 {
    404     Timing timing;
    405     timing.fillMode = Timing::FillModeForwards;
    406     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    407 
    408     animationNode->updateInheritedTime(-1);
    409     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    410 
    411     animationNode->updateInheritedTime(0);
    412     EXPECT_EQ(1, animationNode->timeFraction());
    413 
    414     animationNode->updateInheritedTime(1);
    415     EXPECT_EQ(1, animationNode->timeFraction());
    416 }
    417 
    418 TEST(AnimationAnimationNodeTest, ZeroDurationFillBackwards)
    419 {
    420     Timing timing;
    421     timing.fillMode = Timing::FillModeBackwards;
    422     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    423 
    424     animationNode->updateInheritedTime(-1);
    425     EXPECT_EQ(0, animationNode->timeFraction());
    426 
    427     animationNode->updateInheritedTime(0);
    428     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    429 
    430     animationNode->updateInheritedTime(1);
    431     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    432 }
    433 
    434 TEST(AnimationAnimationNodeTest, ZeroDurationFillBoth)
    435 {
    436     Timing timing;
    437     timing.fillMode = Timing::FillModeBoth;
    438     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    439 
    440     animationNode->updateInheritedTime(-1);
    441     EXPECT_EQ(0, animationNode->timeFraction());
    442 
    443     animationNode->updateInheritedTime(0);
    444     EXPECT_EQ(1, animationNode->timeFraction());
    445 
    446     animationNode->updateInheritedTime(1);
    447     EXPECT_EQ(1, animationNode->timeFraction());
    448 }
    449 
    450 TEST(AnimationAnimationNodeTest, ZeroDurationStartDelay)
    451 {
    452     Timing timing;
    453     timing.fillMode = Timing::FillModeForwards;
    454     timing.startDelay = 0.5;
    455     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    456 
    457     animationNode->updateInheritedTime(0);
    458     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    459 
    460     animationNode->updateInheritedTime(0.5);
    461     EXPECT_EQ(1, animationNode->timeFraction());
    462 
    463     animationNode->updateInheritedTime(1.5);
    464     EXPECT_EQ(1, animationNode->timeFraction());
    465 }
    466 
    467 TEST(AnimationAnimationNodeTest, ZeroDurationIterationStartAndCount)
    468 {
    469     Timing timing;
    470     timing.iterationStart = 0.1;
    471     timing.iterationCount = 0.2;
    472     timing.fillMode = Timing::FillModeBoth;
    473     timing.startDelay = 0.3;
    474     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    475 
    476     animationNode->updateInheritedTime(0);
    477     EXPECT_EQ(0.1, animationNode->timeFraction());
    478 
    479     animationNode->updateInheritedTime(0.3);
    480     EXPECT_DOUBLE_EQ(0.3, animationNode->timeFraction());
    481 
    482     animationNode->updateInheritedTime(1);
    483     EXPECT_DOUBLE_EQ(0.3, animationNode->timeFraction());
    484 }
    485 
    486 // FIXME: Needs specification work.
    487 TEST(AnimationAnimationNodeTest, ZeroDurationInfiniteIteration)
    488 {
    489     Timing timing;
    490     timing.fillMode = Timing::FillModeForwards;
    491     timing.iterationCount = std::numeric_limits<double>::infinity();
    492     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    493 
    494     animationNode->updateInheritedTime(-1);
    495     EXPECT_EQ(0, animationNode->activeDurationInternal());
    496     EXPECT_TRUE(isNull(animationNode->currentIteration()));
    497     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    498 
    499     animationNode->updateInheritedTime(0);
    500     EXPECT_EQ(0, animationNode->activeDurationInternal());
    501     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->currentIteration());
    502     EXPECT_EQ(1, animationNode->timeFraction());
    503 }
    504 
    505 TEST(AnimationAnimationNodeTest, ZeroDurationIteration)
    506 {
    507     Timing timing;
    508     timing.fillMode = Timing::FillModeForwards;
    509     timing.iterationCount = 2;
    510     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    511 
    512     animationNode->updateInheritedTime(-1);
    513     EXPECT_TRUE(isNull(animationNode->currentIteration()));
    514     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    515 
    516     animationNode->updateInheritedTime(0);
    517     EXPECT_EQ(1, animationNode->currentIteration());
    518     EXPECT_EQ(1, animationNode->timeFraction());
    519 
    520     animationNode->updateInheritedTime(1);
    521     EXPECT_EQ(1, animationNode->currentIteration());
    522     EXPECT_EQ(1, animationNode->timeFraction());
    523 }
    524 
    525 TEST(AnimationAnimationNodeTest, ZeroDurationIterationStart)
    526 {
    527     Timing timing;
    528     timing.iterationStart = 1.2;
    529     timing.iterationCount = 2.2;
    530     timing.fillMode = Timing::FillModeBoth;
    531     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    532 
    533     animationNode->updateInheritedTime(-1);
    534     EXPECT_EQ(1, animationNode->currentIteration());
    535     EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001);
    536 
    537     animationNode->updateInheritedTime(0);
    538     EXPECT_EQ(3, animationNode->currentIteration());
    539     EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001);
    540 
    541     animationNode->updateInheritedTime(10);
    542     EXPECT_EQ(3, animationNode->currentIteration());
    543     EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001);
    544 }
    545 
    546 TEST(AnimationAnimationNodeTest, ZeroDurationIterationAlternate)
    547 {
    548     Timing timing;
    549     timing.fillMode = Timing::FillModeForwards;
    550     timing.iterationCount = 2;
    551     timing.direction = Timing::PlaybackDirectionAlternate;
    552     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    553 
    554     animationNode->updateInheritedTime(-1);
    555     EXPECT_TRUE(isNull(animationNode->currentIteration()));
    556     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    557 
    558     animationNode->updateInheritedTime(0);
    559     EXPECT_EQ(1, animationNode->currentIteration());
    560     EXPECT_EQ(0, animationNode->timeFraction());
    561 
    562     animationNode->updateInheritedTime(1);
    563     EXPECT_EQ(1, animationNode->currentIteration());
    564     EXPECT_EQ(0, animationNode->timeFraction());
    565 }
    566 
    567 TEST(AnimationAnimationNodeTest, ZeroDurationIterationAlternateReverse)
    568 {
    569     Timing timing;
    570     timing.fillMode = Timing::FillModeForwards;
    571     timing.iterationCount = 2;
    572     timing.direction = Timing::PlaybackDirectionAlternateReverse;
    573     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    574 
    575     animationNode->updateInheritedTime(-1);
    576     EXPECT_TRUE(isNull(animationNode->currentIteration()));
    577     EXPECT_TRUE(isNull(animationNode->timeFraction()));
    578 
    579     animationNode->updateInheritedTime(0);
    580     EXPECT_EQ(1, animationNode->currentIteration());
    581     EXPECT_EQ(1, animationNode->timeFraction());
    582 
    583     animationNode->updateInheritedTime(1);
    584     EXPECT_EQ(1, animationNode->currentIteration());
    585     EXPECT_EQ(1, animationNode->timeFraction());
    586 }
    587 
    588 TEST(AnimationAnimationNodeTest, InfiniteDurationSanity)
    589 {
    590     Timing timing;
    591     timing.iterationDuration = std::numeric_limits<double>::infinity();
    592     timing.iterationCount = 1;
    593     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    594 
    595     EXPECT_EQ(0, animationNode->startTime());
    596 
    597     animationNode->updateInheritedTime(0);
    598 
    599     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    600     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    601     EXPECT_TRUE(animationNode->isInPlay());
    602     EXPECT_TRUE(animationNode->isCurrent());
    603     EXPECT_TRUE(animationNode->isInEffect());
    604     EXPECT_EQ(0, animationNode->currentIteration());
    605     EXPECT_EQ(0, animationNode->timeFraction());
    606 
    607     animationNode->updateInheritedTime(1);
    608 
    609     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    610     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    611     EXPECT_TRUE(animationNode->isInPlay());
    612     EXPECT_TRUE(animationNode->isCurrent());
    613     EXPECT_TRUE(animationNode->isInEffect());
    614     EXPECT_EQ(0, animationNode->currentIteration());
    615     EXPECT_EQ(0, animationNode->timeFraction());
    616 }
    617 
    618 // FIXME: Needs specification work.
    619 TEST(AnimationAnimationNodeTest, InfiniteDurationZeroIterations)
    620 {
    621     Timing timing;
    622     timing.iterationDuration = std::numeric_limits<double>::infinity();
    623     timing.iterationCount = 0;
    624     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    625 
    626     EXPECT_EQ(0, animationNode->startTime());
    627 
    628     animationNode->updateInheritedTime(0);
    629 
    630     EXPECT_EQ(0, animationNode->activeDurationInternal());
    631     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    632     EXPECT_FALSE(animationNode->isInPlay());
    633     EXPECT_FALSE(animationNode->isCurrent());
    634     EXPECT_TRUE(animationNode->isInEffect());
    635     EXPECT_EQ(0, animationNode->currentIteration());
    636     EXPECT_EQ(0, animationNode->timeFraction());
    637 
    638     animationNode->updateInheritedTime(1);
    639 
    640     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    641     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    642     EXPECT_FALSE(animationNode->isInPlay());
    643     EXPECT_FALSE(animationNode->isCurrent());
    644     EXPECT_TRUE(animationNode->isInEffect());
    645     EXPECT_EQ(0, animationNode->currentIteration());
    646     EXPECT_EQ(0, animationNode->timeFraction());
    647 }
    648 
    649 TEST(AnimationAnimationNodeTest, InfiniteDurationInfiniteIterations)
    650 {
    651     Timing timing;
    652     timing.iterationDuration = std::numeric_limits<double>::infinity();
    653     timing.iterationCount = std::numeric_limits<double>::infinity();
    654     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    655 
    656     EXPECT_EQ(0, animationNode->startTime());
    657 
    658     animationNode->updateInheritedTime(0);
    659 
    660     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    661     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    662     EXPECT_TRUE(animationNode->isInPlay());
    663     EXPECT_TRUE(animationNode->isCurrent());
    664     EXPECT_TRUE(animationNode->isInEffect());
    665     EXPECT_EQ(0, animationNode->currentIteration());
    666     EXPECT_EQ(0, animationNode->timeFraction());
    667 
    668     animationNode->updateInheritedTime(1);
    669 
    670     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    671     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    672     EXPECT_TRUE(animationNode->isInPlay());
    673     EXPECT_TRUE(animationNode->isCurrent());
    674     EXPECT_TRUE(animationNode->isInEffect());
    675     EXPECT_EQ(0, animationNode->currentIteration());
    676     EXPECT_EQ(0, animationNode->timeFraction());
    677 }
    678 
    679 TEST(AnimationAnimationNodeTest, InfiniteDurationZeroPlaybackRate)
    680 {
    681     Timing timing;
    682     timing.iterationDuration = std::numeric_limits<double>::infinity();
    683     timing.playbackRate = 0;
    684     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    685 
    686     EXPECT_EQ(0, animationNode->startTime());
    687 
    688     animationNode->updateInheritedTime(0);
    689 
    690     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    691     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    692     EXPECT_TRUE(animationNode->isInPlay());
    693     EXPECT_TRUE(animationNode->isCurrent());
    694     EXPECT_TRUE(animationNode->isInEffect());
    695     EXPECT_EQ(0, animationNode->currentIteration());
    696     EXPECT_EQ(0, animationNode->timeFraction());
    697 
    698     animationNode->updateInheritedTime(std::numeric_limits<double>::infinity());
    699 
    700     EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    701     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    702     EXPECT_FALSE(animationNode->isInPlay());
    703     EXPECT_FALSE(animationNode->isCurrent());
    704     EXPECT_TRUE(animationNode->isInEffect());
    705     EXPECT_EQ(0, animationNode->currentIteration());
    706     EXPECT_EQ(0, animationNode->timeFraction());
    707 }
    708 
    709 TEST(AnimationAnimationNodeTest, EndTime)
    710 {
    711     Timing timing;
    712     timing.startDelay = 1;
    713     timing.endDelay = 2;
    714     timing.iterationDuration = 4;
    715     timing.iterationCount = 2;
    716     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    717     EXPECT_EQ(11, animationNode->endTimeInternal());
    718 }
    719 
    720 TEST(AnimationAnimationNodeTest, Events)
    721 {
    722     Timing timing;
    723     timing.iterationDuration = 1;
    724     timing.fillMode = Timing::FillModeForwards;
    725     timing.iterationCount = 2;
    726     timing.startDelay = 1;
    727     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    728 
    729     animationNode->updateInheritedTime(0.0, TimingUpdateOnDemand);
    730     EXPECT_FALSE(animationNode->eventDelegate()->eventTriggered());
    731 
    732     animationNode->updateInheritedTime(0.0, TimingUpdateForAnimationFrame);
    733     EXPECT_TRUE(animationNode->eventDelegate()->eventTriggered());
    734 
    735     animationNode->updateInheritedTime(1.5, TimingUpdateOnDemand);
    736     EXPECT_FALSE(animationNode->eventDelegate()->eventTriggered());
    737 
    738     animationNode->updateInheritedTime(1.5, TimingUpdateForAnimationFrame);
    739     EXPECT_TRUE(animationNode->eventDelegate()->eventTriggered());
    740 
    741 }
    742 
    743 TEST(AnimationAnimationNodeTest, TimeToEffectChange)
    744 {
    745     Timing timing;
    746     timing.iterationDuration = 1;
    747     timing.fillMode = Timing::FillModeForwards;
    748     timing.iterationStart = 0.2;
    749     timing.iterationCount = 2.5;
    750     timing.startDelay = 1;
    751     timing.direction = Timing::PlaybackDirectionAlternate;
    752     RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing);
    753 
    754     animationNode->updateInheritedTime(0);
    755     EXPECT_EQ(0, animationNode->takeLocalTime());
    756     EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration()));
    757 
    758     // Normal iteration.
    759     animationNode->updateInheritedTime(1.75);
    760     EXPECT_EQ(1.75, animationNode->takeLocalTime());
    761     EXPECT_NEAR(0.05, animationNode->takeTimeToNextIteration(), 0.000000000000001);
    762 
    763     // Reverse iteration.
    764     animationNode->updateInheritedTime(2.75);
    765     EXPECT_EQ(2.75, animationNode->takeLocalTime());
    766     EXPECT_NEAR(0.05, animationNode->takeTimeToNextIteration(), 0.000000000000001);
    767 
    768     // Item ends before iteration finishes.
    769     animationNode->updateInheritedTime(3.4);
    770     EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase());
    771     EXPECT_EQ(3.4, animationNode->takeLocalTime());
    772     EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration()));
    773 
    774     // Item has finished.
    775     animationNode->updateInheritedTime(3.5);
    776     EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase());
    777     EXPECT_EQ(3.5, animationNode->takeLocalTime());
    778     EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration()));
    779 }
    780 
    781 }
    782