Files
Renderive/tests/Update_Completion.cpp
T
2026-07-30 18:09:03 +08:00

49 lines
2.2 KiB
C++

#include "../Renderive/architecture/Update_Completion.h"
#include "asio.hpp"
#include <gtest/gtest.h>
#include <atomic>
#include <future>
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();
}