Files
2025-05-18 13:04:45 +08:00

535 lines
13 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "tdmtests/Defs.h"
#include "tdmtests/Helpers.h"
#include "tdm/TDM.h"
TEST(VecTestConstruction, DefaultConstructVec1) {
tdm::vec<1, int> v;
ASSERT_EQ(v[0], 0);
}
TEST(VecTestConstruction, DefaultConstructVec2) {
tdm::vec2<int> v;
ASSERT_EQ(v[0], 0);
ASSERT_EQ(v[1], 0);
}
TEST(VecTestConstruction, DefaultConstructVec3) {
tdm::vec3<int> v;
ASSERT_EQ(v[0], 0);
ASSERT_EQ(v[1], 0);
ASSERT_EQ(v[2], 0);
}
TEST(VecTestConstruction, DefaultConstructVec4) {
tdm::vec4<int> v;
ASSERT_EQ(v[0], 0);
ASSERT_EQ(v[1], 0);
ASSERT_EQ(v[2], 0);
ASSERT_EQ(v[3], 0);
}
TEST(VecTestConstruction, DefaultConstructVecArbitrary) {
tdm::vec<5, int> v;
ASSERT_EQ(v[0], 0);
ASSERT_EQ(v[1], 0);
ASSERT_EQ(v[2], 0);
ASSERT_EQ(v[3], 0);
ASSERT_EQ(v[4], 0);
}
TEST(VecTestConstruction, ConstructFromArgsVec1) {
tdm::vec<1, int> v{1};
ASSERT_EQ(v[0], 1);
}
TEST(VecTestConstruction, ConstructFromArgsVec2) {
tdm::vec2<int> v{1, 2};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
}
TEST(VecTestConstruction, ConstructFromArgsVec3) {
tdm::vec3<int> v{1, 2, 3};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
}
TEST(VecTestConstruction, ConstructFromArgsVec4) {
tdm::vec4<int> v{1, 2, 3, 4};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
}
TEST(VecTestConstruction, ConstructFromArgsVecArbitrary) {
tdm::vec<5, int> v{1, 2, 3, 4, 5};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
ASSERT_EQ(v[4], 5);
}
TEST(VecTestConstruction, ConstructFromVec1) {
tdm::vec<1, long int> v{tdm::vec<1, int>{1}};
ASSERT_EQ(v[0], 1);
}
TEST(VecTestConstruction, ConstructFromVec2) {
tdm::vec2<long int> v{tdm::vec2<int>{1, 2}};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
}
TEST(VecTestConstruction, ConstructFromVec3) {
tdm::vec3<long int> v{tdm::vec3<int>{1, 2, 3}};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
}
TEST(VecTestConstruction, ConstructFromVec4) {
tdm::vec4<long int> v{tdm::vec4<int>{1, 2, 3, 4}};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
}
TEST(VecTestConstruction, ConstructFromVecArbitrary) {
tdm::vec<5, long int> v{tdm::vec<5, int>{1, 2, 3, 4, 5}};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
ASSERT_EQ(v[4], 5);
}
TEST(VecTestConstruction, ConstructFromScalarVec1) {
tdm::vec<1, int> v{42};
ASSERT_EQ(v[0], 42);
}
TEST(VecTestConstruction, ConstructFromScalarVec2) {
tdm::vec2<int> v{42};
ASSERT_EQ(v[0], 42);
ASSERT_EQ(v[1], 42);
}
TEST(VecTestConstruction, ConstructFromScalarVec3) {
tdm::vec3<int> v{42};
ASSERT_EQ(v[0], 42);
ASSERT_EQ(v[1], 42);
ASSERT_EQ(v[2], 42);
}
TEST(VecTestConstruction, ConstructFromScalarVec4) {
tdm::vec4<int> v{42};
ASSERT_EQ(v[0], 42);
ASSERT_EQ(v[1], 42);
ASSERT_EQ(v[2], 42);
ASSERT_EQ(v[3], 42);
}
TEST(VecTestConstruction, ConstructFromScalarVecArbitrary) {
tdm::vec<5, int> v{42};
ASSERT_EQ(v[0], 42);
ASSERT_EQ(v[1], 42);
ASSERT_EQ(v[2], 42);
ASSERT_EQ(v[3], 42);
ASSERT_EQ(v[4], 42);
}
TEST(VecTestOperators, AssignVec1) {
tdm::vec<1, long int> v;
v = tdm::vec<1, int>{1};
ASSERT_EQ(v[0], 1);
}
TEST(VecTestOperators, AssignVec2) {
tdm::vec2<long int> v;
v = tdm::vec2<int>{1, 2};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
}
TEST(VecTestOperators, AssignVec3) {
tdm::vec3<long int> v;
v = tdm::vec3<int>{1, 2, 3};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
}
TEST(VecTestOperators, AssignVec4) {
tdm::vec4<long int> v;
v = tdm::vec4<int>{1, 2, 3, 4};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
}
TEST(VecTestOperators, AssignVecArbitrary) {
tdm::vec<5, long int> v1;
const tdm::vec<5, int> v2{1, 2, 3, 4, 5};
v1 = v2;
ASSERT_EQ(v1[0], 1);
ASSERT_EQ(v1[1], 2);
ASSERT_EQ(v1[2], 3);
ASSERT_EQ(v1[3], 4);
ASSERT_EQ(v1[4], 5);
}
TEST(VecTestOperators, AssignArgsVec1) {
tdm::fvec<1> v;
v = {1.0f};
ASSERT_EQ(v[0], 1.0f);
}
TEST(VecTestOperators, AssignArgsVec2) {
tdm::fvec<2> v;
v = {1.0f, 2.0f};
ASSERT_EQ(v[0], 1.0f);
ASSERT_EQ(v[1], 2.0f);
}
TEST(VecTestOperators, AssignArgsVec3) {
tdm::fvec<3> v;
v = {1.0f, 2.0f, 3.0f};
ASSERT_EQ(v[0], 1.0f);
ASSERT_EQ(v[1], 2.0f);
ASSERT_EQ(v[2], 3.0f);
}
TEST(VecTestOperators, AssignArgsVec4) {
tdm::fvec<4> v;
v = {1.0f, 2.0f, 3.0f, 4.0f};
ASSERT_EQ(v[0], 1.0f);
ASSERT_EQ(v[1], 2.0f);
ASSERT_EQ(v[2], 3.0f);
ASSERT_EQ(v[3], 4.0f);
}
TEST(VecTestOperators, AssignArgsVec5) {
tdm::fvec<5> v;
v = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
ASSERT_EQ(v[0], 1.0f);
ASSERT_EQ(v[1], 2.0f);
ASSERT_EQ(v[2], 3.0f);
ASSERT_EQ(v[3], 4.0f);
ASSERT_EQ(v[4], 5.0f);
}
TEST(VecTestOperators, TestSubscript) {
tdm::vec4<int> v{1, 2, 3, 4};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
}
TEST(VecTestOperators, TestSubscriptModify) {
tdm::vec4<int> v{1, 2, 3, 4};
v[0] = 5;
ASSERT_EQ(v[0], 5);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
}
TEST(VecTestOperators, TestSubscriptConst) {
const tdm::vec4<int> v{1, 2, 3, 4};
ASSERT_EQ(v[0], 1);
ASSERT_EQ(v[1], 2);
ASSERT_EQ(v[2], 3);
ASSERT_EQ(v[3], 4);
}
TEST(VecTestOperators, TestIncrement) {
tdm::vec4<int> v{1, 2, 3, 4};
++v;
ASSERT_EQ(v, tdm::vec4<int>(2, 3, 4, 5));
}
TEST(VecTestOperators, TestDecrement) {
tdm::vec4<int> v{1, 2, 3, 4};
--v;
ASSERT_EQ(v, tdm::vec4<int>(0, 1, 2, 3));
}
TEST(VecTestOperators, TestCompoundAssignmentAddScalar) {
tdm::vec4<long int> v{1, 2, 3, 4};
v += 2;
ASSERT_EQ(v, tdm::vec4<long int>(3, 4, 5, 6));
}
TEST(VecTestOperators, TestCompoundAssignmentAddInitializer) {
tdm::vec4<long int> v{1, 2, 3, 4};
v += {1, 2, 3, 4};
ASSERT_EQ(v, tdm::vec4<long int>(2, 4, 6, 8));
}
TEST(VecTestOperators, TestCompoundAssignmentAddVec) {
tdm::vec4<long int> v1{1, 2, 3, 4};
tdm::vec4<int> v2{1, 2, 3, 4};
v1 += v2;
ASSERT_EQ(v1, tdm::vec4<long int>(2, 4, 6, 8));
}
TEST(VecTestOperators, TestCompoundAssignmentSubtractScalar) {
tdm::vec4<long int> v{5, 8, 11, 14};
v -= 2;
ASSERT_EQ(v, tdm::vec4<long int>(3, 6, 9, 12));
}
TEST(VecTestOperators, TestCompoundAssignmentSubtractInitializer) {
tdm::vec4<long int> v{5, 8, 11, 14};
v -= {1, 2, 3, 4};
ASSERT_EQ(v, tdm::vec4<long int>(4, 6, 8, 10));
}
TEST(VecTestOperators, TestCompoundAssignmentSubtractVec) {
tdm::vec4<long int> v1{5, 8, 11, 14};
tdm::vec4<int> v2{1, 2, 3, 4};
v1 -= v2;
ASSERT_EQ(v1, tdm::vec4<long int>(4, 6, 8, 10));
}
TEST(VecTestOperators, TestCompoundAssignmentMultiplyScalar) {
tdm::vec4<long int> v{1, 2, 3, 4};
v *= 2;
ASSERT_EQ(v, tdm::vec4<long int>(2, 4, 6, 8));
}
TEST(VecTestOperators, TestCompoundAssignmentMultiplyInitializer) {
tdm::vec4<long int> v{1, 2, 3, 4};
v *= {1, 2, 3, 4};
ASSERT_EQ(v, tdm::vec4<long int>(1, 4, 9, 16));
}
TEST(VecTestOperators, TestCompoundAssignmentMultiplyVec) {
tdm::vec4<long int> v1{1, 2, 3, 4};
tdm::vec4<int> v2{4, 3, 2, 1};
v1 *= v2;
ASSERT_EQ(v1, tdm::vec4<long int>(4, 6, 6, 4));
}
TEST(VecTestOperators, TestCompoundAssignmentDivideScalar) {
tdm::vec4<long int> v{8, 24, 36, 32};
v /= 2;
ASSERT_EQ(v, tdm::vec4<long int>(4, 12, 18, 16));
}
TEST(VecTestOperators, TestCompoundAssignmentDivideInitializer) {
tdm::vec4<long int> v{8, 24, 36, 32};
v /= {1, 2, 3, 4};
ASSERT_EQ(v, tdm::vec4<long int>(8, 12, 12, 8));
}
TEST(VecTestOperators, TestCompoundAssignmentDivideVec) {
tdm::vec4<long int> v1{8, 24, 36, 32};
tdm::vec4<int> v2{4, 3, 2, 1};
v1 /= v2;
ASSERT_EQ(v1, tdm::vec4<long int>(2, 8, 18, 32));
}
TEST(VecTestOperators, TestAddVecVec) {
tdm::vec4<int> v1{1, 2, 3, 4};
tdm::vec4<int> v2{5, 6, 7, 8};
auto res = v1 + v2;
ASSERT_EQ(res, tdm::vec4<int>(6, 8, 10, 12));
}
TEST(VecTestOperators, TestAddScalarVec) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = 4 + v;
ASSERT_EQ(res, tdm::vec4<int>(5, 6, 7, 8));
}
TEST(VecTestOperators, TestAddVecScalar) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = v + 7;
ASSERT_EQ(res, tdm::vec4<int>(8, 9, 10, 11));
}
TEST(VecTestOperators, TestSubtractVecVec) {
tdm::vec4<int> v1{1, 2, 3, 4};
tdm::vec4<int> v2{8, 7, 6, 5};
auto res = v1 - v2;
ASSERT_EQ(res, tdm::vec4<int>(-7, -5, -3, -1));
}
TEST(VecTestOperators, TestSubtractScalarVec) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = 4 - v;
ASSERT_EQ(res, tdm::vec4<int>(3, 2, 1, 0));
}
TEST(VecTestOperators, TestSubtractVecScalar) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = v - 7;
ASSERT_EQ(res, tdm::vec4<int>(-6, -5, -4, -3));
}
TEST(VecTestOperators, TestMultiplyVecVec) {
tdm::vec4<int> v1{1, 2, 3, 4};
tdm::vec4<int> v2{5, 6, 7, 8};
auto res = v1 * v2;
ASSERT_EQ(res, tdm::vec4<int>(5, 12, 21, 32));
}
TEST(VecTestOperators, TestMultiplyScalarVec) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = 4 * v;
ASSERT_EQ(res, tdm::vec4<int>(4, 8, 12, 16));
}
TEST(VecTestOperators, TestMultiplyVecScalar) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = v * -2;
ASSERT_EQ(res, tdm::vec4<int>(-2, -4, -6, -8));
}
TEST(VecTestOperators, TestDivideVecVec) {
tdm::vec4<int> v1{1, 2, 3, 4};
tdm::vec4<int> v2{5, 6, 7, 8};
auto res = v2 / v1;
ASSERT_EQ(res, tdm::vec4<int>(5, 3, 2, 2));
}
TEST(VecTestOperators, TestDivideScalarVec) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = 10 / v;
ASSERT_EQ(res, tdm::vec4<int>(10, 5, 3, 2));
}
TEST(VecTestOperators, TestDivideVecScalar) {
tdm::vec4<int> v{1, 2, 3, 4};
auto res = v / 2;
ASSERT_EQ(res, tdm::vec4<int>(0, 1, 1, 2));
}
TEST(VecTestOperators, TestUnaryPlus) {
tdm::vec4<int> v1{-4, -3, 5, 6};
tdm::vec4<int> v2 = +v1;
ASSERT_EQ(v1, v2);
}
TEST(VecTestOperators, TestUnaryMinus) {
tdm::vec4<int> v1{-4, -3, 5, 6};
tdm::vec4<int> v2 = -v1;
ASSERT_EQ(v2, tdm::vec4<int>(4, 3, -5, -6));
}
TEST(VecTestOperators, TestEquality) {
tdm::vec4<int> v1{4, 3, 5, 6};
tdm::vec4<int> v2{4, 3, 5, 6};
tdm::vec4<int> v3;
ASSERT_TRUE(v1 == v2);
ASSERT_FALSE(v1 == v3);
}
TEST(VecTestOperators, TestNonEquality) {
tdm::vec4<int> v1{4, 3, 5, 6};
tdm::vec4<int> v2{4, 3, 5, 6};
tdm::vec4<int> v3;
ASSERT_FALSE(v1 != v2);
ASSERT_TRUE(v1 != v3);
}
TEST(VecTestMembers, TestApplyVec1) {
tdm::vec<1, int> v{1};
int count{};
v.apply([&count](int& val, tdm::dim_t /*unused*/) {
ASSERT_EQ(val, count + 1);
++count;
});
ASSERT_EQ(count, 1);
}
TEST(VecTestMembers, TestApplyVec2) {
tdm::vec2<int> v{1, 2};
int count{};
v.apply([&count](int& val, tdm::dim_t /*unused*/) {
ASSERT_EQ(val, count + 1);
++count;
});
ASSERT_EQ(count, 2);
}
TEST(VecTestMembers, TestApplyVec3) {
tdm::vec3<int> v{1, 2, 3};
int count{};
v.apply([&count](int& val, tdm::dim_t /*unused*/) {
ASSERT_EQ(val, count + 1);
++count;
});
ASSERT_EQ(count, 3);
}
TEST(VecTestMembers, TestApplyVec4) {
tdm::vec4<int> v{1, 2, 3, 4};
int count{};
v.apply([&count](int& val, tdm::dim_t /*unused*/) {
ASSERT_EQ(val, count + 1);
++count;
});
ASSERT_EQ(count, 4);
}
TEST(VecTestMembers, TestApplyVecArbirtary) {
tdm::vec<5, int> v{1, 2, 3, 4, 5};
int count{};
v.apply([&count](int& val, tdm::dim_t /*unused*/) {
ASSERT_EQ(val, count + 1);
++count;
});
ASSERT_EQ(count, 5);
}
TEST(VecTestMembers, TestNegate) {
tdm::vec4<int> v1{-4, -3, 5, 6};
v1.negate();
ASSERT_EQ(v1, tdm::vec4<int>(4, 3, -5, -6));
}
TEST(VecTestMembers, TestLength) {
tdm::vec4<float> v1{0.5f, -0.5f, -0.2f, 1.0f};
ASSERT_NEAR(v1.length(), 1.2409, 0.0001);
tdm::vec4<double> v2{9.0, 24.0, 37.0, 32.0};
ASSERT_NEAR(v2.length(), 55.2268, 0.0001);
v2 = {0.0, 0.0, 0.0, 0.0};
ASSERT_NEAR(v2.length(), 0.0, 0.0001);
}
TEST(VecTestMembers, TestNormalize) {
tdm::vec4<float> v1{0.5f, -0.5f, -0.2f, 1.0f};
v1.normalize();
ASSERT_VEC_NEAR(v1,
tdm::vec4<float>(0.4029f, -0.4029f, -0.1611f, 0.8058f),
0.0001f);
tdm::vec4<double> v2{9.0, 24.0, 37.0, 32.0};
v2.normalize();
ASSERT_VEC_NEAR(v2,
tdm::vec4<double>(0.1629, 0.4345, 0.6699, 0.5794),
0.0001);
v2 = {1.0, 0.0, 0.0, 0.0};
v2.normalize();
ASSERT_VEC_NEAR(v2, tdm::vec4<double>(1.0, 0.0, 0.0, 0.0), 0.0001);
}
TEST(VecTestMembers, TestSum) {
tdm::vec4<int> v{1, 2, 3, 4};
ASSERT_EQ(v.sum(), 10);
}