Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / animation / TimingInputTest.cpp
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
14 namespace blink {
15
16 class AnimationTimingInputTest : public ::testing::Test {
17 protected:
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
42 private:
43     V8TestingScope m_scope;
44 };
45
46 TEST_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
58 TEST_F(AnimationTimingInputTest, TimingInputEndDelay)
59 {
60     EXPECT_EQ(10, applyTimingInputNumber("endDelay", 10000).endDelay);
61     EXPECT_EQ(-2.5, applyTimingInputNumber("endDelay", -2500).endDelay);
62 }
63
64 TEST_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
78 TEST_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
88 TEST_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
102 TEST_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
118 TEST_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
128 TEST_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
140 TEST_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
163 TEST_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