/*
 * Copyright (c) 2013, Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "sky/engine/config.h"
#include "sky/engine/core/animation/AnimationPlayer.h"

#include <gtest/gtest.h>
#include "sky/engine/core/animation/ActiveAnimations.h"
#include "sky/engine/core/animation/Animation.h"
#include "sky/engine/core/animation/AnimationClock.h"
#include "sky/engine/core/animation/AnimationTimeline.h"
#include "sky/engine/core/dom/Document.h"
#include "sky/engine/core/dom/QualifiedName.h"
#include "sky/engine/platform/weborigin/KURL.h"

using namespace blink;

namespace {

class AnimationAnimationPlayerTest : public ::testing::Test {
protected:
    virtual void SetUp()
    {
        setUpWithoutStartingTimeline();
        startTimeline();
    }

    void setUpWithoutStartingTimeline()
    {
        document = Document::create();
        document->animationClock().resetTimeForTesting();
        timeline = AnimationTimeline::create(document.get());
        player = timeline->createAnimationPlayer(0);
        player->setStartTime(0);
        player->setSource(makeAnimation().get());
    }

    void startTimeline()
    {
        simulateFrame(0);
    }

    PassRefPtr<Animation> makeAnimation(double duration = 30, double playbackRate = 1)
    {
        Timing timing;
        timing.iterationDuration = duration;
        timing.playbackRate = playbackRate;
        return Animation::create(0, nullptr, timing);
    }

    bool simulateFrame(double time)
    {
        document->animationClock().updateTime(time);
        document->pendingAnimations().update(false);
        // The timeline does not know about our player, so we have to explicitly call update().
        return player->update(TimingUpdateForAnimationFrame);
    }

    RefPtr<Document> document;
    RefPtr<AnimationTimeline> timeline;
    RefPtr<AnimationPlayer> player;
    TrackExceptionState exceptionState;
};

TEST_F(AnimationAnimationPlayerTest, InitialState)
{
    setUpWithoutStartingTimeline();
    player = timeline->createAnimationPlayer(0);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_FALSE(player->paused());
    EXPECT_EQ(1, player->playbackRate());
    EXPECT_FALSE(player->hasStartTime());
    EXPECT_TRUE(isNull(player->startTimeInternal()));

    startTimeline();
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(0, timeline->currentTimeInternal());
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_FALSE(player->paused());
    EXPECT_EQ(1, player->playbackRate());
    EXPECT_EQ(0, player->startTimeInternal());
    EXPECT_TRUE(player->hasStartTime());
}


TEST_F(AnimationAnimationPlayerTest, CurrentTimeDoesNotSetOutdated)
{
    EXPECT_FALSE(player->outdated());
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_FALSE(player->outdated());
    // FIXME: We should split simulateFrame into a version that doesn't update
    // the player and one that does, as most of the tests don't require update()
    // to be called.
    document->animationClock().updateTime(10);
    EXPECT_EQ(10, player->currentTimeInternal());
    EXPECT_FALSE(player->outdated());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTime)
{
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    player->setCurrentTimeInternal(10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    EXPECT_EQ(10, player->currentTimeInternal());
    simulateFrame(10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeNegative)
{
    player->setCurrentTimeInternal(-10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    EXPECT_EQ(-10, player->currentTimeInternal());
    simulateFrame(20);
    EXPECT_EQ(10, player->currentTimeInternal());

    player->setPlaybackRate(-2);
    player->setCurrentTimeInternal(-10);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_EQ(-10, player->currentTimeInternal());
    simulateFrame(40);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(-10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeNegativeWithoutSimultaneousPlaybackRateChange)
{
    simulateFrame(20);
    EXPECT_EQ(20, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    player->setPlaybackRate(-1);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    simulateFrame(30);
    EXPECT_EQ(20, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    player->setCurrentTimeInternal(-10);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimePastContentEnd)
{
    player->setCurrentTimeInternal(50);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(50, player->currentTimeInternal());
    simulateFrame(20);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(50, player->currentTimeInternal());

    player->setPlaybackRate(-2);
    player->setCurrentTimeInternal(50);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_EQ(50, player->currentTimeInternal());
    simulateFrame(20);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    simulateFrame(40);
    EXPECT_EQ(10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeBeforeTimelineStarted)
{
    setUpWithoutStartingTimeline();
    player->setCurrentTimeInternal(5);
    EXPECT_EQ(5, player->currentTimeInternal());
    startTimeline();
    simulateFrame(10);
    EXPECT_EQ(15, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimePastContentEndBeforeTimelineStarted)
{
    setUpWithoutStartingTimeline();
    player->setCurrentTimeInternal(250);
    EXPECT_EQ(250, player->currentTimeInternal());
    startTimeline();
    simulateFrame(10);
    EXPECT_EQ(250, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeMax)
{
    player->setCurrentTimeInternal(std::numeric_limits<double>::max());
    EXPECT_EQ(std::numeric_limits<double>::max(), player->currentTimeInternal());
    simulateFrame(100);
    EXPECT_EQ(std::numeric_limits<double>::max(), player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeUnrestrictedDouble)
{
    simulateFrame(10);
    player->setCurrentTime(nullValue());
    EXPECT_EQ(10, player->currentTimeInternal());
    player->setCurrentTime(std::numeric_limits<double>::infinity());
    EXPECT_EQ(10, player->currentTimeInternal());
    player->setCurrentTime(-std::numeric_limits<double>::infinity());
    EXPECT_EQ(10, player->currentTimeInternal());
}


TEST_F(AnimationAnimationPlayerTest, SetCurrentTimeSetsStartTime)
{
    EXPECT_EQ(0, player->startTime());
    player->setCurrentTime(1000);
    EXPECT_EQ(-1000, player->startTime());
    simulateFrame(1);
    EXPECT_EQ(-1000, player->startTime());
    EXPECT_EQ(2000, player->currentTime());
}

TEST_F(AnimationAnimationPlayerTest, SetStartTime)
{
    simulateFrame(20);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    EXPECT_EQ(0, player->startTimeInternal());
    EXPECT_EQ(20, player->currentTimeInternal());
    player->setStartTime(10 * 1000);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    EXPECT_EQ(10, player->startTimeInternal());
    EXPECT_EQ(10, player->currentTimeInternal());
    simulateFrame(30);
    EXPECT_EQ(10, player->startTimeInternal());
    EXPECT_EQ(20, player->currentTimeInternal());
    player->setStartTime(-20 * 1000);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetStartTimeLimitsAnimationPlayer)
{
    player->setStartTime(-50 * 1000);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(30, player->currentTimeInternal());
    player->setPlaybackRate(-1);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    player->setStartTime(-100 * 1000);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_TRUE(player->finished());
}

TEST_F(AnimationAnimationPlayerTest, SetStartTimeOnLimitedAnimationPlayer)
{
    simulateFrame(30);
    player->setStartTime(-10 * 1000);
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_EQ(30, player->currentTimeInternal());
    player->setCurrentTimeInternal(50);
    player->setStartTime(-40 * 1000);
    EXPECT_EQ(30, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal());
    EXPECT_TRUE(player->finished());
}

TEST_F(AnimationAnimationPlayerTest, StartTimePauseFinish)
{
    player->pause();
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_TRUE(std::isnan(player->startTime()));
    player->finish(exceptionState);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_TRUE(std::isnan(player->startTime()));
}

TEST_F(AnimationAnimationPlayerTest, PauseBeatsFinish)
{
    player->pause();
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    simulateFrame(10);
    EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal());
    player->finish(exceptionState);
    EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, StartTimeFinishPause)
{
    double startTime = player->startTime();
    player->finish(exceptionState);
    EXPECT_EQ(startTime, player->startTime());
    player->pause();
    EXPECT_TRUE(std::isnan(player->startTime()));
}

TEST_F(AnimationAnimationPlayerTest, StartTimeWithZeroPlaybackRate)
{
    player->setPlaybackRate(0);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_TRUE(std::isnan(player->startTime()));
    simulateFrame(10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, PausePlay)
{
    simulateFrame(10);
    player->pause();
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    EXPECT_TRUE(player->paused());
    EXPECT_EQ(10, player->currentTimeInternal());
    simulateFrame(20);
    EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal());
    player->play();
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    simulateFrame(20);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    EXPECT_FALSE(player->paused());
    EXPECT_EQ(10, player->currentTimeInternal());
    simulateFrame(30);
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, PauseBeforeTimelineStarted)
{
    setUpWithoutStartingTimeline();
    player->pause();
    EXPECT_TRUE(player->paused());
    player->play();
    EXPECT_FALSE(player->paused());

    player->pause();
    startTimeline();
    simulateFrame(100);
    EXPECT_TRUE(player->paused());
    EXPECT_EQ(0, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, PlayRewindsToStart)
{
    player->setCurrentTimeInternal(30);
    player->play();
    EXPECT_EQ(0, player->currentTimeInternal());

    player->setCurrentTimeInternal(40);
    player->play();
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    simulateFrame(10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());

    player->setCurrentTimeInternal(-10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
    player->play();
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, PlayRewindsToEnd)
{
    player->setPlaybackRate(-1);
    player->play();
    EXPECT_EQ(30, player->currentTimeInternal());

    player->setCurrentTimeInternal(40);
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    player->play();
    EXPECT_EQ(30, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    simulateFrame(10);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());

    player->setCurrentTimeInternal(-10);
    player->play();
    EXPECT_EQ(30, player->currentTimeInternal());
    EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
    simulateFrame(20);
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, PlayWithPlaybackRateZeroDoesNotSeek)
{
    player->setPlaybackRate(0);
    player->play();
    EXPECT_EQ(0, player->currentTimeInternal());

    player->setCurrentTimeInternal(40);
    player->play();
    EXPECT_EQ(40, player->currentTimeInternal());

    player->setCurrentTimeInternal(-10);
    player->play();
    EXPECT_EQ(-10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, PlayAfterPauseWithPlaybackRateZeroUpdatesPlayState)
{
    player->pause();
    player->setPlaybackRate(0);
    simulateFrame(1);
    EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal());
    player->play();
    EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
}

TEST_F(AnimationAnimationPlayerTest, Reverse)
{
    player->setCurrentTimeInternal(10);
    player->pause();
    player->reverse();
    EXPECT_FALSE(player->paused());
    EXPECT_EQ(-1, player->playbackRate());
    EXPECT_EQ(10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, ReverseDoesNothingWithPlaybackRateZero)
{
    player->setCurrentTimeInternal(10);
    player->setPlaybackRate(0);
    player->pause();
    player->reverse();
    EXPECT_TRUE(player->paused());
    EXPECT_EQ(0, player->playbackRate());
    EXPECT_EQ(10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, ReverseDoesNotSeekWithNoSource)
{
    player->setSource(0);
    player->setCurrentTimeInternal(10);
    player->reverse();
    EXPECT_EQ(10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, ReverseSeeksToStart)
{
    player->setCurrentTimeInternal(-10);
    player->setPlaybackRate(-1);
    player->reverse();
    EXPECT_EQ(0, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, ReverseSeeksToEnd)
{
    player->setCurrentTimeInternal(40);
    player->reverse();
    EXPECT_EQ(30, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, ReverseLimitsAnimationPlayer)
{
    player->setCurrentTimeInternal(40);
    player->setPlaybackRate(-1);
    player->reverse();
    EXPECT_TRUE(player->finished());
    EXPECT_EQ(40, player->currentTimeInternal());

    player->setCurrentTimeInternal(-10);
    player->reverse();
    EXPECT_TRUE(player->finished());
    EXPECT_EQ(-10, player->currentTimeInternal());
}


TEST_F(AnimationAnimationPlayerTest, Finish)
{
    player->finish(exceptionState);
    EXPECT_EQ(30, player->currentTimeInternal());
    EXPECT_TRUE(player->finished());

    player->setPlaybackRate(-1);
    player->finish(exceptionState);
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_TRUE(player->finished());

    EXPECT_FALSE(exceptionState.had_exception());
}

TEST_F(AnimationAnimationPlayerTest, FinishAfterSourceEnd)
{
    player->setCurrentTimeInternal(40);
    player->finish(exceptionState);
    EXPECT_EQ(30, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, FinishBeforeStart)
{
    player->setCurrentTimeInternal(-10);
    player->setPlaybackRate(-1);
    player->finish(exceptionState);
    EXPECT_EQ(0, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, FinishDoesNothingWithPlaybackRateZero)
{
    player->setCurrentTimeInternal(10);
    player->setPlaybackRate(0);
    player->finish(exceptionState);
    EXPECT_EQ(10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, FinishRaisesException)
{
    Timing timing;
    timing.iterationDuration = 1;
    timing.iterationCount = std::numeric_limits<double>::infinity();
    player->setSource(Animation::create(0, nullptr, timing).get());
    player->setCurrentTimeInternal(10);

    player->finish(exceptionState);
    EXPECT_EQ(10, player->currentTimeInternal());
    EXPECT_TRUE(exceptionState.had_exception());
    EXPECT_EQ(InvalidStateError, exceptionState.code());
}


TEST_F(AnimationAnimationPlayerTest, LimitingAtSourceEnd)
{
    simulateFrame(30);
    EXPECT_EQ(30, player->currentTimeInternal());
    EXPECT_TRUE(player->finished());
    simulateFrame(40);
    EXPECT_EQ(30, player->currentTimeInternal());
    EXPECT_FALSE(player->paused());
}

TEST_F(AnimationAnimationPlayerTest, LimitingAtStart)
{
    simulateFrame(30);
    player->setPlaybackRate(-2);
    simulateFrame(30);
    simulateFrame(45);
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_TRUE(player->finished());
    simulateFrame(60);
    EXPECT_EQ(0, player->currentTimeInternal());
    EXPECT_FALSE(player->paused());
}

TEST_F(AnimationAnimationPlayerTest, LimitingWithNoSource)
{
    player->setSource(0);
    EXPECT_TRUE(player->finished());
    simulateFrame(30);
    EXPECT_EQ(0, player->currentTimeInternal());
}


TEST_F(AnimationAnimationPlayerTest, SetPlaybackRate)
{
    player->setPlaybackRate(2);
    simulateFrame(0);
    EXPECT_EQ(2, player->playbackRate());
    EXPECT_EQ(0, player->currentTimeInternal());
    simulateFrame(10);
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateBeforeTimelineStarted)
{
    setUpWithoutStartingTimeline();
    player->setPlaybackRate(2);
    EXPECT_EQ(2, player->playbackRate());
    EXPECT_EQ(0, player->currentTimeInternal());
    startTimeline();
    simulateFrame(10);
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateWhilePaused)
{
    simulateFrame(10);
    player->pause();
    player->setPlaybackRate(2);
    simulateFrame(20);
    player->play();
    EXPECT_EQ(10, player->currentTimeInternal());
    simulateFrame(20);
    simulateFrame(25);
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateWhileLimited)
{
    simulateFrame(40);
    EXPECT_EQ(30, player->currentTimeInternal());
    player->setPlaybackRate(2);
    simulateFrame(50);
    EXPECT_EQ(30, player->currentTimeInternal());
    player->setPlaybackRate(-2);
    simulateFrame(50);
    simulateFrame(60);
    EXPECT_FALSE(player->finished());
    EXPECT_EQ(10, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateZero)
{
    simulateFrame(0);
    simulateFrame(10);
    player->setPlaybackRate(0);
    simulateFrame(10);
    EXPECT_EQ(10, player->currentTimeInternal());
    simulateFrame(20);
    EXPECT_EQ(10, player->currentTimeInternal());
    player->setCurrentTimeInternal(20);
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetPlaybackRateMax)
{
    player->setPlaybackRate(std::numeric_limits<double>::max());
    simulateFrame(0);
    EXPECT_EQ(std::numeric_limits<double>::max(), player->playbackRate());
    EXPECT_EQ(0, player->currentTimeInternal());
    simulateFrame(1);
    EXPECT_EQ(30, player->currentTimeInternal());
}


TEST_F(AnimationAnimationPlayerTest, SetSource)
{
    player = timeline->createAnimationPlayer(0);
    player->setStartTime(0);
    RefPtr<AnimationNode> source1 = makeAnimation();
    RefPtr<AnimationNode> source2 = makeAnimation();
    player->setSource(source1.get());
    EXPECT_EQ(source1, player->source());
    EXPECT_EQ(0, player->currentTimeInternal());
    player->setCurrentTimeInternal(15);
    player->setSource(source2.get());
    EXPECT_EQ(15, player->currentTimeInternal());
    EXPECT_EQ(0, source1->player());
    EXPECT_EQ(player.get(), source2->player());
    EXPECT_EQ(source2, player->source());
}

TEST_F(AnimationAnimationPlayerTest, SetSourceLimitsAnimationPlayer)
{
    player->setCurrentTimeInternal(20);
    player->setSource(makeAnimation(10).get());
    EXPECT_EQ(20, player->currentTimeInternal());
    EXPECT_TRUE(player->finished());
    simulateFrame(10);
    EXPECT_EQ(20, player->currentTimeInternal());
}

TEST_F(AnimationAnimationPlayerTest, SetSourceUnlimitsAnimationPlayer)
{
    player->setCurrentTimeInternal(40);
    player->setSource(makeAnimation(60).get());
    EXPECT_FALSE(player->finished());
    EXPECT_EQ(40, player->currentTimeInternal());
    simulateFrame(10);
    EXPECT_EQ(50, player->currentTimeInternal());
}


TEST_F(AnimationAnimationPlayerTest, EmptyAnimationPlayersDontUpdateEffects)
{
    player = timeline->createAnimationPlayer(0);
    player->update(TimingUpdateOnDemand);
    EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange());

    simulateFrame(1234);
    EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange());
}

TEST_F(AnimationAnimationPlayerTest, AnimationPlayersDisassociateFromSource)
{
    AnimationNode* animationNode = player->source();
    AnimationPlayer* player2 = timeline->createAnimationPlayer(animationNode);
    EXPECT_EQ(0, player->source());
    player->setSource(animationNode);
    EXPECT_EQ(0, player2->source());
}

TEST_F(AnimationAnimationPlayerTest, AnimationPlayersReturnTimeToNextEffect)
{
    Timing timing;
    timing.startDelay = 1;
    timing.iterationDuration = 1;
    timing.endDelay = 1;
    RefPtr<Animation> animation = Animation::create(0, nullptr, timing);
    player = timeline->createAnimationPlayer(animation.get());
    player->setStartTime(0);

    simulateFrame(0);
    EXPECT_EQ(1, player->timeToEffectChange());

    simulateFrame(0.5);
    EXPECT_EQ(0.5, player->timeToEffectChange());

    simulateFrame(1);
    EXPECT_EQ(0, player->timeToEffectChange());

    simulateFrame(1.5);
    EXPECT_EQ(0, player->timeToEffectChange());

    simulateFrame(2);
    EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange());

    simulateFrame(3);
    EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange());

    player->setCurrentTimeInternal(0);
    simulateFrame(3);
    EXPECT_EQ(1, player->timeToEffectChange());

    player->setPlaybackRate(2);
    simulateFrame(3);
    EXPECT_EQ(0.5, player->timeToEffectChange());

    player->setPlaybackRate(0);
    player->update(TimingUpdateOnDemand);
    EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange());

    player->setCurrentTimeInternal(3);
    player->setPlaybackRate(-1);
    player->update(TimingUpdateOnDemand);
    simulateFrame(3);
    EXPECT_EQ(1, player->timeToEffectChange());

    player->setPlaybackRate(-2);
    player->update(TimingUpdateOnDemand);
    simulateFrame(3);
    EXPECT_EQ(0.5, player->timeToEffectChange());
}

TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectWhenPaused)
{
    EXPECT_EQ(0, player->timeToEffectChange());
    player->pause();
    player->update(TimingUpdateOnDemand);
    EXPECT_EQ(std::numeric_limits<double>::infinity(), player->timeToEffectChange());
}

TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectWhenCancelledBeforeStart)
{
    EXPECT_EQ(0, player->timeToEffectChange());
    player->setCurrentTimeInternal(-8);
    player->setPlaybackRate(2);
    player->cancel();
    player->update(TimingUpdateOnDemand);
    simulateFrame(0);
    EXPECT_EQ(4, player->timeToEffectChange());
}

TEST_F(AnimationAnimationPlayerTest, TimeToNextEffectWhenCancelledBeforeStartReverse)
{
    EXPECT_EQ(0, player->timeToEffectChange());
    player->setCurrentTimeInternal(9);
    player->setPlaybackRate(-3);
    player->cancel();
    player->update(TimingUpdateOnDemand);
    simulateFrame(0);
    EXPECT_EQ(3, player->timeToEffectChange());
}

TEST_F(AnimationAnimationPlayerTest, AttachedAnimationPlayers)
{
    RefPtr<Element> element = document->createElement("foo", ASSERT_NO_EXCEPTION);

    Timing timing;
    RefPtr<Animation> animation = Animation::create(element.get(), nullptr, timing);
    RefPtr<AnimationPlayer> player = timeline->createAnimationPlayer(animation.get());
    simulateFrame(0);
    timeline->serviceAnimations(TimingUpdateForAnimationFrame);
    EXPECT_EQ(1U, element->activeAnimations()->players().find(player.get())->value);

    player.release();
    EXPECT_TRUE(element->activeAnimations()->players().isEmpty());
}

TEST_F(AnimationAnimationPlayerTest, HasLowerPriority)
{
    RefPtr<AnimationPlayer> player1 = timeline->createAnimationPlayer(0);
    RefPtr<AnimationPlayer> player2 = timeline->createAnimationPlayer(0);
    EXPECT_TRUE(AnimationPlayer::hasLowerPriority(player1.get(), player2.get()));
}

}
