選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

314 行
8.7 KiB

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