#define BOOST_TEST_MODULE test_maths #include #include #include #include #include #include #include #include #include using vecter_to_angle = std::tuple; BOOST_DATA_TEST_CASE(test_vector_yaw, boost::unit_test::data::make( {{north, 0}, {south, pi}, {west, half_pi}, {east, -half_pi}, {north + east, -quarter_pi}, {south + east, quarter_pi * -3}, {north + west, quarter_pi}, {south + west, quarter_pi * 3}}), v, a) { BOOST_CHECK_CLOSE(vector_yaw(v), a, 1.F); } BOOST_DATA_TEST_CASE(test_vector_pitch, boost::unit_test::data::make({ {north, 0}, {east, 0}, {south, 0}, {west, 0}, {north + up, quarter_pi}, {east + up, quarter_pi}, {south + up, quarter_pi}, {west + up, quarter_pi}, {north - up, -quarter_pi}, {east - up, -quarter_pi}, {south - up, -quarter_pi}, {west - up, -quarter_pi}, {north + west - up, -quarter_pi}, {north + west + up, quarter_pi}, }), v, a) { BOOST_CHECK_CLOSE(vector_pitch(v), a, 1.F); } using normalize_angle = std::tuple; BOOST_DATA_TEST_CASE(test_angle_normalize, boost::unit_test::data::make({ {0, 0}, {two_pi, 0}, {-two_pi, 0}, {half_pi, half_pi}, {-half_pi, -half_pi}, {half_pi * 3, -half_pi}, {-half_pi * 3, half_pi}, }), in, exp) { BOOST_CHECK_CLOSE(normalize(in), exp, 1); } using pos3_to_arc = std::tuple; BOOST_DATA_TEST_CASE(test_create_arc, boost::unit_test::data::make({ {{0, 0, 0}, north, east, {0, half_pi * 3}}, {{0, 0, 0}, west, east, {half_pi, half_pi * 3}}, {{0, 0, 0}, south, east, {pi, half_pi * 3}}, {{0, 0, 0}, east, north, {-half_pi, 0}}, {{0, 0, 0}, south, north, {pi, two_pi}}, {{0, 0, 0}, east, south, {-half_pi, pi}}, }), c, s, e, a) { const Arc arc {c, s, e}; BOOST_REQUIRE_LT(arc.first, arc.second); BOOST_CHECK_CLOSE(arc.first, a.first, 1.F); BOOST_CHECK_CLOSE(arc.second, a.second, 1.F); } using fac = std::tuple; BOOST_DATA_TEST_CASE(test_find_arc_centre, boost::unit_test::data::make({ {{2, 2}, pi, {3, 3}, half_pi, {3, 2}, true}, {{2, 2}, pi, {1, 3}, -half_pi, {1, 2}, false}, {{-1100, -1000}, pi, {-900, -800}, half_pi, {-900, -1000}, true}, {{1100, 1000}, 0, {1050, 900}, pi + 0.92, {973, 1000}, true}, {{1050, 900}, 0.92, {1000, 800}, pi, {1127, 800}, false}, }), s, es, e, ee, exp, lr) { const auto c = find_arc_centre(s, es, e, ee); BOOST_CHECK_CLOSE(exp.x, c.first.x, 1); BOOST_CHECK_CLOSE(exp.y, c.first.y, 1); BOOST_CHECK_EQUAL(lr, c.second); } BOOST_AUTO_TEST_CASE(test_find_arcs_radius) { BOOST_CHECK_CLOSE(find_arcs_radius({10.32, 26.71}, {0.4, .92}, {2.92, 22.41}, {-0.89, -0.45}), 2.29, 1); } static void compare_rotations(float a, const glm::vec3 & axis, glm::mat4 (*rotate_func)(float), std::string_view n) { BOOST_TEST_CONTEXT(n) { const auto g {glm::rotate(a, axis)}, ilt {rotate_func(a)}; for (int c = 0; c < 4; c++) { BOOST_TEST_CONTEXT(c) { for (int r = 0; r < 4; r++) { BOOST_TEST_CONTEXT(r) { BOOST_CHECK_CLOSE(g[c][r], ilt[c][r], 0.0001); } } } } } } const auto angs = boost::unit_test::data::make({pi, half_pi, two_pi, quarter_pi, -pi, -half_pi, -quarter_pi, 0.F}) * boost::unit_test::data::make(0); const auto random_angs = boost::unit_test::data::random(-two_pi, two_pi) ^ boost::unit_test::data::xrange(1000); const auto rots = boost::unit_test::data::make>({ {up, rotate_yaw, "yaw"}, {west, rotate_pitch, "pitch"}, {north, rotate_roll, "roll"}, }); BOOST_DATA_TEST_CASE(test_rotations, (angs + random_angs) * rots, a, ai, ax, func, n) { (void)ai; compare_rotations(a, ax, func, n); }