193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)/*
293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Copyright (c) 2013, Google Inc. All rights reserved.
393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * modification, are permitted provided that the following conditions are
693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * met:
793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
1093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
1193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
1293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * in the documentation and/or other materials provided with the
1393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * distribution.
1493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
1593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
1693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * this software without specific prior written permission.
1793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) *
1893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) */
3093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "config.h"
32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/TimingCalculations.h"
3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include <gtest/gtest.h>
3593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)namespace {
3993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(AnimationTimingCalculationsTest, ActiveTime)
4193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
4293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Timing timing;
4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // calculateActiveTime(activeDuration, fillMode, localTime, parentPhase, phase, timing)
4593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
4683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // Before Phase
4793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.startDelay = 10;
48d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeForwards, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing)));
49d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeNone, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing)));
50d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(0, calculateActiveTime(20, Timing::FillModeBackwards, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing));
51d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(0, calculateActiveTime(20, Timing::FillModeBoth, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing));
5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
5383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // Active Phase
5493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.startDelay = 10;
5583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // Active, and parent Before
56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeNone, 15, AnimationNode::PhaseBefore, AnimationNode::PhaseActive, timing)));
57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeForwards, 15, AnimationNode::PhaseBefore, AnimationNode::PhaseActive, timing)));
5883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // Active, and parent After
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeNone, 15, AnimationNode::PhaseAfter, AnimationNode::PhaseActive, timing)));
60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeBackwards, 15, AnimationNode::PhaseAfter, AnimationNode::PhaseActive, timing)));
6183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // Active, and parent Active
62d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(5, calculateActiveTime(20, Timing::FillModeForwards, 15, AnimationNode::PhaseActive, AnimationNode::PhaseActive, timing));
6383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
6483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // After Phase
6593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.startDelay = 10;
66d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(21, calculateActiveTime(21, Timing::FillModeForwards, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing));
67d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(21, calculateActiveTime(21, Timing::FillModeBoth, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing));
68d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(21, Timing::FillModeBackwards, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing)));
69d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(21, Timing::FillModeNone, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing)));
7083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
7183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    // None
72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_TRUE(isNull(calculateActiveTime(32, Timing::FillModeNone, nullValue(), AnimationNode::PhaseNone, AnimationNode::PhaseNone, timing)));
7393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
7493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(AnimationTimingCalculationsTest, ScaledActiveTime)
7693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
7793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Timing timing;
7893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
79a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // calculateScaledActiveTime(activeDuration, activeTime, startOffset, timing)
8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
8193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the active time is null
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(isNull(calculateScaledActiveTime(4, nullValue(), 5, timing)));
8393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
8493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the playback rate is negative
8593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.playbackRate = -1;
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(35, calculateScaledActiveTime(40, 10, 5, timing));
8793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
8893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // otherwise
8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.playbackRate = 0;
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(5, calculateScaledActiveTime(40, 10, 5, timing));
9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.playbackRate = 1;
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(15, calculateScaledActiveTime(40, 10, 5, timing));
93a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
94a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // infinte activeTime
95a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    timing.playbackRate = 0;
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, calculateScaledActiveTime(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity(), 0, timing));
97a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    timing.playbackRate = 1;
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(std::numeric_limits<double>::infinity(), calculateScaledActiveTime(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity(), 0, timing));
9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
10093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
101d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(AnimationTimingCalculationsTest, IterationTime)
10293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
10393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Timing timing;
10493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
105a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // calculateIterationTime(iterationDuration, repeatedDuration, scaledActiveTime, startOffset, timing)
10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the scaled active time is null
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(isNull(calculateIterationTime(1, 1, nullValue(), 1, timing)));
10993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if (complex-conditions)...
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(12, calculateIterationTime(12, 12, 12, 0, timing));
11293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // otherwise
11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.iterationCount = 10;
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(5, calculateIterationTime(10, 100, 25, 4, timing));
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(7, calculateIterationTime(11, 110, 29, 1, timing));
11793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.iterationStart = 1.1;
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(8, calculateIterationTime(12, 120, 20, 7, timing));
11993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
12093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(AnimationTimingCalculationsTest, CurrentIteration)
12293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
12393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Timing timing;
12493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // calculateCurrentIteration(iterationDuration, iterationTime, scaledActiveTime, timing)
12693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
12793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the scaled active time is null
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(isNull(calculateCurrentIteration(1, 1, nullValue(), timing)));
12993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
13093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the scaled active time is zero
13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, calculateCurrentIteration(1, 1, 0, timing));
13293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
13393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the iteration time equals the iteration duration
13493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.iterationStart = 4;
13593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.iterationCount = 7;
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(10, calculateCurrentIteration(5, 5, 9, timing));
13793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
13893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // otherwise
13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateCurrentIteration(3.2, 3.1, 10, timing));
14093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
14193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
142d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(AnimationTimingCalculationsTest, DirectedTime)
14393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
14493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Timing timing;
14593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
146a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // calculateDirectedTime(currentIteration, iterationDuration, iterationTime, timing)
14793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
14893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // if the iteration time is null
14909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(isNull(calculateDirectedTime(1, 2, nullValue(), timing)));
15093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
15193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // forwards
15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(17, calculateDirectedTime(0, 20, 17, timing));
15309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(17, calculateDirectedTime(1, 20, 17, timing));
15493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionAlternate;
15509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(17, calculateDirectedTime(0, 20, 17, timing));
15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(17, calculateDirectedTime(2, 20, 17, timing));
15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionAlternateReverse;
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(17, calculateDirectedTime(1, 20, 17, timing));
15909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(17, calculateDirectedTime(3, 20, 17, timing));
16093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
16193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // reverse
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionReverse;
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateDirectedTime(0, 20, 17, timing));
16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateDirectedTime(1, 20, 17, timing));
16593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionAlternate;
16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateDirectedTime(1, 20, 17, timing));
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateDirectedTime(3, 20, 17, timing));
16893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionAlternateReverse;
16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateDirectedTime(0, 20, 17, timing));
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(3, calculateDirectedTime(2, 20, 17, timing));
17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
17293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
173d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST(AnimationTimingCalculationsTest, TransformedTime)
17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
17593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Timing timing;
17693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
177a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // calculateTransformedTime(currentIteration, iterationDuration, iterationTime, timing)
17893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
17993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Iteration time is null
18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(isNull(calculateTransformedTime(1, 2, nullValue(), timing)));
18193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
18293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // PlaybackDirectionForwards
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(12, calculateTransformedTime(0, 20, 12, timing));
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(12, calculateTransformedTime(1, 20, 12, timing));
18593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
18693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // PlaybackDirectionForwards with timing function
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    timing.timingFunction = StepsTimingFunction::create(4, StepsTimingFunction::End);
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(10, calculateTransformedTime(0, 20, 12, timing));
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(10, calculateTransformedTime(1, 20, 12, timing));
19093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
19193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // PlaybackDirectionReverse
192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    timing.timingFunction = Timing::defaults().timingFunction;
19393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionReverse;
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(8, calculateTransformedTime(0, 20, 12, timing));
19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(8, calculateTransformedTime(1, 20, 12, timing));
19693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
19793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // PlaybackDirectionReverse with timing function
1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    timing.timingFunction = StepsTimingFunction::create(4, StepsTimingFunction::End);
19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(5, calculateTransformedTime(0, 20, 12, timing));
20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(5, calculateTransformedTime(1, 20, 12, timing));
20193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
2027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // Timing function when directed time is null.
20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(isNull(calculateTransformedTime(1, 2, nullValue(), timing)));
204a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
205a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    // Timing function when iterationDuration is infinity
206a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionNormal;
20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 0, timing));
20809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(1, calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 1, timing));
209a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    timing.direction = Timing::PlaybackDirectionReverse;
21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(std::numeric_limits<double>::infinity(), calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 0, timing));
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(std::numeric_limits<double>::infinity(), calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 1, timing));
21293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
21393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
21493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
215