2
0

unit_tests.cpp 32 KB

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