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/TimingCalculations.h" 33 34#include <gtest/gtest.h> 35 36using namespace blink; 37 38namespace { 39 40TEST(AnimationTimingCalculationsTest, ActiveTime) 41{ 42 Timing timing; 43 44 // calculateActiveTime(activeDuration, fillMode, localTime, parentPhase, phase, timing) 45 46 // Before Phase 47 timing.startDelay = 10; 48 EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeForwards, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing))); 49 EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeNone, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing))); 50 EXPECT_EQ(0, calculateActiveTime(20, Timing::FillModeBackwards, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing)); 51 EXPECT_EQ(0, calculateActiveTime(20, Timing::FillModeBoth, 0, AnimationNode::PhaseActive, AnimationNode::PhaseBefore, timing)); 52 53 // Active Phase 54 timing.startDelay = 10; 55 // Active, and parent Before 56 EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeNone, 15, AnimationNode::PhaseBefore, AnimationNode::PhaseActive, timing))); 57 EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeForwards, 15, AnimationNode::PhaseBefore, AnimationNode::PhaseActive, timing))); 58 // Active, and parent After 59 EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeNone, 15, AnimationNode::PhaseAfter, AnimationNode::PhaseActive, timing))); 60 EXPECT_TRUE(isNull(calculateActiveTime(20, Timing::FillModeBackwards, 15, AnimationNode::PhaseAfter, AnimationNode::PhaseActive, timing))); 61 // Active, and parent Active 62 EXPECT_EQ(5, calculateActiveTime(20, Timing::FillModeForwards, 15, AnimationNode::PhaseActive, AnimationNode::PhaseActive, timing)); 63 64 // After Phase 65 timing.startDelay = 10; 66 EXPECT_EQ(21, calculateActiveTime(21, Timing::FillModeForwards, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing)); 67 EXPECT_EQ(21, calculateActiveTime(21, Timing::FillModeBoth, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing)); 68 EXPECT_TRUE(isNull(calculateActiveTime(21, Timing::FillModeBackwards, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing))); 69 EXPECT_TRUE(isNull(calculateActiveTime(21, Timing::FillModeNone, 45, AnimationNode::PhaseActive, AnimationNode::PhaseAfter, timing))); 70 71 // None 72 EXPECT_TRUE(isNull(calculateActiveTime(32, Timing::FillModeNone, nullValue(), AnimationNode::PhaseNone, AnimationNode::PhaseNone, timing))); 73} 74 75TEST(AnimationTimingCalculationsTest, ScaledActiveTime) 76{ 77 Timing timing; 78 79 // calculateScaledActiveTime(activeDuration, activeTime, startOffset, timing) 80 81 // if the active time is null 82 EXPECT_TRUE(isNull(calculateScaledActiveTime(4, nullValue(), 5, timing))); 83 84 // if the playback rate is negative 85 timing.playbackRate = -1; 86 EXPECT_EQ(35, calculateScaledActiveTime(40, 10, 5, timing)); 87 88 // otherwise 89 timing.playbackRate = 0; 90 EXPECT_EQ(5, calculateScaledActiveTime(40, 10, 5, timing)); 91 timing.playbackRate = 1; 92 EXPECT_EQ(15, calculateScaledActiveTime(40, 10, 5, timing)); 93 94 // infinte activeTime 95 timing.playbackRate = 0; 96 EXPECT_EQ(0, calculateScaledActiveTime(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity(), 0, timing)); 97 timing.playbackRate = 1; 98 EXPECT_EQ(std::numeric_limits<double>::infinity(), calculateScaledActiveTime(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity(), 0, timing)); 99} 100 101TEST(AnimationTimingCalculationsTest, IterationTime) 102{ 103 Timing timing; 104 105 // calculateIterationTime(iterationDuration, repeatedDuration, scaledActiveTime, startOffset, timing) 106 107 // if the scaled active time is null 108 EXPECT_TRUE(isNull(calculateIterationTime(1, 1, nullValue(), 1, timing))); 109 110 // if (complex-conditions)... 111 EXPECT_EQ(12, calculateIterationTime(12, 12, 12, 0, timing)); 112 113 // otherwise 114 timing.iterationCount = 10; 115 EXPECT_EQ(5, calculateIterationTime(10, 100, 25, 4, timing)); 116 EXPECT_EQ(7, calculateIterationTime(11, 110, 29, 1, timing)); 117 timing.iterationStart = 1.1; 118 EXPECT_EQ(8, calculateIterationTime(12, 120, 20, 7, timing)); 119} 120 121TEST(AnimationTimingCalculationsTest, CurrentIteration) 122{ 123 Timing timing; 124 125 // calculateCurrentIteration(iterationDuration, iterationTime, scaledActiveTime, timing) 126 127 // if the scaled active time is null 128 EXPECT_TRUE(isNull(calculateCurrentIteration(1, 1, nullValue(), timing))); 129 130 // if the scaled active time is zero 131 EXPECT_EQ(0, calculateCurrentIteration(1, 1, 0, timing)); 132 133 // if the iteration time equals the iteration duration 134 timing.iterationStart = 4; 135 timing.iterationCount = 7; 136 EXPECT_EQ(10, calculateCurrentIteration(5, 5, 9, timing)); 137 138 // otherwise 139 EXPECT_EQ(3, calculateCurrentIteration(3.2, 3.1, 10, timing)); 140} 141 142TEST(AnimationTimingCalculationsTest, DirectedTime) 143{ 144 Timing timing; 145 146 // calculateDirectedTime(currentIteration, iterationDuration, iterationTime, timing) 147 148 // if the iteration time is null 149 EXPECT_TRUE(isNull(calculateDirectedTime(1, 2, nullValue(), timing))); 150 151 // forwards 152 EXPECT_EQ(17, calculateDirectedTime(0, 20, 17, timing)); 153 EXPECT_EQ(17, calculateDirectedTime(1, 20, 17, timing)); 154 timing.direction = Timing::PlaybackDirectionAlternate; 155 EXPECT_EQ(17, calculateDirectedTime(0, 20, 17, timing)); 156 EXPECT_EQ(17, calculateDirectedTime(2, 20, 17, timing)); 157 timing.direction = Timing::PlaybackDirectionAlternateReverse; 158 EXPECT_EQ(17, calculateDirectedTime(1, 20, 17, timing)); 159 EXPECT_EQ(17, calculateDirectedTime(3, 20, 17, timing)); 160 161 // reverse 162 timing.direction = Timing::PlaybackDirectionReverse; 163 EXPECT_EQ(3, calculateDirectedTime(0, 20, 17, timing)); 164 EXPECT_EQ(3, calculateDirectedTime(1, 20, 17, timing)); 165 timing.direction = Timing::PlaybackDirectionAlternate; 166 EXPECT_EQ(3, calculateDirectedTime(1, 20, 17, timing)); 167 EXPECT_EQ(3, calculateDirectedTime(3, 20, 17, timing)); 168 timing.direction = Timing::PlaybackDirectionAlternateReverse; 169 EXPECT_EQ(3, calculateDirectedTime(0, 20, 17, timing)); 170 EXPECT_EQ(3, calculateDirectedTime(2, 20, 17, timing)); 171} 172 173TEST(AnimationTimingCalculationsTest, TransformedTime) 174{ 175 Timing timing; 176 177 // calculateTransformedTime(currentIteration, iterationDuration, iterationTime, timing) 178 179 // Iteration time is null 180 EXPECT_TRUE(isNull(calculateTransformedTime(1, 2, nullValue(), timing))); 181 182 // PlaybackDirectionForwards 183 EXPECT_EQ(12, calculateTransformedTime(0, 20, 12, timing)); 184 EXPECT_EQ(12, calculateTransformedTime(1, 20, 12, timing)); 185 186 // PlaybackDirectionForwards with timing function 187 timing.timingFunction = StepsTimingFunction::create(4, StepsTimingFunction::End); 188 EXPECT_EQ(10, calculateTransformedTime(0, 20, 12, timing)); 189 EXPECT_EQ(10, calculateTransformedTime(1, 20, 12, timing)); 190 191 // PlaybackDirectionReverse 192 timing.timingFunction = Timing::defaults().timingFunction; 193 timing.direction = Timing::PlaybackDirectionReverse; 194 EXPECT_EQ(8, calculateTransformedTime(0, 20, 12, timing)); 195 EXPECT_EQ(8, calculateTransformedTime(1, 20, 12, timing)); 196 197 // PlaybackDirectionReverse with timing function 198 timing.timingFunction = StepsTimingFunction::create(4, StepsTimingFunction::End); 199 EXPECT_EQ(5, calculateTransformedTime(0, 20, 12, timing)); 200 EXPECT_EQ(5, calculateTransformedTime(1, 20, 12, timing)); 201 202 // Timing function when directed time is null. 203 EXPECT_TRUE(isNull(calculateTransformedTime(1, 2, nullValue(), timing))); 204 205 // Timing function when iterationDuration is infinity 206 timing.direction = Timing::PlaybackDirectionNormal; 207 EXPECT_EQ(0, calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 0, timing)); 208 EXPECT_EQ(1, calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 1, timing)); 209 timing.direction = Timing::PlaybackDirectionReverse; 210 EXPECT_EQ(std::numeric_limits<double>::infinity(), calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 0, timing)); 211 EXPECT_EQ(std::numeric_limits<double>::infinity(), calculateTransformedTime(0, std::numeric_limits<double>::infinity(), 1, timing)); 212} 213 214} 215