vector_tc.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include <cxxtest/TestSuite.h>
  2. #include "vector.hpp"
  3. class vector_TestSuite : public CxxTest::TestSuite {
  4. public:
  5. using vec2i = math::vector::raw_vector<2, int>;
  6. using vec3 = math::vector::raw_vector<3, double>;
  7. using vec3i = math::vector::raw_vector<3, int>;
  8. using vec4i = math::vector::raw_vector<4, int>;
  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::raw_vector<3, int> 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<3, int>()).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} * vec2i{2,1}), (vec2i{2,0}))
  44. }
  45. void test_vector_divides_vector() const {
  46. TS_ASSERT_EQUALS((vec2i{6,4} / 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. void test_vector_subtraction_value() const {
  52. TS_ASSERT_EQUALS((vec2i{1,0} - 1), (vec2i{0,-1}))
  53. }
  54. void test_vector_multiplication_value() const {
  55. TS_ASSERT_EQUALS((vec2i{1,0} * 3), (vec2i{3,0}))
  56. }
  57. void test_vector_divides_value() const {
  58. TS_ASSERT_EQUALS((vec2i{6,4} / 2), (vec2i{3,2}))
  59. }
  60. void test_value_addition_vector() const {
  61. TS_ASSERT_EQUALS(1+iota2i(), (vec2i{2,3}));
  62. }
  63. void test_value_subtraction_vector() const {
  64. TS_ASSERT_EQUALS(4-iota2i(), (vec2i{3,2}));
  65. }
  66. void test_value_multiplication_vector() const {
  67. TS_ASSERT_EQUALS(2*iota2i(), (vec2i{2,4}));
  68. }
  69. void test_value_divides_vector() const {
  70. TS_ASSERT_EQUALS(4/iota2i(), (vec2i{4,2}));
  71. }
  72. void test_length_of_vector() const {
  73. TS_ASSERT_EQUALS(iota3i().lengthSquared(), 14);
  74. TS_ASSERT_DELTA(iota3i().length(), std::sqrt(14), 0.00001);
  75. }
  76. void test_distance_of_vector() const {
  77. TS_ASSERT_EQUALS((iota3i().distanceSquared(vec3i{3, 1, -1})), 21);
  78. TS_ASSERT_DELTA((iota3i().distance(vec3i{3, 1, -1})), std::sqrt(21), 0.00001);
  79. }
  80. void test_dot_product() const {
  81. TS_ASSERT_EQUALS((iota3i().dot(vec3i{3, 0, -1})), 0);
  82. }
  83. void test_unit_vector() const {
  84. double sq = std::sqrt(14);
  85. vec3 epsilon{0.00001, math::vector::fill};
  86. TS_ASSERT_DELTA(iota3i().unit(), (vec3{1/sq, 2/sq, 3/sq}), epsilon);
  87. }
  88. void test_type_shift() const {
  89. TS_ASSERT_EQUALS((vec3i(vec3{1.0, 2.3, 3.9})), iota3i());
  90. }
  91. void test_swap() const {
  92. vec2i a{1, 2}; const vec2i ac = a;
  93. vec2i b{5, 7}; const vec2i bc = b;
  94. a.swap(b);
  95. TS_ASSERT_EQUALS(a, bc);
  96. TS_ASSERT_EQUALS(b, ac);
  97. }
  98. void test_negate_vector() const {
  99. TS_ASSERT_EQUALS(-iota3i(), (vec3i{-1,-2,-3}));
  100. }
  101. void test_absolute_value() const {
  102. TS_ASSERT_EQUALS(iota3i(), std::abs(-iota3i()));
  103. }
  104. private:
  105. template <size_t N, typename T> math::vector::raw_vector<N, T> iota() const {
  106. math::vector::raw_vector<N, T> rval;
  107. for (size_t i = 0; i < N; ++i) rval[i] = static_cast<T>(i+1);
  108. return rval;
  109. }
  110. vec2i iota2i() const { return iota<2, int>(); }
  111. vec3i iota3i() const { return iota<3, int>(); }
  112. };