vector.t.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include <cxxtest/TestSuite.h>
  2. #include "vector.hpp"
  3. class vector_TestSuite : public CxxTest::TestSuite {
  4. public:
  5. using vec2i = math::vector::vector<int, 2>;
  6. using vec3 = math::vector::vector<double, 3>;
  7. using vec3i = math::vector::vector<int, 3>;
  8. using vec4i = math::vector::vector<int, 4>;
  9. void test_vector_equals() const {
  10. TS_ASSERT_EQUALS(iota3i(), (vec3i{1, 2, 3}));
  11. }
  12. void test_vector_notequals() const {
  13. TS_ASSERT_DIFFERS(iota3i(), (vec3i{0, 2, 3}));
  14. }
  15. void test_vector_elems() const {
  16. math::vector::vector<int, 3> viota = iota3i();
  17. TS_ASSERT_EQUALS(viota[0], 1);
  18. TS_ASSERT_EQUALS(viota[1], 2);
  19. TS_ASSERT_EQUALS(viota[2], 3);
  20. }
  21. void test_vector_oob() const {
  22. TS_ASSERT_THROWS((iota<int, 3>()).at(3), std::out_of_range);
  23. }
  24. void test_default_zero() const {
  25. TS_ASSERT_EQUALS(vec3i(), (vec3i{0,0,0}));
  26. }
  27. void test_extends_with_zero() const {
  28. TS_ASSERT_EQUALS(vec4i(iota3i()), (vec4i{1,2,3,0}));
  29. }
  30. void test_vec2_cross() const {
  31. TS_ASSERT_EQUALS((vec2i{1,1}.cross(vec2i{-1,1})), (vec3i{0,0,2}));
  32. }
  33. void test_vec3_cross() const {
  34. TS_ASSERT_EQUALS((vec3i{1,1,2}.cross(vec3i{-1,1,1})), (vec3i{-1,-3,2}));
  35. }
  36. void test_vector_addition_vector() const {
  37. TS_ASSERT_EQUALS((vec2i{1,0} + vec2i{0,1}), (vec2i{1,1}))
  38. }
  39. void test_vector_subtraction_vector() const {
  40. TS_ASSERT_EQUALS((vec2i{1,0} - vec2i{0,1}), (vec2i{1,-1}))
  41. }
  42. void test_vector_multiplication_vector() const {
  43. TS_ASSERT_EQUALS((vec2i{1,0}.scaled(vec2i{2,1})), (vec2i{2,0}))
  44. }
  45. void test_vector_divides_vector() const {
  46. TS_ASSERT_EQUALS((vec2i{6,4}.invscaled(vec2i{2,1})), (vec2i{3,4}))
  47. }
  48. // void test_vector_addition_value() const {
  49. // TS_ASSERT_EQUALS((vec2i{1,0} + 1), (vec2i{2,1}))
  50. // }
  51. //
  52. // void test_vector_subtraction_value() const {
  53. // TS_ASSERT_EQUALS((vec2i{1,0} - 1), (vec2i{0,-1}))
  54. // }
  55. void test_vector_multiplication_value() const {
  56. TS_ASSERT_EQUALS((vec2i{1,0} * 3), (vec2i{3,0}))
  57. }
  58. void test_vector_divides_value() const {
  59. TS_ASSERT_EQUALS((vec2i{6,4} / 2), (vec2i{3,2}))
  60. }
  61. // void test_value_addition_vector() const {
  62. // TS_ASSERT_EQUALS(1+iota2i(), (vec2i{2,3}));
  63. // }
  64. //
  65. // void test_value_subtraction_vector() const {
  66. // TS_ASSERT_EQUALS(4-iota2i(), (vec2i{3,2}));
  67. // }
  68. void test_value_multiplication_vector() const {
  69. TS_ASSERT_EQUALS(2*iota2i(), (vec2i{2,4}));
  70. }
  71. // void test_value_divides_vector() const {
  72. // TS_ASSERT_EQUALS(4/iota2i(), (vec2i{4,2}));
  73. // }
  74. void test_length_of_vector() const {
  75. // TS_ASSERT_EQUALS(iota3i().lengthSquared(), 14);
  76. TS_ASSERT_DELTA(iota3i().magnitude(), std::sqrt(14), 0.00001);
  77. }
  78. void test_distance_of_vector() const {
  79. // TS_ASSERT_EQUALS((iota3i().distanceSquared(vec3i{3, 1, -1})), 21);
  80. TS_ASSERT_DELTA((iota3i() - vec3i{3, 1, -1}).magnitude(), std::sqrt(21), 0.00001);
  81. }
  82. void test_projection_of_vector() const {
  83. TS_ASSERT_DELTA((iota3i().projection(vec3i{3, 1, -1})).magnitude(), std::sqrt(4.0/11.0), 0.00001);
  84. }
  85. void test_dot_product() const {
  86. TS_ASSERT_EQUALS((iota3i().dot(vec3i{3, 0, -1})), 0);
  87. }
  88. void test_unit_vector() const {
  89. double sq = std::sqrt(14);
  90. vec3 epsilon{0.00001, math::vector::fill};
  91. TS_ASSERT_DELTA(iota3i().unit(), (vec3{1/sq, 2/sq, 3/sq}), epsilon);
  92. }
  93. void test_type_shift() const {
  94. TS_ASSERT_EQUALS((vec3i(vec3{1.0, 2.3, 3.9})), iota3i());
  95. }
  96. void test_swap() const {
  97. vec2i a{1, 2}; const vec2i ac = a;
  98. vec2i b{5, 7}; const vec2i bc = b;
  99. swap(a, b);
  100. TS_ASSERT_EQUALS(a, bc);
  101. TS_ASSERT_EQUALS(b, ac);
  102. }
  103. void test_negate_vector() const {
  104. TS_ASSERT_EQUALS(-iota3i(), (vec3i{-1,-2,-3}));
  105. }
  106. void test_absolute_value() const {
  107. TS_ASSERT_EQUALS(iota3i(), abs(-iota3i()));
  108. }
  109. private:
  110. template <typename T, size_t N> math::vector::vector<T, N> iota() const {
  111. math::vector::vector<T, N> rval;
  112. for (size_t i = 0; i < N; ++i) rval[i] = static_cast<T>(i+1);
  113. return rval;
  114. }
  115. vec2i iota2i() const { return iota<int, 2>(); }
  116. vec3i iota3i() const { return iota<int, 3>(); }
  117. };