// Copyright (c) 2012 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 "cobalt/math/vector2d.h"

#include <cmath>
#include <limits>

#include "base/basictypes.h"
#include "cobalt/math/vector2d_f.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace math {

TEST(Vector2dTest, ConversionToFloat) {
  Vector2d i(3, 4);
  Vector2dF f = i;
  EXPECT_EQ(i, f);
}

TEST(Vector2dTest, IsZero) {
  Vector2d int_zero(0, 0);
  Vector2d int_nonzero(2, -2);
  Vector2dF float_zero(0, 0);
  Vector2dF float_nonzero(0.1f, -0.1f);

  EXPECT_TRUE(int_zero.IsZero());
  EXPECT_FALSE(int_nonzero.IsZero());
  EXPECT_TRUE(float_zero.IsZero());
  EXPECT_FALSE(float_nonzero.IsZero());
}

TEST(Vector2dTest, Add) {
  Vector2d i1(3, 5);
  Vector2d i2(4, -1);

  const struct {
    Vector2d expected;
    Vector2d actual;
  } int_tests[] = {{Vector2d(3, 5), i1 + Vector2d()},
                   {Vector2d(3 + 4, 5 - 1), i1 + i2},
                   {Vector2d(3 - 4, 5 + 1), i1 - i2}};

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(int_tests); ++i)
    EXPECT_EQ(int_tests[i].expected.ToString(), int_tests[i].actual.ToString());

  Vector2dF f1(3.1f, 5.1f);
  Vector2dF f2(4.3f, -1.3f);

  const struct {
    Vector2dF expected;
    Vector2dF actual;
  } float_tests[] = {{Vector2dF(3.1F, 5.1F), f1 + Vector2d()},
                     {Vector2dF(3.1F, 5.1F), f1 + Vector2dF()},
                     {Vector2dF(3.1f + 4.3f, 5.1f - 1.3f), f1 + f2},
                     {Vector2dF(3.1f - 4.3f, 5.1f + 1.3f), f1 - f2}};

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i)
    EXPECT_EQ(float_tests[i].expected.ToString(),
              float_tests[i].actual.ToString());
}

TEST(Vector2dTest, Negative) {
  const struct {
    Vector2d expected;
    Vector2d actual;
  } int_tests[] = {{Vector2d(0, 0), -Vector2d(0, 0)},
                   {Vector2d(-3, -3), -Vector2d(3, 3)},
                   {Vector2d(3, 3), -Vector2d(-3, -3)},
                   {Vector2d(-3, 3), -Vector2d(3, -3)},
                   {Vector2d(3, -3), -Vector2d(-3, 3)}};

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(int_tests); ++i)
    EXPECT_EQ(int_tests[i].expected.ToString(), int_tests[i].actual.ToString());

  const struct {
    Vector2dF expected;
    Vector2dF actual;
  } float_tests[] = {{Vector2dF(0, 0), -Vector2d(0, 0)},
                     {Vector2dF(-0.3f, -0.3f), -Vector2dF(0.3f, 0.3f)},
                     {Vector2dF(0.3f, 0.3f), -Vector2dF(-0.3f, -0.3f)},
                     {Vector2dF(-0.3f, 0.3f), -Vector2dF(0.3f, -0.3f)},
                     {Vector2dF(0.3f, -0.3f), -Vector2dF(-0.3f, 0.3f)}};

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i)
    EXPECT_EQ(float_tests[i].expected.ToString(),
              float_tests[i].actual.ToString());
}

TEST(Vector2dTest, Scale) {
  float double_values[][4] = {
      {4.5f, 1.2f, 3.3f, 5.6f},  {4.5f, -1.2f, 3.3f, 5.6f},
      {4.5f, 1.2f, 3.3f, -5.6f}, {4.5f, 1.2f, -3.3f, -5.6f},
      {-4.5f, 1.2f, 3.3f, 5.6f}, {-4.5f, 1.2f, 0, 5.6f},
      {-4.5f, 1.2f, 3.3f, 0},    {4.5f, 0, 3.3f, 5.6f},
      {0, 1.2f, 3.3f, 5.6f}};

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(double_values); ++i) {
    Vector2dF v(double_values[i][0], double_values[i][1]);
    v.Scale(double_values[i][2], double_values[i][3]);
    EXPECT_EQ(v.x(), double_values[i][0] * double_values[i][2]);
    EXPECT_EQ(v.y(), double_values[i][1] * double_values[i][3]);

    Vector2dF v2 =
        ScaleVector2d(Vector2dF(double_values[i][0], double_values[i][1]),
                      double_values[i][2], double_values[i][3]);
    EXPECT_EQ(double_values[i][0] * double_values[i][2], v2.x());
    EXPECT_EQ(double_values[i][1] * double_values[i][3], v2.y());
  }

  float single_values[][3] = {
      {4.5f, 1.2f, 3.3f},  {4.5f, -1.2f, 3.3f}, {4.5f, 1.2f, 3.3f},
      {4.5f, 1.2f, -3.3f}, {-4.5f, 1.2f, 3.3f}, {-4.5f, 1.2f, 0},
      {-4.5f, 1.2f, 3.3f}, {4.5f, 0, 3.3f},     {0, 1.2f, 3.3f}};

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(single_values); ++i) {
    Vector2dF v(single_values[i][0], single_values[i][1]);
    v.Scale(single_values[i][2]);
    EXPECT_EQ(v.x(), single_values[i][0] * single_values[i][2]);
    EXPECT_EQ(v.y(), single_values[i][1] * single_values[i][2]);

    Vector2dF v2 =
        ScaleVector2d(Vector2dF(double_values[i][0], double_values[i][1]),
                      double_values[i][2]);
    EXPECT_EQ(single_values[i][0] * single_values[i][2], v2.x());
    EXPECT_EQ(single_values[i][1] * single_values[i][2], v2.y());
  }
}

