8TEST_CASE(
"Vector and Color Types (helios_vector_types.h)") {
13 DOCTEST_CHECK(v0.x == 1);
14 DOCTEST_CHECK(v0.y == 2);
17 int2 v_vec_c(std::vector<int>{1, 2});
18 DOCTEST_CHECK(v_vec_c == v0);
19 DOCTEST_CHECK_THROWS(int2({1}));
22 DOCTEST_CHECK(v_arr_c == v0);
25 DOCTEST_CHECK(v0 + v1 == int2(4, 6));
27 DOCTEST_CHECK(v0 == int2(4, 6));
28 DOCTEST_CHECK(v1 - v0 == int2(-1, -2));
30 DOCTEST_CHECK(v0 == int2(1, 2));
31 DOCTEST_CHECK(v0 != v1);
32 DOCTEST_CHECK(-v0 == int2(-1, -2));
36 DOCTEST_CHECK(
make_int2(arr2) == int2(5, 6));
41 DOCTEST_CHECK(ss.str() ==
"helios::int2<1, 2>");
47 DOCTEST_CHECK(v0.x == 1);
50 int3 v_vec_c(std::vector<int>{1, 2, 3});
51 DOCTEST_CHECK(v_vec_c == v0);
52 DOCTEST_CHECK_THROWS(int3({1}));
53 int arr[3] = {1, 2, 3};
55 DOCTEST_CHECK(v_arr_c == v0);
58 DOCTEST_CHECK(v0 + v1 == int3(5, 7, 9));
60 DOCTEST_CHECK(v0 == int3(5, 7, 9));
61 DOCTEST_CHECK(v1 - v0 == int3(-1, -2, -3));
63 DOCTEST_CHECK(v0 == int3(1, 2, 3));
64 DOCTEST_CHECK(v0 != v1);
65 DOCTEST_CHECK(-v0 == int3(-1, -2, -3));
69 int arr2[3] = {1, 2, 3};
75 DOCTEST_CHECK(ss.str() ==
"helios::int3<1, 2, 3>");
81 DOCTEST_CHECK(v0.w == 4);
85 DOCTEST_CHECK(v_def_c.x == 0);
86 int4 v_vec_c(std::vector<int>{1, 2, 3, 4});
87 DOCTEST_CHECK(v_vec_c == v0);
88 DOCTEST_CHECK_THROWS(int4({1}));
89 int arr[4] = {1, 2, 3, 4};
91 DOCTEST_CHECK(v_arr_c == v0);
94 DOCTEST_CHECK(v0 + v1 == int4(6, 8, 10, 12));
96 DOCTEST_CHECK(v0 == int4(6, 8, 10, 12));
97 DOCTEST_CHECK(v1 - v0 == int4(-1, -2, -3, -4));
99 DOCTEST_CHECK(v0 == int4(1, 2, 3, 4));
100 DOCTEST_CHECK(v0 != v1);
101 DOCTEST_CHECK(-v0 == int4(-1, -2, -3, -4));
104 DOCTEST_CHECK(
make_int4(1, 2, 3, 4) == v0);
105 int arr2[4] = {1, 2, 3, 4};
109 std::stringstream ss;
111 DOCTEST_CHECK(ss.str() ==
"helios::int4<1, 2, 3, 4>");
117 DOCTEST_CHECK(v0.x == 1);
121 DOCTEST_CHECK(v_def_c.x == 0);
122 uint2 v_vec_c(std::vector<uint>{1, 2});
123 DOCTEST_CHECK(v_vec_c == v0);
124 DOCTEST_CHECK_THROWS(uint2({1}));
125 unsigned int arr[2] = {1, 2};
127 DOCTEST_CHECK(v_arr_c == v0);
130 DOCTEST_CHECK(v0 + v1 == uint2(4, 6));
132 DOCTEST_CHECK(v0 == uint2(4, 6));
133 DOCTEST_CHECK(v0 - v1 == uint2(1, 2));
135 DOCTEST_CHECK(v0 == uint2(1, 2));
136 DOCTEST_CHECK(v0 != v1);
137 DOCTEST_CHECK(-v0 == uint2((
unsigned int) -1, (
unsigned int) -2));
141 unsigned int arr2[2] = {1, 2};
145 std::stringstream ss;
147 DOCTEST_CHECK(ss.str() ==
"helios::uint2<1, 2>");
153 DOCTEST_CHECK(v0.x == 1);
157 DOCTEST_CHECK(v_def_c.x == 0);
158 uint3 v_vec_c(std::vector<uint>{1, 2, 3});
159 DOCTEST_CHECK(v_vec_c == v0);
160 DOCTEST_CHECK_THROWS(uint3({1}));
161 unsigned int arr[3] = {1, 2, 3};
163 DOCTEST_CHECK(v_arr_c == v0);
166 DOCTEST_CHECK(v0 + v1 == uint3(5, 7, 9));
168 DOCTEST_CHECK(v0 == uint3(5, 7, 9));
169 DOCTEST_CHECK(v0 - v1 == uint3(1, 2, 3));
171 DOCTEST_CHECK(v0 == uint3(1, 2, 3));
172 DOCTEST_CHECK(v0 != v1);
173 DOCTEST_CHECK(-v0 == uint3((
unsigned int) -1, (
unsigned int) -2, (
unsigned int) -3));
177 unsigned int arr2[3] = {1, 2, 3};
181 std::stringstream ss;
183 DOCTEST_CHECK(ss.str() ==
"helios::uint3<1, 2, 3>");
187 uint4 v0(1, 2, 3, 4);
188 uint4 v1(5, 6, 7, 8);
189 DOCTEST_CHECK(v0.w == 4);
193 DOCTEST_CHECK(v_def_c.x == 0);
194 uint4 v_vec_c(std::vector<uint>{1, 2, 3, 4});
195 DOCTEST_CHECK(v_vec_c == v0);
196 DOCTEST_CHECK_THROWS(uint4({1}));
197 unsigned int arr[4] = {1, 2, 3, 4};
199 DOCTEST_CHECK(v_arr_c == v0);
202 DOCTEST_CHECK(v0 + v1 == uint4(6, 8, 10, 12));
204 DOCTEST_CHECK(v0 == uint4(6, 8, 10, 12));
205 DOCTEST_CHECK(v0 - v1 == uint4(1, 2, 3, 4));
207 DOCTEST_CHECK(v0 == uint4(1, 2, 3, 4));
208 DOCTEST_CHECK(v0 != v1);
209 DOCTEST_CHECK(-v0 == uint4((
unsigned int) -1, (
unsigned int) -2, (
unsigned int) -3, (
unsigned int) -4));
213 unsigned int arr2[4] = {1, 2, 3, 4};
217 std::stringstream ss;
219 DOCTEST_CHECK(ss.str() ==
"helios::uint4<1, 2, 3, 4>");
227 DOCTEST_CHECK_THROWS(vec2({1.f}));
228 float arr[] = {1.f, 2.f};
230 DOCTEST_CHECK(v_arr_c == v0);
233 DOCTEST_CHECK(vec2(3.f, 4.f).magnitude() == doctest::Approx(5.f));
234 DOCTEST_CHECK(normalize(vec2(3.f, 4.f)) == vec2(0.6f, 0.8f));
235 vec2 v_norm = vec2(3.f, 4.f);
237 DOCTEST_CHECK(v_norm == vec2(0.6f, 0.8f));
238 vec2 zero_vec(0.f, 0.f);
239 zero_vec.normalize();
240 DOCTEST_CHECK(zero_vec == vec2(0.f, 0.f));
244 DOCTEST_CHECK(v0 * v1 == doctest::Approx(11.f));
246 DOCTEST_CHECK(v0 == vec2(4.f, 6.f));
248 DOCTEST_CHECK(v0 == vec2(1.f, 2.f));
250 DOCTEST_CHECK(v0 == vec2(2.f, 4.f));
252 DOCTEST_CHECK(v0 == vec2(1.f, 2.f));
253 DOCTEST_CHECK(v0 + 1.f == vec2(2.f, 3.f));
254 DOCTEST_CHECK(1.f + v0 == vec2(2.f, 3.f));
255 DOCTEST_CHECK(v0 - 1.f == vec2(0.f, 1.f));
256 DOCTEST_CHECK(1.f - v0 == vec2(0.f, -1.f));
257 DOCTEST_CHECK(v0 * 2.f == vec2(2.f, 4.f));
258 DOCTEST_CHECK(v0 / 2.f == vec2(0.5f, 1.f));
259 DOCTEST_CHECK(v0 / 0.f == vec2(std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity()));
260 DOCTEST_CHECK(v0 != v1);
261 DOCTEST_CHECK(-v0 == vec2(-1.f, -2.f));
264 std::stringstream ss;
266 DOCTEST_CHECK(ss.str() ==
"helios::vec2<1, 2>");
270 vec3 v0(1.f, 2.f, 3.f);
271 vec3 v1(4.f, 5.f, 6.f);
274 DOCTEST_CHECK_THROWS(vec3({1.f}));
275 float arr[] = {1.f, 2.f, 3.f};
277 DOCTEST_CHECK(v_arr_c == v0);
280 vec3 zero_vec(0.f, 0.f, 0.f);
281 zero_vec.normalize();
282 DOCTEST_CHECK(zero_vec == vec3(0.f, 0.f, 0.f));
286 DOCTEST_CHECK(v0 == vec3(5.f, 7.f, 9.f));
288 DOCTEST_CHECK(v0 == vec3(1.f, 2.f, 3.f));
290 DOCTEST_CHECK(v0 == vec3(2.f, 4.f, 6.f));
292 DOCTEST_CHECK(v0 == vec3(1.f, 2.f, 3.f));
293 DOCTEST_CHECK(v0 + 1.f == vec3(2.f, 3.f, 4.f));
294 DOCTEST_CHECK(1.f + v0 == vec3(2.f, 3.f, 4.f));
295 DOCTEST_CHECK(v0 - 1.f == vec3(0.f, 1.f, 2.f));
296 DOCTEST_CHECK(1.f - v0 == vec3(0.f, -1.f, -2.f));
297 DOCTEST_CHECK(v0 * 2.f == vec3(2.f, 4.f, 6.f));
298 DOCTEST_CHECK(v0 != v1);
301 float arr2[] = {1.f, 2.f, 3.f};
305 std::stringstream ss;
307 DOCTEST_CHECK(ss.str() ==
"helios::vec3<1, 2, 3>");
311 vec4 v0(1.f, 2.f, 3.f, 4.f);
312 vec4 v1(5.f, 6.f, 7.f, 8.f);
316 DOCTEST_CHECK(v_def_c.x == 0.f);
317 DOCTEST_CHECK_THROWS(vec4({1.f}));
318 float arr[] = {1.f, 2.f, 3.f, 4.f};
320 DOCTEST_CHECK(v_arr_c == v0);
323 DOCTEST_CHECK(vec4(1, 2, 3, 4).magnitude() == doctest::Approx(sqrt(30.f)));
324 vec4 v_norm(1, 2, 3, 4);
326 float mag = sqrt(30.f);
327 DOCTEST_CHECK(v_norm.x == doctest::Approx(1.f / mag));
329 zero_vec.normalize();
330 DOCTEST_CHECK(zero_vec == vec4(0, 0, 0, 0));
331 DOCTEST_CHECK(normalize(vec4(1, 2, 3, 4)) == v_norm);
334 DOCTEST_CHECK(v0 * v1 == doctest::Approx(70.f));
335 DOCTEST_CHECK(v0 + v1 == vec4(6.f, 8.f, 10.f, 12.f));
337 DOCTEST_CHECK(v0 == vec4(6.f, 8.f, 10.f, 12.f));
338 DOCTEST_CHECK(v0 - v1 == vec4(1.f, 2.f, 3.f, 4.f));
340 DOCTEST_CHECK(v0 == vec4(1.f, 2.f, 3.f, 4.f));
342 DOCTEST_CHECK(v0 == vec4(2.f, 4.f, 6.f, 8.f));
344 DOCTEST_CHECK(v0 == vec4(1.f, 2.f, 3.f, 4.f));
345 DOCTEST_CHECK(v0 + 1.f == vec4(2.f, 3.f, 4.f, 5.f));
346 DOCTEST_CHECK(1.f + v0 == vec4(2.f, 3.f, 4.f, 5.f));
347 DOCTEST_CHECK(v0 - 1.f == vec4(0.f, 1.f, 2.f, 3.f));
348 DOCTEST_CHECK(1.f - v0 == vec4(0.f, -1.f, -2.f, -3.f));
349 DOCTEST_CHECK(v0 * 2.f == vec4(2.f, 4.f, 6.f, 8.f));
350 DOCTEST_CHECK(2.f * v0 == vec4(2.f, 4.f, 6.f, 8.f));
351 DOCTEST_CHECK(v0 / 2.f == vec4(0.5f, 1.f, 1.5f, 2.f));
352 DOCTEST_CHECK(v0 / 0.f == vec4(std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity()));
353 DOCTEST_CHECK(v0 != v1);
354 DOCTEST_CHECK(-v0 == vec4(-1.f, -2.f, -3.f, -4.f));
357 DOCTEST_CHECK(
make_vec4(1.f, 2.f, 3.f, 4.f) == v0);
358 float arr2[] = {1.f, 2.f, 3.f, 4.f};
362 std::stringstream ss;
364 DOCTEST_CHECK(ss.str() ==
"helios::vec4<1, 2, 3, 4>");
367 SUBCASE(
"RGBcolor") {
368 RGBcolor c0(0.1f, 0.2f, 0.3f);
369 RGBcolor c1(0.4f, 0.5f, 0.6f);
372 float arr[] = {0.1f, 0.2f, 0.3f};
373 RGBcolor c_arr_c(arr);
374 DOCTEST_CHECK(c_arr_c == c0);
375 std::vector<float> vec = {0.1f, 0.2f, 0.3f};
376 RGBcolor c_vec_c(vec);
377 DOCTEST_CHECK(c_vec_c == c0);
378 DOCTEST_CHECK_THROWS(RGBcolor({0.1f}));
379 vec3 v(0.1f, 0.2f, 0.3f);
381 DOCTEST_CHECK(c_v3_c == c0);
385 DOCTEST_CHECK(c0.r == doctest::Approx(0.2f));
386 DOCTEST_CHECK_THROWS(c0.scale(-1.f));
389 c0 = RGBcolor(0.1f, 0.2f, 0.3f);
390 DOCTEST_CHECK(c0 + c1 == RGBcolor(0.5f, 0.7f, 0.9f));
391 DOCTEST_CHECK(c1 - c0 == RGBcolor(0.3f, 0.3f, 0.3f));
392 DOCTEST_CHECK(c0 != c1);
395 std::stringstream ss;
397 DOCTEST_CHECK(ss.str() ==
"helios::RGBcolor<0.1, 0.2, 0.3>");
400 SUBCASE(
"RGBAcolor") {
401 RGBAcolor c0(0.1f, 0.2f, 0.3f, 0.4f);
402 RGBAcolor c1(0.5f, 0.6f, 0.7f, 0.8f);
405 float arr[] = {0.1f, 0.2f, 0.3f, 0.4f};
406 RGBAcolor c_arr_c(arr);
407 DOCTEST_CHECK(c_arr_c == c0);
408 std::vector<float> vec = {0.1f, 0.2f, 0.3f, 0.4f};
409 RGBAcolor c_vec_c(vec);
410 DOCTEST_CHECK(c_vec_c == c0);
411 DOCTEST_CHECK_THROWS(RGBAcolor({0.1f}));
415 DOCTEST_CHECK(c0.r == doctest::Approx(0.2f));
416 DOCTEST_CHECK_THROWS(c0.scale(-1.f));
419 c0 = RGBAcolor(0.1f, 0.2f, 0.3f, 0.4f);
420 DOCTEST_CHECK(c0 + c1 == RGBAcolor(0.6f, 0.8f, 1.0f, 1.0f));
421 DOCTEST_CHECK(c1 - c0 == RGBAcolor(0.4f, 0.4f, 0.4f, 0.4f));
422 DOCTEST_CHECK(c0 != c1);
425 std::stringstream ss;
427 DOCTEST_CHECK(ss.str() ==
"helios::RGBAcolor<0.1, 0.2, 0.3, 0.4>");
431TEST_CASE(
"Date and Time Logic") {
432 SUBCASE(
"Date struct and helpers") {
435 DOCTEST_CHECK_THROWS(Date(32, 1, 2000));
436 DOCTEST_CHECK_THROWS(Date(1, 13, 2000));
437 DOCTEST_CHECK_THROWS(Date(1, 1, 999));
440 DOCTEST_CHECK(d == Date(10, 1, 2000));
441 DOCTEST_CHECK(d != Date(11, 1, 2000));
444 DOCTEST_CHECK_THROWS(
make_Date(32, 1, 2000));
445 DOCTEST_CHECK_THROWS(
make_Date(1, 13, 2000));
446 DOCTEST_CHECK_THROWS(
make_Date(1, 1, 999));
447 DOCTEST_CHECK_THROWS(
make_Date(0, 2000));
448 DOCTEST_CHECK_THROWS(
make_Date(367, 2000));
463 std::stringstream ss;
465 DOCTEST_CHECK(ss.str() ==
"2000-01-10");
468 SUBCASE(
"Date::JulianDay edge cases") {
470 int jd1 = d1.JulianDay();
471 DOCTEST_CHECK(jd1 == 1);
472 Date d2(31, 12, 2021);
473 int jd2 = d2.JulianDay();
474 DOCTEST_CHECK(jd2 == 365);
475 Date d3(29, 2, 2020);
476 int jd3 = d3.JulianDay();
477 DOCTEST_CHECK(jd3 == 60);
480 SUBCASE(
"JulianDay and CalendarDay") {
482 DOCTEST_CHECK(jd1 == 1);
484 DOCTEST_CHECK(jd2 == 365);
486 DOCTEST_CHECK(jd3 == 60);
489 DOCTEST_CHECK(d.day == 29);
490 DOCTEST_CHECK(d.month == 2);
491 DOCTEST_CHECK(d.year == 2020);
493 capture_cerr cerr_buffer;
496 DOCTEST_CHECK_THROWS(jd1 =
JulianDay(32, 1, 2021));
497 DOCTEST_CHECK_THROWS(jd2 =
JulianDay(1, 13, 2021));
500 SUBCASE(
"Time struct and helpers") {
503 DOCTEST_CHECK_THROWS(Time(24, 1));
504 DOCTEST_CHECK_THROWS(Time(1, 60));
505 DOCTEST_CHECK_THROWS(Time(1, 1, 60));
506 DOCTEST_CHECK_THROWS(Time(1, 60, 1));
507 DOCTEST_CHECK_THROWS(Time(24, 1, 1));
510 DOCTEST_CHECK(t == Time(1, 2, 3));
511 DOCTEST_CHECK(t != Time(1, 2, 4));
514 DOCTEST_CHECK(
make_Time(1, 2) == Time(1, 2, 0));
517 DOCTEST_CHECK_THROWS(
make_Time(1, 1, 60));
518 DOCTEST_CHECK_THROWS(
make_Time(1, 60, 1));
519 DOCTEST_CHECK_THROWS(
make_Time(24, 1, 1));
522 std::stringstream ss;
524 DOCTEST_CHECK(ss.str() ==
"1:02:03");
527 SUBCASE(
"Location struct") {
528 Location l(1.f, 2.f, 3.f);
531 DOCTEST_CHECK(l == Location(1.f, 2.f, 3.f));
532 DOCTEST_CHECK(l != Location(1.f, 2.f, 4.f));
535 std::stringstream ss;
537 DOCTEST_CHECK(ss.str() ==
"<1,2,3>");
540 SUBCASE(
"Julian day conversion") {
543 DOCTEST_CHECK(d.year == year);
544 DOCTEST_CHECK(d.month == 1);
545 DOCTEST_CHECK(d.day == 10);
547 DOCTEST_CHECK(d.month == 8);
548 DOCTEST_CHECK(d.day == 17);
551 DOCTEST_CHECK(d.month == 8);
552 DOCTEST_CHECK(d.day == 18);
555 SUBCASE(
"Date methods") {
556 SUBCASE(
"incrementDay") {
557 Date d(31, 12, 2020);
559 DOCTEST_CHECK(d.day == 1);
560 DOCTEST_CHECK(d.month == 1);
561 DOCTEST_CHECK(d.year == 2021);
563 Date d2(28, 2, 2021);
565 DOCTEST_CHECK(d2.day == 1);
566 DOCTEST_CHECK(d2.month == 3);
567 DOCTEST_CHECK(d2.year == 2021);
569 Date d3(28, 2, 2020);
571 DOCTEST_CHECK(d3.day == 29);
572 DOCTEST_CHECK(d3.month == 2);
573 DOCTEST_CHECK(d3.year == 2020);
575 SUBCASE(
"isLeapYear") {
577 DOCTEST_CHECK(d1.isLeapYear());
579 DOCTEST_CHECK(!d2.isLeapYear());
581 DOCTEST_CHECK(d3.isLeapYear());
583 DOCTEST_CHECK(!d4.isLeapYear());
588TEST_CASE(
"Coordinate System Conversions") {
589 SUBCASE(
"Spherical coordinate struct and conversions") {
590 SphericalCoord sc(1.f, 0.5f, 1.5f);
598 DOCTEST_CHECK(sc == SphericalCoord(1.f, 0.5f, 1.5f));
602 DOCTEST_CHECK(cart.x == doctest::Approx(1.f * cos(0.5f) * sin(1.5f)));
603 DOCTEST_CHECK(cart.y == doctest::Approx(1.f * cos(0.5f) * cos(1.5f)));
604 DOCTEST_CHECK(cart.z == doctest::Approx(1.f * sin(0.5f)));
607 std::stringstream ss;
609 DOCTEST_CHECK(ss.str() ==
"helios::SphericalCoord<1, 0.5, 1.5>");
611 SUBCASE(
"Cartesian to Spherical and back") {
615 DOCTEST_CHECK(sph.radius == doctest::Approx(sph2.radius).epsilon(errtol));
616 DOCTEST_CHECK(sph.elevation == doctest::Approx(sph2.elevation).epsilon(errtol));
617 DOCTEST_CHECK(sph.zenith == doctest::Approx(sph2.zenith).epsilon(errtol));
618 DOCTEST_CHECK(sph.azimuth == doctest::Approx(sph2.azimuth).epsilon(errtol));
620 SUBCASE(
"cart2sphere and sphere2cart") {
624 DOCTEST_CHECK(p2.x == doctest::Approx(p1.x));
625 DOCTEST_CHECK(p2.y == doctest::Approx(p1.y));
626 DOCTEST_CHECK(p2.z == doctest::Approx(p1.z));
628 vec3 p_pole(0, 0, 5);
630 DOCTEST_CHECK(s_pole.radius == doctest::Approx(5.f));
631 DOCTEST_CHECK(s_pole.elevation == doctest::Approx(
PI_F / 2.f));