1e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch/*
2e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (c) 2013, Google Inc. All rights reserved.
3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Redistribution and use in source and binary forms, with or without
5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * modification, are permitted provided that the following conditions are
6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * met:
7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *     * Redistributions of source code must retain the above copyright
9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * notice, this list of conditions and the following disclaimer.
10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *     * Redistributions in binary form must reproduce the above
11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * copyright notice, this list of conditions and the following disclaimer
12e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * in the documentation and/or other materials provided with the
13e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * distribution.
14e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *     * Neither the name of Google Inc. nor the names of its
15e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * contributors may be used to endorse or promote products derived from
16e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * this software without specific prior written permission.
17e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
18e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */
30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "config.h"
32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/animation/AnimatableNumber.h"
33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSCalculationValue.h"
35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSPrimitiveValue.h"
36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/platform/CalculationValue.h"
37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/MathExtras.h"
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include <gtest/gtest.h>
40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
41e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochusing namespace WebCore;
42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochnamespace {
44e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass AnimatableNumberTest : public ::testing::Test {
46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochprotected:
47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    virtual void SetUp()
48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
49e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
50e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
51e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    PassRefPtr<AnimatableNumber> create(double value)
52e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return create(value, CSSPrimitiveValue::CSS_NUMBER);
54e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
55e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    PassRefPtr<AnimatableNumber> create(double value, CSSPrimitiveValue::UnitTypes type)
57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
58e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return AnimatableNumber::create(CSSPrimitiveValue::create(value, type).get());
59e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    PassRefPtr<CSSCalcValue> createCalc(double valueLeft, CSSPrimitiveValue::UnitTypes typeLeft, double valueRight, CSSPrimitiveValue::UnitTypes typeRight)
62e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
63e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return CSSCalcValue::create(CSSCalcValue::createExpressionNode(
64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(valueLeft, typeLeft), valueLeft == trunc(valueLeft)),
65e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(valueRight, typeRight), valueRight == trunc(valueRight)),
66e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            CalcAdd
67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        ));
68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
69e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
70e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool testToCSSValue(CSSValue* cssValue)
71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return testToCSSValue(cssValue, cssValue);
73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool testToCSSValue(CSSValue* cssValueExpected, CSSValue* cssValue)
75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
76e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return AnimatableNumber::create(cssValue)->toCSSValue()->equals(*cssValueExpected);
77e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
78e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool testInterpolate(CSSValue* cssValueExpected, AnimatableNumber* numberA, AnimatableNumber* numberB, double fraction)
79e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
80e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        return toAnimatableNumber(AnimatableValue::interpolate(numberA, numberB, fraction).get())->toCSSValue()->equals(*cssValueExpected);
81e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool testAdd(CSSValue* cssValueExpected, AnimatableNumber* numberA, AnimatableNumber* numberB)
83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    {
84e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        return toAnimatableNumber(AnimatableValue::add(numberA, numberB).get())->toCSSValue()->equals(*cssValueExpected);
85e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
86e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch};
87e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
88e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochTEST_F(AnimatableNumberTest, CanCreateFrom)
89e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
90e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_NUMBER).get()));
91e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_PX).get()));
92e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_CM).get()));
93e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_MM).get()));
94e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_IN).get()));
95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_PT).get()));
96e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_PC).get()));
97e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_EMS).get()));
98e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_EXS).get()));
99e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_REMS).get()));
100e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_DEG).get()));
101e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_RAD).get()));
102e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_GRAD).get()));
103e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_TURN).get()));
104e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_PERCENTAGE).get()));
105e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_VW).get()));
106e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_VH).get()));
107e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_VMIN).get()));
108e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_VMAX).get()));
109e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_MS).get()));
110e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_S).get()));
111e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_HZ).get()));
112e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_KHZ).get()));
113e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_DPPX).get()));
114e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_DPI).get()));
115e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(5, CSSPrimitiveValue::CSS_DPCM).get()));
116e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
117e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_CM).get()));
118e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create(createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_CM)).get()));
119e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
120e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_FALSE(AnimatableNumber::canCreateFrom(CSSPrimitiveValue::create("NaN", CSSPrimitiveValue::CSS_STRING).get()));
121e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
122e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
123e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochTEST_F(AnimatableNumberTest, Create)
124e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
125e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_NUMBER).get()));
126e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_PX).get()));
127e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_CM).get()));
128e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_MM).get()));
129e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_IN).get()));
130e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_PT).get()));
131e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_PC).get()));
132e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_EMS).get()));
133e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_EXS).get()));
134e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_REMS).get()));
135e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_DEG).get()));
136e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_RAD).get()));
137e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_GRAD).get()));
138e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_TURN).get()));
139e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_PERCENTAGE).get()));
140e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_VW).get()));
141e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_VH).get()));
142e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_VMIN).get()));
143e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_VMAX).get()));
144e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_MS).get()));
145e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_S).get()));
146e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_HZ).get()));
147e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_KHZ).get()));
148e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_DPPX).get()));
149e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_DPI).get()));
150e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(create(5, CSSPrimitiveValue::CSS_DPCM).get()));
151e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
152e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(
153e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        AnimatableNumber::create(createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_CM).get()).get()
154e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ));
155e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(static_cast<bool>(
156e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        AnimatableNumber::create(CSSPrimitiveValue::create(createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_CM)).get()).get()
157e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ));
158e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
159e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
160e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochTEST_F(AnimatableNumberTest, ToCSSValue)
161e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
162e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_NUMBER).get()));
163e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_PX).get()));
164e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_CM).get()));
165e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_MM).get()));
166e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_IN).get()));
167e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_PT).get()));
168e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_PC).get()));
169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_EMS).get()));
170e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_EXS).get()));
171e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_REMS).get()));
172e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_DEG).get()));
173e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_RAD).get()));
174e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_GRAD).get()));
175e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_TURN).get()));
176e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_PERCENTAGE).get()));
177e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_VW).get()));
178e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_VH).get()));
179e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_VMIN).get()));
180e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_VMAX).get()));
181e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_MS).get()));
182e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_S).get()));
183e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_HZ).get()));
184e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_KHZ).get()));
185e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_DPPX).get()));
186e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_DPI).get()));
187e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(-5, CSSPrimitiveValue::CSS_DPCM).get()));
188e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
189e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_IN)).get()));
190e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testToCSSValue(CSSPrimitiveValue::create(createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_IN)).get(),
191e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        createCalc(3, CSSPrimitiveValue::CSS_PX, 5, CSSPrimitiveValue::CSS_IN).get()));
192e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
193e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
194e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochTEST_F(AnimatableNumberTest, Interpolate)
195e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
196e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<AnimatableNumber> from10 = create(10);
197e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<AnimatableNumber> to20 = create(20);
198e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(5,  CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(), -0.5));
199e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(),  0));
200e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(14, CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(),  0.4));
201e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(15, CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(),  0.5));
202e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(16, CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(),  0.6));
203e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(20, CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(),  1));
204e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(25, CSSPrimitiveValue::CSS_NUMBER).get(), from10.get(), to20.get(),  1.5));
205e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
206e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<AnimatableNumber> from10px = create(10, CSSPrimitiveValue::CSS_PX);
207e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<AnimatableNumber> to20pxAsInches = create(20.0 / 96, CSSPrimitiveValue::CSS_IN);
208e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(5,  CSSPrimitiveValue::CSS_PX).get(), from10px.get(), to20pxAsInches.get(), -0.5));
209e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_PX).get(), from10px.get(), to20pxAsInches.get(),  0));
210e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(14, CSSPrimitiveValue::CSS_PX).get(), from10px.get(), to20pxAsInches.get(),  0.4));
211e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(15, CSSPrimitiveValue::CSS_PX).get(), from10px.get(), to20pxAsInches.get(),  0.5));
212e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(16, CSSPrimitiveValue::CSS_PX).get(), from10px.get(), to20pxAsInches.get(),  0.6));
213e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(20.0 / 96, CSSPrimitiveValue::CSS_IN).get(), from10px.get(), to20pxAsInches.get(),  1));
214e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(25, CSSPrimitiveValue::CSS_PX).get(), from10px.get(), to20pxAsInches.get(),  1.5));
215e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
216e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<AnimatableNumber> from10em = create(10, CSSPrimitiveValue::CSS_EMS);
217e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<AnimatableNumber> to20rem = create(20, CSSPrimitiveValue::CSS_REMS);
218e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(createCalc(15, CSSPrimitiveValue::CSS_EMS, -10, CSSPrimitiveValue::CSS_REMS)).get(),
219e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(), -0.5));
220e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_EMS).get(),
221e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(),  0));
222e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(createCalc(6, CSSPrimitiveValue::CSS_EMS, 8, CSSPrimitiveValue::CSS_REMS)).get(),
223e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(),  0.4));
224e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(createCalc(5, CSSPrimitiveValue::CSS_EMS, 10, CSSPrimitiveValue::CSS_REMS)).get(),
225e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(),  0.5));
226e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(createCalc(4, CSSPrimitiveValue::CSS_EMS, 12, CSSPrimitiveValue::CSS_REMS)).get(),
227e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(),  0.6));
228e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(20, CSSPrimitiveValue::CSS_REMS).get(),
229e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(),  1));
230e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testInterpolate(CSSPrimitiveValue::create(createCalc(-5, CSSPrimitiveValue::CSS_EMS, 30, CSSPrimitiveValue::CSS_REMS)).get(),
231e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        from10em.get(), to20rem.get(),  1.5));
232e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
233e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
234e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochTEST_F(AnimatableNumberTest, Add)
235e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
236e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_NUMBER).get(), create(4).get(), create(6).get()));
237e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_NUMBER).get(), create(0).get(), create(10).get()));
238e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_PX).get(), create(10, CSSPrimitiveValue::CSS_PX).get(), create(0, CSSPrimitiveValue::CSS_MM).get()));
239e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(CSSPrimitiveValue::create(100, CSSPrimitiveValue::CSS_PX).get(), create(4, CSSPrimitiveValue::CSS_PX).get(), create(1, CSSPrimitiveValue::CSS_IN).get()));
240e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(
241e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue::create(createCalc(10, CSSPrimitiveValue::CSS_EMS, 20, CSSPrimitiveValue::CSS_REMS)).get(),
242e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        create(10, CSSPrimitiveValue::CSS_EMS).get(),
243e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        create(20, CSSPrimitiveValue::CSS_REMS).get()));
244e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(
245e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue::create(10, CSSPrimitiveValue::CSS_EMS).get(),
246e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        create(10, CSSPrimitiveValue::CSS_EMS).get(),
247e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        create(0, CSSPrimitiveValue::CSS_REMS).get()));
248e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EXPECT_TRUE(testAdd(
249e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue::create(20, CSSPrimitiveValue::CSS_REMS).get(),
250e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        create(0, CSSPrimitiveValue::CSS_EMS).get(),
251e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        create(20, CSSPrimitiveValue::CSS_REMS).get()));
252e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
253e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
254e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
255