// Copyright 2021, Collabora, Ltd. // SPDX-License-Identifier: BSL-1.0 /*! * @file * @brief HistoryBuffer collection tests. * @author Ryan Pavlik */ #include #include #include "catch/catch.hpp" TEST_CASE("m_relation_history") { m_relation_history *rh = nullptr; m_relation_history_create(&rh); SECTION("empty buffer") { xrt_space_relation out_relation = XRT_SPACE_RELATION_ZERO; CHECK(m_relation_history_get(rh, 0, &out_relation) == M_RELATION_HISTORY_RESULT_INVALID); CHECK(m_relation_history_get(rh, 1, &out_relation) == M_RELATION_HISTORY_RESULT_INVALID); } SECTION("populated buffer") { xrt_space_relation relation = XRT_SPACE_RELATION_ZERO; relation.relation_flags = (xrt_space_relation_flags)( XRT_SPACE_RELATION_POSITION_TRACKED_BIT | XRT_SPACE_RELATION_POSITION_VALID_BIT | XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT | XRT_SPACE_RELATION_ORIENTATION_VALID_BIT | XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT); relation.linear_velocity.x = 1.f; // arbitrary value constexpr auto T0 = 20 * (uint64_t)U_TIME_1S_IN_NS; // one second after T0 constexpr auto T1 = T0 + (uint64_t)U_TIME_1S_IN_NS; // two seconds after T0 constexpr auto T2 = T1 + (uint64_t)U_TIME_1S_IN_NS; m_relation_history_push(rh, &relation, T0); relation.pose.position.x = 1.f; m_relation_history_push(rh, &relation, T1); relation.pose.position.x = 2.f; m_relation_history_push(rh, &relation, T2); xrt_space_relation out_relation = XRT_SPACE_RELATION_ZERO; CHECK(m_relation_history_get(rh, 0, &out_relation) == M_RELATION_HISTORY_RESULT_INVALID); CHECK(m_relation_history_get(rh, T0, &out_relation) == M_RELATION_HISTORY_RESULT_EXACT); CHECK(out_relation.pose.position.x == 0.f); CHECK(m_relation_history_get(rh, T1, &out_relation) == M_RELATION_HISTORY_RESULT_EXACT); CHECK(out_relation.pose.position.x == 1.f); CHECK(m_relation_history_get(rh, T2, &out_relation) == M_RELATION_HISTORY_RESULT_EXACT); CHECK(out_relation.pose.position.x == 2.f); CHECK(m_relation_history_get(rh, T0 - (uint64_t)U_TIME_1S_IN_NS, &out_relation) == M_RELATION_HISTORY_RESULT_REVERSE_PREDICTED); CHECK(out_relation.pose.position.x < 0.f); CHECK(m_relation_history_get(rh, (T0 + T1) / 2, &out_relation) == M_RELATION_HISTORY_RESULT_INTERPOLATED); CHECK(out_relation.pose.position.x > 0.f); CHECK(out_relation.pose.position.x < 1.f); CHECK(m_relation_history_get(rh, (T1 + T2) / 2, &out_relation) == M_RELATION_HISTORY_RESULT_INTERPOLATED); CHECK(out_relation.pose.position.x > 1.f); CHECK(out_relation.pose.position.x < 2.f); CHECK(m_relation_history_get(rh, T2 + (uint64_t)U_TIME_1S_IN_NS, &out_relation) == M_RELATION_HISTORY_RESULT_PREDICTED); CHECK(out_relation.pose.position.x > 2.f); } m_relation_history_destroy(&rh); }