|
|
@@ -5,7 +5,7 @@
|
|
|
// Created by Sam Jaffe on 6/2/18.
|
|
|
//
|
|
|
|
|
|
-#include <gmock/gmock.h>
|
|
|
+#include <testing/xcode_gtest_helper.h>
|
|
|
|
|
|
#include "math/vector/vector.hpp"
|
|
|
|
|
|
@@ -16,6 +16,7 @@ template <typename T, size_t N> math::vector::vector<T, N> iota() {
|
|
|
return rval;
|
|
|
}
|
|
|
|
|
|
+using math::vector::vector;
|
|
|
using vec2i = math::vector::vector<int, 2>;
|
|
|
using vec3 = math::vector::vector<double, 3>;
|
|
|
using vec3i = math::vector::vector<int, 3>;
|
|
|
@@ -26,18 +27,18 @@ vec3i iota3i() { return iota<int, 3>(); }
|
|
|
vec4i iota4i() { return iota<int, 4>(); }
|
|
|
|
|
|
TEST(Vector, Equality) {
|
|
|
- EXPECT_THAT((iota3i()), vec3i({1, 2, 3}));
|
|
|
- EXPECT_THAT((iota3i()), ::testing::Ne(vec3i({0, 2, 3})));
|
|
|
+ EXPECT_THAT((iota3i()), vec3i(1, 2, 3));
|
|
|
+ EXPECT_THAT((iota3i()), ::testing::Ne(vec3i(0, 2, 3)));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, Comparison) {
|
|
|
vec3i const iota = iota3i();
|
|
|
- vec3i const low_lt({0, 2, 3});
|
|
|
- vec3i const mid_lt({1, 1, 3});
|
|
|
- vec3i const high_lt({1, 2, 2});
|
|
|
- vec3i const low_gt({2, 2, 3});
|
|
|
- vec3i const mid_gt({1, 3, 3});
|
|
|
- vec3i const high_gt({1, 2, 4});
|
|
|
+ vec3i const low_lt{0, 2, 3};
|
|
|
+ vec3i const mid_lt{1, 1, 3};
|
|
|
+ vec3i const high_lt{1, 2, 2};
|
|
|
+ vec3i const low_gt{2, 2, 3};
|
|
|
+ vec3i const mid_gt{1, 3, 3};
|
|
|
+ vec3i const high_gt{1, 2, 4};
|
|
|
EXPECT_THAT(iota, ::testing::Gt(low_lt));
|
|
|
EXPECT_THAT(iota, ::testing::Gt(mid_lt));
|
|
|
EXPECT_THAT(iota, ::testing::Gt(high_lt));
|
|
|
@@ -51,15 +52,15 @@ TEST(Vector, Comparison) {
|
|
|
}
|
|
|
|
|
|
TEST(Vector, DefaultConstructorIsAllZero) {
|
|
|
- EXPECT_THAT(vec3i(), vec3i({0, 0, 0}));
|
|
|
+ EXPECT_THAT(vec3i(), vec3i(0, 0, 0));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, FillConstructorInsertsAllElements) {
|
|
|
- EXPECT_THAT(vec3i(1, math::vector::fill), vec3i({1, 1, 1}));
|
|
|
+ EXPECT_THAT(vec3i(1, math::vector::fill), vec3i(1, 1, 1));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, ExtensionConstructorAppendsZeros) {
|
|
|
- EXPECT_THAT(vec4i(iota3i()), vec4i({1, 2, 3, 0}));
|
|
|
+ EXPECT_THAT(vec4i(iota3i()), vec4i(1, 2, 3, 0));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, CanAccessVectorElements) {
|
|
|
@@ -90,81 +91,80 @@ TEST(Vector, AccessingOutOfRangeThrows) {
|
|
|
}
|
|
|
|
|
|
TEST(Vector, CrossProduct2DHasOnlyZElement) {
|
|
|
- EXPECT_THAT(vec2i({1, 1}).cross(vec2i({-1, 1})), vec3i({0, 0, 2}));
|
|
|
+ EXPECT_THAT(vec2i(1, 1).cross(vec2i(-1, 1)), vec3i(0, 0, 2));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, CrossProduct3DHasAllElements) {
|
|
|
- EXPECT_THAT(vec3i({1, 1, 2}).cross(vec3i({-1, 1, 1})), vec3i({-1, -3, 2}));
|
|
|
+ EXPECT_THAT(vec3i(1, 1, 2).cross(vec3i(-1, 1, 1)), vec3i(-1, -3, 2));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, AdditionIsPiecewise) {
|
|
|
- EXPECT_THAT((vec2i{{1, 0}} + vec2i{{0, 1}}), vec2i({1, 1}));
|
|
|
+ EXPECT_THAT((vec2i{1, 0} + vec2i{0, 1}), vec2i(1, 1));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, SubtractionIsPiecewise) {
|
|
|
- EXPECT_THAT((vec2i{{1, 0}} - vec2i{{0, 1}}), vec2i({1, -1}));
|
|
|
+ EXPECT_THAT((vec2i{1, 0} - vec2i{0, 1}), vec2i(1, -1));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, MultiplicationIsPiecewise) {
|
|
|
- EXPECT_THAT((vec2i{{1, 0}} * vec2i({2, 1})), vec2i({2, 0}));
|
|
|
+ EXPECT_THAT((vec2i{1, 0} * vec2i{2, 1}), vec2i(2, 0));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, DivisionIsPiecewise) {
|
|
|
- EXPECT_THAT((vec2i{{6, 4}} / vec2i({2, 1})), vec2i({3, 4}));
|
|
|
+ EXPECT_THAT((vec2i{6, 4} / vec2i{2, 1}), vec2i(3, 4));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, DivisionByZeroThrowsException) {
|
|
|
EXPECT_THROW(vec3{} / 0, std::domain_error);
|
|
|
- EXPECT_THROW((vec3{{1.0, 1.0, 1.0}} / vec3({1.0, 0.5, 0.0})),
|
|
|
- std::domain_error);
|
|
|
+ EXPECT_THROW((vec3{1.0, 1.0, 1.0} / vec3(1.0, 0.5, 0.0)), std::domain_error);
|
|
|
}
|
|
|
|
|
|
TEST(Vector, AdditionWithValueType) {
|
|
|
- EXPECT_THAT(vec2i({1, 0}) + 1, vec2i({2, 1}));
|
|
|
- EXPECT_THAT(1 + iota2i(), vec2i({2, 3}));
|
|
|
+ EXPECT_THAT(vec2i(1, 0) + 1, vec2i(2, 1));
|
|
|
+ EXPECT_THAT(1 + iota2i(), vec2i(2, 3));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, SubtractionWithValueType) {
|
|
|
- EXPECT_THAT(4 - iota2i(), vec2i({3, 2}));
|
|
|
- EXPECT_THAT(vec2i({1, 0}) - 1, vec2i({0, -1}));
|
|
|
+ EXPECT_THAT(4 - iota2i(), vec2i(3, 2));
|
|
|
+ EXPECT_THAT(vec2i(1, 0) - 1, vec2i(0, -1));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, MultiplicationWithValueType) {
|
|
|
- EXPECT_THAT((vec2i{{1, 0}} * 3), vec2i({3, 0}));
|
|
|
- EXPECT_THAT(2 * iota2i(), vec2i({2, 4}));
|
|
|
+ EXPECT_THAT((vec2i{{1, 0}} * 3), vec2i(3, 0));
|
|
|
+ EXPECT_THAT(2 * iota2i(), vec2i(2, 4));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, DivisionWithValueType) {
|
|
|
- EXPECT_THAT((vec2i{{6, 4}} / 2), vec2i({3, 2}));
|
|
|
+ EXPECT_THAT((vec2i{{6, 4}} / 2), vec2i(3, 2));
|
|
|
// EXPECT_THAT(4/iota2i(), (vec2i{4,2}));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, OperatorPlusEqualsMutatesValue) {
|
|
|
vec3i vec = iota3i();
|
|
|
- EXPECT_THAT(vec += iota3i(), vec3i({2, 4, 6}));
|
|
|
- EXPECT_THAT(vec, vec3i({2, 4, 6}));
|
|
|
- EXPECT_THAT(vec += 1, vec3i({3, 5, 7}));
|
|
|
- EXPECT_THAT(vec, vec3i({3, 5, 7}));
|
|
|
+ EXPECT_THAT(vec += iota3i(), vec3i(2, 4, 6));
|
|
|
+ EXPECT_THAT(vec, vec3i(2, 4, 6));
|
|
|
+ EXPECT_THAT(vec += 1, vec3i(3, 5, 7));
|
|
|
+ EXPECT_THAT(vec, vec3i(3, 5, 7));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, OperatorMinusEqualsMutatesValue) {
|
|
|
vec3i vec = iota3i();
|
|
|
- EXPECT_THAT(vec -= 1, vec3i({0, 1, 2}));
|
|
|
- EXPECT_THAT(vec, vec3i({0, 1, 2}));
|
|
|
- EXPECT_THAT(vec -= iota3i(), vec3i({-1, -1, -1}));
|
|
|
- EXPECT_THAT(vec, vec3i({-1, -1, -1}));
|
|
|
+ EXPECT_THAT(vec -= 1, vec3i(0, 1, 2));
|
|
|
+ EXPECT_THAT(vec, vec3i(0, 1, 2));
|
|
|
+ EXPECT_THAT(vec -= iota3i(), vec3i(-1, -1, -1));
|
|
|
+ EXPECT_THAT(vec, vec3i(-1, -1, -1));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, MultiplicationWorksAcrossTypes) {
|
|
|
- EXPECT_THAT(iota3i() * 0.5, vec3({0.5, 1.0, 1.5}));
|
|
|
- EXPECT_THAT(0.5 * iota3i(), vec3({0.5, 1.0, 1.5}));
|
|
|
- EXPECT_THAT(vec3({2.0, 1.5, -2}) * iota3i(), vec3({2.0, 3.0, -6.0}));
|
|
|
+ EXPECT_THAT(iota3i() * 0.5, vec3(0.5, 1.0, 1.5));
|
|
|
+ EXPECT_THAT(0.5 * iota3i(), vec3(0.5, 1.0, 1.5));
|
|
|
+ EXPECT_THAT(vec3(2.0, 1.5, -2) * iota3i(), vec3(2.0, 3.0, -6.0));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, DivisionWorksAcrossTypes) {
|
|
|
- EXPECT_THAT(iota3i() / 0.5, vec3({2.0, 4.0, 6.0}));
|
|
|
- EXPECT_THAT(iota3i() / vec3({2.0, 2.5, -2}), vec3({0.5, 0.8, -1.5}));
|
|
|
- EXPECT_THAT(vec3({2.0, 2.5, -3}) / iota3i(), vec3({2.0, 1.25, -1.0}));
|
|
|
+ EXPECT_THAT(iota3i() / 0.5, vec3(2.0, 4.0, 6.0));
|
|
|
+ EXPECT_THAT(iota3i() / vec3(2.0, 2.5, -2), vec3(0.5, 0.8, -1.5));
|
|
|
+ EXPECT_THAT(vec3(2.0, 2.5, -3) / iota3i(), vec3(2.0, 1.25, -1.0));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, Length) {
|
|
|
@@ -176,19 +176,19 @@ TEST(Vector, Length) {
|
|
|
|
|
|
TEST(Vector, Distance) {
|
|
|
// EXPECT_THAT((iota3i().distanceSquared(vec3i{3, 1, -1})), 21);
|
|
|
- EXPECT_THAT((iota3i() - vec3i({3, 1, -1})).magnitude(),
|
|
|
+ EXPECT_THAT((iota3i() - vec3i{3, 1, -1}).magnitude(),
|
|
|
::testing::DoubleNear(std::sqrt(21),
|
|
|
std::numeric_limits<double>::epsilon()));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, Projection) {
|
|
|
- EXPECT_THAT(iota3i().projection(vec3i({3, 1, -1})).magnitude(),
|
|
|
+ EXPECT_THAT(iota3i().projection(vec3i{3, 1, -1}).magnitude(),
|
|
|
::testing::DoubleNear(std::sqrt(4.0 / 11.0),
|
|
|
std::numeric_limits<double>::epsilon()));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, DotProductIsSumOfElementProducts) {
|
|
|
- EXPECT_THAT(iota3i().dot(vec3i({3, 0, -1})), 0);
|
|
|
+ EXPECT_THAT(iota3i().dot(vec3i{3, 0, -1}), 0);
|
|
|
}
|
|
|
|
|
|
TEST(Vector, UnitFunctionCreatesNewVectorOverMagnitude) {
|
|
|
@@ -203,7 +203,7 @@ TEST(Vector, UnitFunctionCreatesNewVectorOverMagnitude) {
|
|
|
}
|
|
|
|
|
|
TEST(Vector, CanCastEntireVectorThroughConstructor) {
|
|
|
- EXPECT_THAT(vec3i(vec3({1.0, 2.3, 3.9})), iota3i());
|
|
|
+ EXPECT_THAT(vec3i(vec3{1.0, 2.3, 3.9}), iota3i());
|
|
|
}
|
|
|
|
|
|
TEST(Vector, SwapExchangesAllValues) {
|
|
|
@@ -218,17 +218,17 @@ TEST(Vector, SwapExchangesAllValues) {
|
|
|
}
|
|
|
|
|
|
TEST(Vector, UnaryNegateOperatorNegatesAllElements) {
|
|
|
- EXPECT_THAT(-iota3i(), vec3i({-1, -2, -3}));
|
|
|
+ EXPECT_THAT(-iota3i(), vec3i(-1, -2, -3));
|
|
|
}
|
|
|
|
|
|
TEST(Vector, AbsoluteValueOfVectorAbsAllElements) {
|
|
|
EXPECT_THAT(iota3i(), abs(-iota3i()));
|
|
|
}
|
|
|
|
|
|
-TEST(Vector, MakeVectorAllowsConstuctionFromVariadicComponents) {
|
|
|
- EXPECT_TRUE((std::is_same<vec2i, decltype(make_vector(1, 2))>::value));
|
|
|
- EXPECT_THAT(iota2i(), make_vector(1, 2));
|
|
|
- EXPECT_FALSE((std::is_same<vec2i, decltype(make_vector(1, 2, 3))>::value));
|
|
|
- EXPECT_TRUE((std::is_same<vec3i, decltype(make_vector(1, 2, 3))>::value));
|
|
|
- EXPECT_THAT(iota3i(), make_vector(1, 2, 3));
|
|
|
+TEST(Vector, CanPerformTypeDeduced) {
|
|
|
+ EXPECT_TRUE((std::is_same<vec2i, decltype(vector{1, 2})>::value));
|
|
|
+ EXPECT_THAT(iota2i(), vector(1, 2));
|
|
|
+ EXPECT_FALSE((std::is_same<vec2i, decltype(vector{1, 2, 3})>::value));
|
|
|
+ EXPECT_TRUE((std::is_same<vec3i, decltype(vector{1, 2, 3})>::value));
|
|
|
+ EXPECT_THAT(iota3i(), vector(1, 2, 3));
|
|
|
}
|