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