#include #include #include #include #include "renderive/renderable/Renderable.hpp" #include "renderive/scene/Scene.hpp" struct Scene2D_Context_Test_Renderable : Renderable_Base { explicit Scene2D_Context_Test_Renderable(Scene_Base& scene) : Renderable_Base(scene, {.cache_enabled = false}) {} void render(const Scene_Render_Context& context) override { ++render_count; scene_is_2d = dynamic_cast(context.scene) != nullptr; render_thread = std::this_thread::get_id(); } std::atomic render_count{}; bool scene_is_2d{}; std::thread::id render_thread; }; TEST(scene2d_context_test, swaps_renderable_cache_and_renders_in_background) { Scene2D_Context<> scene; const auto caller_thread = std::this_thread::get_id(); auto first = std::make_shared(scene); auto second = std::make_shared(scene); scene.attach_renderable(first); scene.render(); scene.wait_for_render(); EXPECT_EQ(first->render_count.load(), 1); EXPECT_TRUE(first->scene_is_2d); EXPECT_NE(first->render_thread, caller_thread); scene.detach_renderable(*first); scene.attach_renderable(second); scene.render(); scene.wait_for_render(); EXPECT_EQ(first->render_count.load(), 1); EXPECT_EQ(second->render_count.load(), 1); EXPECT_EQ(scene.frame_control_strategy->frame_control_state().publish_revision, 2); }