#include "../Renderive/architecture/Update_Completion.h" #include "asio.hpp" #include #include #include TEST(Update_Completion, CompletesStageWaitersAndCancelledWaiters) { asio::io_context io; auto state = renderive::make_update_state(); renderive::Update_Ticket ticket(state); std::atomic_int rendered_count{}; std::atomic_int input_count{}; ticket.async_wait(renderive::Update_Stage::Rendered, asio::bind_executor(io.get_executor(), [&](std::error_code error, renderive::Update_Outcome outcome) { if (error || outcome != renderive::Update_Outcome::Completed) std::terminate(); rendered_count.fetch_add(1, std::memory_order_relaxed); })); state->complete_until(renderive::Update_Stage::Input_Released); io.poll(); EXPECT_EQ(rendered_count.load(std::memory_order_relaxed), 0); state->complete_until(renderive::Update_Stage::Rendered); io.restart(); io.run(); EXPECT_EQ(rendered_count.load(std::memory_order_relaxed), 1); ticket.async_wait(renderive::Update_Stage::Input_Released, asio::bind_executor(io.get_executor(), [&](std::error_code error, renderive::Update_Outcome outcome) { if (error || outcome != renderive::Update_Outcome::Completed) std::terminate(); input_count.fetch_add(1, std::memory_order_relaxed); })); io.restart(); io.run(); EXPECT_EQ(input_count.load(std::memory_order_relaxed), 1); auto cancelled_state = renderive::make_update_state(); renderive::Update_Ticket cancelled_ticket(cancelled_state); std::atomic_int cancel_count{}; cancelled_ticket.async_wait(renderive::Update_Stage::Presented, asio::bind_executor(io.get_executor(), [&](std::error_code error, renderive::Update_Outcome outcome) { if (!error || outcome != renderive::Update_Outcome::Cancelled) std::terminate(); cancel_count.fetch_add(1, std::memory_order_relaxed); })); cancelled_state->complete_all(std::make_error_code(std::errc::operation_canceled), renderive::Update_Outcome::Cancelled); io.restart(); io.run(); EXPECT_EQ(cancel_count.load(std::memory_order_relaxed), 1); } int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }