#include #include #include #include namespace renderive::render_3D { using namespace std::chrono_literals; TEST(Render3DFrameControl, LowLatencyBackpressuresInsteadOfReplacingPublishedFrame) { Scene3D scene({.width = 64, .height = 64}); ASSERT_TRUE(scene.prepare_frame()); auto second_prepare = std::async(std::launch::async, [&] { return scene.prepare_frame(); }); EXPECT_EQ(second_prepare.wait_for(100ms), std::future_status::timeout); EXPECT_TRUE(scene.render_frame()); ASSERT_EQ(second_prepare.wait_for(5s), std::future_status::ready); EXPECT_TRUE(second_prepare.get()); EXPECT_TRUE(scene.render_frame()); } TEST(Render3DFrameControl, ManualRefreshReleasesTheWaitingPainter) { Manual_Scene3D scene({.width = 64, .height = 64}); ASSERT_TRUE(scene.prepare_frame()); auto second_prepare = std::async(std::launch::async, [&] { return scene.prepare_frame(); }); EXPECT_EQ(second_prepare.wait_for(100ms), std::future_status::timeout); ASSERT_TRUE(scene.refresh()); ASSERT_EQ(second_prepare.wait_for(5s), std::future_status::ready); EXPECT_TRUE(second_prepare.get()); EXPECT_TRUE(scene.render_frame()); ASSERT_TRUE(scene.refresh()); EXPECT_TRUE(scene.render_frame()); } TEST(Render3DFrameControl, PlaybackPreservesQueuedFrames) { Playback_Scene3D scene({.width = 64, .height = 64}); ASSERT_TRUE(scene.prepare_frame()); ASSERT_TRUE(scene.prepare_frame()); EXPECT_TRUE(scene.render_frame()); EXPECT_TRUE(scene.render_frame()); EXPECT_FALSE(scene.render_frame()); } } // namespace renderive::render_3D