VectorTests.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "../Tests.hpp"
  2. #include "core/math/Vector.hpp"
  3. const float eps = 0.0001f;
  4. using V3 = Core::Vector3;
  5. using I3 = Core::IntVector3;
  6. static void testInitAndRead() {
  7. V3 v1;
  8. Core::Vector2 v2(1.0f, 2.0f);
  9. V3 v3(3.0f, 4.0f, 5.0f);
  10. Core::Vector4 v4(6.0f, 7.0f, 8.0f, 9.0f);
  11. CORE_TEST_FLOAT(0.0f, v1[0], 0.0f);
  12. CORE_TEST_FLOAT(0.0f, v1[0], 0.0f);
  13. CORE_TEST_FLOAT(0.0f, v1[0], 0.0f);
  14. CORE_TEST_FLOAT(1.0f, v2[0], 0.0f);
  15. CORE_TEST_FLOAT(2.0f, v2[1], 0.0f);
  16. CORE_TEST_FLOAT(3.0f, v3[0], 0.0f);
  17. CORE_TEST_FLOAT(4.0f, v3[1], 0.0f);
  18. CORE_TEST_FLOAT(5.0f, v3[2], 0.0f);
  19. CORE_TEST_FLOAT(6.0f, v4[0], 0.0f);
  20. CORE_TEST_FLOAT(7.0f, v4[1], 0.0f);
  21. CORE_TEST_FLOAT(8.0f, v4[2], 0.0f);
  22. CORE_TEST_FLOAT(9.0f, v4[3], 0.0f);
  23. }
  24. static void testSetAngles() {
  25. float root = Core::Math::squareRoot(2.0f) * 0.5f;
  26. CORE_TEST_VECTOR(V3(1.0f, 0.0f, 0.0f), V3().setAngles(0.0f, 0.0f));
  27. CORE_TEST_VECTOR(V3(root, 0.0f, -root), V3().setAngles(45.0f, 0.0f));
  28. CORE_TEST_VECTOR(V3(0.0f, 0.0f, -1.0f), V3().setAngles(90.0f, 0.0f));
  29. CORE_TEST_VECTOR(V3(-root, 0.0f, -root), V3().setAngles(135.0f, 0.0f));
  30. CORE_TEST_VECTOR(V3(-1.0f, 0.0f, 0.0f), V3().setAngles(180.0f, 0.0f));
  31. CORE_TEST_VECTOR(V3(-root, 0.0f, root), V3().setAngles(225.0f, 0.0f));
  32. CORE_TEST_VECTOR(V3(0.0f, 0.0f, 1.0f), V3().setAngles(270.0f, 0.0f));
  33. CORE_TEST_VECTOR(V3(root, 0.0f, root), V3().setAngles(315.0f, 0.0f));
  34. CORE_TEST_VECTOR(V3(0.0f, 1.0f, 0.0f), V3().setAngles(0.0f, 90.0f));
  35. CORE_TEST_VECTOR(V3(0.0f, 1.0f, 0.0f), V3().setAngles(90.0f, 90.0f));
  36. CORE_TEST_VECTOR(V3(0.0f, 1.0f, 0.0f), V3().setAngles(180.0f, 90.0f));
  37. CORE_TEST_VECTOR(V3(0.0f, 1.0f, 0.0f), V3().setAngles(270.0f, 90.0f));
  38. CORE_TEST_VECTOR(V3(0.0f, -1.0f, 0.0f), V3().setAngles(0.0f, -90.0f));
  39. CORE_TEST_VECTOR(V3(0.0f, -1.0f, 0.0f), V3().setAngles(90.0f, -90.0f));
  40. CORE_TEST_VECTOR(V3(0.0f, -1.0f, 0.0f), V3().setAngles(180.0f, -90.0f));
  41. CORE_TEST_VECTOR(V3(0.0f, -1.0f, 0.0f), V3().setAngles(270.0f, -90.0f));
  42. CORE_TEST_VECTOR(V3(root, root, 0.0f), V3().setAngles(0.0f, 45.0f));
  43. CORE_TEST_VECTOR(V3(0.0f, root, -root), V3().setAngles(90.0f, 45.0f));
  44. CORE_TEST_VECTOR(V3(-root, root, 0.0f), V3().setAngles(180.0f, 45.0f));
  45. CORE_TEST_VECTOR(V3(0.0f, root, root), V3().setAngles(270.0f, 45.0f));
  46. CORE_TEST_VECTOR(V3(root, -root, 0.0f), V3().setAngles(0.0f, -45.0f));
  47. CORE_TEST_VECTOR(V3(0.0f, -root, -root), V3().setAngles(90.0f, -45.0f));
  48. CORE_TEST_VECTOR(V3(-root, -root, 0.0f), V3().setAngles(180.0f, -45.0f));
  49. CORE_TEST_VECTOR(V3(0.0f, -root, root), V3().setAngles(270.0f, -45.0f));
  50. CORE_TEST_VECTOR(V3(0.5f, root, -0.5f), V3().setAngles(45.0f, 45.0f));
  51. }
  52. static void testCross() {
  53. CORE_TEST_VECTOR(V3(0.0f, 0.0f, 1.0f),
  54. V3(1.0f, 0.0f, 0.0f).cross(V3(0.0f, 1.0f, 0.0f)));
  55. CORE_TEST_VECTOR(V3(0.0f, -1.0f, 0.0f),
  56. V3(1.0f, 0.0f, 0.0f).cross(V3(0.0f, 0.0f, 1.0f)));
  57. CORE_TEST_VECTOR(V3(0.0f, 0.0f, -1.0f),
  58. V3(0.0f, 1.0f, 0.0f).cross(V3(1.0f, 0.0f, 0.0f)));
  59. CORE_TEST_VECTOR(V3(1.0f, 0.0f, 0.0f),
  60. V3(0.0f, 1.0f, 0.0f).cross(V3(0.0f, 0.0f, 1.0f)));
  61. CORE_TEST_VECTOR(V3(0.0f, 1.0f, 0.0f),
  62. V3(0.0f, 0.0f, 1.0f).cross(V3(1.0f, 0.0f, 0.0f)));
  63. CORE_TEST_VECTOR(V3(-1.0f, 0.0f, 0.0f),
  64. V3(0.0f, 0.0f, 1.0f).cross(V3(0.0f, 1.0f, 0.0f)));
  65. }
  66. static void testSetAdd() {
  67. V3 v;
  68. v += V3(1.0f, 2.0f, 3.0f);
  69. CORE_TEST_VECTOR(V3(1.0f, 2.0f, 3.0f), v);
  70. v += V3(2.0f, 3.0f, 4.0f);
  71. CORE_TEST_VECTOR(V3(3.0f, 5.0f, 7.0f), v);
  72. }
  73. static void testAdd() {
  74. CORE_TEST_VECTOR(V3(1.0f, 2.0f, 3.0f), V3() + V3(1.0f, 2.0f, 3.0f));
  75. CORE_TEST_VECTOR(V3(3.0f, 5.0f, 7.0f),
  76. V3(1.0f, 2.0f, 3.0f) + V3(2.0f, 3.0f, 4.0f));
  77. }
  78. static void testSetSub() {
  79. V3 v;
  80. v -= V3(1.0f, 2.0f, 3.0f);
  81. CORE_TEST_VECTOR(V3(-1.0f, -2.0f, -3.0f), v);
  82. v -= V3(2.0f, 3.0f, 4.0f);
  83. CORE_TEST_VECTOR(V3(-3.0f, -5.0f, -7.0f), v);
  84. }
  85. static void testSub() {
  86. CORE_TEST_VECTOR(V3(1.0f, 2.0f, 3.0f), V3() - V3(-1.0f, -2.0f, -3.0f));
  87. CORE_TEST_VECTOR(V3(-1.0f, -1.0f, -1.0f),
  88. V3(1.0f, 2.0f, 3.0f) - V3(2.0f, 3.0f, 4.0f));
  89. }
  90. static void testInvert() {
  91. CORE_TEST_VECTOR(V3(-1.0f, 2.0f, 3.0f), -V3(1.0f, -2.0f, -3.0f));
  92. }
  93. static void testSetMul() {
  94. V3 v(1.0f, 2.0f, 3.0f);
  95. v *= 3.0f;
  96. CORE_TEST_VECTOR(V3(3.0f, 6.0f, 9.0f), v);
  97. v *= -2.0f;
  98. CORE_TEST_VECTOR(V3(-6.0f, -12.0f, -18.0f), v);
  99. }
  100. static void testMul() {
  101. CORE_TEST_VECTOR(V3(-3.0f, -6.0f, -9.0f), 3.0f * V3(-1.0f, -2.0f, -3.0f));
  102. CORE_TEST_VECTOR(V3(3.0f, 6.0f, 9.0f), V3(1.0f, 2.0f, 3.0f) * 3.0);
  103. }
  104. static void testSetMulVector() {
  105. V3 v(1.0f, 2.0f, 3.0f);
  106. v *= V3(2.0f, 1.0f, 3.0f);
  107. CORE_TEST_VECTOR(V3(2.0f, 2.0f, 9.0f), v);
  108. v *= V3(-3.0f, 4.0f, -2.0f);
  109. CORE_TEST_VECTOR(V3(-6.0f, 8.0f, -18.0f), v);
  110. }
  111. static void testMulVector() {
  112. CORE_TEST_VECTOR(V3(-2.0f, -2.0f, -9.0f),
  113. V3(2.0f, 1.0f, 3.0f) * V3(-1.0f, -2.0f, -3.0f));
  114. CORE_TEST_VECTOR(V3(2.0f, 2.0f, 9.0f),
  115. V3(1.0f, 2.0f, 3.0f) * V3(2.0f, 1.0f, 3.0f));
  116. }
  117. static void testSetDiv() {
  118. V3 v(12.0f, 24.0f, 9.0f);
  119. v /= 3.0f;
  120. CORE_TEST_VECTOR(V3(4.0f, 8.0f, 3.0f), v);
  121. v /= -2.0f;
  122. CORE_TEST_VECTOR(V3(-2.0f, -4.0f, -1.5f), v);
  123. }
  124. static void testDiv() {
  125. CORE_TEST_VECTOR(V3(-1.0f, -2.0f, -3.0f), V3(-3.0f, -6.0f, -9.0f) / 3.0f);
  126. }
  127. static void testDot() {
  128. CORE_TEST_FLOAT(9.0f, V3(-4.0f, 2.0f, -3.0f).dot(V3(-1.0f, -2.0f, -3.0f)),
  129. eps);
  130. CORE_TEST_FLOAT(-22.0f, V3(2.0f, 2.0f, -4.0f).dot(V3(1.0f, -2.0f, 5.0f)),
  131. eps);
  132. }
  133. static void testSquareLength() {
  134. CORE_TEST_FLOAT(29.0f, V3(-4.0f, 2.0f, -3.0f).squareLength(), eps);
  135. CORE_TEST_FLOAT(24.0f, V3(2.0f, 2.0f, -4.0f).squareLength(), eps);
  136. }
  137. static void testLength() {
  138. CORE_TEST_FLOAT(3.0f, V3(-2.0f, 2.0f, -1.0f).length(), eps);
  139. CORE_TEST_FLOAT(7.0f, V3(6.0f, 2.0f, -3.0f).length(), eps);
  140. }
  141. static void testNormalize() {
  142. V3 v1(-2.0f, 2.0f, -1.0f);
  143. V3 v2 = v1 * (1.0f / 3.0f);
  144. v1.normalize();
  145. CORE_TEST_VECTOR(v2, v1);
  146. V3 v3(6.0f, 2.0f, -3.0f);
  147. V3 v4 = v3 * (1.0f / 7.0f);
  148. v3.normalize();
  149. CORE_TEST_VECTOR(v4, v3);
  150. }
  151. static void testCast() {
  152. CORE_TEST_VECTOR(V3(-2.5f, 2.6f, 9.0f).toInt(), I3(-2, 2, 9));
  153. CORE_TEST_VECTOR(I3(-2.5f, 2.6f, 9.0f).toFloat(), V3(-2.0f, 2.0f, 9.0f));
  154. }
  155. static void testToString() {
  156. Core::String32<200> s;
  157. CORE_TEST_ERROR(s.append(Core::Vector<1, float>()));
  158. CORE_TEST_ERROR(s.append(Core::Vector2(2.0f, 3.0f)));
  159. CORE_TEST_ERROR(s.append(V3(4.0f, 5.0f, 6.0f)));
  160. Core::String32<200> s2;
  161. CORE_TEST_ERROR(s2.append("[0.00][2.00, 3.00][4.00, 5.00, 6.00]"));
  162. CORE_TEST_EQUAL(s2, s);
  163. }
  164. void Core::testVector() {
  165. testInitAndRead();
  166. testSetAngles();
  167. testCross();
  168. testSetAdd();
  169. testAdd();
  170. testSetSub();
  171. testSub();
  172. testInvert();
  173. testSetMul();
  174. testMul();
  175. testSetMulVector();
  176. testMulVector();
  177. testSetDiv();
  178. testDiv();
  179. testDot();
  180. testSquareLength();
  181. testLength();
  182. testNormalize();
  183. testCast();
  184. testToString();
  185. }