You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

316 line
8.8 KiB

  1. //
  2. // Lol Engine — Unit tests
  3. //
  4. // Copyright © 2010—2014 Sam Hocevar <sam@hocevar.net>
  5. //
  6. // Lol Engine is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #include <lol/engine-internal.h>
  13. #include <lolunit.h>
  14. namespace lol
  15. {
  16. lolunit_declare_fixture(VectorTest)
  17. {
  18. void SetUp() {}
  19. void TearDown() {}
  20. lolunit_declare_test(VectorEquality)
  21. {
  22. vec2 a2(1.0f, 2.0f);
  23. vec2 b2(0.0f, 2.0f);
  24. vec2 c2(1.0f, 0.0f);
  25. lolunit_assert_equal(a2, a2);
  26. lolunit_assert_not_different(a2, a2);
  27. lolunit_assert_different(a2, b2);
  28. lolunit_assert_not_equal(a2, b2);
  29. lolunit_assert_different(a2, c2);
  30. lolunit_assert_not_equal(a2, c2);
  31. vec3 a3(1.0f, 2.0f, 3.0f);
  32. vec3 b3(0.0f, 2.0f, 3.0f);
  33. vec3 c3(1.0f, 0.0f, 3.0f);
  34. vec3 d3(1.0f, 2.0f, 0.0f);
  35. lolunit_assert_equal(a3, a3);
  36. lolunit_assert_not_different(a3, a3);
  37. lolunit_assert_different(a3, b3);
  38. lolunit_assert_not_equal(a3, b3);
  39. lolunit_assert_different(a3, c3);
  40. lolunit_assert_not_equal(a3, c3);
  41. lolunit_assert_different(a3, d3);
  42. lolunit_assert_not_equal(a3, d3);
  43. vec4 a4(1.0f, 2.0f, 3.0f, 4.0f);
  44. vec4 b4(0.0f, 2.0f, 3.0f, 4.0f);
  45. vec4 c4(1.0f, 0.0f, 3.0f, 4.0f);
  46. vec4 d4(1.0f, 2.0f, 0.0f, 4.0f);
  47. vec4 e4(1.0f, 2.0f, 3.0f, 0.0f);
  48. lolunit_assert_equal(a4, a4);
  49. lolunit_assert_not_different(a4, a4);
  50. lolunit_assert_different(a4, b4);
  51. lolunit_assert_not_equal(a4, b4);
  52. lolunit_assert_different(a4, c4);
  53. lolunit_assert_not_equal(a4, c4);
  54. lolunit_assert_different(a4, d4);
  55. lolunit_assert_not_equal(a4, d4);
  56. lolunit_assert_different(a4, e4);
  57. lolunit_assert_not_equal(a4, e4);
  58. }
  59. lolunit_declare_test(VectorInequality)
  60. {
  61. vec2 a2(1.0f, 3.0f);
  62. vec2 b2(0.0f, 0.0f);
  63. vec2 c2(1.0f, 1.0f);
  64. vec2 d2(2.0f, 2.0f);
  65. vec2 e2(3.0f, 3.0f);
  66. vec2 f2(4.0f, 4.0f);
  67. lolunit_assert_lequal(a2, a2);
  68. lolunit_assert_not_less(a2, a2);
  69. lolunit_assert_not_lequal(a2, b2);
  70. lolunit_assert_not_less(a2, b2);
  71. lolunit_assert_not_lequal(a2, c2);
  72. lolunit_assert_not_less(a2, c2);
  73. lolunit_assert_not_lequal(a2, d2);
  74. lolunit_assert_not_less(a2, d2);
  75. lolunit_assert_lequal(a2, e2);
  76. lolunit_assert_not_less(a2, e2);
  77. lolunit_assert_lequal(a2, f2);
  78. lolunit_assert_less(a2, f2);
  79. }
  80. lolunit_declare_test(VectorInit)
  81. {
  82. vec2 a { 1.f, 2.f };
  83. lolunit_assert_equal(1.f, a.x);
  84. lolunit_assert_equal(2.f, a.y);
  85. vec3 b { 1.f, 2.f, 3.f };
  86. lolunit_assert_equal(1.f, b.x);
  87. lolunit_assert_equal(2.f, b.y);
  88. lolunit_assert_equal(3.f, b.z);
  89. vec4 c { 1.f, 2.f, 3.f, 4.f };
  90. lolunit_assert_equal(1.f, c.x);
  91. lolunit_assert_equal(2.f, c.y);
  92. lolunit_assert_equal(3.f, c.z);
  93. lolunit_assert_equal(4.f, c.w);
  94. vec_t<float, 10> d { 1.f, 2.f, 3.f, 4.f, 5.f };
  95. lolunit_assert_equal(1.f, d[0]);
  96. lolunit_assert_equal(2.f, d[1]);
  97. lolunit_assert_equal(3.f, d[2]);
  98. lolunit_assert_equal(4.f, d[3]);
  99. lolunit_assert_equal(5.f, d[4]);
  100. lolunit_assert_equal(0.f, d[5]);
  101. lolunit_assert_equal(0.f, d[6]);
  102. lolunit_assert_equal(0.f, d[7]);
  103. lolunit_assert_equal(0.f, d[8]);
  104. lolunit_assert_equal(0.f, d[9]);
  105. }
  106. lolunit_declare_test(VectorSwizzle)
  107. {
  108. vec3 a(1.0f, 2.0f, 3.0f);
  109. vec3 b(4.0f, 5.0f, 6.0f);
  110. vec3 c;
  111. c = a;
  112. c.x = b.y;
  113. lolunit_assert_equal(c.x, 5.0f);
  114. lolunit_assert_equal(c.y, 2.0f);
  115. lolunit_assert_equal(c.z, 3.0f);
  116. c = a.zyx;
  117. lolunit_assert_equal(c.x, 3.0f);
  118. lolunit_assert_equal(c.y, 2.0f);
  119. lolunit_assert_equal(c.z, 1.0f);
  120. #if 0 /* Visual Studio doesn't support these yet. */
  121. c = a;
  122. c.xy = b.yz;
  123. lolunit_assert_equal(c.x, 5.0f);
  124. lolunit_assert_equal(c.y, 6.0f);
  125. lolunit_assert_equal(c.z, 3.0f);
  126. c = a;
  127. c.xy = b.zz;
  128. lolunit_assert_equal(c.x, 6.0f);
  129. lolunit_assert_equal(c.y, 6.0f);
  130. lolunit_assert_equal(c.z, 3.0f);
  131. c = a;
  132. c.xz = b.xy;
  133. lolunit_assert_equal(c.x, 4.0f);
  134. lolunit_assert_equal(c.y, 2.0f);
  135. lolunit_assert_equal(c.z, 5.0f);
  136. c = a;
  137. c.xz = b.xz;
  138. lolunit_assert_equal(c.x, 4.0f);
  139. lolunit_assert_equal(c.y, 2.0f);
  140. lolunit_assert_equal(c.z, 6.0f);
  141. c = a;
  142. c.xz = c.zy = b.yx;
  143. lolunit_assert_equal(c.x, 5.0f);
  144. lolunit_assert_equal(c.y, 4.0f);
  145. lolunit_assert_equal(c.z, 4.0f);
  146. #endif
  147. }
  148. lolunit_declare_test(VectorSwizzleMul)
  149. {
  150. ivec3 a(1, 2, 3);
  151. ivec3 b = a * 2;
  152. lolunit_assert_equal(b.x, 2);
  153. lolunit_assert_equal(b.y, 4);
  154. lolunit_assert_equal(b.z, 6);
  155. ivec3 c = (ivec3)a.zyx * 2;
  156. lolunit_assert_equal(c.x, 6);
  157. lolunit_assert_equal(c.y, 4);
  158. lolunit_assert_equal(c.z, 2);
  159. ivec3 d = 2 * (ivec3)a.zyx;
  160. lolunit_assert_equal(d.x, 6);
  161. lolunit_assert_equal(d.y, 4);
  162. lolunit_assert_equal(d.z, 2);
  163. ivec3 e = a.zyx * 2;
  164. lolunit_assert_equal(e.x, 6);
  165. lolunit_assert_equal(e.y, 4);
  166. lolunit_assert_equal(e.z, 2);
  167. ivec3 f = 2 * a.zyx;
  168. lolunit_assert_equal(f.x, 6);
  169. lolunit_assert_equal(f.y, 4);
  170. lolunit_assert_equal(f.z, 2);
  171. }
  172. lolunit_declare_test(VectorUnaryMinus)
  173. {
  174. vec2 a(1.0f, 3.0f);
  175. vec2 b(-1.0f, -3.0f);
  176. lolunit_assert_equal(a, -b);
  177. lolunit_assert_equal(-a, b);
  178. }
  179. lolunit_declare_test(CastVector)
  180. {
  181. vec2 a1(1.0f, 3.0f);
  182. vec3 b(a1, 0.0f);
  183. vec2 a2(b.xy);
  184. lolunit_assert_equal(b.x, a1.x);
  185. lolunit_assert_equal(b.y, a1.y);
  186. lolunit_assert_equal(b.z, 0.0f);
  187. lolunit_assert_equal(a2, a1);
  188. vec4 c(a1, 0.0f, 0.0f);
  189. vec2 a3(c.xy);
  190. lolunit_assert_equal(c.x, a1.x);
  191. lolunit_assert_equal(c.y, a1.y);
  192. lolunit_assert_equal(c.z, 0.0f);
  193. lolunit_assert_equal(c.w, 0.0f);
  194. lolunit_assert_equal(a3, a1);
  195. }
  196. lolunit_declare_test(Orthogonal)
  197. {
  198. vec3 a(1.f, 0.f, 0.f);
  199. vec3 b(0.f, 1.f, 0.f);
  200. vec3 c(0.f, 0.f, 1.f);
  201. lolunit_assert_doubles_equal(dot(orthogonal(a), a), 0.f, 1e-6f);
  202. lolunit_assert_doubles_equal(dot(orthogonal(b), b), 0.f, 1e-6f);
  203. lolunit_assert_doubles_equal(dot(orthogonal(c), c), 0.f, 1e-6f);
  204. /* The length of the orthogonal vector should be at least
  205. * sqrt(2)/2 times the length of the original vector. */
  206. lolunit_assert_greater(length(orthogonal(a)), 0.7f);
  207. lolunit_assert_greater(length(orthogonal(b)), 0.7f);
  208. lolunit_assert_greater(length(orthogonal(c)), 0.7f);
  209. lolunit_assert_doubles_equal(dot(orthonormal(a), a), 0.f, 1e-6f);
  210. lolunit_assert_doubles_equal(dot(orthonormal(b), b), 0.f, 1e-6f);
  211. lolunit_assert_doubles_equal(dot(orthonormal(c), c), 0.f, 1e-6f);
  212. /* The length of the orthonormal vector should be 1. */
  213. lolunit_assert_doubles_equal(length(orthonormal(a)), 1.f, 1e-6f);
  214. lolunit_assert_doubles_equal(length(orthonormal(b)), 1.f, 1e-6f);
  215. lolunit_assert_doubles_equal(length(orthonormal(c)), 1.f, 1e-6f);
  216. }
  217. lolunit_declare_test(LargeVectors)
  218. {
  219. vec_t<int, 50> v0(0);
  220. vec_t<int, 50> v1(1);
  221. vec_t<int, 50> v2(2);
  222. vec_t<int, 50> v3(3);
  223. auto va = v0 + v3;
  224. auto vb = v1 + v2;
  225. lolunit_assert(va == vb);
  226. }
  227. #if !LOL_FEATURE_VISUAL_STUDIO_THAT_FUCKING_PIECE_OF_SHIT_COMPILER
  228. lolunit_declare_test(VectorIterator)
  229. {
  230. vec4 v4(1.125f, 1.25f, 1.375f, 1.25f);
  231. for (auto x : v4)
  232. {
  233. lolunit_assert_greater(x, 1.0f);
  234. lolunit_assert_less(x, 1.5f);
  235. }
  236. for (auto &x : v4)
  237. {
  238. lolunit_assert_greater(x, 1.0f);
  239. lolunit_assert_less(x, 1.5f);
  240. }
  241. for (auto x : v4.zywx)
  242. {
  243. lolunit_assert_greater(x, 1.0f);
  244. lolunit_assert_less(x, 1.5f);
  245. }
  246. vec4 const &v4c = v4;
  247. for (auto x : v4c)
  248. {
  249. lolunit_assert_greater(x, 1.0f);
  250. lolunit_assert_less(x, 1.5f);
  251. }
  252. for (auto &x : v4c)
  253. {
  254. lolunit_assert_greater(x, 1.0f);
  255. lolunit_assert_less(x, 1.5f);
  256. }
  257. }
  258. #endif
  259. };
  260. } /* namespace lol */