matrix_test.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //
  2. // matrix_test.cpp
  3. // matrix
  4. //
  5. // Created by Sam Jaffe on 6/3/18.
  6. //
  7. #include <gmock/gmock.h>
  8. #include "matrix.hpp"
  9. #include "matrix_helpers.hpp"
  10. using matr2i = math::matrix::matrix<int, 2, 2>;
  11. using matr2 = math::matrix::matrix<double, 2, 2>;
  12. TEST(Matrix, Equality) {
  13. using math::matrix::identity;
  14. EXPECT_THAT((identity<int, 2>()), matr2i({{{1,0},{0,1}}}));
  15. }
  16. TEST(Matrix, AdditionSumsAllElements) {
  17. auto iden = math::matrix::identity<int, 2>();
  18. auto result = matr2i({{{2,0},{0,2}}});
  19. EXPECT_THAT(iden + iden, result);
  20. }
  21. TEST(Matrix, DefaultConstructorIsZeros) {
  22. auto zero = matr2i({{{0,0},{0,0}}});
  23. EXPECT_THAT(matr2i{}, zero);
  24. }
  25. TEST(Matrix, SubtractionDiffsAllElements) {
  26. auto zero = matr2i({{{0,0},{0,0}}});
  27. auto iden = math::matrix::identity<int, 2>();
  28. EXPECT_THAT(iden-iden, zero);
  29. }
  30. TEST(Matrix, NegationAltersAllElements) {
  31. auto iden = math::matrix::identity<int, 2>();
  32. EXPECT_THAT(-iden, matr2i({{{-1,0},{0,-1}}}));
  33. }
  34. TEST(Matrix, _matrix_scaling) {
  35. auto iden = math::matrix::identity<double, 2>();
  36. EXPECT_THAT(2*iden, matr2({{{2.0,0.0},{0.0,2.0}}}));
  37. EXPECT_THAT(iden*2, matr2({{{2.0,0.0},{0.0,2.0}}}));
  38. EXPECT_THAT(iden/2.0, matr2({{{0.5,0.0},{0.0,0.5}}}));
  39. }
  40. TEST(Matrix, MultiplyingSameSizeMatricesProducesSameSize) {
  41. auto A = matr2i({{{1,2},{2,3}}});
  42. auto B = matr2i({{{1,0},{1,1}}});
  43. EXPECT_THAT(A*B, matr2i({{{3,2},{5,3}}}));
  44. EXPECT_THAT(B*A, matr2i({{{1,2},{3,5}}}));
  45. }
  46. TEST(Matrix, MultiplyingDifferentSizeMatricesChangesSize) {
  47. using matr2x2i = math::matrix::matrix<int, 2, 2>;
  48. using matr2x3i = math::matrix::matrix<int, 2, 3>;
  49. using matr3x2i = math::matrix::matrix<int, 3, 2>;
  50. using matr3x3i = math::matrix::matrix<int, 3, 3>;
  51. auto A = matr3x2i({{{1,0},{0,1},{1,1}}});
  52. auto B = matr2x3i({{{0,1,0},{1,0,1}}});
  53. EXPECT_THAT(A*B, matr3x3i({{{0,1,0},{1,0,1},{1,1,1}}}));
  54. EXPECT_THAT(B*A, matr2x2i({{{0,1},{2,1}}}));
  55. }
  56. TEST(Matrix, VectorMultiplicationProducesVector) {
  57. using vec2i = math::vector::vector<int, 2>;
  58. auto A = matr2i({{{1,0},{1,2}}});
  59. auto x = vec2i({1,2});
  60. EXPECT_THAT(A*x, vec2i({1,5}));
  61. }
  62. //TEST(Matrix, Composition) {
  63. // using namespace math::matrix;
  64. // using vec4 = math::vector::vector<double, 4>;
  65. // using vec3 = math::vector::vector<double, 3>;
  66. // auto rot = rotation<4>(math::degree{90}, rotate::X_AXIS);
  67. // auto mov = translation(vec3({2.0, 2.5, 1.5}));
  68. // auto scl = scalar(vec3(2.0, math::vector::fill));
  69. // vec4 epsilon{0.00001, math::vector::fill};
  70. // TS_ASSERT_DELTA((mov * scl * rot * vec4({1,2,3,1})),
  71. // (vec4({4.0,-1.5,-4.5,1.0})),
  72. // epsilon);
  73. //}
  74. TEST(Matrix, MatrixConstructableFromVector) {
  75. using vec3 = math::vector::vector<double, 3>;
  76. vec3 v = vec3({1,2,3});
  77. math::matrix::matrix<double, 3, 1> m{v};
  78. EXPECT_THAT(m(0,0), v[0]);
  79. EXPECT_THAT(m(1,0), v[1]);
  80. EXPECT_THAT(m(2,0), v[2]);
  81. }
  82. TEST(Matrix, CanAlterEntireRowInOneExpression) {
  83. matr2i A = math::matrix::identity<int, 2>();
  84. matr2i const B = 2 * A;
  85. A[0] = B[0];
  86. EXPECT_THAT(A, matr2i({{{2,0},{0,1}}}));
  87. }