1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "config.h" 6#include "core/animation/TimingInput.h" 7 8#include "bindings/core/v8/Dictionary.h" 9#include "core/animation/AnimationNodeTiming.h" 10#include "core/animation/AnimationTestHelper.h" 11#include <gtest/gtest.h> 12#include <v8.h> 13 14namespace blink { 15 16class AnimationTimingInputTest : public ::testing::Test { 17protected: 18 AnimationTimingInputTest() 19 : m_isolate(v8::Isolate::GetCurrent()) 20 , m_scope(m_isolate) 21 { 22 } 23 24 Timing applyTimingInputNumber(String timingProperty, double timingPropertyValue) 25 { 26 v8::Handle<v8::Object> timingInput = v8::Object::New(m_isolate); 27 setV8ObjectPropertyAsNumber(timingInput, timingProperty, timingPropertyValue); 28 Dictionary timingInputDictionary = Dictionary(v8::Handle<v8::Value>::Cast(timingInput), m_isolate); 29 return TimingInput::convert(timingInputDictionary); 30 } 31 32 Timing applyTimingInputString(String timingProperty, String timingPropertyValue) 33 { 34 v8::Handle<v8::Object> timingInput = v8::Object::New(m_isolate); 35 setV8ObjectPropertyAsString(timingInput, timingProperty, timingPropertyValue); 36 Dictionary timingInputDictionary = Dictionary(v8::Handle<v8::Value>::Cast(timingInput), m_isolate); 37 return TimingInput::convert(timingInputDictionary); 38 } 39 40 v8::Isolate* m_isolate; 41 42private: 43 V8TestingScope m_scope; 44}; 45 46TEST_F(AnimationTimingInputTest, TimingInputStartDelay) 47{ 48 EXPECT_EQ(1.1, applyTimingInputNumber("delay", 1100).startDelay); 49 EXPECT_EQ(-1, applyTimingInputNumber("delay", -1000).startDelay); 50 EXPECT_EQ(1, applyTimingInputString("delay", "1000").startDelay); 51 EXPECT_EQ(0, applyTimingInputString("delay", "1s").startDelay); 52 EXPECT_EQ(0, applyTimingInputString("delay", "Infinity").startDelay); 53 EXPECT_EQ(0, applyTimingInputString("delay", "-Infinity").startDelay); 54 EXPECT_EQ(0, applyTimingInputString("delay", "NaN").startDelay); 55 EXPECT_EQ(0, applyTimingInputString("delay", "rubbish").startDelay); 56} 57 58TEST_F(AnimationTimingInputTest, TimingInputEndDelay) 59{ 60 EXPECT_EQ(10, applyTimingInputNumber("endDelay", 10000).endDelay); 61 EXPECT_EQ(-2.5, applyTimingInputNumber("endDelay", -2500).endDelay); 62} 63 64TEST_F(AnimationTimingInputTest, TimingInputFillMode) 65{ 66 Timing::FillMode defaultFillMode = Timing::FillModeAuto; 67 68 EXPECT_EQ(Timing::FillModeAuto, applyTimingInputString("fill", "auto").fillMode); 69 EXPECT_EQ(Timing::FillModeForwards, applyTimingInputString("fill", "forwards").fillMode); 70 EXPECT_EQ(Timing::FillModeNone, applyTimingInputString("fill", "none").fillMode); 71 EXPECT_EQ(Timing::FillModeBackwards, applyTimingInputString("fill", "backwards").fillMode); 72 EXPECT_EQ(Timing::FillModeBoth, applyTimingInputString("fill", "both").fillMode); 73 EXPECT_EQ(defaultFillMode, applyTimingInputString("fill", "everything!").fillMode); 74 EXPECT_EQ(defaultFillMode, applyTimingInputString("fill", "backwardsandforwards").fillMode); 75 EXPECT_EQ(defaultFillMode, applyTimingInputNumber("fill", 2).fillMode); 76} 77 78TEST_F(AnimationTimingInputTest, TimingInputIterationStart) 79{ 80 EXPECT_EQ(1.1, applyTimingInputNumber("iterationStart", 1.1).iterationStart); 81 EXPECT_EQ(0, applyTimingInputNumber("iterationStart", -1).iterationStart); 82 EXPECT_EQ(0, applyTimingInputString("iterationStart", "Infinity").iterationStart); 83 EXPECT_EQ(0, applyTimingInputString("iterationStart", "-Infinity").iterationStart); 84 EXPECT_EQ(0, applyTimingInputString("iterationStart", "NaN").iterationStart); 85 EXPECT_EQ(0, applyTimingInputString("iterationStart", "rubbish").iterationStart); 86} 87 88TEST_F(AnimationTimingInputTest, TimingInputIterationCount) 89{ 90 EXPECT_EQ(2.1, applyTimingInputNumber("iterations", 2.1).iterationCount); 91 EXPECT_EQ(0, applyTimingInputNumber("iterations", -1).iterationCount); 92 93 Timing timing = applyTimingInputString("iterations", "Infinity"); 94 EXPECT_TRUE(std::isinf(timing.iterationCount)); 95 EXPECT_GT(timing.iterationCount, 0); 96 97 EXPECT_EQ(0, applyTimingInputString("iterations", "-Infinity").iterationCount); 98 EXPECT_EQ(1, applyTimingInputString("iterations", "NaN").iterationCount); 99 EXPECT_EQ(1, applyTimingInputString("iterations", "rubbish").iterationCount); 100} 101 102TEST_F(AnimationTimingInputTest, TimingInputIterationDuration) 103{ 104 EXPECT_EQ(1.1, applyTimingInputNumber("duration", 1100).iterationDuration); 105 EXPECT_TRUE(std::isnan(applyTimingInputNumber("duration", -1000).iterationDuration)); 106 EXPECT_EQ(1, applyTimingInputString("duration", "1000").iterationDuration); 107 108 Timing timing = applyTimingInputString("duration", "Infinity"); 109 EXPECT_TRUE(std::isinf(timing.iterationDuration)); 110 EXPECT_GT(timing.iterationDuration, 0); 111 112 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "-Infinity").iterationDuration)); 113 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "NaN").iterationDuration)); 114 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "auto").iterationDuration)); 115 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "rubbish").iterationDuration)); 116} 117 118TEST_F(AnimationTimingInputTest, TimingInputPlaybackRate) 119{ 120 EXPECT_EQ(2.1, applyTimingInputNumber("playbackRate", 2.1).playbackRate); 121 EXPECT_EQ(-1, applyTimingInputNumber("playbackRate", -1).playbackRate); 122 EXPECT_EQ(1, applyTimingInputString("playbackRate", "Infinity").playbackRate); 123 EXPECT_EQ(1, applyTimingInputString("playbackRate", "-Infinity").playbackRate); 124 EXPECT_EQ(1, applyTimingInputString("playbackRate", "NaN").playbackRate); 125 EXPECT_EQ(1, applyTimingInputString("playbackRate", "rubbish").playbackRate); 126} 127 128TEST_F(AnimationTimingInputTest, TimingInputDirection) 129{ 130 Timing::PlaybackDirection defaultPlaybackDirection = Timing::PlaybackDirectionNormal; 131 132 EXPECT_EQ(Timing::PlaybackDirectionNormal, applyTimingInputString("direction", "normal").direction); 133 EXPECT_EQ(Timing::PlaybackDirectionReverse, applyTimingInputString("direction", "reverse").direction); 134 EXPECT_EQ(Timing::PlaybackDirectionAlternate, applyTimingInputString("direction", "alternate").direction); 135 EXPECT_EQ(Timing::PlaybackDirectionAlternateReverse, applyTimingInputString("direction", "alternate-reverse").direction); 136 EXPECT_EQ(defaultPlaybackDirection, applyTimingInputString("direction", "rubbish").direction); 137 EXPECT_EQ(defaultPlaybackDirection, applyTimingInputNumber("direction", 2).direction); 138} 139 140TEST_F(AnimationTimingInputTest, TimingInputTimingFunction) 141{ 142 const RefPtr<TimingFunction> defaultTimingFunction = LinearTimingFunction::shared(); 143 144 EXPECT_EQ(*CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease), *applyTimingInputString("easing", "ease").timingFunction); 145 EXPECT_EQ(*CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn), *applyTimingInputString("easing", "ease-in").timingFunction); 146 EXPECT_EQ(*CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseOut), *applyTimingInputString("easing", "ease-out").timingFunction); 147 EXPECT_EQ(*CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut), *applyTimingInputString("easing", "ease-in-out").timingFunction); 148 EXPECT_EQ(*LinearTimingFunction::shared(), *applyTimingInputString("easing", "linear").timingFunction); 149 EXPECT_EQ(*StepsTimingFunction::preset(StepsTimingFunction::Start), *applyTimingInputString("easing", "step-start").timingFunction); 150 EXPECT_EQ(*StepsTimingFunction::preset(StepsTimingFunction::Middle), *applyTimingInputString("easing", "step-middle").timingFunction); 151 EXPECT_EQ(*StepsTimingFunction::preset(StepsTimingFunction::End), *applyTimingInputString("easing", "step-end").timingFunction); 152 EXPECT_EQ(*CubicBezierTimingFunction::create(1, 1, 0.3, 0.3), *applyTimingInputString("easing", "cubic-bezier(1, 1, 0.3, 0.3)").timingFunction); 153 EXPECT_EQ(*StepsTimingFunction::create(3, StepsTimingFunction::Start), *applyTimingInputString("easing", "steps(3, start)").timingFunction); 154 EXPECT_EQ(*StepsTimingFunction::create(5, StepsTimingFunction::Middle), *applyTimingInputString("easing", "steps(5, middle)").timingFunction); 155 EXPECT_EQ(*StepsTimingFunction::create(5, StepsTimingFunction::End), *applyTimingInputString("easing", "steps(5, end)").timingFunction); 156 EXPECT_EQ(*defaultTimingFunction, *applyTimingInputString("easing", "steps(5.6, end)").timingFunction); 157 EXPECT_EQ(*defaultTimingFunction, *applyTimingInputString("easing", "cubic-bezier(2, 2, 0.3, 0.3)").timingFunction); 158 EXPECT_EQ(*defaultTimingFunction, *applyTimingInputString("easing", "rubbish").timingFunction); 159 EXPECT_EQ(*defaultTimingFunction, *applyTimingInputNumber("easing", 2).timingFunction); 160 EXPECT_EQ(*defaultTimingFunction, *applyTimingInputString("easing", "initial").timingFunction); 161} 162 163TEST_F(AnimationTimingInputTest, TimingInputEmpty) 164{ 165 Timing controlTiming; 166 167 v8::Handle<v8::Object> timingInput = v8::Object::New(m_isolate); 168 Dictionary timingInputDictionary = Dictionary(v8::Handle<v8::Value>::Cast(timingInput), m_isolate); 169 Timing updatedTiming = TimingInput::convert(timingInputDictionary); 170 171 EXPECT_EQ(controlTiming.startDelay, updatedTiming.startDelay); 172 EXPECT_EQ(controlTiming.fillMode, updatedTiming.fillMode); 173 EXPECT_EQ(controlTiming.iterationStart, updatedTiming.iterationStart); 174 EXPECT_EQ(controlTiming.iterationCount, updatedTiming.iterationCount); 175 EXPECT_TRUE(std::isnan(updatedTiming.iterationDuration)); 176 EXPECT_EQ(controlTiming.playbackRate, updatedTiming.playbackRate); 177 EXPECT_EQ(controlTiming.direction, updatedTiming.direction); 178 EXPECT_EQ(*controlTiming.timingFunction, *updatedTiming.timingFunction); 179} 180 181} // namespace blink 182