unit_tests.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. /*
  2. * Copyright (c) 2012-2016 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "config.h"
  6. #if CROWN_BUILD_UNIT_TESTS
  7. #include "aabb.h"
  8. #include "array.h"
  9. #include "command_line.h"
  10. #include "dynamic_string.h"
  11. #include "json.h"
  12. #include "macros.h"
  13. #include "math_utils.h"
  14. #include "matrix3x3.h"
  15. #include "matrix4x4.h"
  16. #include "memory.h"
  17. #include "murmur.h"
  18. #include "path.h"
  19. #include "sjson.h"
  20. #include "sphere.h"
  21. #include "string_id.h"
  22. #include "string_utils.h"
  23. #include "temp_allocator.h"
  24. #include "vector.h"
  25. #include "vector2.h"
  26. #include "vector3.h"
  27. #include "vector4.h"
  28. namespace crown
  29. {
  30. static void test_memory()
  31. {
  32. memory_globals::init();
  33. Allocator& a = default_allocator();
  34. void* p = a.allocate(32);
  35. CE_ENSURE(a.allocated_size(p) >= 32);
  36. a.deallocate(p);
  37. memory_globals::shutdown();
  38. }
  39. static void test_array()
  40. {
  41. memory_globals::init();
  42. Allocator& a = default_allocator();
  43. {
  44. Array<int> v(a);
  45. CE_ENSURE(array::size(v) == 0);
  46. array::push_back(v, 1);
  47. CE_ENSURE(array::size(v) == 1);
  48. CE_ENSURE(v[0] == 1);
  49. }
  50. memory_globals::shutdown();
  51. }
  52. static void test_vector()
  53. {
  54. memory_globals::init();
  55. Allocator& a = default_allocator();
  56. {
  57. Vector<int> v(a);
  58. CE_ENSURE(vector::size(v) == 0);
  59. vector::push_back(v, 1);
  60. CE_ENSURE(vector::size(v) == 1);
  61. CE_ENSURE(v[0] == 1);
  62. }
  63. memory_globals::shutdown();
  64. }
  65. static void test_vector2()
  66. {
  67. {
  68. const Vector2 a = vector2(1.2f, 4.2f);
  69. const Vector2 b = vector2(2.7f, -1.9f);
  70. const Vector2 c = a - b;
  71. CE_ENSURE(fequal(c.x, -1.5f, 0.0001f));
  72. CE_ENSURE(fequal(c.y, 6.1f, 0.0001f));
  73. }
  74. {
  75. const Vector2 a = vector2(1.2f, 4.2f);
  76. const Vector2 b = vector2(2.7f, -1.9f);
  77. const Vector2 c = a + b;
  78. CE_ENSURE(fequal(c.x, 3.9f, 0.0001f));
  79. CE_ENSURE(fequal(c.y, 2.3f, 0.0001f));
  80. }
  81. {
  82. const Vector2 a = vector2(1.2f, 4.2f);
  83. const Vector2 b = a * 2.0f;
  84. CE_ENSURE(fequal(b.x, 2.4f, 0.0001f));
  85. CE_ENSURE(fequal(b.y, 8.4f, 0.0001f));
  86. }
  87. {
  88. const Vector2 a = vector2(1.2f, 4.2f);
  89. const Vector2 b = vector2(2.7f, -1.9f);
  90. const f32 c = dot(a, b);
  91. CE_ENSURE(fequal(c, -4.74f, 0.0001f));
  92. }
  93. {
  94. const Vector2 a = vector2(1.2f, 4.2f);
  95. const f32 c = length_squared(a);
  96. CE_ENSURE(fequal(c, 19.08f, 0.0001f));
  97. }
  98. {
  99. const Vector2 a = vector2(1.2f, 4.2f);
  100. const f32 c = length(a);
  101. CE_ENSURE(fequal(c, 4.36806f, 0.0001f));
  102. }
  103. {
  104. Vector2 a = vector2(1.2f, 4.2f);
  105. normalize(a);
  106. CE_ENSURE(fequal(length(a), 1.0f, 0.00001f));
  107. }
  108. {
  109. const Vector2 a = vector2(1.2f, 4.2f);
  110. const Vector2 b = vector2(2.7f, -1.9f);
  111. const float c = distance_squared(a, b);
  112. CE_ENSURE(fequal(c, 39.46f, 0.00001f));
  113. }
  114. {
  115. const Vector2 a = vector2(1.2f, 4.2f);
  116. const Vector2 b = vector2(2.7f, -1.9f);
  117. const float c = distance(a, b);
  118. CE_ENSURE(fequal(c, 6.28171f, 0.00001f));
  119. }
  120. {
  121. const Vector2 a = vector2(1.2f, 4.2f);
  122. const Vector2 b = vector2(2.7f, -1.9f);
  123. const Vector2 c = max(a, b);
  124. CE_ENSURE(fequal(c.x, 2.7f, 0.00001f));
  125. CE_ENSURE(fequal(c.y, 4.2f, 0.00001f));
  126. }
  127. {
  128. const Vector2 a = vector2(1.2f, 4.2f);
  129. const Vector2 b = vector2(2.7f, -1.9f);
  130. const Vector2 c = min(a, b);
  131. CE_ENSURE(fequal(c.x, 1.2f, 0.00001f));
  132. CE_ENSURE(fequal(c.y, -1.9f, 0.00001f));
  133. }
  134. }
  135. static void test_vector3()
  136. {
  137. {
  138. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  139. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  140. const Vector3 c = a - b;
  141. CE_ENSURE(fequal(c.x, -1.5f, 0.0001f));
  142. CE_ENSURE(fequal(c.y, 6.1f, 0.0001f));
  143. CE_ENSURE(fequal(c.z, 1.8f, 0.0001f));
  144. }
  145. {
  146. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  147. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  148. const Vector3 c = a + b;
  149. CE_ENSURE(fequal(c.x, 3.9f, 0.0001f));
  150. CE_ENSURE(fequal(c.y, 2.3f, 0.0001f));
  151. CE_ENSURE(fequal(c.z, -6.4f, 0.0001f));
  152. }
  153. {
  154. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  155. const Vector3 b = a * 2.0f;
  156. CE_ENSURE(fequal(b.x, 2.4f, 0.0001f));
  157. CE_ENSURE(fequal(b.y, 8.4f, 0.0001f));
  158. CE_ENSURE(fequal(b.z, -4.6f, 0.0001f));
  159. }
  160. {
  161. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  162. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  163. const f32 c = dot(a, b);
  164. CE_ENSURE(fequal(c, 4.69f, 0.0001f));
  165. }
  166. {
  167. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  168. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  169. const Vector3 c = cross(a, b);
  170. CE_ENSURE(fequal(c.x, -21.59f, 0.0001f));
  171. CE_ENSURE(fequal(c.y, -1.29f, 0.0001f));
  172. CE_ENSURE(fequal(c.z, -13.62f, 0.0001f));
  173. }
  174. {
  175. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  176. const f32 c = length_squared(a);
  177. CE_ENSURE(fequal(c, 24.37f, 0.0001f));
  178. }
  179. {
  180. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  181. const f32 c = length(a);
  182. CE_ENSURE(fequal(c, 4.93659f, 0.0001f));
  183. }
  184. {
  185. Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  186. normalize(a);
  187. CE_ENSURE(fequal(length(a), 1.0f, 0.00001f));
  188. }
  189. {
  190. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  191. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  192. const float c = distance_squared(a, b);
  193. CE_ENSURE(fequal(c, 42.70f, 0.00001f));
  194. }
  195. {
  196. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  197. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  198. const float c = distance(a, b);
  199. CE_ENSURE(fequal(c, 6.53452f, 0.00001f));
  200. }
  201. {
  202. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  203. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  204. const Vector3 c = max(a, b);
  205. CE_ENSURE(fequal(c.x, 2.7f, 0.00001f));
  206. CE_ENSURE(fequal(c.y, 4.2f, 0.00001f));
  207. CE_ENSURE(fequal(c.z, -2.3f, 0.00001f));
  208. }
  209. {
  210. const Vector3 a = vector3(1.2f, 4.2f, -2.3f);
  211. const Vector3 b = vector3(2.7f, -1.9f, -4.1f);
  212. const Vector3 c = min(a, b);
  213. CE_ENSURE(fequal(c.x, 1.2f, 0.00001f));
  214. CE_ENSURE(fequal(c.y, -1.9f, 0.00001f));
  215. CE_ENSURE(fequal(c.z, -4.1f, 0.00001f));
  216. }
  217. }
  218. static void test_vector4()
  219. {
  220. {
  221. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  222. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  223. const Vector4 c = a - b;
  224. CE_ENSURE(fequal(c.x, -1.5f, 0.0001f));
  225. CE_ENSURE(fequal(c.y, 6.1f, 0.0001f));
  226. CE_ENSURE(fequal(c.z, 1.8f, 0.0001f));
  227. CE_ENSURE(fequal(c.w, 4.5f, 0.0001f));
  228. }
  229. {
  230. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  231. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  232. const Vector4 c = a + b;
  233. CE_ENSURE(fequal(c.x, 3.9f, 0.0001f));
  234. CE_ENSURE(fequal(c.y, 2.3f, 0.0001f));
  235. CE_ENSURE(fequal(c.z, -6.4f, 0.0001f));
  236. CE_ENSURE(fequal(c.w, 6.5f, 0.0001f));
  237. }
  238. {
  239. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 1.5f);
  240. const Vector4 b = a * 2.0f;
  241. CE_ENSURE(fequal(b.x, 2.4f, 0.0001f));
  242. CE_ENSURE(fequal(b.y, 8.4f, 0.0001f));
  243. CE_ENSURE(fequal(b.z, -4.6f, 0.0001f));
  244. CE_ENSURE(fequal(b.w, 3.0f, 0.0001f));
  245. }
  246. {
  247. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  248. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  249. const f32 c = dot(a, b);
  250. CE_ENSURE(fequal(c, 10.19f, 0.0001f));
  251. }
  252. {
  253. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  254. const f32 c = length_squared(a);
  255. CE_ENSURE(fequal(c, 54.62f, 0.0001f));
  256. }
  257. {
  258. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  259. const f32 c = length(a);
  260. CE_ENSURE(fequal(c, 7.39053f, 0.0001f));
  261. }
  262. {
  263. Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  264. normalize(a);
  265. CE_ENSURE(fequal(length(a), 1.0f, 0.00001f));
  266. }
  267. {
  268. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  269. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  270. const float c = distance_squared(a, b);
  271. CE_ENSURE(fequal(c, 62.95f, 0.00001f));
  272. }
  273. {
  274. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  275. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  276. const float c = distance(a, b);
  277. CE_ENSURE(fequal(c, 7.93410f, 0.00001f));
  278. }
  279. {
  280. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  281. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  282. const Vector4 c = max(a, b);
  283. CE_ENSURE(fequal(c.x, 2.7f, 0.00001f));
  284. CE_ENSURE(fequal(c.y, 4.2f, 0.00001f));
  285. CE_ENSURE(fequal(c.z, -2.3f, 0.00001f));
  286. CE_ENSURE(fequal(c.w, 5.5f, 0.00001f));
  287. }
  288. {
  289. const Vector4 a = vector4(1.2f, 4.2f, -2.3f, 5.5f);
  290. const Vector4 b = vector4(2.7f, -1.9f, -4.1f, 1.0f);
  291. const Vector4 c = min(a, b);
  292. CE_ENSURE(fequal(c.x, 1.2f, 0.00001f));
  293. CE_ENSURE(fequal(c.y, -1.9f, 0.00001f));
  294. CE_ENSURE(fequal(c.z, -4.1f, 0.00001f));
  295. CE_ENSURE(fequal(c.w, 1.0f, 0.00001f));
  296. }
  297. }
  298. static void test_matrix3x3()
  299. {
  300. {
  301. const Matrix3x3 a = matrix3x3(1.2f, -2.3f, 5.1f
  302. , 2.2f, -5.1f, 1.1f
  303. , 3.2f, 3.3f, -3.8f
  304. );
  305. const Matrix3x3 b = matrix3x3(3.2f, 4.8f, 6.0f
  306. , -1.6f, -7.1f, -2.4f
  307. , -3.1f, -2.2f, 8.9f
  308. );
  309. const Matrix3x3 c = a + b;
  310. CE_ENSURE(fequal(c.x.x, 4.4f, 0.00001f));
  311. CE_ENSURE(fequal(c.x.y, 2.5f, 0.00001f));
  312. CE_ENSURE(fequal(c.x.z, 11.1f, 0.00001f));
  313. CE_ENSURE(fequal(c.y.x, 0.6f, 0.00001f));
  314. CE_ENSURE(fequal(c.y.y, -12.2f, 0.00001f));
  315. CE_ENSURE(fequal(c.y.z, -1.3f, 0.00001f));
  316. CE_ENSURE(fequal(c.z.x, 0.1f, 0.00001f));
  317. CE_ENSURE(fequal(c.z.y, 1.1f, 0.00001f));
  318. CE_ENSURE(fequal(c.z.z, 5.1f, 0.00001f));
  319. }
  320. {
  321. const Matrix3x3 a = matrix3x3(1.2f, -2.3f, 5.1f
  322. , 2.2f, -5.1f, 1.1f
  323. , 3.2f, 3.3f, -3.8f
  324. );
  325. const Matrix3x3 b = matrix3x3(3.2f, 4.8f, 6.0f
  326. , -1.6f, -7.1f, -2.4f
  327. , -3.1f, -2.2f, 8.9f
  328. );
  329. const Matrix3x3 c = a - b;
  330. CE_ENSURE(fequal(c.x.x, -2.0f, 0.00001f));
  331. CE_ENSURE(fequal(c.x.y, -7.1f, 0.00001f));
  332. CE_ENSURE(fequal(c.x.z, -0.9f, 0.00001f));
  333. CE_ENSURE(fequal(c.y.x, 3.8f, 0.00001f));
  334. CE_ENSURE(fequal(c.y.y, 2.0f, 0.00001f));
  335. CE_ENSURE(fequal(c.y.z, 3.5f, 0.00001f));
  336. CE_ENSURE(fequal(c.z.x, 6.3f, 0.00001f));
  337. CE_ENSURE(fequal(c.z.y, 5.5f, 0.00001f));
  338. CE_ENSURE(fequal(c.z.z, -12.7f, 0.00001f));
  339. }
  340. {
  341. const Matrix3x3 a = matrix3x3(1.2f, -2.3f, 5.1f
  342. , 2.2f, -5.1f, 1.1f
  343. , 3.2f, 3.3f, -3.8f
  344. );
  345. const Matrix3x3 b = matrix3x3(3.2f, 4.8f, 6.0f
  346. , -1.6f, -7.1f, -2.4f
  347. , -3.1f, -2.2f, 8.9f
  348. );
  349. const Matrix3x3 c = a * b;
  350. CE_ENSURE(fequal(c.x.x, -8.29f, 0.00001f));
  351. CE_ENSURE(fequal(c.x.y, 10.87f, 0.00001f));
  352. CE_ENSURE(fequal(c.x.z, 58.11f, 0.00001f));
  353. CE_ENSURE(fequal(c.y.x, 11.79f, 0.00001f));
  354. CE_ENSURE(fequal(c.y.y, 44.35f, 0.00001f));
  355. CE_ENSURE(fequal(c.y.z, 35.23f, 0.00001f));
  356. CE_ENSURE(fequal(c.z.x, 16.74f, 0.00001f));
  357. CE_ENSURE(fequal(c.z.y, 0.29f, 0.00001f));
  358. CE_ENSURE(fequal(c.z.z, -22.54f, 0.00001f));
  359. }
  360. {
  361. const Matrix3x3 a = matrix3x3(1.2f, -2.3f, 5.1f
  362. , 2.2f, -5.1f, 1.1f
  363. , 3.2f, 3.3f, -3.8f
  364. );
  365. const f32 det = determinant(a);
  366. CE_ENSURE(fequal(det, 111.834f, 0.00001f));
  367. }
  368. {
  369. const Matrix3x3 a = matrix3x3(1.2f, -2.3f, 5.1f
  370. , 2.2f, -5.1f, 1.1f
  371. , 3.2f, 3.3f, -3.8f
  372. );
  373. const Matrix3x3 b = get_inverted(a);
  374. CE_ENSURE(fequal(b.x.x, 0.140833f, 0.00001f));
  375. CE_ENSURE(fequal(b.x.y, 0.072339f, 0.00001f));
  376. CE_ENSURE(fequal(b.x.z, 0.209954f, 0.00001f));
  377. CE_ENSURE(fequal(b.y.x, 0.106228f, 0.00001f));
  378. CE_ENSURE(fequal(b.y.y, -0.186705f, 0.00001f));
  379. CE_ENSURE(fequal(b.y.z, 0.088524f, 0.00001f));
  380. CE_ENSURE(fequal(b.z.x, 0.210848f, 0.00001f));
  381. CE_ENSURE(fequal(b.z.y, -0.101221f, 0.00001f));
  382. CE_ENSURE(fequal(b.z.z, -0.009478f, 0.00001f));
  383. }
  384. {
  385. const Matrix3x3 a = matrix3x3(1.2f, -2.3f, 5.1f
  386. , 2.2f, -5.1f, 1.1f
  387. , 3.2f, 3.3f, -3.8f
  388. );
  389. const Matrix3x3 b = get_transposed(a);
  390. CE_ENSURE(fequal(b.x.x, 1.2f, 0.00001f));
  391. CE_ENSURE(fequal(b.x.y, 2.2f, 0.00001f));
  392. CE_ENSURE(fequal(b.x.z, 3.2f, 0.00001f));
  393. CE_ENSURE(fequal(b.y.x, -2.3f, 0.00001f));
  394. CE_ENSURE(fequal(b.y.y, -5.1f, 0.00001f));
  395. CE_ENSURE(fequal(b.y.z, 3.3f, 0.00001f));
  396. CE_ENSURE(fequal(b.z.x, 5.1f, 0.00001f));
  397. CE_ENSURE(fequal(b.z.y, 1.1f, 0.00001f));
  398. CE_ENSURE(fequal(b.z.z, -3.8f, 0.00001f));
  399. }
  400. }
  401. static void test_matrix4x4()
  402. {
  403. {
  404. const Matrix4x4 a = matrix4x4(1.2f, -2.3f, 5.1f, -1.2f
  405. , 2.2f, -5.1f, 1.1f, -7.4f
  406. , 3.2f, 3.3f, -3.8f, -9.2f
  407. , -6.8f, -2.9f, 1.0f, 4.9f
  408. );
  409. const Matrix4x4 b = matrix4x4(3.2f, 4.8f, 6.0f, 5.3f
  410. , -1.6f, -7.1f, -2.4f, -6.2f
  411. , -3.1f, -2.2f, 8.9f, 8.3f
  412. , 3.8f, 9.1f, -3.1f, -7.1f
  413. );
  414. const Matrix4x4 c = a + b;
  415. CE_ENSURE(fequal(c.x.x, 4.4f, 0.00001f));
  416. CE_ENSURE(fequal(c.x.y, 2.5f, 0.00001f));
  417. CE_ENSURE(fequal(c.x.z, 11.1f, 0.00001f));
  418. CE_ENSURE(fequal(c.x.w, 4.1f, 0.00001f));
  419. CE_ENSURE(fequal(c.y.x, 0.6f, 0.00001f));
  420. CE_ENSURE(fequal(c.y.y, -12.2f, 0.00001f));
  421. CE_ENSURE(fequal(c.y.z, -1.3f, 0.00001f));
  422. CE_ENSURE(fequal(c.y.w, -13.6f, 0.00001f));
  423. CE_ENSURE(fequal(c.z.x, 0.1f, 0.00001f));
  424. CE_ENSURE(fequal(c.z.y, 1.1f, 0.00001f));
  425. CE_ENSURE(fequal(c.z.z, 5.1f, 0.00001f));
  426. CE_ENSURE(fequal(c.z.w, -0.9f, 0.00001f));
  427. CE_ENSURE(fequal(c.t.x, -3.0f, 0.00001f));
  428. CE_ENSURE(fequal(c.t.y, 6.2f, 0.00001f));
  429. CE_ENSURE(fequal(c.t.z, -2.1f, 0.00001f));
  430. CE_ENSURE(fequal(c.t.w, -2.2f, 0.00001f));
  431. }
  432. {
  433. const Matrix4x4 a = matrix4x4(1.2f, -2.3f, 5.1f, -1.2f
  434. , 2.2f, -5.1f, 1.1f, -7.4f
  435. , 3.2f, 3.3f, -3.8f, -9.2f
  436. , -6.8f, -2.9f, 1.0f, 4.9f
  437. );
  438. const Matrix4x4 b = matrix4x4(3.2f, 4.8f, 6.0f, 5.3f
  439. , -1.6f, -7.1f, -2.4f, -6.2f
  440. , -3.1f, -2.2f, 8.9f, 8.3f
  441. , 3.8f, 9.1f, -3.1f, -7.1f
  442. );
  443. const Matrix4x4 c = a - b;
  444. CE_ENSURE(fequal(c.x.x, -2.0f, 0.00001f));
  445. CE_ENSURE(fequal(c.x.y, -7.1f, 0.00001f));
  446. CE_ENSURE(fequal(c.x.z, -0.9f, 0.00001f));
  447. CE_ENSURE(fequal(c.x.w, -6.5f, 0.00001f));
  448. CE_ENSURE(fequal(c.y.x, 3.8f, 0.00001f));
  449. CE_ENSURE(fequal(c.y.y, 2.0f, 0.00001f));
  450. CE_ENSURE(fequal(c.y.z, 3.5f, 0.00001f));
  451. CE_ENSURE(fequal(c.y.w, -1.2f, 0.00001f));
  452. CE_ENSURE(fequal(c.z.x, 6.3f, 0.00001f));
  453. CE_ENSURE(fequal(c.z.y, 5.5f, 0.00001f));
  454. CE_ENSURE(fequal(c.z.z, -12.7f, 0.00001f));
  455. CE_ENSURE(fequal(c.z.w, -17.5f, 0.00001f));
  456. CE_ENSURE(fequal(c.t.x, -10.6f, 0.00001f));
  457. CE_ENSURE(fequal(c.t.y, -12.0f, 0.00001f));
  458. CE_ENSURE(fequal(c.t.z, 4.1f, 0.00001f));
  459. CE_ENSURE(fequal(c.t.w, 12.0f, 0.00001f));
  460. }
  461. {
  462. const Matrix4x4 a = matrix4x4(1.2f, -2.3f, 5.1f, -1.2f
  463. , 2.2f, -5.1f, 1.1f, -7.4f
  464. , 3.2f, 3.3f, -3.8f, -9.2f
  465. , -6.8f, -2.9f, 1.0f, 4.9f
  466. );
  467. const Matrix4x4 b = matrix4x4(3.2f, 4.8f, 6.0f, 5.3f
  468. , -1.6f, -7.1f, -2.4f, -6.2f
  469. , -3.1f, -2.2f, 8.9f, 8.3f
  470. , 3.8f, 9.1f, -3.1f, -7.1f
  471. );
  472. const Matrix4x4 c = a * b;
  473. CE_ENSURE(fequal(c.x.x, -12.85, 0.00001f));
  474. CE_ENSURE(fequal(c.x.y, -0.05, 0.00001f));
  475. CE_ENSURE(fequal(c.x.z, 61.83, 0.00001f));
  476. CE_ENSURE(fequal(c.x.w, 71.47, 0.00001f));
  477. CE_ENSURE(fequal(c.y.x, -16.33, 0.00001f));
  478. CE_ENSURE(fequal(c.y.y, -22.99, 0.00001f));
  479. CE_ENSURE(fequal(c.y.z, 58.17, 0.00001f));
  480. CE_ENSURE(fequal(c.y.w, 104.95, 0.00001f));
  481. CE_ENSURE(fequal(c.z.x, -18.22, 0.00001f));
  482. CE_ENSURE(fequal(c.z.y, -83.43, 0.00001f));
  483. CE_ENSURE(fequal(c.z.z, 5.98, 0.00001f));
  484. CE_ENSURE(fequal(c.z.w, 30.28, 0.00001f));
  485. CE_ENSURE(fequal(c.t.x, -1.60, 0.00001f));
  486. CE_ENSURE(fequal(c.t.y, 30.34, 0.00001f));
  487. CE_ENSURE(fequal(c.t.z, -40.13, 0.00001f));
  488. CE_ENSURE(fequal(c.t.w, -44.55, 0.00001f));
  489. }
  490. {
  491. const Matrix4x4 a = matrix4x4(1.2f, -2.3f, 5.1f, -1.2f
  492. , 2.2f, -5.1f, 1.1f, -7.4f
  493. , 3.2f, 3.3f, -3.8f, -9.2f
  494. , -6.8f, -2.9f, 1.0f, 4.9f
  495. );
  496. const f32 det = determinant(a);
  497. CE_ENSURE(fequal(det, -1379.14453f, 0.00001f));
  498. }
  499. {
  500. const Matrix4x4 a = matrix4x4(1.2f, -2.3f, 5.1f, -1.2f
  501. , 2.2f, -5.1f, 1.1f, -7.4f
  502. , 3.2f, 3.3f, -3.8f, -9.2f
  503. , -6.8f, -2.9f, 1.0f, 4.9f
  504. );
  505. const Matrix4x4 b = get_inverted(a);
  506. CE_ENSURE(fequal(b.x.x, -0.08464f, 0.00001f));
  507. CE_ENSURE(fequal(b.x.y, 0.06129f, 0.00001f));
  508. CE_ENSURE(fequal(b.x.z, -0.15210f, 0.00001f));
  509. CE_ENSURE(fequal(b.x.w, -0.21374f, 0.00001f));
  510. CE_ENSURE(fequal(b.y.x, 0.14384f, 0.00001f));
  511. CE_ENSURE(fequal(b.y.y, -0.18486f, 0.00001f));
  512. CE_ENSURE(fequal(b.y.z, 0.14892f, 0.00001f));
  513. CE_ENSURE(fequal(b.y.w, 0.03565f, 0.00001f));
  514. CE_ENSURE(fequal(b.z.x, 0.26073f, 0.00001f));
  515. CE_ENSURE(fequal(b.z.y, -0.09877f, 0.00001f));
  516. CE_ENSURE(fequal(b.z.z, 0.07063f, 0.00001f));
  517. CE_ENSURE(fequal(b.z.w, 0.04729f, 0.00001f));
  518. CE_ENSURE(fequal(b.t.x, -0.08553f, 0.00001f));
  519. CE_ENSURE(fequal(b.t.y, -0.00419f, 0.00001f));
  520. CE_ENSURE(fequal(b.t.z, -0.13735f, 0.00001f));
  521. CE_ENSURE(fequal(b.t.w, -0.08108f, 0.00001f));
  522. }
  523. {
  524. const Matrix4x4 a = matrix4x4(1.2f, -2.3f, 5.1f, -1.2f
  525. , 2.2f, -5.1f, 1.1f, -7.4f
  526. , 3.2f, 3.3f, -3.8f, -9.2f
  527. , -6.8f, -2.9f, 1.0f, 4.9f
  528. );
  529. const Matrix4x4 b = get_transposed(a);
  530. CE_ENSURE(fequal(b.x.x, 1.2f, 0.00001f));
  531. CE_ENSURE(fequal(b.x.y, 2.2f, 0.00001f));
  532. CE_ENSURE(fequal(b.x.z, 3.2f, 0.00001f));
  533. CE_ENSURE(fequal(b.x.w, -6.8f, 0.00001f));
  534. CE_ENSURE(fequal(b.y.x, -2.3f, 0.00001f));
  535. CE_ENSURE(fequal(b.y.y, -5.1f, 0.00001f));
  536. CE_ENSURE(fequal(b.y.z, 3.3f, 0.00001f));
  537. CE_ENSURE(fequal(b.y.w, -2.9f, 0.00001f));
  538. CE_ENSURE(fequal(b.z.x, 5.1f, 0.00001f));
  539. CE_ENSURE(fequal(b.z.y, 1.1f, 0.00001f));
  540. CE_ENSURE(fequal(b.z.z, -3.8f, 0.00001f));
  541. CE_ENSURE(fequal(b.z.w, 1.0f, 0.00001f));
  542. CE_ENSURE(fequal(b.t.x, -1.2f, 0.00001f));
  543. CE_ENSURE(fequal(b.t.y, -7.4f, 0.00001f));
  544. CE_ENSURE(fequal(b.t.z, -9.2f, 0.00001f));
  545. CE_ENSURE(fequal(b.t.w, 4.9f, 0.00001f));
  546. }
  547. }
  548. static void test_aabb()
  549. {
  550. {
  551. AABB a;
  552. aabb::reset(a);
  553. CE_ENSURE(a.min == VECTOR3_ZERO);
  554. CE_ENSURE(a.max == VECTOR3_ZERO);
  555. }
  556. {
  557. AABB a;
  558. a.min = vector3(-2.3f, 1.2f, -4.5f);
  559. a.max = vector3( 3.7f, 5.3f, -2.9f);
  560. const Vector3 c = aabb::center(a);
  561. CE_ENSURE(fequal(c.x, 0.70f, 0.00001f));
  562. CE_ENSURE(fequal(c.y, 3.25f, 0.00001f));
  563. CE_ENSURE(fequal(c.z, -3.70f, 0.00001f));
  564. }
  565. {
  566. AABB a;
  567. a.min = vector3(-2.3f, 1.2f, -4.5f);
  568. a.max = vector3( 3.7f, 5.3f, -2.9f);
  569. const float c = aabb::volume(a);
  570. CE_ENSURE(fequal(c, 39.36f, 0.00001f));
  571. }
  572. {
  573. AABB a;
  574. aabb::reset(a);
  575. const Vector3 points[] =
  576. {
  577. { -1.2f, 3.4f, 5.5f },
  578. { 8.2f, -2.4f, -1.5f },
  579. { -5.9f, 9.2f, 6.0f }
  580. };
  581. aabb::add_points(a, CE_COUNTOF(points), points);
  582. CE_ENSURE(fequal(a.min.x, -5.9f, 0.00001f));
  583. CE_ENSURE(fequal(a.min.y, -2.4f, 0.00001f));
  584. CE_ENSURE(fequal(a.min.z, -1.5f, 0.00001f));
  585. CE_ENSURE(fequal(a.max.x, 8.2f, 0.00001f));
  586. CE_ENSURE(fequal(a.max.y, 9.2f, 0.00001f));
  587. CE_ENSURE(fequal(a.max.z, 6.0f, 0.00001f));
  588. }
  589. {
  590. AABB boxes[3];
  591. aabb::reset(boxes[0]);
  592. aabb::reset(boxes[1]);
  593. aabb::reset(boxes[2]);
  594. const Vector3 points[] =
  595. {
  596. { -1.2f, 3.4f, 5.5f },
  597. { 8.2f, -2.4f, -1.5f },
  598. { -5.9f, 9.2f, 6.0f },
  599. { -2.8f, -3.5f, 1.9f },
  600. { -8.3f, -3.1f, 1.9f },
  601. { 4.0f, -3.9f, -1.4f },
  602. { -0.4f, -1.8f, -2.2f },
  603. { -8.6f, -4.8f, 2.8f },
  604. { 4.1f, 4.7f, -0.4f }
  605. };
  606. aabb::add_points(boxes[0], CE_COUNTOF(points)/3, &points[0]);
  607. aabb::add_points(boxes[1], CE_COUNTOF(points)/3, &points[3]);
  608. aabb::add_points(boxes[2], CE_COUNTOF(points)/3, &points[6]);
  609. AABB d;
  610. aabb::reset(d);
  611. aabb::add_boxes(d, CE_COUNTOF(boxes), boxes);
  612. CE_ENSURE(fequal(d.min.x, -8.6f, 0.00001f));
  613. CE_ENSURE(fequal(d.min.y, -4.8f, 0.00001f));
  614. CE_ENSURE(fequal(d.min.z, -2.2f, 0.00001f));
  615. CE_ENSURE(fequal(d.max.x, 8.2f, 0.00001f));
  616. CE_ENSURE(fequal(d.max.y, 9.2f, 0.00001f));
  617. CE_ENSURE(fequal(d.max.z, 6.0f, 0.00001f));
  618. }
  619. {
  620. AABB a;
  621. a.min = vector3(-2.3f, 1.2f, -4.5f);
  622. a.max = vector3( 3.7f, 5.3f, -2.9f);
  623. CE_ENSURE( aabb::contains_point(a, vector3(1.2f, 3.0f, -4.4f)));
  624. CE_ENSURE(!aabb::contains_point(a, vector3(3.8f, 3.0f, -4.4f)));
  625. CE_ENSURE(!aabb::contains_point(a, vector3(1.2f, -1.0f, -4.4f)));
  626. CE_ENSURE(!aabb::contains_point(a, vector3(1.2f, 3.0f, -4.6f)));
  627. }
  628. }
  629. static void test_sphere()
  630. {
  631. {
  632. Sphere a;
  633. sphere::reset(a);
  634. CE_ENSURE(a.c == VECTOR3_ZERO);
  635. CE_ENSURE(fequal(a.r, 0.0f, 0.00001f));
  636. }
  637. {
  638. Sphere a;
  639. a.c = VECTOR3_ZERO;
  640. a.r = 1.61f;
  641. const float b = sphere::volume(a);
  642. CE_ENSURE(fequal(b, 17.48099f, 0.00001f));
  643. }
  644. {
  645. Sphere a;
  646. sphere::reset(a);
  647. const Vector3 points[] =
  648. {
  649. { -1.2f, 3.4f, 5.5f },
  650. { 8.2f, -2.4f, -1.5f },
  651. { -5.9f, 9.2f, 6.0f }
  652. };
  653. sphere::add_points(a, CE_COUNTOF(points), points);
  654. CE_ENSURE(fequal(a.c.x, 0.0f, 0.00001f));
  655. CE_ENSURE(fequal(a.c.y, 0.0f, 0.00001f));
  656. CE_ENSURE(fequal(a.c.z, 0.0f, 0.00001f));
  657. CE_ENSURE(fequal(a.r, 12.46795f, 0.00001f));
  658. }
  659. {
  660. Sphere spheres[3];
  661. sphere::reset(spheres[0]);
  662. sphere::reset(spheres[1]);
  663. sphere::reset(spheres[2]);
  664. const Vector3 points[] =
  665. {
  666. { 6.6f, 3.5f, -5.7f },
  667. { -5.3f, -9.1f, -7.9f },
  668. { -1.5f, 4.4f, -5.8f },
  669. { 7.2f, -2.4f, -9.5f },
  670. { 4.0f, -8.1f, 6.6f },
  671. { -8.2f, 2.2f, 4.6f },
  672. { 2.9f, -4.8f, -6.8f },
  673. { -7.6f, -7.0f, 0.8f },
  674. { 8.2f, 2.8f, -4.8f }
  675. };
  676. sphere::add_points(spheres[0], CE_COUNTOF(points)/3, &points[0]);
  677. sphere::add_points(spheres[1], CE_COUNTOF(points)/3, &points[3]);
  678. sphere::add_points(spheres[2], CE_COUNTOF(points)/3, &points[6]);
  679. Sphere d;
  680. sphere::reset(d);
  681. sphere::add_spheres(d, CE_COUNTOF(spheres), spheres);
  682. CE_ENSURE(fequal(d.r, 13.16472f, 0.00001f));
  683. }
  684. {
  685. Sphere a;
  686. a.c = vector3(-2.3f, 1.2f, -4.5f);
  687. a.r = 1.0f;
  688. CE_ENSURE( sphere::contains_point(a, vector3(-2.9f, 1.6f, -4.0f)));
  689. CE_ENSURE(!sphere::contains_point(a, vector3(-3.9f, 1.6f, -4.0f)));
  690. CE_ENSURE(!sphere::contains_point(a, vector3(-2.9f, 2.6f, -4.0f)));
  691. CE_ENSURE(!sphere::contains_point(a, vector3(-2.9f, 1.6f, -6.0f)));
  692. }
  693. }
  694. static void test_murmur()
  695. {
  696. const u32 m = murmur32("murmur32", 8, 0);
  697. CE_ENSURE(m == 0x7c2365dbu);
  698. const u64 n = murmur64("murmur64", 8, 0);
  699. CE_ENSURE(n == 0x90631502d1a3432bu);
  700. }
  701. static void test_string_id()
  702. {
  703. {
  704. StringId32 a("murmur32");
  705. CE_ENSURE(a._id == 0x7c2365dbu);
  706. StringId32 b("murmur32", 8);
  707. CE_ENSURE(a._id == 0x7c2365dbu);
  708. char buf[128];
  709. a.to_string(buf);
  710. CE_ENSURE(strcmp(buf, "7c2365db") == 0);
  711. }
  712. {
  713. StringId64 a("murmur64");
  714. CE_ENSURE(a._id == 0x90631502d1a3432bu);
  715. StringId64 b("murmur64", 8);
  716. CE_ENSURE(a._id == 0x90631502d1a3432bu);
  717. char buf[128];
  718. a.to_string(buf);
  719. CE_ENSURE(strcmp(buf, "90631502d1a3432b") == 0);
  720. }
  721. }
  722. static void test_dynamic_string()
  723. {
  724. memory_globals::init();
  725. {
  726. TempAllocator1024 ta;
  727. DynamicString str(ta);
  728. CE_ENSURE(str.empty());
  729. str.set("murmur32", 8);
  730. CE_ENSURE(str.length() == 8);
  731. const StringId32 id = str.to_string_id();
  732. CE_ENSURE(id._id == 0x7c2365dbu);
  733. }
  734. {
  735. TempAllocator1024 ta;
  736. DynamicString str("Test ", ta);
  737. str += "string.";
  738. CE_ENSURE(strcmp(str.c_str(), "Test string.") == 0);
  739. }
  740. {
  741. TempAllocator1024 ta;
  742. DynamicString str(" \tSushi\t ", ta);
  743. str.ltrim();
  744. CE_ENSURE(strcmp(str.c_str(), "Sushi\t ") == 0);
  745. }
  746. {
  747. TempAllocator1024 ta;
  748. DynamicString str(" \tSushi\t ", ta);
  749. str.rtrim();
  750. CE_ENSURE(strcmp(str.c_str(), " \tSushi") == 0);
  751. }
  752. {
  753. TempAllocator1024 ta;
  754. DynamicString str(" \tSushi\t ", ta);
  755. str.trim();
  756. CE_ENSURE(strcmp(str.c_str(), "Sushi") == 0);
  757. }
  758. memory_globals::shutdown();
  759. }
  760. static void test_json()
  761. {
  762. memory_globals::init();
  763. {
  764. JsonValueType::Enum t = json::type("null");
  765. CE_ENSURE(t == JsonValueType::NIL);
  766. }
  767. {
  768. JsonValueType::Enum t = json::type("true");
  769. CE_ENSURE(t == JsonValueType::BOOL);
  770. }
  771. {
  772. JsonValueType::Enum t = json::type("false");
  773. CE_ENSURE(t == JsonValueType::BOOL);
  774. }
  775. {
  776. JsonValueType::Enum t = json::type("3.14");
  777. CE_ENSURE(t == JsonValueType::NUMBER);
  778. }
  779. {
  780. JsonValueType::Enum t = json::type("\"foo\"");
  781. CE_ENSURE(t == JsonValueType::STRING);
  782. }
  783. {
  784. JsonValueType::Enum t = json::type("[]");
  785. CE_ENSURE(t == JsonValueType::ARRAY);
  786. }
  787. {
  788. JsonValueType::Enum t = json::type("{}");
  789. CE_ENSURE(t == JsonValueType::OBJECT);
  790. }
  791. {
  792. const s32 a = json::parse_int("3.14");
  793. CE_ENSURE(a == 3);
  794. }
  795. {
  796. const f32 a = json::parse_float("3.14");
  797. CE_ENSURE(fequal(a, 3.14f));
  798. }
  799. {
  800. const bool a = json::parse_bool("true");
  801. CE_ENSURE(a == true);
  802. }
  803. {
  804. const bool a = json::parse_bool("false");
  805. CE_ENSURE(a == false);
  806. }
  807. {
  808. TempAllocator1024 ta;
  809. DynamicString str(ta);
  810. json::parse_string("\"This is JSON\"", str);
  811. CE_ENSURE(strcmp(str.c_str(), "This is JSON") == 0);
  812. }
  813. memory_globals::shutdown();
  814. }
  815. static void test_sjson()
  816. {
  817. memory_globals::init();
  818. {
  819. JsonValueType::Enum t = sjson::type("null");
  820. CE_ENSURE(t == JsonValueType::NIL);
  821. }
  822. {
  823. JsonValueType::Enum t = sjson::type("true");
  824. CE_ENSURE(t == JsonValueType::BOOL);
  825. }
  826. {
  827. JsonValueType::Enum t = sjson::type("false");
  828. CE_ENSURE(t == JsonValueType::BOOL);
  829. }
  830. {
  831. JsonValueType::Enum t = sjson::type("3.14");
  832. CE_ENSURE(t == JsonValueType::NUMBER);
  833. }
  834. {
  835. JsonValueType::Enum t = sjson::type("\"foo\"");
  836. CE_ENSURE(t == JsonValueType::STRING);
  837. }
  838. {
  839. JsonValueType::Enum t = sjson::type("[]");
  840. CE_ENSURE(t == JsonValueType::ARRAY);
  841. }
  842. {
  843. JsonValueType::Enum t = sjson::type("{}");
  844. CE_ENSURE(t == JsonValueType::OBJECT);
  845. }
  846. {
  847. const s32 a = sjson::parse_int("3.14");
  848. CE_ENSURE(a == 3);
  849. }
  850. {
  851. const f32 a = sjson::parse_float("3.14");
  852. CE_ENSURE(fequal(a, 3.14f));
  853. }
  854. {
  855. const bool a = sjson::parse_bool("true");
  856. CE_ENSURE(a == true);
  857. }
  858. {
  859. const bool a = sjson::parse_bool("false");
  860. CE_ENSURE(a == false);
  861. }
  862. {
  863. TempAllocator1024 ta;
  864. DynamicString str(ta);
  865. sjson::parse_string("\"This is JSON\"", str);
  866. CE_ENSURE(strcmp(str.c_str(), "This is JSON") == 0);
  867. }
  868. {
  869. const Vector2 a = sjson::parse_vector2("[ 1.2 -2.5 ]");
  870. CE_ENSURE(fequal(a.x, 1.2f));
  871. CE_ENSURE(fequal(a.y, -2.5f));
  872. }
  873. {
  874. const Vector3 a = sjson::parse_vector3("[ 3.1 0.5 -5.7]");
  875. CE_ENSURE(fequal(a.x, 3.1f));
  876. CE_ENSURE(fequal(a.y, 0.5f));
  877. CE_ENSURE(fequal(a.z, -5.7f));
  878. }
  879. {
  880. const Vector4 a = sjson::parse_vector4("[ 6.7 -1.3 2.9 -0.4 ]");
  881. CE_ENSURE(fequal(a.x, 6.7f));
  882. CE_ENSURE(fequal(a.y, -1.3f));
  883. CE_ENSURE(fequal(a.z, 2.9f));
  884. CE_ENSURE(fequal(a.w, -0.4f));
  885. }
  886. {
  887. const Quaternion a = sjson::parse_quaternion("[ -1.5 -3.4 9.1 -3.5 ]");
  888. CE_ENSURE(fequal(a.x, -1.5f));
  889. CE_ENSURE(fequal(a.y, -3.4f));
  890. CE_ENSURE(fequal(a.z, 9.1f));
  891. CE_ENSURE(fequal(a.w, -3.5f));
  892. }
  893. {
  894. const Matrix4x4 a = sjson::parse_matrix4x4(
  895. "["
  896. "-3.2 5.3 -0.7 4.1 "
  897. " 5.6 7.0 -3.2 -1.2 "
  898. "-6.3 9.0 3.9 1.1 "
  899. " 0.4 -7.3 8.9 -0.1 "
  900. "]"
  901. );
  902. CE_ENSURE(fequal(a.x.x, -3.2f));
  903. CE_ENSURE(fequal(a.x.y, 5.3f));
  904. CE_ENSURE(fequal(a.x.z, -0.7f));
  905. CE_ENSURE(fequal(a.x.w, 4.1f));
  906. CE_ENSURE(fequal(a.y.x, 5.6f));
  907. CE_ENSURE(fequal(a.y.y, 7.0f));
  908. CE_ENSURE(fequal(a.y.z, -3.2f));
  909. CE_ENSURE(fequal(a.y.w, -1.2f));
  910. CE_ENSURE(fequal(a.z.x, -6.3f));
  911. CE_ENSURE(fequal(a.z.y, 9.0f));
  912. CE_ENSURE(fequal(a.z.z, 3.9f));
  913. CE_ENSURE(fequal(a.z.w, 1.1f));
  914. CE_ENSURE(fequal(a.t.x, 0.4f));
  915. CE_ENSURE(fequal(a.t.y, -7.3f));
  916. CE_ENSURE(fequal(a.t.z, 8.9f));
  917. CE_ENSURE(fequal(a.t.w, -0.1f));
  918. }
  919. {
  920. const StringId32 a = sjson::parse_string_id("\"murmur32\"");
  921. CE_ENSURE(a._id == 0x7c2365dbu);
  922. }
  923. {
  924. const ResourceId a = sjson::parse_resource_id("\"murmur64\"");
  925. CE_ENSURE(a._id == 0x90631502d1a3432bu);
  926. }
  927. memory_globals::shutdown();
  928. }
  929. static void test_path()
  930. {
  931. #if CROWN_PLATFORM_POSIX
  932. {
  933. const bool a = path::is_absolute("/home/foo");
  934. CE_ENSURE(a == true);
  935. const bool b = path::is_absolute("home/foo");
  936. CE_ENSURE(b == false);
  937. }
  938. {
  939. const bool a = path::is_relative("/home/foo");
  940. CE_ENSURE(a == false);
  941. const bool b = path::is_relative("home/foo");
  942. CE_ENSURE(b == true);
  943. }
  944. {
  945. const bool a = path::is_root("/");
  946. CE_ENSURE(a == true);
  947. const bool b = path::is_root("/home");
  948. CE_ENSURE(b == false);
  949. }
  950. #else
  951. {
  952. const bool a = path::is_absolute("C:\\Users\\foo");
  953. CE_ENSURE(a == true);
  954. const bool b = path::is_absolute("Users\\foo");
  955. CE_ENSURE(b == false);
  956. }
  957. {
  958. const bool a = path::is_relative("D:\\Users\\foo");
  959. CE_ENSURE(a == false);
  960. const bool b = path::is_relative("Users\\foo");
  961. CE_ENSURE(b == true);
  962. }
  963. {
  964. const bool a = path::is_root("E:\\");
  965. CE_ENSURE(a == true);
  966. const bool b = path::is_root("E:\\Users");
  967. CE_ENSURE(b == false);
  968. }
  969. #endif // CROWN_PLATFORM_POSIX
  970. {
  971. const char* p = path::basename("");
  972. CE_ENSURE(strcmp(p, "") == 0);
  973. const char* q = path::basename("/");
  974. CE_ENSURE(strcmp(q, "") == 0);
  975. const char* r = path::basename("boot.config");
  976. CE_ENSURE(strcmp(r, "boot.config") == 0);
  977. const char* s = path::basename("foo/boot.config");
  978. CE_ENSURE(strcmp(s, "boot.config") == 0);
  979. const char* t = path::basename("/foo/boot.config");
  980. CE_ENSURE(strcmp(t, "boot.config") == 0);
  981. }
  982. {
  983. const char* p = path::extension("");
  984. CE_ENSURE(p == NULL);
  985. const char* q = path::extension("boot");
  986. CE_ENSURE(q == NULL);
  987. const char* r = path::extension("boot.bar.config");
  988. CE_ENSURE(strcmp(r, "config") == 0);
  989. }
  990. }
  991. static void test_command_line()
  992. {
  993. const char* argv[] =
  994. {
  995. "args",
  996. "-s",
  997. "--switch",
  998. "--argument",
  999. "orange"
  1000. };
  1001. CommandLine cl(CE_COUNTOF(argv), argv);
  1002. CE_ENSURE(cl.has_argument("switch", 's'));
  1003. const char* orange = cl.get_parameter("argument");
  1004. CE_ENSURE(orange != NULL && strcmp(orange, "orange") == 0);
  1005. }
  1006. static void run_unit_tests()
  1007. {
  1008. test_memory();
  1009. test_array();
  1010. test_vector();
  1011. test_vector2();
  1012. test_vector3();
  1013. test_vector4();
  1014. test_matrix3x3();
  1015. test_matrix4x4();
  1016. test_aabb();
  1017. test_sphere();
  1018. test_murmur();
  1019. test_string_id();
  1020. test_dynamic_string();
  1021. test_json();
  1022. test_sjson();
  1023. test_path();
  1024. test_command_line();
  1025. }
  1026. } // namespace crown
  1027. #endif // CROWN_BUILD_UNIT_TESTS