// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <memory>

#include "cobalt/math/cubic_bezier.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace math {
namespace {

TEST(CubicBezierTest, Basic) {
  CubicBezier function(0.25, 0.0, 0.75, 1.0);

  double epsilon = 0.00015;

  EXPECT_NEAR(function.Solve(0), 0, epsilon);
  EXPECT_NEAR(function.Solve(0.05), 0.01136, epsilon);
  EXPECT_NEAR(function.Solve(0.1), 0.03978, epsilon);
  EXPECT_NEAR(function.Solve(0.15), 0.079780, epsilon);
  EXPECT_NEAR(function.Solve(0.2), 0.12803, epsilon);
  EXPECT_NEAR(function.Solve(0.25), 0.18235, epsilon);
  EXPECT_NEAR(function.Solve(0.3), 0.24115, epsilon);
  EXPECT_NEAR(function.Solve(0.35), 0.30323, epsilon);
  EXPECT_NEAR(function.Solve(0.4), 0.36761, epsilon);
  EXPECT_NEAR(function.Solve(0.45), 0.43345, epsilon);
  EXPECT_NEAR(function.Solve(0.5), 0.5, epsilon);
  EXPECT_NEAR(function.Solve(0.6), 0.63238, epsilon);
  EXPECT_NEAR(function.Solve(0.65), 0.69676, epsilon);
  EXPECT_NEAR(function.Solve(0.7), 0.75884, epsilon);
  EXPECT_NEAR(function.Solve(0.75), 0.81764, epsilon);
  EXPECT_NEAR(function.Solve(0.8), 0.87196, epsilon);
  EXPECT_NEAR(function.Solve(0.85), 0.92021, epsilon);
  EXPECT_NEAR(function.Solve(0.9), 0.96021, epsilon);
  EXPECT_NEAR(function.Solve(0.95), 0.98863, epsilon);
  EXPECT_NEAR(function.Solve(1), 1, epsilon);
}

// Tests that solving the bezier works with knots with y not in (0, 1).
TEST(CubicBezierTest, UnclampedYValues) {
  CubicBezier function(0.5, -1.0, 0.5, 2.0);

  double epsilon = 0.00015;

  EXPECT_NEAR(function.Solve(0.0), 0.0, epsilon);
  EXPECT_NEAR(function.Solve(0.05), -0.08954, epsilon);
  EXPECT_NEAR(function.Solve(0.1), -0.15613, epsilon);
  EXPECT_NEAR(function.Solve(0.15), -0.19641, epsilon);
  EXPECT_NEAR(function.Solve(0.2), -0.20651, epsilon);
  EXPECT_NEAR(function.Solve(0.25), -0.18232, epsilon);
  EXPECT_NEAR(function.Solve(0.3), -0.11992, epsilon);
  EXPECT_NEAR(function.Solve(0.35), -0.01672, epsilon);
  EXPECT_NEAR(function.Solve(0.4), 0.12660, epsilon);
  EXPECT_NEAR(function.Solve(0.45), 0.30349, epsilon);
  EXPECT_NEAR(function.Solve(0.5), 0.50000, epsilon);
  EXPECT_NEAR(function.Solve(0.55), 0.69651, epsilon);
  EXPECT_NEAR(function.Solve(0.6), 0.87340, epsilon);
  EXPECT_NEAR(function.Solve(0.65), 1.01672, epsilon);
  EXPECT_NEAR(function.Solve(0.7), 1.11992, epsilon);
  EXPECT_NEAR(function.Solve(0.75), 1.18232, epsilon);
  EXPECT_NEAR(function.Solve(0.8), 1.20651, epsilon);
  EXPECT_NEAR(function.Solve(0.85), 1.19641, epsilon);
  EXPECT_NEAR(function.Solve(0.9), 1.15613, epsilon);
  EXPECT_NEAR(function.Solve(0.95), 1.08954, epsilon);
  EXPECT_NEAR(function.Solve(1.0), 1.0, epsilon);
}

TEST(CubicBezierTest, Range) {
  double epsilon = 0.00015;
  double min, max;

  // Derivative is a constant.
  std::unique_ptr<CubicBezier> function(
      new CubicBezier(0.25, (1.0 / 3.0), 0.75, (2.0 / 3.0)));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_EQ(1, max);

  // Derivative is linear.
  function.reset(new CubicBezier(0.25, -0.5, 0.75, (-1.0 / 6.0)));
  function->Range(&min, &max);
  EXPECT_NEAR(min, -0.225, epsilon);
  EXPECT_EQ(1, max);

  // Derivative has no real roots.
  function.reset(new CubicBezier(0.25, 0.25, 0.75, 0.5));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_EQ(1, max);

  // Derivative has exactly one real root.
  function.reset(new CubicBezier(0.0, 1.0, 1.0, 0.0));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_EQ(1, max);

  // Derivative has one root < 0 and one root > 1.
  function.reset(new CubicBezier(0.25, 0.1, 0.75, 0.9));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_EQ(1, max);

  // Derivative has two roots in [0,1].
  function.reset(new CubicBezier(0.25, 2.5, 0.75, 0.5));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_NEAR(max, 1.28818, epsilon);
  function.reset(new CubicBezier(0.25, 0.5, 0.75, -1.5));
  function->Range(&min, &max);
  EXPECT_NEAR(min, -0.28818, epsilon);
  EXPECT_EQ(1, max);

  // Derivative has one root < 0 and one root in [0,1].
  function.reset(new CubicBezier(0.25, 0.1, 0.75, 1.5));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_NEAR(max, 1.10755, epsilon);

  // Derivative has one root in [0,1] and one root > 1.
  function.reset(new CubicBezier(0.25, -0.5, 0.75, 0.9));
  function->Range(&min, &max);
  EXPECT_NEAR(min, -0.10755, epsilon);
  EXPECT_EQ(1, max);

  // Derivative has two roots < 0.
  function.reset(new CubicBezier(0.25, 0.3, 0.75, 0.633));
  function->Range(&min, &max);
  EXPECT_EQ(0, min);
  EXPECT_EQ(1, max);

  // Derivative has two roots > 1.
  function.reset(new CubicBezier(0.25, 0.367, 0.75, 0.7));
  function->Range(&min, &max);
  EXPECT_EQ(0.f, min);
  EXPECT_EQ(1.f, max);
}

TEST(CubicBezierTest, Slope) {
  CubicBezier function(0.25, 0.0, 0.75, 1.0);

  double epsilon = 0.00015;

  EXPECT_NEAR(function.Slope(0), 0, epsilon);
  EXPECT_NEAR(function.Slope(0.05), 0.42170, epsilon);
  EXPECT_NEAR(function.Slope(0.1), 0.69778, epsilon);
  EXPECT_NEAR(function.Slope(0.15), 0.89121, epsilon);
  EXPECT_NEAR(function.Slope(0.2), 1.03184, epsilon);
  EXPECT_NEAR(function.Slope(0.25), 1.13576, epsilon);
  EXPECT_NEAR(function.Slope(0.3), 1.21239, epsilon);
  EXPECT_NEAR(function.Slope(0.35), 1.26751, epsilon);
  EXPECT_NEAR(function.Slope(0.4), 1.30474, epsilon);
  EXPECT_NEAR(function.Slope(0.45), 1.32628, epsilon);
  EXPECT_NEAR(function.Slope(0.5), 1.33333, epsilon);
  EXPECT_NEAR(function.Slope(0.55), 1.32628, epsilon);
  EXPECT_NEAR(function.Slope(0.6), 1.30474, epsilon);
  EXPECT_NEAR(function.Slope(0.65), 1.26751, epsilon);
  EXPECT_NEAR(function.Slope(0.7), 1.21239, epsilon);
  EXPECT_NEAR(function.Slope(0.75), 1.13576, epsilon);
  EXPECT_NEAR(function.Slope(0.8), 1.03184, epsilon);
  EXPECT_NEAR(function.Slope(0.85), 0.89121, epsilon);
  EXPECT_NEAR(function.Slope(0.9), 0.69778, epsilon);
  EXPECT_NEAR(function.Slope(0.95), 0.42170, epsilon);
  EXPECT_NEAR(function.Slope(1), 0, epsilon);
}

}  // namespace
}  // namespace math
}  // namespace cobalt
