Files
Renderive/Kernel/tests/renderive/scene/Scene2D_Context_Test.cpp
T
2026-08-04 16:24:41 +08:00

37 lines
1.5 KiB
C++

#include <gtest/gtest.h>
#include <atomic>
#include <memory>
#include <thread>
#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<Scene_2D_Base*>(context.scene) != nullptr;
render_thread = std::this_thread::get_id();
}
std::atomic<int> 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<Scene2D_Context_Test_Renderable>(scene);
auto second = std::make_shared<Scene2D_Context_Test_Renderable>(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);
}