unit_tests.cpp 30 KB

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