TEST(AnimationAnimationEffectTest, InfiniteDurationZeroPlaybackRate)
{
    Timing timing;
    timing.iterationDuration = std::numeric_limits<double>::infinity();
    timing.playbackRate = 0;
    RefPtrWillBeRawPtr<TestAnimationEffect> animationNode = TestAnimationEffect::create(timing);

    EXPECT_EQ(0, animationNode->computedTiming().startTime());

    animationNode->updateInheritedTime(0);

    EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    EXPECT_EQ(AnimationEffect::PhaseActive, animationNode->phase());
    EXPECT_TRUE(animationNode->isInPlay());
    EXPECT_TRUE(animationNode->isCurrent());
    EXPECT_TRUE(animationNode->isInEffect());
    EXPECT_EQ(0, animationNode->currentIteration());
    EXPECT_EQ(0, animationNode->timeFraction());

    animationNode->updateInheritedTime(std::numeric_limits<double>::infinity());

    EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal());
    EXPECT_EQ(AnimationEffect::PhaseAfter, animationNode->phase());
    EXPECT_FALSE(animationNode->isInPlay());
    EXPECT_FALSE(animationNode->isCurrent());
    EXPECT_TRUE(animationNode->isInEffect());
    EXPECT_EQ(0, animationNode->currentIteration());
    EXPECT_EQ(0, animationNode->timeFraction());
}
TEST(AnimationAnimationEffectTest, ZeroDurationSanity)
{
    Timing timing;
    RefPtrWillBeRawPtr<TestAnimationEffect> animationNode = TestAnimationEffect::create(timing);

    EXPECT_EQ(0, animationNode->computedTiming().startTime());

    animationNode->updateInheritedTime(0);

    EXPECT_EQ(AnimationEffect::PhaseAfter, animationNode->phase());
    EXPECT_FALSE(animationNode->isInPlay());
    EXPECT_FALSE(animationNode->isCurrent());
    EXPECT_TRUE(animationNode->isInEffect());
    EXPECT_EQ(0, animationNode->currentIteration());
    EXPECT_EQ(0, animationNode->computedTiming().startTime());
    EXPECT_EQ(0, animationNode->activeDurationInternal());
    EXPECT_EQ(1, animationNode->timeFraction());

    animationNode->updateInheritedTime(1);

    EXPECT_EQ(AnimationEffect::PhaseAfter, animationNode->phase());
    EXPECT_FALSE(animationNode->isInPlay());
    EXPECT_FALSE(animationNode->isCurrent());
    EXPECT_TRUE(animationNode->isInEffect());
    EXPECT_EQ(0, animationNode->currentIteration());
    EXPECT_EQ(0, animationNode->computedTiming().startTime());
    EXPECT_EQ(0, animationNode->activeDurationInternal());
    EXPECT_EQ(1, animationNode->timeFraction());
}
// FIXME: Needs specification work.
TEST(AnimationAnimationEffectTest, ZeroDurationInfiniteIteration)
{
    Timing timing;
    timing.fillMode = Timing::FillModeForwards;
    timing.iterationCount = std::numeric_limits<double>::infinity();
    RefPtrWillBeRawPtr<TestAnimationEffect> animationNode = TestAnimationEffect::create(timing);

    animationNode->updateInheritedTime(-1);
    EXPECT_EQ(0, animationNode->activeDurationInternal());
    EXPECT_TRUE(isNull(animationNode->currentIteration()));
    EXPECT_TRUE(isNull(animationNode->timeFraction()));

    animationNode->updateInheritedTime(0);
    EXPECT_EQ(0, animationNode->activeDurationInternal());
    EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->currentIteration());
    EXPECT_EQ(1, animationNode->timeFraction());
}
TEST(AnimationAnimationEffectTest, ZeroIteration)
{
    Timing timing;
    timing.iterationDuration = 1;
    timing.fillMode = Timing::FillModeForwards;
    timing.iterationCount = 0;
    RefPtrWillBeRawPtr<TestAnimationEffect> animationNode = TestAnimationEffect::create(timing);

    animationNode->updateInheritedTime(-1);
    EXPECT_EQ(0, animationNode->activeDurationInternal());
    EXPECT_TRUE(isNull(animationNode->currentIteration()));
    EXPECT_TRUE(isNull(animationNode->timeFraction()));

    animationNode->updateInheritedTime(0);
    EXPECT_EQ(0, animationNode->activeDurationInternal());
    EXPECT_EQ(0, animationNode->currentIteration());
    EXPECT_EQ(0, animationNode->timeFraction());
}