// 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
