/src/tests/unit_tests/vector2_tests.cpp

https://github.com/doyubkim/fluid-engine-dev · C++ · 343 lines · 262 code · 76 blank · 5 comment · 5 complexity · 155321cf428ae56a38bb03d478c4cd55 MD5 · raw file

  1. // Copyright (c) 2018 Doyub Kim
  2. //
  3. // I am making my contributions/submissions to this project solely in my
  4. // personal capacity and am not conveying any rights to any intellectual
  5. // property of any third parties.
  6. #include <jet/vector3.h>
  7. #include <gtest/gtest.h>
  8. #include <algorithm>
  9. using namespace jet;
  10. TEST(Vector2, Constructors) {
  11. Vector2F vec;
  12. EXPECT_FLOAT_EQ(0.f, vec.x);
  13. EXPECT_FLOAT_EQ(0.f, vec.y);
  14. Vector2F vec2(5.f, 3.f);
  15. EXPECT_FLOAT_EQ(5.f, vec2.x);
  16. EXPECT_FLOAT_EQ(3.f, vec2.y);
  17. Vector2F vec5 = { 7.f, 6.f };
  18. EXPECT_FLOAT_EQ(7.f, vec5.x);
  19. EXPECT_FLOAT_EQ(6.f, vec5.y);
  20. Vector2F vec6(vec5);
  21. EXPECT_FLOAT_EQ(7.f, vec6.x);
  22. EXPECT_FLOAT_EQ(6.f, vec6.y);
  23. }
  24. TEST(Vector2, SetMethods) {
  25. Vector2F vec;
  26. vec.set(4.f, 2.f);
  27. EXPECT_FLOAT_EQ(4.f, vec.x);
  28. EXPECT_FLOAT_EQ(2.f, vec.y);
  29. auto lst = {0.f, 5.f};
  30. vec.set(lst);
  31. EXPECT_FLOAT_EQ(0.f, vec.x);
  32. EXPECT_FLOAT_EQ(5.f, vec.y);
  33. vec.set(Vector2F(9.f, 8.f));
  34. EXPECT_FLOAT_EQ(9.f, vec.x);
  35. EXPECT_FLOAT_EQ(8.f, vec.y);
  36. }
  37. TEST(Vector2, BasicSetterMethods) {
  38. Vector2F vec(3.f, 9.f);
  39. vec.setZero();
  40. EXPECT_FLOAT_EQ(0.f, vec.x);
  41. EXPECT_FLOAT_EQ(0.f, vec.y);
  42. vec.set(4.f, 2.f);
  43. vec.normalize();
  44. float len = vec.x * vec.x + vec.y * vec.y;
  45. EXPECT_NEAR(len, 1.f, 1e-6);
  46. }
  47. TEST(Vector2, BinaryOperatorMethods) {
  48. Vector2F vec(3.f, 9.f);
  49. vec = vec.add(4.f);
  50. EXPECT_FLOAT_EQ(7.f, vec.x);
  51. EXPECT_FLOAT_EQ(13.f, vec.y);
  52. vec = vec.add(Vector2F(-2.f, 1.f));
  53. EXPECT_FLOAT_EQ(5.f, vec.x);
  54. EXPECT_FLOAT_EQ(14.f, vec.y);
  55. vec = vec.sub(8.f);
  56. EXPECT_FLOAT_EQ(-3.f, vec.x);
  57. EXPECT_FLOAT_EQ(6.f, vec.y);
  58. vec = vec.sub(Vector2F(-5.f, 3.f));
  59. EXPECT_FLOAT_EQ(2.f, vec.x);
  60. EXPECT_FLOAT_EQ(3.f, vec.y);
  61. vec = vec.mul(2.f);
  62. EXPECT_FLOAT_EQ(4.f, vec.x);
  63. EXPECT_FLOAT_EQ(6.f, vec.y);
  64. vec = vec.mul(Vector2F(3.f, -2.f));
  65. EXPECT_FLOAT_EQ(12.f, vec.x);
  66. EXPECT_FLOAT_EQ(-12.f, vec.y);
  67. vec = vec.div(4.f);
  68. EXPECT_FLOAT_EQ(3.f, vec.x);
  69. EXPECT_FLOAT_EQ(-3.f, vec.y);
  70. vec = vec.div(Vector2F(3.f, -1.f));
  71. EXPECT_FLOAT_EQ(1.f, vec.x);
  72. EXPECT_FLOAT_EQ(3.f, vec.y);
  73. float d = vec.dot(Vector2F(4.f, 2.f));
  74. EXPECT_FLOAT_EQ(d, 10.f);
  75. float c = vec.cross(Vector2F(5.f, -7.f));
  76. EXPECT_FLOAT_EQ(c, -22.f);
  77. }
  78. TEST(Vector2, BinaryInverseOperatorMethods) {
  79. Vector2F vec(3.f, 9.f);
  80. vec = vec.rsub(8.f);
  81. EXPECT_FLOAT_EQ(5.f, vec.x);
  82. EXPECT_FLOAT_EQ(-1.f, vec.y);
  83. vec = vec.rsub(Vector2F(-5.f, 3.f));
  84. EXPECT_FLOAT_EQ(-10.f, vec.x);
  85. EXPECT_FLOAT_EQ(4.f, vec.y);
  86. vec = Vector2F(-4.f, -3.f);
  87. vec = vec.rdiv(12.f);
  88. EXPECT_FLOAT_EQ(-3.f, vec.x);
  89. EXPECT_FLOAT_EQ(vec.y, -4.f);
  90. vec = vec.rdiv(Vector2F(3.f, -16.f));
  91. EXPECT_FLOAT_EQ(-1.f, vec.x);
  92. EXPECT_FLOAT_EQ(4.f, vec.y);
  93. float c = vec.rcross(Vector2F(5.f, -7.f));
  94. EXPECT_FLOAT_EQ(c, 13.f);
  95. }
  96. TEST(Vector2, AugmentedOperatorMethods) {
  97. Vector2F vec(3.f, 9.f);
  98. vec.iadd(4.f);
  99. EXPECT_FLOAT_EQ(7.f, vec.x);
  100. EXPECT_FLOAT_EQ(vec.y, 13.f);
  101. vec.iadd(Vector2F(-2.f, 1.f));
  102. EXPECT_FLOAT_EQ(5.f, vec.x);
  103. EXPECT_FLOAT_EQ(vec.y, 14.f);
  104. vec.isub(8.f);
  105. EXPECT_FLOAT_EQ(-3.f, vec.x);
  106. EXPECT_FLOAT_EQ(6.f, vec.y);
  107. vec.isub(Vector2F(-5.f, 3.f));
  108. EXPECT_FLOAT_EQ(2.f, vec.x);
  109. EXPECT_FLOAT_EQ(3.f, vec.y);
  110. vec.imul(2.f);
  111. EXPECT_FLOAT_EQ(4.f, vec.x);
  112. EXPECT_FLOAT_EQ(6.f, vec.y);
  113. vec.imul(Vector2F(3.f, -2.f));
  114. EXPECT_FLOAT_EQ(12.f, vec.x);
  115. EXPECT_FLOAT_EQ(-12.f, vec.y);
  116. vec.idiv(4.f);
  117. EXPECT_FLOAT_EQ(3.f, vec.x);
  118. EXPECT_FLOAT_EQ(-3.f, vec.y);
  119. vec.idiv(Vector2F(3.f, -1.f));
  120. EXPECT_FLOAT_EQ(1.f, vec.x);
  121. EXPECT_FLOAT_EQ(3.f, vec.y);
  122. }
  123. TEST(Vector2, AtMethod) {
  124. Vector2F vec(8.f, 9.f);
  125. EXPECT_FLOAT_EQ(vec.at(0), 8.f);
  126. EXPECT_FLOAT_EQ(vec.at(1), 9.f);
  127. vec.at(0) = 7.f;
  128. vec.at(1) = 6.f;
  129. EXPECT_FLOAT_EQ(7.f, vec.x);
  130. EXPECT_FLOAT_EQ(6.f, vec.y);
  131. }
  132. TEST(Vector2, BasicGetterMethods) {
  133. Vector2F vec(3.f, 7.f), vec2(-3.f, -7.f);
  134. float sum = vec.sum();
  135. EXPECT_FLOAT_EQ(sum, 10.f);
  136. float avg = vec.avg();
  137. EXPECT_FLOAT_EQ(avg, 5.f);
  138. float min = vec.min();
  139. EXPECT_FLOAT_EQ(min, 3.f);
  140. float max = vec.max();
  141. EXPECT_FLOAT_EQ(max, 7.f);
  142. float absmin = vec2.absmin();
  143. EXPECT_FLOAT_EQ(absmin, -3.f);
  144. float absmax = vec2.absmax();
  145. EXPECT_FLOAT_EQ(absmax, -7.f);
  146. size_t daxis = vec.dominantAxis();
  147. EXPECT_EQ(daxis, (size_t)1);
  148. size_t saxis = vec.subminantAxis();
  149. EXPECT_EQ(saxis, (size_t)0);
  150. float eps = 1e-6f;
  151. vec2 = vec.normalized();
  152. float lenSqr = vec2.x * vec2.x + vec2.y * vec2.y;
  153. EXPECT_NEAR(lenSqr, 1.f, eps);
  154. vec2.imul(2.f);
  155. float len = vec2.length();
  156. EXPECT_NEAR(len, 2.f, eps);
  157. lenSqr = vec2.lengthSquared();
  158. EXPECT_NEAR(lenSqr, 4.f, eps);
  159. }
  160. TEST(Vector2, BracketOperator) {
  161. Vector2F vec(8.f, 9.f);
  162. EXPECT_FLOAT_EQ(vec[0], 8.f);
  163. EXPECT_FLOAT_EQ(vec[1], 9.f);
  164. vec[0] = 7.f;
  165. vec[1] = 6.f;
  166. EXPECT_FLOAT_EQ(7.f, vec.x);
  167. EXPECT_FLOAT_EQ(6.f, vec.y);
  168. }
  169. TEST(Vector2, AssignmentOperator) {
  170. Vector2F vec(5.f, 1.f);
  171. Vector2F vec2(3.f, 3.f);
  172. vec2 = vec;
  173. EXPECT_FLOAT_EQ(5.f, vec2.x);
  174. EXPECT_FLOAT_EQ(vec2.y, 1.f);
  175. }
  176. TEST(Vector2, AugmentedOperators) {
  177. Vector2F vec(3.f, 9.f);
  178. vec += 4.f;
  179. EXPECT_FLOAT_EQ(7.f, vec.x);
  180. EXPECT_FLOAT_EQ(vec.y, 13.f);
  181. vec += Vector2F(-2.f, 1.f);
  182. EXPECT_FLOAT_EQ(5.f, vec.x);
  183. EXPECT_FLOAT_EQ(vec.y, 14.f);
  184. vec -= 8.f;
  185. EXPECT_FLOAT_EQ(-3.f, vec.x);
  186. EXPECT_FLOAT_EQ(6.f, vec.y);
  187. vec -= Vector2F(-5.f, 3.f);
  188. EXPECT_FLOAT_EQ(2.f, vec.x);
  189. EXPECT_FLOAT_EQ(3.f, vec.y);
  190. vec *= 2.f;
  191. EXPECT_FLOAT_EQ(4.f, vec.x);
  192. EXPECT_FLOAT_EQ(6.f, vec.y);
  193. vec *= Vector2F(3.f, -2.f);
  194. EXPECT_FLOAT_EQ(12.f, vec.x);
  195. EXPECT_FLOAT_EQ(-12.f, vec.y);
  196. vec /= 4.f;
  197. EXPECT_FLOAT_EQ(3.f, vec.x);
  198. EXPECT_FLOAT_EQ(-3.f, vec.y);
  199. vec /= Vector2F(3.f, -1.f);
  200. EXPECT_FLOAT_EQ(1.f, vec.x);
  201. EXPECT_FLOAT_EQ(3.f, vec.y);
  202. }
  203. TEST(Vector2, EqualOperator) {
  204. Vector2F vec, vec2(3.f, 7.f), vec3(3.f, 5.f), vec4(5.f, 1.f);
  205. vec = vec2;
  206. EXPECT_TRUE(vec == vec2);
  207. EXPECT_FALSE(vec == vec3);
  208. EXPECT_FALSE(vec != vec2);
  209. EXPECT_TRUE(vec != vec3);
  210. EXPECT_TRUE(vec != vec4);
  211. }
  212. TEST(Vector2, MinMaxFunction) {
  213. Vector2F vec(5.f, 1.f);
  214. Vector2F vec2(3.f, 3.f);
  215. Vector2F minVector = min(vec, vec2);
  216. Vector2F maxVector = max(vec, vec2);
  217. EXPECT_EQ(Vector2F(3.f, 1.f), minVector);
  218. EXPECT_EQ(Vector2F(5.f, 3.f), maxVector);
  219. }
  220. TEST(Vector2, ClampFunction) {
  221. Vector2F vec(2.f, 4.f), low(3.f, -1.f), high(5.f, 2.f);
  222. Vector2F clampedVec = clamp(vec, low, high);
  223. EXPECT_EQ(Vector2F(3.f, 2.f), clampedVec);
  224. }
  225. TEST(Vector2, CeilFloorFunction) {
  226. Vector2F vec(2.2f, 4.7f);
  227. Vector2F ceilVec = ceil(vec);
  228. EXPECT_EQ(Vector2F(3.f, 5.f), ceilVec);
  229. Vector2F floorVec = floor(vec);
  230. EXPECT_EQ(Vector2F(2.f, 4.f), floorVec);
  231. }
  232. TEST(Vector2, BinaryOperators) {
  233. Vector2F vec(3.f, 9.f);
  234. vec = vec + 4.f;
  235. EXPECT_FLOAT_EQ(7.f, vec.x);
  236. EXPECT_FLOAT_EQ(vec.y, 13.f);
  237. vec = vec + Vector2F(-2.f, 1.f);
  238. EXPECT_FLOAT_EQ(5.f, vec.x);
  239. EXPECT_FLOAT_EQ(vec.y, 14.f);
  240. vec = vec - 8.f;
  241. EXPECT_FLOAT_EQ(-3.f, vec.x);
  242. EXPECT_FLOAT_EQ(6.f, vec.y);
  243. vec = vec - Vector2F(-5.f, 3.f);
  244. EXPECT_FLOAT_EQ(2.f, vec.x);
  245. EXPECT_FLOAT_EQ(3.f, vec.y);
  246. vec = vec * 2.f;
  247. EXPECT_FLOAT_EQ(4.f, vec.x);
  248. EXPECT_FLOAT_EQ(6.f, vec.y);
  249. vec = vec * Vector2F(3.f, -2.f);
  250. EXPECT_FLOAT_EQ(12.f, vec.x);
  251. EXPECT_FLOAT_EQ(-12.f, vec.y);
  252. vec = vec / 4.f;
  253. EXPECT_FLOAT_EQ(3.f, vec.x);
  254. EXPECT_FLOAT_EQ(-3.f, vec.y);
  255. vec = vec / Vector2F(3.f, -1.f);
  256. EXPECT_FLOAT_EQ(1.f, vec.x);
  257. EXPECT_FLOAT_EQ(3.f, vec.y);
  258. Vector2D v = Vector2D(2.0, 1.0).normalized();
  259. Vector2D normal = Vector2D(1.0, 1.0).normalized();
  260. Vector2D reflected = v.reflected(normal);
  261. Vector2D reflectedAnswer = Vector2D(-1.0, -2.0).normalized();
  262. EXPECT_NEAR(reflected.distanceTo(reflectedAnswer), 0.0, 1e-9);
  263. Vector2D projected = v.projected(normal);
  264. EXPECT_NEAR(projected.dot(normal), 0.0, 1e-9);
  265. Vector2D tangential = normal.tangential();
  266. EXPECT_NEAR(tangential.dot(normal), 0.0, 1e-9);
  267. }