| // | |
| // 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 <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]); | |
| ASSERT_EQ(2.0, vec.data()[1]); | |
| vec.data()[0] = 3.0; | |
| 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]); | |
| 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(); | |
| 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(); | |
| data[1] = 1; | |
| ASSERT_EQ(0u, vec[0]); | |
| ASSERT_EQ(1u, vec[1]); | |
| } | |
| } // anonymous namespace |