vector_test.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // vector_test.cpp
  3. // vector
  4. //
  5. // Created by Sam Jaffe on 6/2/18.
  6. //
  7. #include <gmock/gmock.h>
  8. #include "vector.hpp"
  9. template <typename T, size_t N>
  10. math::vector::vector<T, N> iota() {
  11. math::vector::vector<T, N> rval;
  12. for (size_t i = 0; i < N; ++i) rval[i] = static_cast<T>(i+1);
  13. return rval;
  14. }
  15. using vec2i = math::vector::vector<int, 2>;
  16. using vec3 = math::vector::vector<double, 3>;
  17. using vec3i = math::vector::vector<int, 3>;
  18. using vec4i = math::vector::vector<int, 4>;
  19. vec2i iota2i() { return iota<int, 2>(); }
  20. vec3i iota3i() { return iota<int, 3>(); }
  21. TEST(Vector, Equality) {
  22. EXPECT_THAT((iota3i()), (vec3i{{1, 2, 3}}));
  23. EXPECT_THAT((iota3i()), ::testing::Not(vec3i{{0, 2, 3}}));
  24. }
  25. TEST(Vector, DefaultConstructorIsAllZero) {
  26. EXPECT_THAT(vec3i(), (vec3i{{0,0,0}}));
  27. }
  28. TEST(Vector, ExtensionConstructorAppendsZeros) {
  29. EXPECT_THAT(vec4i(iota3i()), (vec4i{{1,2,3,0}}));
  30. }
  31. TEST(Vector, CanAccessVectorElements) {
  32. math::vector::vector<int, 3> viota = iota3i();
  33. EXPECT_THAT(viota[0], 1);
  34. EXPECT_THAT(viota[1], 2);
  35. EXPECT_THAT(viota[2], 3);
  36. }
  37. TEST(Vector, AccessingOutOfRangeThrows) {
  38. EXPECT_THROW(iota3i().at(3), std::out_of_range);
  39. }
  40. TEST(Vector, CrossProduct2DHasOnlyZElement) {
  41. EXPECT_THAT((vec2i{{1,1}}.cross(vec2i{{-1,1}})), (vec3i{{0,0,2}}));
  42. }
  43. TEST(Vector, CrossProduct3DHasAllElements) {
  44. EXPECT_THAT((vec3i{{1,1,2}}.cross(vec3i{{-1,1,1}})), (vec3i{{-1,-3,2}}));
  45. }
  46. TEST(Vector, AdditionIsPiecewise) {
  47. EXPECT_THAT((vec2i{{1,0}} + vec2i{{0,1}}), (vec2i{{1,1}}));
  48. }
  49. TEST(Vector, SubtractionIsPiecewise) {
  50. EXPECT_THAT((vec2i{{1,0}} - vec2i{{0,1}}), (vec2i{{1,-1}}));
  51. }
  52. TEST(Vector, MultiplicationIsPiecewise) {
  53. EXPECT_THAT((vec2i{{1,0}}*(vec2i{{2,1}})), (vec2i{{2,0}}));
  54. }
  55. TEST(Vector, DivisionIsPiecewise) {
  56. EXPECT_THAT((vec2i{{6,4}}/(vec2i{{2,1}})), (vec2i{{3,4}}));
  57. }
  58. TEST(Vector, DivisionByZeroThrowsException) {
  59. EXPECT_THROW(vec3{} / 0, std::domain_error);
  60. EXPECT_THROW((vec3{{1.0, 1.0, 1.0}}/(vec3{{1.0, 0.5, 0.0}})), std::domain_error);
  61. }
  62. // TEST(Vector, AdditionWithValueType) {
  63. // EXPECT_THAT((vec2i{1,0} + 1), (vec2i{2,1}))
  64. // EXPECT_THAT(1+iota2i(), (vec2i{2,3}));
  65. // }
  66. //
  67. // TEST(Vector, SubtractionWithValueType) {
  68. // EXPECT_THAT(4-iota2i(), (vec2i{3,2}));
  69. // EXPECT_THAT((vec2i{1,0} - 1), (vec2i{0,-1}))
  70. // }
  71. TEST(Vector, MultiplicationWithValueType) {
  72. EXPECT_THAT((vec2i{{1,0}} * 3), (vec2i{{3,0}}));
  73. EXPECT_THAT(2*iota2i(), (vec2i{{2,4}}));
  74. }
  75. TEST(Vector, DivisionWithValueType) {
  76. EXPECT_THAT((vec2i{{6,4}} / 2), (vec2i{{3,2}}));
  77. // EXPECT_THAT(4/iota2i(), (vec2i{4,2}));
  78. }
  79. TEST(Vector, Length) {
  80. // EXPECT_THAT(iota3i().lengthSquared(), 14);
  81. EXPECT_THAT(iota3i().magnitude(),
  82. ::testing::DoubleNear(std::sqrt(14), 0.00001));
  83. }
  84. TEST(Vector, Distance) {
  85. // EXPECT_THAT((iota3i().distanceSquared(vec3i{3, 1, -1})), 21);
  86. EXPECT_THAT((iota3i() - vec3i{{3, 1, -1}}).magnitude(),
  87. ::testing::DoubleNear(std::sqrt(21), 0.00001));
  88. }
  89. TEST(Vector, Projection) {
  90. EXPECT_THAT((iota3i().projection(vec3i{{3, 1, -1}})).magnitude(),
  91. ::testing::DoubleNear(std::sqrt(4.0/11.0), 0.00001));
  92. }
  93. TEST(Vector, DotProductIsSumOfElementProducts) {
  94. EXPECT_THAT((iota3i().dot(vec3i{{3, 0, -1}})), 0);
  95. }
  96. TEST(Vector, UnitFunctionCreatesNewVectorOverMagnitude) {
  97. double sq = std::sqrt(14);
  98. auto unit = iota3i().unit();
  99. EXPECT_THAT(unit[0], ::testing::DoubleNear(1/sq, 0.00001));
  100. EXPECT_THAT(unit[1], ::testing::DoubleNear(2/sq, 0.00001));
  101. EXPECT_THAT(unit[2], ::testing::DoubleNear(3/sq, 0.00001));
  102. }
  103. TEST(Vector, CanCastEntireVectorThroughConstructor) {
  104. EXPECT_THAT((vec3i(vec3{{1.0, 2.3, 3.9}})), iota3i());
  105. }
  106. TEST(Vector, SwapExchangesAllValues) {
  107. using std::swap;
  108. vec2i a{{1, 2}}; const vec2i ac = a;
  109. vec2i b{{5, 7}}; const vec2i bc = b;
  110. swap(a, b);
  111. EXPECT_THAT(a, bc);
  112. EXPECT_THAT(b, ac);
  113. }
  114. TEST(Vector, UnaryNegateOperatorNegatesAllElements) {
  115. EXPECT_THAT(-iota3i(), (vec3i{{-1,-2,-3}}));
  116. }
  117. TEST(Vector, AbsoluteValueOfVectorAbsAllElements) {
  118. EXPECT_THAT(iota3i(), abs(-iota3i()));
  119. }
  120. TEST(Vector, MakeVectorAllowsConstuctionFromVariadicComponents) {
  121. EXPECT_TRUE((std::is_same<vec2i, decltype(make_vector(1, 2))>::value));
  122. EXPECT_THAT(iota2i(), make_vector(1, 2));
  123. EXPECT_FALSE((std::is_same<vec2i, decltype(make_vector(1, 2, 3))>::value));
  124. EXPECT_TRUE((std::is_same<vec3i, decltype(make_vector(1, 2, 3))>::value));
  125. EXPECT_THAT(iota3i(), make_vector(1, 2, 3));
  126. }