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