//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// vector_utils_unittests.cpp: Unit tests for the vector utils.
//

#include "vector_utils.h"
#include "common/unsafe_buffers.h"

#include <gtest/gtest.h>

using namespace angle;

namespace
{

// First test that comparing vectors work
TEST(VectorUtilsTest, Comparison)
{
    // Don't use ASSERT_EQ at first because the == is more hidden
    ASSERT_TRUE(Vector2(2.0, 3.0) == Vector2(2.0, 3.0));
    ASSERT_TRUE(Vector2(2.0, 3.0) != Vector2(2.0, 4.0));

    // Check ASSERT_EQ and ASSERT_NE work correctly
    ASSERT_EQ(Vector2(2.0, 3.0), Vector2(2.0, 3.0));
    ASSERT_NE(Vector2(2.0, 3.0), Vector2(2.0, 4.0));

    // Check comparison works on all elements
    ASSERT_EQ(Vector4(0.0), Vector4(0.0));
    ASSERT_NE(Vector4(1.0, 0.0, 0.0, 0.0), Vector4(0.0));
    ASSERT_NE(Vector4(0.0, 1.0, 0.0, 0.0), Vector4(0.0));
    ASSERT_NE(Vector4(0.0, 0.0, 1.0, 0.0), Vector4(0.0));
    ASSERT_NE(Vector4(0.0, 0.0, 0.0, 1.0), Vector4(0.0));
}

// Test indexing
TEST(VectorUtilsTest, Indexing)
{
    Vector2 vec(1.0, 2.0);
    ASSERT_EQ(1.0, vec[0]);
    ASSERT_EQ(2.0, vec[1]);

    vec[0] = 3.0;
    vec[1] = 4.0;
    ASSERT_EQ(Vector2(3.0, 4.0), vec);
}

// Test for the various constructors
TEST(VectorUtilsTest, Constructors)
{
    // Constructor initializing all to a single element
    {
        Vector2 vec(3.0);
        ASSERT_EQ(3.0, vec[0]);
        ASSERT_EQ(3.0, vec[1]);
    }

    // Constructor initializing from another Vector
    {
        Vector2 vec(Vector2(1.0, 2.0));
        ASSERT_EQ(1.0, vec[0]);
        ASSERT_EQ(2.0, vec[1]);
    }

    // Mixed constructor
    {
        Vector4 vec(1.0, Vector2(2.0, 3.0), 4.0);
        ASSERT_EQ(1.0, vec[0]);
        ASSERT_EQ(2.0, vec[1]);
        ASSERT_EQ(3.0, vec[2]);
        ASSERT_EQ(4.0, vec[3]);
    }
}

// Test accessing the data directly
TEST(VectorUtilsTest, DataAccess)
{
    Vector2 vec(1.0, 2.0);
    ASSERT_EQ(2u, vec.size());

    ASSERT_EQ(1.0, vec.data()[0]);
    ANGLE_UNSAFE_TODO(ASSERT_EQ(2.0, vec.data()[1]));

    vec.data()[0] = 3.0;
    ANGLE_UNSAFE_TODO(vec.data()[1]) = 4.0;

    ASSERT_EQ(Vector2(3.0, 4.0), vec);
}

// Test accessing the data directly
TEST(VectorUtilsTest, LoadStore)
{
    float data[] = {1.0, 2.0};

    Vector2 vec = Vector2::Load(data);

    ASSERT_EQ(1.0, vec.data()[0]);
    ANGLE_UNSAFE_TODO(ASSERT_EQ(2.0, vec.data()[1]));

    vec = Vector2(3.0, 4.0);
    Vector2::Store(vec, data);

    ASSERT_EQ(3.0, data[0]);
    ASSERT_EQ(4.0, data[1]);
}

// Test basic arithmetic operations
TEST(VectorUtilsTest, BasicArithmetic)
{
    ASSERT_EQ(Vector2(2.0, 3.0), +Vector2(2.0, 3.0));
    ASSERT_EQ(Vector2(-2.0, -3.0), -Vector2(2.0, 3.0));
    ASSERT_EQ(Vector2(4.0, 6.0), Vector2(1.0, 2.0) + Vector2(3.0, 4.0));
    ASSERT_EQ(Vector2(-2.0, -2.0), Vector2(1.0, 2.0) - Vector2(3.0, 4.0));
    ASSERT_EQ(Vector2(3.0, 8.0), Vector2(1.0, 2.0) * Vector2(3.0, 4.0));
    ASSERT_EQ(Vector2(3.0, 2.0), Vector2(3.0, 4.0) / Vector2(1.0, 2.0));

    ASSERT_EQ(Vector2(2.0, 4.0), Vector2(1.0, 2.0) * 2);
    ASSERT_EQ(Vector2(2.0, 4.0), 2 * Vector2(1.0, 2.0));
    ASSERT_EQ(Vector2(0.5, 1.0), Vector2(1.0, 2.0) / 2);
}

// Test compound arithmetic operations
TEST(VectorUtilsTest, CompoundArithmetic)
{
    {
        Vector2 vec(1.0, 2.0);
        vec += Vector2(3.0, 4.0);
        ASSERT_EQ(Vector2(4.0, 6.0), vec);
    }
    {
        Vector2 vec(1.0, 2.0);
        vec -= Vector2(3.0, 4.0);
        ASSERT_EQ(Vector2(-2.0, -2.0), vec);
    }
    {
        Vector2 vec(1.0, 2.0);
        vec *= Vector2(3.0, 4.0);
        ASSERT_EQ(Vector2(3.0, 8.0), vec);
    }
    {
        Vector2 vec(3.0, 4.0);
        vec /= Vector2(1.0, 2.0);
        ASSERT_EQ(Vector2(3.0, 2.0), vec);
    }
    {
        Vector2 vec(1.0, 2.0);
        vec *= 2.0;
        ASSERT_EQ(Vector2(2.0, 4.0), vec);
    }
    {
        Vector2 vec(1.0, 2.0);
        vec /= 2.0;
        ASSERT_EQ(Vector2(0.5, 1.0), vec);
    }
}

// Test other arithmetic operations
TEST(VectorUtilsTest, OtherArithmeticOperations)
{
    Vector2 vec(3.0, 4.0);

    ASSERT_EQ(25.0, vec.lengthSquared());
    ASSERT_EQ(5.0, vec.length());
    ASSERT_EQ(Vector2(0.6, 0.8), vec.normalized());

    ASSERT_EQ(11.0, vec.dot(Vector2(1.0, 2.0)));
}

// Test element shortcuts
TEST(VectorUtilsTest, ElementShortcuts)
{
    Vector2 vec2(1.0, 2.0);
    Vector3 vec3(1.0, 2.0, 3.0);
    Vector4 vec4(1.0, 2.0, 3.0, 4.0);

    ASSERT_EQ(1.0, vec2.x());
    ASSERT_EQ(1.0, vec3.x());
    ASSERT_EQ(1.0, vec4.x());

    ASSERT_EQ(2.0, vec2.y());
    ASSERT_EQ(2.0, vec3.y());
    ASSERT_EQ(2.0, vec4.y());

    ASSERT_EQ(3.0, vec3.z());
    ASSERT_EQ(3.0, vec4.z());

    ASSERT_EQ(4.0, vec4.w());

    vec2.x() = 0.0;
    ASSERT_EQ(Vector2(0.0, 2.0), vec2);
}

// Test the cross product
TEST(VectorUtilsTest, CrossProduct)
{
    ASSERT_EQ(Vector3(0.0, 0.0, 1.0), Vector3(1.0, 0.0, 0.0).cross(Vector3(0.0, 1.0, 0.0)));
    ASSERT_EQ(Vector3(-3.0, 6.0, -3.0), Vector3(1.0, 2.0, 3.0).cross(Vector3(4.0, 5.0, 6.0)));
}

// Test basic functionality of int vectors
TEST(VectorUtilsTest, IntVector)
{
    Vector2I vec(0);

    int *data = vec.data();
    ANGLE_UNSAFE_TODO(data[1]) = 1;

    ASSERT_EQ(0, vec[0]);
    ASSERT_EQ(1, vec[1]);
}

// Test basic functionality of int vectors
TEST(VectorUtilsTest, UIntVector)
{
    Vector2U vec(0);

    unsigned int *data = vec.data();
    ANGLE_UNSAFE_TODO(data[1]) = 1;

    ASSERT_EQ(0u, vec[0]);
    ASSERT_EQ(1u, vec[1]);
}

}  // anonymous namespace
