Home | History | Annotate | Download | only in animation
      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 "platform/animation/TimingFunction.h"
     33 
     34 #include "wtf/text/WTFString.h"
     35 #include <gmock/gmock.h>
     36 #include <gtest/gtest.h>
     37 #include <sstream>
     38 #include <string>
     39 
     40 // Macro is only used to allow the use of streams.
     41 // Can be removed if a pretty failure message isn't needed.
     42 #define EXPECT_NE_WITH_MESSAGE(a, b) \
     43     EXPECT_NE(*a.second, *b.second) \
     44         << a.first \
     45         << " (" << a.second->toString().latin1().data() << ")" \
     46         << " ==  " \
     47         << b.first \
     48         << " (" << b.second->toString().latin1().data() << ")" \
     49         << "\n";
     50 
     51 namespace blink {
     52 
     53 namespace {
     54 
     55 class TimingFunctionTest : public ::testing::Test {
     56 public:
     57     void notEqualHelperLoop(Vector<std::pair<std::string, RefPtr<TimingFunction> > >& v)
     58     {
     59         for (size_t i = 0; i < v.size(); ++i) {
     60             for (size_t j = 0; j < v.size(); ++j) {
     61                 if (i == j)
     62                     continue;
     63                 EXPECT_NE_WITH_MESSAGE(v[i], v[j]);
     64             }
     65         }
     66     }
     67 };
     68 
     69 TEST_F(TimingFunctionTest, LinearToString)
     70 {
     71     RefPtr<TimingFunction> linearTiming = LinearTimingFunction::shared();
     72     EXPECT_EQ(linearTiming->toString(), "linear");
     73 }
     74 
     75 TEST_F(TimingFunctionTest, CubicToString)
     76 {
     77     RefPtr<TimingFunction> cubicEaseTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease);
     78     EXPECT_EQ("ease", cubicEaseTiming->toString());
     79     RefPtr<TimingFunction> cubicEaseInTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
     80     EXPECT_EQ("ease-in", cubicEaseInTiming->toString());
     81     RefPtr<TimingFunction> cubicEaseOutTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseOut);
     82     EXPECT_EQ("ease-out", cubicEaseOutTiming->toString());
     83     RefPtr<TimingFunction> cubicEaseInOutTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut);
     84     EXPECT_EQ("ease-in-out", cubicEaseInOutTiming->toString());
     85 
     86     RefPtr<TimingFunction> cubicCustomTiming = CubicBezierTimingFunction::create(0.17, 0.67, 1, -1.73);
     87     EXPECT_EQ("cubic-bezier(0.17, 0.67, 1, -1.73)", cubicCustomTiming->toString());
     88 }
     89 
     90 TEST_F(TimingFunctionTest, StepToString)
     91 {
     92     RefPtr<TimingFunction> stepTimingStart = StepsTimingFunction::preset(StepsTimingFunction::Start);
     93     EXPECT_EQ("step-start", stepTimingStart->toString());
     94 
     95     RefPtr<TimingFunction> stepTimingMiddle = StepsTimingFunction::preset(StepsTimingFunction::Middle);
     96     EXPECT_EQ("step-middle", stepTimingMiddle->toString());
     97 
     98     RefPtr<TimingFunction> stepTimingEnd = StepsTimingFunction::preset(StepsTimingFunction::End);
     99     EXPECT_EQ("step-end", stepTimingEnd->toString());
    100 
    101     RefPtr<TimingFunction> stepTimingCustomStart = StepsTimingFunction::create(3, StepsTimingFunction::Start);
    102     EXPECT_EQ("steps(3, start)", stepTimingCustomStart->toString());
    103 
    104     RefPtr<TimingFunction> stepTimingCustomMiddle = StepsTimingFunction::create(4, StepsTimingFunction::Middle);
    105     EXPECT_EQ("steps(4, middle)", stepTimingCustomMiddle->toString());
    106 
    107     RefPtr<TimingFunction> stepTimingCustomEnd = StepsTimingFunction::create(5, StepsTimingFunction::End);
    108     EXPECT_EQ("steps(5, end)", stepTimingCustomEnd->toString());
    109 }
    110 
    111 TEST_F(TimingFunctionTest, BaseOperatorEq)
    112 {
    113     RefPtr<TimingFunction> linearTiming = LinearTimingFunction::shared();
    114     RefPtr<TimingFunction> cubicTiming1 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
    115     RefPtr<TimingFunction> cubicTiming2 = CubicBezierTimingFunction::create(0.17, 0.67, 1, -1.73);
    116     RefPtr<TimingFunction> stepsTiming1 = StepsTimingFunction::preset(StepsTimingFunction::End);
    117     RefPtr<TimingFunction> stepsTiming2 = StepsTimingFunction::create(5, StepsTimingFunction::Start);
    118 
    119     Vector<std::pair<std::string, RefPtr<TimingFunction> > > v;
    120     v.append(std::make_pair("linearTiming", linearTiming));
    121     v.append(std::make_pair("cubicTiming1", cubicTiming1));
    122     v.append(std::make_pair("cubicTiming2", cubicTiming2));
    123     v.append(std::make_pair("stepsTiming1", stepsTiming1));
    124     v.append(std::make_pair("stepsTiming2", stepsTiming2));
    125     notEqualHelperLoop(v);
    126 }
    127 
    128 TEST_F(TimingFunctionTest, LinearOperatorEq)
    129 {
    130     RefPtr<TimingFunction> linearTiming1 = LinearTimingFunction::shared();
    131     RefPtr<TimingFunction> linearTiming2 = LinearTimingFunction::shared();
    132     EXPECT_EQ(*linearTiming1, *linearTiming1);
    133     EXPECT_EQ(*linearTiming1, *linearTiming2);
    134 }
    135 
    136 TEST_F(TimingFunctionTest, CubicOperatorEq)
    137 {
    138     RefPtr<TimingFunction> cubicEaseInTiming1 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
    139     RefPtr<TimingFunction> cubicEaseInTiming2 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
    140     EXPECT_EQ(*cubicEaseInTiming1, *cubicEaseInTiming1);
    141     EXPECT_EQ(*cubicEaseInTiming1, *cubicEaseInTiming2);
    142 
    143     RefPtr<TimingFunction> cubicEaseOutTiming1 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseOut);
    144     RefPtr<TimingFunction> cubicEaseOutTiming2 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseOut);
    145     EXPECT_EQ(*cubicEaseOutTiming1, *cubicEaseOutTiming1);
    146     EXPECT_EQ(*cubicEaseOutTiming1, *cubicEaseOutTiming2);
    147 
    148     RefPtr<TimingFunction> cubicEaseInOutTiming1 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut);
    149     RefPtr<TimingFunction> cubicEaseInOutTiming2 = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut);
    150     EXPECT_EQ(*cubicEaseInOutTiming1, *cubicEaseInOutTiming1);
    151     EXPECT_EQ(*cubicEaseInOutTiming1, *cubicEaseInOutTiming2);
    152 
    153     RefPtr<TimingFunction> cubicCustomTiming1 = CubicBezierTimingFunction::create(0.17, 0.67, 1, -1.73);
    154     RefPtr<TimingFunction> cubicCustomTiming2 = CubicBezierTimingFunction::create(0.17, 0.67, 1, -1.73);
    155     EXPECT_EQ(*cubicCustomTiming1, *cubicCustomTiming1);
    156     EXPECT_EQ(*cubicCustomTiming1, *cubicCustomTiming2);
    157 
    158     Vector<std::pair<std::string, RefPtr<TimingFunction> > > v;
    159     v.append(std::make_pair("cubicEaseInTiming1", cubicEaseInTiming1));
    160     v.append(std::make_pair("cubicEaseOutTiming1", cubicEaseOutTiming1));
    161     v.append(std::make_pair("cubicEaseInOutTiming1", cubicEaseInOutTiming1));
    162     v.append(std::make_pair("cubicCustomTiming1", cubicCustomTiming1));
    163     notEqualHelperLoop(v);
    164 }
    165 
    166 TEST_F(TimingFunctionTest, CubicOperatorEqReflectivity)
    167 {
    168     RefPtr<TimingFunction> cubicA = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
    169     RefPtr<TimingFunction> cubicB = CubicBezierTimingFunction::create(0.42, 0.0, 1.0, 1.0);
    170     EXPECT_NE(*cubicA, *cubicB);
    171     EXPECT_NE(*cubicB, *cubicA);
    172 }
    173 
    174 TEST_F(TimingFunctionTest, StepsOperatorEq)
    175 {
    176     RefPtr<TimingFunction> stepsTimingStart1 = StepsTimingFunction::preset(StepsTimingFunction::Start);
    177     RefPtr<TimingFunction> stepsTimingStart2 = StepsTimingFunction::preset(StepsTimingFunction::Start);
    178     EXPECT_EQ(*stepsTimingStart1, *stepsTimingStart1);
    179     EXPECT_EQ(*stepsTimingStart1, *stepsTimingStart2);
    180 
    181     RefPtr<TimingFunction> stepsTimingEnd1 = StepsTimingFunction::preset(StepsTimingFunction::End);
    182     RefPtr<TimingFunction> stepsTimingEnd2 = StepsTimingFunction::preset(StepsTimingFunction::End);
    183     EXPECT_EQ(*stepsTimingEnd1, *stepsTimingEnd1);
    184     EXPECT_EQ(*stepsTimingEnd1, *stepsTimingEnd2);
    185 
    186     RefPtr<TimingFunction> stepsTimingCustom1 = StepsTimingFunction::create(5, StepsTimingFunction::Start);
    187     RefPtr<TimingFunction> stepsTimingCustom2 = StepsTimingFunction::create(5, StepsTimingFunction::End);
    188     RefPtr<TimingFunction> stepsTimingCustom3 = StepsTimingFunction::create(7, StepsTimingFunction::Start);
    189     RefPtr<TimingFunction> stepsTimingCustom4 = StepsTimingFunction::create(7, StepsTimingFunction::End);
    190 
    191     EXPECT_EQ(*StepsTimingFunction::create(5, StepsTimingFunction::Start), *stepsTimingCustom1);
    192     EXPECT_EQ(*StepsTimingFunction::create(5, StepsTimingFunction::End), *stepsTimingCustom2);
    193     EXPECT_EQ(*StepsTimingFunction::create(7, StepsTimingFunction::Start), *stepsTimingCustom3);
    194     EXPECT_EQ(*StepsTimingFunction::create(7, StepsTimingFunction::End), *stepsTimingCustom4);
    195 
    196     Vector<std::pair<std::string, RefPtr<TimingFunction> > > v;
    197     v.append(std::make_pair("stepsTimingStart1", stepsTimingStart1));
    198     v.append(std::make_pair("stepsTimingEnd1", stepsTimingEnd1));
    199     v.append(std::make_pair("stepsTimingCustom1", stepsTimingCustom1));
    200     v.append(std::make_pair("stepsTimingCustom2", stepsTimingCustom2));
    201     v.append(std::make_pair("stepsTimingCustom3", stepsTimingCustom3));
    202     v.append(std::make_pair("stepsTimingCustom4", stepsTimingCustom4));
    203     notEqualHelperLoop(v);
    204 }
    205 
    206 TEST_F(TimingFunctionTest, StepsOperatorEqPreset)
    207 {
    208     RefPtr<TimingFunction> stepsA = StepsTimingFunction::preset(StepsTimingFunction::Start);
    209     RefPtr<TimingFunction> stepsB = StepsTimingFunction::create(1, StepsTimingFunction::Start);
    210     EXPECT_EQ(*stepsA, *stepsB);
    211     EXPECT_EQ(*stepsB, *stepsA);
    212 }
    213 
    214 TEST_F(TimingFunctionTest, LinearEvaluate)
    215 {
    216     RefPtr<TimingFunction> linearTiming = LinearTimingFunction::shared();
    217     EXPECT_EQ(0.2, linearTiming->evaluate(0.2, 0));
    218     EXPECT_EQ(0.6, linearTiming->evaluate(0.6, 0));
    219     EXPECT_EQ(-0.2, linearTiming->evaluate(-0.2, 0));
    220     EXPECT_EQ(1.6, linearTiming->evaluate(1.6, 0));
    221 }
    222 
    223 TEST_F(TimingFunctionTest, LinearRange)
    224 {
    225     double start = 0;
    226     double end = 1;
    227     RefPtr<TimingFunction> linearTiming = LinearTimingFunction::shared();
    228     linearTiming->range(&start, &end);
    229     EXPECT_NEAR(0, start, 0.01);
    230     EXPECT_NEAR(1, end, 0.01);
    231     start = -1;
    232     end = 10;
    233     linearTiming->range(&start, &end);
    234     EXPECT_NEAR(-1, start, 0.01);
    235     EXPECT_NEAR(10, end, 0.01);
    236 }
    237 
    238 TEST_F(TimingFunctionTest, StepRange)
    239 {
    240     double start = 0;
    241     double end = 1;
    242     RefPtr<TimingFunction> steps = StepsTimingFunction::preset(StepsTimingFunction::Start);
    243     steps->range(&start, &end);
    244     EXPECT_NEAR(0, start, 0.01);
    245     EXPECT_NEAR(1, end, 0.01);
    246 
    247     start = -1;
    248     end = 10;
    249     steps->range(&start, &end);
    250     EXPECT_NEAR(0, start, 0.01);
    251     EXPECT_NEAR(1, end, 0.01);
    252 }
    253 
    254 TEST_F(TimingFunctionTest, CubicRange)
    255 {
    256     double start = 0;
    257     double end = 1;
    258 
    259     RefPtr<TimingFunction> cubicEaseTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease);
    260     start = 0;
    261     end = 1;
    262     cubicEaseTiming->range(&start, &end);
    263     EXPECT_NEAR(0, start, 0.01);
    264     EXPECT_NEAR(1, end, 0.01);
    265     start = -1;
    266     end = 10;
    267     cubicEaseTiming->range(&start, &end);
    268     EXPECT_NEAR(-0.4, start, 0.01);
    269     EXPECT_NEAR(1, end, 0.01);
    270 
    271     RefPtr<TimingFunction> cubicEaseInTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
    272     start = 0;
    273     end = 1;
    274     cubicEaseInTiming->range(&start, &end);
    275     EXPECT_NEAR(0, start, 0.01);
    276     EXPECT_NEAR(1, end, 0.01);
    277     start = -1;
    278     end = 10;
    279     cubicEaseInTiming->range(&start, &end);
    280     EXPECT_NEAR(0.0, start, 0.01);
    281     EXPECT_NEAR(16.51, end, 0.01);
    282 
    283     RefPtr<TimingFunction> cubicEaseOutTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseOut);
    284     start = 0;
    285     end = 1;
    286     cubicEaseOutTiming->range(&start, &end);
    287     EXPECT_NEAR(0, start, 0.01);
    288     EXPECT_NEAR(1, end, 0.01);
    289     start = -1;
    290     end = 10;
    291     cubicEaseOutTiming->range(&start, &end);
    292     EXPECT_NEAR(-1.72, start, 0.01);
    293     EXPECT_NEAR(1.0, end, 0.01);
    294 
    295     RefPtr<TimingFunction> cubicEaseInOutTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut);
    296     start = 0;
    297     end = 1;
    298     cubicEaseInOutTiming->range(&start, &end);
    299     EXPECT_NEAR(0, start, 0.01);
    300     EXPECT_NEAR(1, end, 0.01);
    301     start = -1;
    302     end = 10;
    303     cubicEaseInOutTiming->range(&start, &end);
    304     EXPECT_NEAR(0.0, start, 0.01);
    305     EXPECT_NEAR(1.0, end, 0.01);
    306 
    307     RefPtr<TimingFunction> cubicCustomTiming = CubicBezierTimingFunction::create(0.17, 0.67, 1.0, -1.73);
    308     start = 0;
    309     end = 1;
    310     cubicCustomTiming->range(&start, &end);
    311     EXPECT_NEAR(-0.33, start, 0.01);
    312     EXPECT_NEAR(1.0, end, 0.01);
    313 
    314     start = -1;
    315     end = 10;
    316     cubicCustomTiming->range(&start, &end);
    317     EXPECT_NEAR(-3.94, start, 0.01);
    318     EXPECT_NEAR(4.578, end, 0.01);
    319 }
    320 
    321 TEST_F(TimingFunctionTest, CubicEvaluate)
    322 {
    323     double tolerance = 0.01;
    324     RefPtr<TimingFunction> cubicEaseTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease);
    325     EXPECT_NEAR(0.418, cubicEaseTiming->evaluate(0.25, tolerance), tolerance);
    326     EXPECT_NEAR(0.805, cubicEaseTiming->evaluate(0.50, tolerance), tolerance);
    327     EXPECT_NEAR(0.960, cubicEaseTiming->evaluate(0.75, tolerance), tolerance);
    328 
    329     RefPtr<TimingFunction> cubicEaseInTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
    330     EXPECT_NEAR(0.093, cubicEaseInTiming->evaluate(0.25, tolerance), tolerance);
    331     EXPECT_NEAR(0.305, cubicEaseInTiming->evaluate(0.50, tolerance), tolerance);
    332     EXPECT_NEAR(0.620, cubicEaseInTiming->evaluate(0.75, tolerance), tolerance);
    333 
    334     RefPtr<TimingFunction> cubicEaseOutTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseOut);
    335     EXPECT_NEAR(0.379, cubicEaseOutTiming->evaluate(0.25, tolerance), tolerance);
    336     EXPECT_NEAR(0.694, cubicEaseOutTiming->evaluate(0.50, tolerance), tolerance);
    337     EXPECT_NEAR(0.906, cubicEaseOutTiming->evaluate(0.75, tolerance), tolerance);
    338 
    339     RefPtr<TimingFunction> cubicEaseInOutTiming = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut);
    340     EXPECT_NEAR(0.128, cubicEaseInOutTiming->evaluate(0.25, tolerance), tolerance);
    341     EXPECT_NEAR(0.500, cubicEaseInOutTiming->evaluate(0.50, tolerance), tolerance);
    342     EXPECT_NEAR(0.871, cubicEaseInOutTiming->evaluate(0.75, tolerance), tolerance);
    343 
    344     RefPtr<TimingFunction> cubicCustomTiming = CubicBezierTimingFunction::create(0.17, 0.67, 1, -1.73);
    345     EXPECT_NEAR(0.034, cubicCustomTiming->evaluate(0.25, tolerance), tolerance);
    346     EXPECT_NEAR(-0.217, cubicCustomTiming->evaluate(0.50, tolerance), tolerance);
    347     EXPECT_NEAR(-0.335, cubicCustomTiming->evaluate(0.75, tolerance), tolerance);
    348 }
    349 
    350 TEST_F(TimingFunctionTest, StepsEvaluate)
    351 {
    352     RefPtr<TimingFunction> stepsTimingStart = StepsTimingFunction::preset(StepsTimingFunction::Start);
    353     EXPECT_EQ(0.00, stepsTimingStart->evaluate(-1.10, 0));
    354     EXPECT_EQ(0.00, stepsTimingStart->evaluate(-0.10, 0));
    355     EXPECT_EQ(1.00, stepsTimingStart->evaluate(0.00, 0));
    356     EXPECT_EQ(1.00, stepsTimingStart->evaluate(0.20, 0));
    357     EXPECT_EQ(1.00, stepsTimingStart->evaluate(0.60, 0));
    358     EXPECT_EQ(1.00, stepsTimingStart->evaluate(1.00, 0));
    359     EXPECT_EQ(1.00, stepsTimingStart->evaluate(2.00, 0));
    360 
    361     RefPtr<TimingFunction> stepsTimingMiddle = StepsTimingFunction::preset(StepsTimingFunction::Middle);
    362     EXPECT_EQ(0.00, stepsTimingMiddle->evaluate(-2.50, 0));
    363     EXPECT_EQ(0.00, stepsTimingMiddle->evaluate(0.00, 0));
    364     EXPECT_EQ(0.00, stepsTimingMiddle->evaluate(0.49, 0));
    365     EXPECT_EQ(1.00, stepsTimingMiddle->evaluate(0.50, 0));
    366     EXPECT_EQ(1.00, stepsTimingMiddle->evaluate(1.00, 0));
    367     EXPECT_EQ(1.00, stepsTimingMiddle->evaluate(2.50, 0));
    368 
    369     RefPtr<TimingFunction> stepsTimingEnd = StepsTimingFunction::preset(StepsTimingFunction::End);
    370     EXPECT_EQ(0.00, stepsTimingEnd->evaluate(-2.00, 0));
    371     EXPECT_EQ(0.00, stepsTimingEnd->evaluate(0.00, 0));
    372     EXPECT_EQ(0.00, stepsTimingEnd->evaluate(0.20, 0));
    373     EXPECT_EQ(0.00, stepsTimingEnd->evaluate(0.60, 0));
    374     EXPECT_EQ(1.00, stepsTimingEnd->evaluate(1.00, 0));
    375     EXPECT_EQ(1.00, stepsTimingEnd->evaluate(2.00, 0));
    376 
    377     RefPtr<TimingFunction> stepsTimingCustomStart = StepsTimingFunction::create(4, StepsTimingFunction::Start);
    378     EXPECT_EQ(0.00, stepsTimingCustomStart->evaluate(-0.50, 0));
    379     EXPECT_EQ(0.25, stepsTimingCustomStart->evaluate(0.00, 0));
    380     EXPECT_EQ(0.25, stepsTimingCustomStart->evaluate(0.24, 0));
    381     EXPECT_EQ(0.50, stepsTimingCustomStart->evaluate(0.25, 0));
    382     EXPECT_EQ(0.50, stepsTimingCustomStart->evaluate(0.49, 0));
    383     EXPECT_EQ(0.75, stepsTimingCustomStart->evaluate(0.50, 0));
    384     EXPECT_EQ(0.75, stepsTimingCustomStart->evaluate(0.74, 0));
    385     EXPECT_EQ(1.00, stepsTimingCustomStart->evaluate(0.75, 0));
    386     EXPECT_EQ(1.00, stepsTimingCustomStart->evaluate(1.00, 0));
    387     EXPECT_EQ(1.00, stepsTimingCustomStart->evaluate(1.50, 0));
    388 
    389     RefPtr<TimingFunction> stepsTimingCustomMiddle = StepsTimingFunction::create(4, StepsTimingFunction::Middle);
    390     EXPECT_EQ(0.00, stepsTimingCustomMiddle->evaluate(-2.00, 0));
    391     EXPECT_EQ(0.00, stepsTimingCustomMiddle->evaluate(0.00, 0));
    392     EXPECT_EQ(0.00, stepsTimingCustomMiddle->evaluate(0.12, 0));
    393     EXPECT_EQ(0.25, stepsTimingCustomMiddle->evaluate(0.13, 0));
    394     EXPECT_EQ(0.25, stepsTimingCustomMiddle->evaluate(0.37, 0));
    395     EXPECT_EQ(0.50, stepsTimingCustomMiddle->evaluate(0.38, 0));
    396     EXPECT_EQ(0.50, stepsTimingCustomMiddle->evaluate(0.62, 0));
    397     EXPECT_EQ(0.75, stepsTimingCustomMiddle->evaluate(0.63, 0));
    398     EXPECT_EQ(0.75, stepsTimingCustomMiddle->evaluate(0.87, 0));
    399     EXPECT_EQ(1.00, stepsTimingCustomMiddle->evaluate(0.88, 0));
    400     EXPECT_EQ(1.00, stepsTimingCustomMiddle->evaluate(1.00, 0));
    401     EXPECT_EQ(1.00, stepsTimingCustomMiddle->evaluate(3.00, 0));
    402 
    403     RefPtr<TimingFunction> stepsTimingCustomEnd = StepsTimingFunction::create(4, StepsTimingFunction::End);
    404     EXPECT_EQ(0.00, stepsTimingCustomEnd->evaluate(-2.00, 0));
    405     EXPECT_EQ(0.00, stepsTimingCustomEnd->evaluate(0.00, 0));
    406     EXPECT_EQ(0.00, stepsTimingCustomEnd->evaluate(0.24, 0));
    407     EXPECT_EQ(0.25, stepsTimingCustomEnd->evaluate(0.25, 0));
    408     EXPECT_EQ(0.25, stepsTimingCustomEnd->evaluate(0.49, 0));
    409     EXPECT_EQ(0.50, stepsTimingCustomEnd->evaluate(0.50, 0));
    410     EXPECT_EQ(0.50, stepsTimingCustomEnd->evaluate(0.74, 0));
    411     EXPECT_EQ(0.75, stepsTimingCustomEnd->evaluate(0.75, 0));
    412     EXPECT_EQ(0.75, stepsTimingCustomEnd->evaluate(0.99, 0));
    413     EXPECT_EQ(1.00, stepsTimingCustomEnd->evaluate(1.00, 0));
    414     EXPECT_EQ(1.00, stepsTimingCustomEnd->evaluate(2.00, 0));
    415 }
    416 
    417 } // namespace
    418 
    419 } // namespace blink
    420