| // Copyright 2015 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "cobalt/cssom/timing_function.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace cobalt { |
| namespace cssom { |
| |
| namespace { |
| const float kErrorEpsilon = 0.00015f; |
| } // namespace |
| |
| TEST(TimingFunctionTest, BasicCubicBezierTest) { |
| scoped_refptr<TimingFunction> function( |
| new CubicBezierTimingFunction(0.25f, 0.0f, 0.75f, 1.0f)); |
| |
| EXPECT_NEAR(function->Evaluate(0.0f), 0.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.05f), 0.01136f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.1f), 0.03978f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.15f), 0.079780f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.2f), 0.12803f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.25f), 0.18235f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.3f), 0.24115f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.35f), 0.30323f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.4f), 0.36761f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.45f), 0.43345f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.5f), 0.5f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.6f), 0.63238f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.65f), 0.69676f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.7f), 0.75884f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.75f), 0.81764f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.8f), 0.87196f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.85f), 0.92021f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.9f), 0.96021f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.95f), 0.98863f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.0f), 1.0f, kErrorEpsilon); |
| } |
| |
| TEST(TimingFunctionTest, LinearCubicBezierTest) { |
| scoped_refptr<TimingFunction> function(TimingFunction::GetLinear()); |
| |
| EXPECT_NEAR(function->Evaluate(0.0f), 0.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.1f), 0.1f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.2f), 0.2f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.3f), 0.3f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.4f), 0.4f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.5f), 0.5f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.6f), 0.6f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.7f), 0.7f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.8f), 0.8f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.9f), 0.9f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.0f), 1.0f, kErrorEpsilon); |
| } |
| |
| // Tests that solving the bezier works with knots with y not in (0, 1). |
| TEST(TimingFunctionTest, UnclampedYValuesCubicBezierTest) { |
| scoped_refptr<TimingFunction> function( |
| new CubicBezierTimingFunction(0.5f, -1.0f, 0.5f, 2.0f)); |
| |
| EXPECT_NEAR(function->Evaluate(0.0f), 0.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.05f), -0.08954f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.1f), -0.15613f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.15f), -0.19641f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.2f), -0.20651f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.25f), -0.18232f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.3f), -0.11992f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.35f), -0.01672f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.4f), 0.12660f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.45f), 0.30349f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.5f), 0.50000f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.55f), 0.69651f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.6f), 0.87340f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.65f), 1.01672f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.7f), 1.11992f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.75f), 1.18232f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.8f), 1.20651f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.85f), 1.19641f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.9f), 1.15613f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.95f), 1.08954f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.0f), 1.0f, kErrorEpsilon); |
| } |
| |
| TEST(TimingFunctionTest, StepStartTest) { |
| scoped_refptr<TimingFunction> function(TimingFunction::GetStepStart()); |
| |
| EXPECT_NEAR(function->Evaluate(0.0f), 1.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.5f), 1.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.0f), 1.0f, kErrorEpsilon); |
| } |
| |
| TEST(TimingFunctionTest, StepEndTest) { |
| scoped_refptr<TimingFunction> function(TimingFunction::GetStepEnd()); |
| |
| EXPECT_NEAR(function->Evaluate(0.0f), 0.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.5f), 0.0f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.0f), 1.0f, kErrorEpsilon); |
| } |
| |
| TEST(TimingFunctionTest, MultiStepEndTest) { |
| scoped_refptr<TimingFunction> function( |
| new SteppingTimingFunction(4, SteppingTimingFunction::kEnd)); |
| |
| EXPECT_NEAR(function->Evaluate(0.000f), 0.00f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.125f), 0.00f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.250f), 0.25f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.375f), 0.25f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.500f), 0.50f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.625f), 0.50f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.750f), 0.75f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.875f), 0.75f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.000f), 1.00f, kErrorEpsilon); |
| } |
| |
| TEST(TimingFunctionTest, MultiStepStartTest) { |
| scoped_refptr<TimingFunction> function( |
| new SteppingTimingFunction(4, SteppingTimingFunction::kStart)); |
| |
| EXPECT_NEAR(function->Evaluate(0.000f), 0.25f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.125f), 0.25f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.250f), 0.50f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.375f), 0.50f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.500f), 0.75f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.625f), 0.75f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.750f), 1.00f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(0.875f), 1.00f, kErrorEpsilon); |
| EXPECT_NEAR(function->Evaluate(1.000f), 1.00f, kErrorEpsilon); |
| } |
| |
| } // namespace cssom |
| } // namespace cobalt |