VectorTests.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <math.h>
  2. #include "tests/VectorTests.h"
  3. #include "tests/Test.h"
  4. #include "utils/StringBuffer.h"
  5. #include "math/Vector.h"
  6. const float eps = 0.0001f;
  7. template<int N>
  8. static void compareVectors(Test& test, const Vector<N>& wanted, const Vector<N>& actual, const char* text) {
  9. for(int i = 0; i < N; i++) {
  10. test.checkFloat(wanted[i], actual[i], eps, StringBuffer<50>(text).append(" (").append(i).append(")"));
  11. }
  12. }
  13. static void testInitAndRead(Test& test) {
  14. Vector3 v1;
  15. Vector2 v2(1.0f, 2.0f);
  16. Vector3 v3(3.0f, 4.0f, 5.0f);
  17. test.checkEqual(0.0f, v1[0], "init 1");
  18. test.checkEqual(0.0f, v1[0], "init 2");
  19. test.checkEqual(0.0f, v1[0], "init 3");
  20. test.checkEqual(1.0f, v2[0], "init 4");
  21. test.checkEqual(2.0f, v2[1], "init 5");
  22. test.checkEqual(3.0f, v3[0], "init 6");
  23. test.checkEqual(4.0f, v3[1], "init 7");
  24. test.checkEqual(5.0f, v3[2], "init 8");
  25. }
  26. static void testSetAngles(Test& test) {
  27. float root = sqrtf(2.0f) * 0.5f;
  28. compareVectors(test, Vector3(1.0f, 0.0f, 0.0f), Vector3().setAngles(0.0f, 0.0f), "angle 0 | 0");
  29. compareVectors(test, Vector3(root, 0.0f, -root), Vector3().setAngles(45.0f, 0.0f), "angle 45 | 0");
  30. compareVectors(test, Vector3(0.0f, 0.0f, -1.0f), Vector3().setAngles(90.0f, 0.0f), "angle 90 | 0");
  31. compareVectors(test, Vector3(-root, 0.0f, -root), Vector3().setAngles(135.0f, 0.0f), "angle 135 | 0");
  32. compareVectors(test, Vector3(-1.0f, 0.0f, 0.0f), Vector3().setAngles(180.0f, 0.0f), "angle 180 | 0");
  33. compareVectors(test, Vector3(-root, 0.0f, root), Vector3().setAngles(225.0f, 0.0f), "angle 225 | 0");
  34. compareVectors(test, Vector3(0.0f, 0.0f, 1.0f), Vector3().setAngles(270.0f, 0.0f), "angle 270 | 0");
  35. compareVectors(test, Vector3(root, 0.0f, root), Vector3().setAngles(315.0f, 0.0f), "angle 315 | 0");
  36. compareVectors(test, Vector3(0.0f, 1.0f, 0.0f), Vector3().setAngles(0.0f, 90.0f), "angle 0 | 90");
  37. compareVectors(test, Vector3(0.0f, 1.0f, 0.0f), Vector3().setAngles(90.0f, 90.0f), "angle 90 | 90");
  38. compareVectors(test, Vector3(0.0f, 1.0f, 0.0f), Vector3().setAngles(180.0f, 90.0f), "angle 180 | 90");
  39. compareVectors(test, Vector3(0.0f, 1.0f, 0.0f), Vector3().setAngles(270.0f, 90.0f), "angle 270 | 90");
  40. compareVectors(test, Vector3(0.0f, -1.0f, 0.0f), Vector3().setAngles(0.0f, -90.0f), "angle 0 | -90");
  41. compareVectors(test, Vector3(0.0f, -1.0f, 0.0f), Vector3().setAngles(90.0f, -90.0f), "angle 90 | -90");
  42. compareVectors(test, Vector3(0.0f, -1.0f, 0.0f), Vector3().setAngles(180.0f, -90.0f), "angle 180 | -90");
  43. compareVectors(test, Vector3(0.0f, -1.0f, 0.0f), Vector3().setAngles(270.0f, -90.0f), "angle 270 | -90");
  44. compareVectors(test, Vector3(root, root, 0.0f), Vector3().setAngles(0.0f, 45.0f), "angle 0 | 45");
  45. compareVectors(test, Vector3(0.0f, root, -root), Vector3().setAngles(90.0f, 45.0f), "angle 90 | 45");
  46. compareVectors(test, Vector3(-root, root, 0.0f), Vector3().setAngles(180.0f, 45.0f), "angle 180 | 45");
  47. compareVectors(test, Vector3(0.0f, root, root), Vector3().setAngles(270.0f, 45.0f), "angle 270 | 45");
  48. compareVectors(test, Vector3(root, -root, 0.0f), Vector3().setAngles(0.0f, -45.0f), "angle 0 | -45");
  49. compareVectors(test, Vector3(0.0f, -root, -root), Vector3().setAngles(90.0f, -45.0f), "angle 90 | -45");
  50. compareVectors(test, Vector3(-root, -root, 0.0f), Vector3().setAngles(180.0f, -45.0f), "angle 180 | -45");
  51. compareVectors(test, Vector3(0.0f, -root, root), Vector3().setAngles(270.0f, -45.0f), "angle 270 | -45");
  52. compareVectors(test, Vector3(0.5f, root, -0.5f), Vector3().setAngles(45.0f, 45.0f), "angle 45 | 45");
  53. }
  54. static void testCross(Test& test) {
  55. compareVectors(test, Vector3(0.0f, 0.0f, 1.0f),
  56. Vector3(1.0f, 0.0f, 0.0f).cross(Vector3(0.0f, 1.0f, 0.0)), "cross 1");
  57. compareVectors(test, Vector3(0.0f, -1.0f, 0.0f),
  58. Vector3(1.0f, 0.0f, 0.0f).cross(Vector3(0.0f, 0.0f, 1.0)), "cross 2");
  59. compareVectors(test, Vector3(0.0f, 0.0f, -1.0f),
  60. Vector3(0.0f, 1.0f, 0.0f).cross(Vector3(1.0f, 0.0f, 0.0)), "cross 3");
  61. compareVectors(test, Vector3(1.0f, 0.0f, 0.0f),
  62. Vector3(0.0f, 1.0f, 0.0f).cross(Vector3(0.0f, 0.0f, 1.0)), "cross 4");
  63. compareVectors(test, Vector3(0.0f, 1.0f, 0.0f),
  64. Vector3(0.0f, 0.0f, 1.0f).cross(Vector3(1.0f, 0.0f, 0.0)), "cross 5");
  65. compareVectors(test, Vector3(-1.0f, 0.0f, 0.0f),
  66. Vector3(0.0f, 0.0f, 1.0f).cross(Vector3(0.0f, 1.0f, 0.0)), "cross 6");
  67. }
  68. static void testSetAdd(Test& test) {
  69. Vector3 v;
  70. v += Vector3(1.0f, 2.0f, 3.0f);
  71. compareVectors(test, Vector3(1.0f, 2.0f, 3.0f), v, "set add 1");
  72. v += Vector3(2.0f, 3.0f, 4.0f);
  73. compareVectors(test, Vector3(3.0f, 5.0f, 7.0f), v, "set add 2");
  74. }
  75. static void testAdd(Test& test) {
  76. compareVectors(test, Vector3(1.0f, 2.0f, 3.0f), Vector3() + Vector3(1.0f, 2.0f, 3.0f), "add 1");
  77. compareVectors(test, Vector3(3.0f, 5.0f, 7.0f), Vector3(1.0f, 2.0f, 3.0f) + Vector3(2.0f, 3.0f, 4.0f), "add 2");
  78. }
  79. static void testSetSub(Test& test) {
  80. Vector3 v;
  81. v -= Vector3(1.0f, 2.0f, 3.0f);
  82. compareVectors(test, Vector3(-1.0f, -2.0f, -3.0f), v, "set sub 1");
  83. v -= Vector3(2.0f, 3.0f, 4.0f);
  84. compareVectors(test, Vector3(-3.0f, -5.0f, -7.0f), v, "set sub 2");
  85. }
  86. static void testSub(Test& test) {
  87. compareVectors(test, Vector3(1.0f, 2.0f, 3.0f), Vector3() - Vector3(-1.0f, -2.0f, -3.0f), "sub 1");
  88. compareVectors(test, Vector3(-1.0f, -1.0f, -1.0f), Vector3(1.0f, 2.0f, 3.0f) - Vector3(2.0f, 3.0f, 4.0f), "sub 2");
  89. }
  90. static void testInvert(Test& test) {
  91. compareVectors(test, Vector3(-1.0f, 2.0f, 3.0f), -Vector3(1.0f, -2.0f, -3.0f), "invert");
  92. }
  93. static void testSetMul(Test& test) {
  94. Vector3 v(1.0f, 2.0f, 3.0f);
  95. v *= 3.0f;
  96. compareVectors(test, Vector3(3.0f, 6.0f, 9.0f), v, "set mul 1");
  97. v *= -2.0f;
  98. compareVectors(test, Vector3(-6.0f, -12.0f, -18.0f), v, "set mul 2");
  99. }
  100. static void testMul(Test& test) {
  101. compareVectors(test, Vector3(-3.0f, -6.0f, -9.0f), 3.0f * Vector3(-1.0f, -2.0f, -3.0f), "mul 1");
  102. compareVectors(test, Vector3(3.0f, 6.0f, 9.0f), Vector3(1.0f, 2.0f, 3.0f) * 3.0, "mul 2");
  103. }
  104. static void testDot(Test& test) {
  105. test.checkFloat(9.0f, Vector3(-4.0f, 2.0f, -3.0f).dot(Vector3(-1.0f, -2.0f, -3.0f)), eps, "dot 1");
  106. test.checkFloat(-22.0f, Vector3(2.0f, 2.0f, -4.0f).dot(Vector3(1.0f, -2.0f, 5.0f)), eps, "dot 2");
  107. }
  108. static void testSquareLength(Test& test) {
  109. test.checkFloat(29.0f, Vector3(-4.0f, 2.0f, -3.0f).squareLength(), eps, "square length 1");
  110. test.checkFloat(24.0f, Vector3(2.0f, 2.0f, -4.0f).squareLength(), eps, "square length 2");
  111. }
  112. static void testLength(Test& test) {
  113. test.checkFloat(3.0f, Vector3(-2.0f, 2.0f, -1.0f).length(), eps, "length 1");
  114. test.checkFloat(7.0f, Vector3(6.0f, 2.0f, -3.0f).length(), eps, "length 2");
  115. }
  116. static void testNormalize(Test& test) {
  117. Vector3 v1(-2.0f, 2.0f, -1.0f);
  118. Vector3 v2 = v1 * (1.0f / 3.0f);
  119. v1.normalize();
  120. compareVectors(test, v2, v1, "normalize 1");
  121. Vector3 v3(6.0f, 2.0f, -3.0f);
  122. Vector3 v4 = v3 * (1.0f / 7.0f);
  123. v3.normalize();
  124. compareVectors(test, v4, v3, "normalize 2");
  125. }
  126. static void testToString(Test& test) {
  127. StringBuffer<50> s;
  128. s.append(Vector<1>()).append(Vector<2>(2.0f, 3.0f)).append(Vector<3>(4.0f, 5.0f, 6.0f));
  129. test.checkEqual(StringBuffer<50>("[0.00][2.00, 3.00][4.00, 5.00, 6.00]"), s, "to string");
  130. }
  131. void VectorTests::test() {
  132. Test test("Vector");
  133. testInitAndRead(test);
  134. testSetAngles(test);
  135. testCross(test);
  136. testSetAdd(test);
  137. testAdd(test);
  138. testSetSub(test);
  139. testSub(test);
  140. testInvert(test);
  141. testSetMul(test);
  142. testMul(test);
  143. testDot(test);
  144. testSquareLength(test);
  145. testLength(test);
  146. testNormalize(test);
  147. testToString(test);
  148. test.finalize();
  149. }