TEST(Vector2dTest, Length) {
  int int_values[][2] = {
      {0, 0}, {10, 20}, {20, 10}, {-10, -20}, {-20, 10}, {10, -20},
  };

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(int_values); ++i) {
    int v0 = int_values[i][0];
    int v1 = int_values[i][1];
    double length_squared =
        static_cast<double>(v0) * v0 + static_cast<double>(v1) * v1;
    double length = std::sqrt(length_squared);
    Vector2d vector(v0, v1);
    EXPECT_EQ(static_cast<float>(length_squared), vector.LengthSquared());
    EXPECT_EQ(static_cast<float>(length), vector.Length());
  }

  float float_values[][2] = {
      {0, 0},
      {10.5f, 20.5f},
      {20.5f, 10.5f},
      {-10.5f, -20.5f},
      {-20.5f, 10.5f},
      {10.5f, -20.5f},
      // A large vector that fails if the Length function doesn't use
      // double precision internally.
      {1236278317862780234892374893213178027.12122348904204230f,
       335890352589839028212313231225425134332.38123f},
  };

  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_values); ++i) {
    double v0 = float_values[i][0];
    double v1 = float_values[i][1];
    double length_squared =
        static_cast<double>(v0) * v0 + static_cast<double>(v1) * v1;
    double length = std::sqrt(length_squared);
    Vector2dF vector(v0, v1);
    EXPECT_DOUBLE_EQ(length_squared, vector.LengthSquared());
    EXPECT_FLOAT_EQ(static_cast<float>(length), vector.Length());
  }
}

TEST(Vector2dTest, ClampVector2d) {
  Vector2d a;

  a = Vector2d(3, 5);
  EXPECT_EQ(Vector2d(3, 5).ToString(), a.ToString());
  a.SetToMax(Vector2d(2, 4));
  EXPECT_EQ(Vector2d(3, 5).ToString(), a.ToString());
  a.SetToMax(Vector2d(3, 5));
  EXPECT_EQ(Vector2d(3, 5).ToString(), a.ToString());
  a.SetToMax(Vector2d(4, 2));
  EXPECT_EQ(Vector2d(4, 5).ToString(), a.ToString());
  a.SetToMax(Vector2d(8, 10));
  EXPECT_EQ(Vector2d(8, 10).ToString(), a.ToString());

  a.SetToMin(Vector2d(9, 11));
  EXPECT_EQ(Vector2d(8, 10).ToString(), a.ToString());
  a.SetToMin(Vector2d(8, 10));
  EXPECT_EQ(Vector2d(8, 10).ToString(), a.ToString());
  a.SetToMin(Vector2d(11, 9));
  EXPECT_EQ(Vector2d(8, 9).ToString(), a.ToString());
  a.SetToMin(Vector2d(7, 11));
  EXPECT_EQ(Vector2d(7, 9).ToString(), a.ToString());
  a.SetToMin(Vector2d(3, 5));
  EXPECT_EQ(Vector2d(3, 5).ToString(), a.ToString());
}

TEST(Vector2dTest, ClampVector2dF) {
  Vector2dF a;

  a = Vector2dF(3.5f, 5.5f);
  EXPECT_EQ(Vector2dF(3.5f, 5.5f).ToString(), a.ToString());
  a.SetToMax(Vector2dF(2.5f, 4.5f));
  EXPECT_EQ(Vector2dF(3.5f, 5.5f).ToString(), a.ToString());
  a.SetToMax(Vector2dF(3.5f, 5.5f));
  EXPECT_EQ(Vector2dF(3.5f, 5.5f).ToString(), a.ToString());
  a.SetToMax(Vector2dF(4.5f, 2.5f));
  EXPECT_EQ(Vector2dF(4.5f, 5.5f).ToString(), a.ToString());
  a.SetToMax(Vector2dF(8.5f, 10.5f));
  EXPECT_EQ(Vector2dF(8.5f, 10.5f).ToString(), a.ToString());

  a.SetToMin(Vector2dF(9.5f, 11.5f));
  EXPECT_EQ(Vector2dF(8.5f, 10.5f).ToString(), a.ToString());
  a.SetToMin(Vector2dF(8.5f, 10.5f));
  EXPECT_EQ(Vector2dF(8.5f, 10.5f).ToString(), a.ToString());
  a.SetToMin(Vector2dF(11.5f, 9.5f));
  EXPECT_EQ(Vector2dF(8.5f, 9.5f).ToString(), a.ToString());
  a.SetToMin(Vector2dF(7.5f, 11.5f));
  EXPECT_EQ(Vector2dF(7.5f, 9.5f).ToString(), a.ToString());
  a.SetToMin(Vector2dF(3.5f, 5.5f));
  EXPECT_EQ(Vector2dF(3.5f, 5.5f).ToString(), a.ToString());
}

}  // namespace math
}  // namespace cobalt
