TEST(AnimationAnimationInputHelpersTest, ParseAnimationTimingFunction)
{
    EXPECT_EQ(nullptr, AnimationInputHelpers::parseTimingFunction("initial"));
    EXPECT_EQ(nullptr, AnimationInputHelpers::parseTimingFunction("inherit"));
    EXPECT_EQ(nullptr, AnimationInputHelpers::parseTimingFunction("unset"));

    EXPECT_TRUE(timingFunctionRoundTrips("ease"));
    EXPECT_TRUE(timingFunctionRoundTrips("linear"));
    EXPECT_TRUE(timingFunctionRoundTrips("ease-in"));
    EXPECT_TRUE(timingFunctionRoundTrips("ease-out"));
    EXPECT_TRUE(timingFunctionRoundTrips("ease-in-out"));
    EXPECT_TRUE(timingFunctionRoundTrips("step-start"));
    EXPECT_TRUE(timingFunctionRoundTrips("step-middle"));
    EXPECT_TRUE(timingFunctionRoundTrips("step-end"));
    EXPECT_TRUE(timingFunctionRoundTrips("steps(3, start)"));
    EXPECT_TRUE(timingFunctionRoundTrips("steps(3, middle)"));
    EXPECT_TRUE(timingFunctionRoundTrips("steps(3, end)"));
    EXPECT_TRUE(timingFunctionRoundTrips("cubic-bezier(0.1, 5, 0.23, 0)"));

    EXPECT_EQ("steps(3, end)", AnimationInputHelpers::parseTimingFunction("steps(3)")->toString());

    EXPECT_EQ(nullptr, AnimationInputHelpers::parseTimingFunction("steps(3, nowhere)"));
    EXPECT_EQ(nullptr, AnimationInputHelpers::parseTimingFunction("steps(-3, end)"));
    EXPECT_EQ(nullptr, AnimationInputHelpers::parseTimingFunction("cubic-bezier(0.1, 0, 4, 0.4)"));
}
TEST_F(AnimationAnimationInputHelpersTest, ParseAnimationTimingFunction)
{
    timingFunctionThrows("", exceptionState);
    timingFunctionThrows("initial", exceptionState);
    timingFunctionThrows("inherit", exceptionState);
    timingFunctionThrows("unset", exceptionState);

    timingFunctionRoundTrips("ease", exceptionState);
    timingFunctionRoundTrips("linear", exceptionState);
    timingFunctionRoundTrips("ease-in", exceptionState);
    timingFunctionRoundTrips("ease-out", exceptionState);
    timingFunctionRoundTrips("ease-in-out", exceptionState);
    timingFunctionRoundTrips("step-start", exceptionState);
    timingFunctionRoundTrips("step-middle", exceptionState);
    timingFunctionRoundTrips("step-end", exceptionState);
    timingFunctionRoundTrips("steps(3, start)", exceptionState);
    timingFunctionRoundTrips("steps(3, middle)", exceptionState);
    timingFunctionRoundTrips("steps(3, end)", exceptionState);
    timingFunctionRoundTrips("cubic-bezier(0.1, 5, 0.23, 0)", exceptionState);

    EXPECT_EQ("steps(3, end)", parseTimingFunction("steps(3)", exceptionState)->toString());

    timingFunctionThrows("steps(3, nowhere)", exceptionState);
    timingFunctionThrows("steps(-3, end)", exceptionState);
    timingFunctionThrows("cubic-bezier(0.1, 0, 4, 0.4)", exceptionState);
}