|
@@ -5,19 +5,19 @@
|
|
|
// Created by Sam Jaffe on 6/3/18.
|
|
// Created by Sam Jaffe on 6/3/18.
|
|
|
//
|
|
//
|
|
|
|
|
|
|
|
-#include <gmock/gmock.h>
|
|
|
|
|
|
|
+#include <testing/xcode_gtest_helper.h>
|
|
|
|
|
|
|
|
#include "math/matrix/matrix.hpp"
|
|
#include "math/matrix/matrix.hpp"
|
|
|
|
|
|
|
|
using matr2i = math::matrix::matrix<int, 2, 2>;
|
|
using matr2i = math::matrix::matrix<int, 2, 2>;
|
|
|
using matr2 = math::matrix::matrix<double, 2, 2>;
|
|
using matr2 = math::matrix::matrix<double, 2, 2>;
|
|
|
|
|
|
|
|
-matr2i identity2i() { return matr2i({{{1, 0}, {0, 1}}}); }
|
|
|
|
|
-matr2 identity2() { return matr2({{{1, 0}, {0, 1}}}); }
|
|
|
|
|
|
|
+matr2i identity2i() { return matr2i{{1, 0}, {0, 1}}; }
|
|
|
|
|
+matr2 identity2() { return matr2{{1, 0}, {0, 1}}; }
|
|
|
|
|
|
|
|
TEST(Matrix, Equality) {
|
|
TEST(Matrix, Equality) {
|
|
|
- EXPECT_THAT(identity2i(), matr2i({{{1, 0}, {0, 1}}}));
|
|
|
|
|
- EXPECT_THAT(identity2i(), ::testing::Ne(matr2i({{{0, 1}, {0, 1}}})));
|
|
|
|
|
|
|
+ EXPECT_THAT(identity2i(), (matr2i{{1, 0}, {0, 1}}));
|
|
|
|
|
+ EXPECT_THAT(identity2i(), ::testing::Ne(matr2i{{0, 1}, {0, 1}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, AtRowBeyondBoundaryThrowsException) {
|
|
TEST(Matrix, AtRowBeyondBoundaryThrowsException) {
|
|
@@ -53,25 +53,25 @@ TEST(Matrix, ConstAtColumnBeyondBoundaryThrowsException) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, TransposeOfSquareMatrixRotatesAroundDiagonal) {
|
|
TEST(Matrix, TransposeOfSquareMatrixRotatesAroundDiagonal) {
|
|
|
- matr2i mat({{{1, 1}, {2, 2}}});
|
|
|
|
|
- EXPECT_THAT(mat.transpose(), matr2i({{{1, 2}, {1, 2}}}));
|
|
|
|
|
|
|
+ matr2i mat{{1, 1}, {2, 2}};
|
|
|
|
|
+ EXPECT_THAT(mat.transpose(), (matr2i{{1, 2}, {1, 2}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, TransposeOfMatrixFlipsDimension) {
|
|
TEST(Matrix, TransposeOfMatrixFlipsDimension) {
|
|
|
using matr3x2i = math::matrix::matrix<int, 3, 2>;
|
|
using matr3x2i = math::matrix::matrix<int, 3, 2>;
|
|
|
using matr2x3i = math::matrix::matrix<int, 2, 3>;
|
|
using matr2x3i = math::matrix::matrix<int, 2, 3>;
|
|
|
- matr3x2i mat({{{1, 1}, {2, 2}, {3, 3}}});
|
|
|
|
|
- EXPECT_THAT(mat.transpose(), matr2x3i({{{1, 2, 3}, {1, 2, 3}}}));
|
|
|
|
|
|
|
+ matr3x2i mat{{1, 1}, {2, 2}, {3, 3}};
|
|
|
|
|
+ EXPECT_THAT(mat.transpose(), (matr2x3i{{1, 2, 3}, {1, 2, 3}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, AdditionSumsAllElements) {
|
|
TEST(Matrix, AdditionSumsAllElements) {
|
|
|
auto iden = identity2i();
|
|
auto iden = identity2i();
|
|
|
- auto result = matr2i({{{2, 0}, {0, 2}}});
|
|
|
|
|
|
|
+ auto result = matr2i{{2, 0}, {0, 2}};
|
|
|
EXPECT_THAT(iden + iden, result);
|
|
EXPECT_THAT(iden + iden, result);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, DefaultConstructorIsZeros) {
|
|
TEST(Matrix, DefaultConstructorIsZeros) {
|
|
|
- auto zero = matr2i({{{0, 0}, {0, 0}}});
|
|
|
|
|
|
|
+ auto zero = matr2i{{0, 0}, {0, 0}};
|
|
|
EXPECT_THAT(matr2i{}, zero);
|
|
EXPECT_THAT(matr2i{}, zero);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -81,23 +81,23 @@ TEST(Matrix, SubtractionDiffsAllElements) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, NegationAltersAllElements) {
|
|
TEST(Matrix, NegationAltersAllElements) {
|
|
|
- EXPECT_THAT(-identity2i(), matr2i({{{-1, 0}, {0, -1}}}));
|
|
|
|
|
|
|
+ EXPECT_THAT(-identity2i(), (matr2i{{-1, 0}, {0, -1}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, MultiplicationAltersAllElements) {
|
|
TEST(Matrix, MultiplicationAltersAllElements) {
|
|
|
- EXPECT_THAT(2 * identity2(), matr2({{{2.0, 0.0}, {0.0, 2.0}}}));
|
|
|
|
|
- EXPECT_THAT(identity2() * 2, matr2({{{2.0, 0.0}, {0.0, 2.0}}}));
|
|
|
|
|
|
|
+ EXPECT_THAT(2 * identity2(), (matr2{{2.0, 0.0}, {0.0, 2.0}}));
|
|
|
|
|
+ EXPECT_THAT(identity2() * 2, (matr2{{2.0, 0.0}, {0.0, 2.0}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, DivisionAltersAllElements) {
|
|
TEST(Matrix, DivisionAltersAllElements) {
|
|
|
- EXPECT_THAT(identity2() / 2.0, matr2({{{0.5, 0.0}, {0.0, 0.5}}}));
|
|
|
|
|
|
|
+ EXPECT_THAT(identity2() / 2.0, (matr2{{0.5, 0.0}, {0.0, 0.5}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, MultiplyingSameSizeMatricesProducesSameSize) {
|
|
TEST(Matrix, MultiplyingSameSizeMatricesProducesSameSize) {
|
|
|
- auto A = matr2i({{{1, 2}, {2, 3}}});
|
|
|
|
|
- auto B = matr2i({{{1, 0}, {1, 1}}});
|
|
|
|
|
- EXPECT_THAT(A * B, matr2i({{{3, 2}, {5, 3}}}));
|
|
|
|
|
- EXPECT_THAT(B * A, matr2i({{{1, 2}, {3, 5}}}));
|
|
|
|
|
|
|
+ auto A = matr2i{{1, 2}, {2, 3}};
|
|
|
|
|
+ auto B = matr2i{{1, 0}, {1, 1}};
|
|
|
|
|
+ EXPECT_THAT(A * B, (matr2i{{3, 2}, {5, 3}}));
|
|
|
|
|
+ EXPECT_THAT(B * A, (matr2i{{1, 2}, {3, 5}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, MultiplyingDifferentSizeMatricesChangesSize) {
|
|
TEST(Matrix, MultiplyingDifferentSizeMatricesChangesSize) {
|
|
@@ -105,30 +105,31 @@ TEST(Matrix, MultiplyingDifferentSizeMatricesChangesSize) {
|
|
|
using matr2x3i = math::matrix::matrix<int, 2, 3>;
|
|
using matr2x3i = math::matrix::matrix<int, 2, 3>;
|
|
|
using matr3x2i = math::matrix::matrix<int, 3, 2>;
|
|
using matr3x2i = math::matrix::matrix<int, 3, 2>;
|
|
|
using matr3x3i = math::matrix::matrix<int, 3, 3>;
|
|
using matr3x3i = math::matrix::matrix<int, 3, 3>;
|
|
|
- auto A = matr3x2i({{{1, 0}, {0, 1}, {1, 1}}});
|
|
|
|
|
- auto B = matr2x3i({{{0, 1, 0}, {1, 0, 1}}});
|
|
|
|
|
- EXPECT_THAT(A * B, matr3x3i({{{0, 1, 0}, {1, 0, 1}, {1, 1, 1}}}));
|
|
|
|
|
- EXPECT_THAT(B * A, matr2x2i({{{0, 1}, {2, 1}}}));
|
|
|
|
|
|
|
+ auto A = matr3x2i{{1, 0}, {0, 1}, {1, 1}};
|
|
|
|
|
+ auto B = matr2x3i{{0, 1, 0}, {1, 0, 1}};
|
|
|
|
|
+ EXPECT_THAT(A * B, (matr3x3i{{0, 1, 0}, {1, 0, 1}, {1, 1, 1}}));
|
|
|
|
|
+ EXPECT_THAT(B * A, (matr2x2i{{0, 1}, {2, 1}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, VectorMultiplicationProducesVector) {
|
|
TEST(Matrix, VectorMultiplicationProducesVector) {
|
|
|
using vec2i = math::vector::vector<int, 2>;
|
|
using vec2i = math::vector::vector<int, 2>;
|
|
|
- auto A = matr2i({{{1, 0}, {1, 2}}});
|
|
|
|
|
- auto x = vec2i({1, 2});
|
|
|
|
|
- EXPECT_THAT(A * x, vec2i({1, 5}));
|
|
|
|
|
|
|
+ auto A = matr2i{{1, 0}, {1, 2}};
|
|
|
|
|
+ auto x = vec2i{1, 2};
|
|
|
|
|
+ EXPECT_THAT(A * x, vec2i(1, 5));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, ConcatenationExtends) {
|
|
TEST(Matrix, ConcatenationExtends) {
|
|
|
using namespace math::matrix;
|
|
using namespace math::matrix;
|
|
|
- auto A = matr2i({{{1, 2}, {2, 3}}});
|
|
|
|
|
- auto B = matr2i({{{1, 0}, {1, 1}}});
|
|
|
|
|
|
|
+ using namespace math::vector;
|
|
|
|
|
+ auto A = matr2i{{1, 2}, {2, 3}};
|
|
|
|
|
+ auto B = matr2i{{1, 0}, {1, 1}};
|
|
|
EXPECT_THAT(A.concat(B, concat_strategy::horizontal),
|
|
EXPECT_THAT(A.concat(B, concat_strategy::horizontal),
|
|
|
- (matrix<int, 2, 4>({{{1, 2, 1, 0}, {2, 3, 1, 1}}})));
|
|
|
|
|
|
|
+ (matrix{vector{1, 2, 1, 0}, {2, 3, 1, 1}}));
|
|
|
EXPECT_THAT(A.concat(B, concat_strategy::vertical),
|
|
EXPECT_THAT(A.concat(B, concat_strategy::vertical),
|
|
|
- (matrix<int, 4, 2>({{{1, 2}, {2, 3}, {1, 0}, {1, 1}}})));
|
|
|
|
|
- EXPECT_THAT(A.concat(B, concat_strategy::diagonal),
|
|
|
|
|
- (matrix<int, 4, 4>(
|
|
|
|
|
- {{{1, 2, 0, 0}, {2, 3, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}}})));
|
|
|
|
|
|
|
+ (matrix{vector{1, 2}, {2, 3}, {1, 0}, {1, 1}}));
|
|
|
|
|
+ EXPECT_THAT(
|
|
|
|
|
+ A.concat(B, concat_strategy::diagonal),
|
|
|
|
|
+ (matrix{vector{1, 2, 0, 0}, {2, 3, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// TEST(Matrix, Composition) {
|
|
// TEST(Matrix, Composition) {
|
|
@@ -136,17 +137,17 @@ TEST(Matrix, ConcatenationExtends) {
|
|
|
// using vec4 = math::vector::vector<double, 4>;
|
|
// using vec4 = math::vector::vector<double, 4>;
|
|
|
// using vec3 = math::vector::vector<double, 3>;
|
|
// using vec3 = math::vector::vector<double, 3>;
|
|
|
// auto rot = rotation<4>(math::degree{90}, rotate::X_AXIS);
|
|
// auto rot = rotation<4>(math::degree{90}, rotate::X_AXIS);
|
|
|
-// auto mov = translation(vec3({2.0, 2.5, 1.5}));
|
|
|
|
|
|
|
+// auto mov = translation(vec3{2.0, 2.5, 1.5});
|
|
|
// auto scl = scalar(vec3(2.0, math::vector::fill));
|
|
// auto scl = scalar(vec3(2.0, math::vector::fill));
|
|
|
// vec4 epsilon{0.00001, math::vector::fill};
|
|
// vec4 epsilon{0.00001, math::vector::fill};
|
|
|
-// TS_ASSERT_DELTA((mov * scl * rot * vec4({1,2,3,1})),
|
|
|
|
|
-// (vec4({4.0,-1.5,-4.5,1.0})),
|
|
|
|
|
|
|
+// TS_ASSERT_DELTA((mov * scl * rot * vec4{1,2,3,1}),
|
|
|
|
|
+// (vec4{4.0,-1.5,-4.5,1.0}),
|
|
|
// epsilon);
|
|
// epsilon);
|
|
|
//}
|
|
//}
|
|
|
|
|
|
|
|
TEST(Matrix, MatrixConstructableFromVector) {
|
|
TEST(Matrix, MatrixConstructableFromVector) {
|
|
|
using vec3 = math::vector::vector<double, 3>;
|
|
using vec3 = math::vector::vector<double, 3>;
|
|
|
- vec3 v = vec3({1, 2, 3});
|
|
|
|
|
|
|
+ vec3 v = vec3{1, 2, 3};
|
|
|
math::matrix::matrix<double, 3, 1> m{v};
|
|
math::matrix::matrix<double, 3, 1> m{v};
|
|
|
EXPECT_THAT(m(0, 0), v[0]);
|
|
EXPECT_THAT(m(0, 0), v[0]);
|
|
|
EXPECT_THAT(m(1, 0), v[1]);
|
|
EXPECT_THAT(m(1, 0), v[1]);
|
|
@@ -156,12 +157,14 @@ TEST(Matrix, MatrixConstructableFromVector) {
|
|
|
TEST(Matrix, RowAllowsMutation) {
|
|
TEST(Matrix, RowAllowsMutation) {
|
|
|
matr2i A = identity2i();
|
|
matr2i A = identity2i();
|
|
|
A[0][0] = 2;
|
|
A[0][0] = 2;
|
|
|
- EXPECT_THAT(A, matr2i({{{2, 0}, {0, 1}}}));
|
|
|
|
|
|
|
+ EXPECT_THAT(A, (matr2i{{2, 0}, {0, 1}}));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(Matrix, CanAlterEntireRowInOneExpression) {
|
|
TEST(Matrix, CanAlterEntireRowInOneExpression) {
|
|
|
matr2i A = identity2i();
|
|
matr2i A = identity2i();
|
|
|
matr2i const B = 2 * A;
|
|
matr2i const B = 2 * A;
|
|
|
A[0] = B[0];
|
|
A[0] = B[0];
|
|
|
- EXPECT_THAT(A, matr2i({{{2, 0}, {0, 1}}}));
|
|
|
|
|
|
|
+ EXPECT_THAT(A, (matr2i{{2, 0}, {0, 1}}));
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+TEST(Matrix, CannotCompile) { matr2i{{2, 0}}; }
|