#include #include #include using namespace psemek::geom; test_case(geom_vector_empty) { vector pi; vector pf; static_assert(std::is_same_v); static_assert(std::is_same_v); expect_equal(pi.dimension, 0); expect_equal(pf.dimension, 0); expect_throw(pi[0], detail::empty_array_exception); expect_throw(pf[0], detail::empty_array_exception); } test_case(geom_vector_init) { vector pi{1, 2}; vector pf{3.f, 4.f, 5.f}; static_assert(std::is_same_v); static_assert(std::is_same_v); expect_equal(pi[0], 1); expect_equal(pi[1], 2); expect_equal(pf[0], 3.f); expect_equal(pf[1], 4.f); expect_equal(pf[2], 5.f); } test_case(geom_vector_deduce) { vector pi{1, 2}; vector pf{3.f, 4.f, 5.f}; static_assert(std::is_same_v); static_assert(std::is_same_v); expect_equal(pi[0], 1); expect_equal(pi[1], 2); expect_equal(pf[0], 3.f); expect_equal(pf[1], 4.f); expect_equal(pf[2], 5.f); } test_case(geom_vector_arithmetic) { vector vi1{1, 2}; vector vi2{3, 4}; expect_equal(-vi1, (vector{-1, -2})); expect_equal(5 * vi1, (vector{5, 10})); expect_equal(vi1 * 5, (vector{5, 10})); expect_equal(vi1 + vi2, (vector{4, 6})); expect_equal(vi1 - vi2, (vector{-2, -2})); expect_equal(2 * vi1 - 3 * vi2, (vector{-7, -8})); vector vf1{5.f, 6.f, 7.f}; vector vf2{8.f, 9.f, 10.f}; expect_equal(-vf1, (vector{-5.f, -6.f, -7.f})); expect_equal(5.f * vf1, (vector{25.f, 30.f, 35.f})); expect_equal(vf1 * 5.f, (vector{25.f, 30.f, 35.f})); expect_equal(vf1 + vf2, (vector{13.f, 15.f, 17.f})); expect_equal(vf1 - vf2, (vector{-3.f, -3.f, -3.f})); expect_equal(2.f * vf1 - 3.f * vf2, (vector{-14.f, -15.f, -16.f})); } test_case(geom_vector_dot) { vector vi1{1, 2}; vector vi2{3, 4}; expect_equal((dot(vi1, vi2)), 11); vector vf1{5.f, 6.f, 7.f}; vector vf2{8.f, 9.f, 10.f}; expect_equal((dot(vf1, vf2)), 164.f); } test_case(geom_vector_det) { vector vi1{1, 2}; vector vi2{3, 4}; expect_equal((det(vi1, vi2)), -2); vector vf1{5.f, 6.f, 7.f}; vector vf2{8.f, 9.f, 10.f}; vector vf3{11.f, 12.f, 14.f}; expect_equal((det(vf1, vf2, vf3)), -3.f); } test_case(geom_vector_compare) { vector vi1{1, 2}; vector vi2{3, 4}; expect_equal(vi1, vi1); expect_equal(vi2, vi2); expect_different(vi1, vi2); expect_different(vi2, vi1); expect_less(vi1, vi2); expect_lequal(vi1, vi2); expect_greater(vi2, vi1); expect_gequal(vi2, vi1); } test_case(geom_vector_cast) { vector pi{1, 2}; vector pf{3.f, 4.f, 5.f}; expect_equal(cast(pi), (vector{1.f, 2.f})); expect_equal(cast(pf), (vector{3, 4, 5})); } test_case(geom_vector_ort) { vector v1{1.f, 2.f}; vector v2{3.f, 4.f, 5.f}; expect_small((dot(v1, ort(v1))), 1e-6); expect_small((dot(v2, ort(v2))), 1e-6); } test_case(geom_vector_cross) { vector v1{1.f, 2.f, 3.f}; vector v2{4.f, 5.f, 6.f}; expect_small((dot(v1, cross(v1, v2))), 1e-6); expect_small((dot(v2, cross(v1, v2))), 1e-6); } test_case(geom_vector_length) { vector v{5.f, 12.f}; expect_equal(length_sqr(v), 169.f); expect_close(length(v), 13.f, 1e-6); } test_case(geom_vector_lerp) { vector v1{1.f, 2.f, 3.f}; vector v2{5.f, 6.f, 7.f}; expect_equal((lerp(v1, v2, 0.25f)), (vector{2.f, 3.f, 4.f})); expect_equal((lerp(v1, v2, 0.5f )), (vector{3.f, 4.f, 5.f})); expect_equal((lerp(v1, v2, 0.75f)), (vector{4.f, 5.f, 6.f})); } test_case(geom_vector_slerp) { vector v1{1.f, 0.f}; vector v2{0.f, 1.f}; for (int i = 0; i <= 9; ++i) { // 10-degree steps auto s = slerp(v1, v2, i / 9.f); expect_close((length(s)), 1.f, 1e-6); expect_gequal((det(v1, s)), 0.f); expect_gequal((det(s, v2)), 0.f); } }