This commit is contained in:
2026-08-16 21:18:28 +08:00
parent 9d544c7ba9
commit 3153f7d64f
15 changed files with 387 additions and 200 deletions
+33 -33
View File
@@ -61,8 +61,8 @@ TEST(Renderive_Core2, RootIdentityAndRefreshDiagnosticsComeFromKernelState) {
EXPECT_EQ(plot.root_renderable(), root);
plot.set_viewport_size({32, 24});
plot.activate_view();
EXPECT_EQ(plot.set_max_render_fps(144.0), Plot_Control_Error::none);
ASSERT_EQ(plot.render_frame(), Plot_Render_Result::none);
EXPECT_TRUE(plot.set_max_render_fps(144.0));
ASSERT_EQ(plot.render_frame().value(), Plot_Render_Status::rendered);
const auto diagnostics = plot.diagnostics();
EXPECT_DOUBLE_EQ(diagnostics.refresh.frequency_hz, 144.0);
EXPECT_EQ(diagnostics.refresh.frame_count, 1u);
@@ -194,7 +194,7 @@ TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
for (std::size_t index = 0; index < samples.size(); ++index)
samples[index] = -100.0 + static_cast<double>(index % 24) * 3.0;
spectrum->update_samples(samples);
ASSERT_EQ(plot.render_frame(), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame().value(), Plot_Render_Status::rendered);
bool saw_frame = false;
bool saw_drawn_pixel = false;
plot.with_frame([&](Image_View view) {
@@ -214,10 +214,10 @@ TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
EXPECT_TRUE(saw_frame);
EXPECT_TRUE(saw_drawn_pixel);
EXPECT_EQ(plot.diagnostics().refresh.frame_count, 1u);
EXPECT_NE(plot.render_frame(), Plot_Render_Result::none);
EXPECT_NE(plot.render_frame().value(), Plot_Render_Status::rendered);
samples.front() += 1.0;
spectrum->update_samples(samples);
EXPECT_EQ(plot.render_frame(true), Plot_Render_Result::none);
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
frequency_axis->set<&Axis_Properties::wheel>(true);
const Range before_zoom = frequency_axis->get<&Axis_Properties::coordinates>();
Wheel_Event wheel;
@@ -226,7 +226,7 @@ TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
plot.dispatch_event(wheel);
EXPECT_TRUE(wheel.is_accepted());
EXPECT_LT(frequency_axis->get<&Axis_Properties::coordinates>().size(), before_zoom.size());
EXPECT_EQ(plot.render_frame(), Plot_Render_Result::none);
EXPECT_EQ(plot.render_frame().value(), Plot_Render_Status::rendered);
apply_runtime_edit(plot, [root, frequency_axis, power_axis, spectrum](auto& editor) {
editor.set_display_parent(frequency_axis, root);
editor.set_display_parent(power_axis, root);
@@ -234,8 +234,8 @@ TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
editor.clear_dependency_parent(spectrum);
editor.detach(spectrum);
});
EXPECT_EQ(plot.render_frame(true), Plot_Render_Result::none);
EXPECT_NE(plot.render_frame(), Plot_Render_Result::none);
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
EXPECT_NE(plot.render_frame().value(), Plot_Render_Status::rendered);
}
TEST(Renderive_Core2, StandaloneRenderableBuilderJoinsSceneOnlyInsideRuntimeEditor) {
Plot_Scene plot;
@@ -296,14 +296,14 @@ TEST(Renderive_Core2, PerformanceOverlayConsumesKernelFrameDiagnostics) {
plot.init();
plot.set_viewport_size({160, 90});
plot.activate_view();
EXPECT_EQ(plot.set_max_render_fps(120.0), Plot_Control_Error::none);
EXPECT_TRUE(plot.set_max_render_fps(120.0));
Performance_Overlay_Options options;
options.log.enabled = false;
const auto overlay = attach_performance_overlay(plot, options);
ASSERT_TRUE(overlay);
set_performance_plot_name(plot, "integration");
set_performance_overlay_enabled(plot, true);
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
const auto snapshot = overlay->display_snapshot();
ASSERT_TRUE(snapshot);
EXPECT_EQ(snapshot->plot_name, "integration");
@@ -317,12 +317,12 @@ TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers)
manual.init();
manual.set_viewport_size({64, 40});
EXPECT_EQ(manual.frame_mode(), Plot_Frame_Mode::Manual);
ASSERT_EQ(manual.prepare_frame(), Plot_Render_Result::none);
ASSERT_TRUE(manual.prepare_frame());
auto manual_observer = manual.frame_status();
EXPECT_EQ(manual_observer.last_event, "prepared");
EXPECT_EQ(manual_observer.pending_frame_count, 1u);
ASSERT_EQ(manual.refresh_manual_frame(), Plot_Render_Result::none);
ASSERT_EQ(manual.render_prepared_frame(), Plot_Render_Result::none);
ASSERT_TRUE(manual.refresh_manual_frame());
ASSERT_TRUE(manual.render_prepared_frame());
manual_observer = manual.frame_status();
EXPECT_EQ(manual_observer.last_event, "rendered");
EXPECT_EQ(manual_observer.consumed_frame_count, 1u);
@@ -330,7 +330,7 @@ TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers)
low_latency.init();
low_latency.set_viewport_size({64, 40});
low_latency.activate_view();
ASSERT_EQ(low_latency.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(low_latency.render_frame(true).value(), Plot_Render_Status::rendered);
const auto low_observer = low_latency.frame_status();
EXPECT_EQ(low_latency.frame_mode(), Plot_Frame_Mode::Low_Latency);
EXPECT_EQ(low_observer.last_event, "lifecycle_completed");
@@ -338,14 +338,14 @@ TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers)
Plot_Scene playback({.frame_mode = Plot_Frame_Mode::Playback});
playback.init();
playback.set_viewport_size({64, 40});
ASSERT_EQ(playback.prepare_frame(), Plot_Render_Result::none);
ASSERT_EQ(playback.prepare_frame(), Plot_Render_Result::none);
ASSERT_EQ(playback.prepare_frame(), Plot_Render_Result::none);
ASSERT_TRUE(playback.prepare_frame());
ASSERT_TRUE(playback.prepare_frame());
ASSERT_TRUE(playback.prepare_frame());
auto playback_observer = playback.frame_status();
EXPECT_EQ(playback.frame_mode(), Plot_Frame_Mode::Playback);
EXPECT_EQ(playback_observer.last_event, "enqueued");
EXPECT_EQ(playback_observer.pending_frame_count, 3u);
ASSERT_EQ(playback.render_prepared_frame(), Plot_Render_Result::none);
ASSERT_TRUE(playback.render_prepared_frame());
playback_observer = playback.frame_status();
EXPECT_EQ(playback_observer.last_event, "rendered");
EXPECT_EQ(playback_observer.pending_frame_count, 2u);
@@ -520,7 +520,7 @@ TEST(Renderive_Core2, RetainedSpectrumApisRoundTripAndMarkersRemainObservable) {
EXPECT_EQ(spectrum->selectable_line_marker_count(), 0);
spectrum->clear_custom_markers();
EXPECT_EQ(spectrum->selected_marker_index(), -1);
EXPECT_EQ(plot.render_frame(true), Plot_Render_Result::none);
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
}
TEST(Renderive_Core2, RetainedHeatmapSweepAndTraceApisPreserveDataShapes) {
Plot_Scene plot;
@@ -634,7 +634,7 @@ TEST(Renderive_Core2, RetainedHeatmapSweepAndTraceApisPreserveDataShapes) {
trace->append_sample(Time_Of_Day{4000}, -70.0);
EXPECT_EQ(trace->sample_count(), 2U);
EXPECT_EQ(trace->rendered_point_count(), 2U);
EXPECT_EQ(plot.render_frame(true), Plot_Render_Result::none);
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
}
TEST(Renderive_Core2, RetainedSelectionAndConstellationApisDriveInteractionAndLayout) {
Plot_Scene plot;
@@ -713,7 +713,7 @@ TEST(Renderive_Core2, RetainedSelectionAndConstellationApisDriveInteractionAndLa
constellation->fit_square_to_axes();
EXPECT_EQ(horizontal->get<&Axis_Properties::coordinates>(), (Range{-3.0, 3.0}));
EXPECT_EQ(vertical->get<&Axis_Properties::coordinates>(), (Range{3.0, -3.0}));
EXPECT_EQ(plot.render_frame(true), Plot_Render_Result::none);
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
}
TEST(Renderive_Core2, PlottablePropertiesPublishOnlyAtFrameBoundary) {
Plot_Scene plot;
@@ -738,12 +738,12 @@ TEST(Renderive_Core2, PlottablePropertiesPublishOnlyAtFrameBoundary) {
EXPECT_EQ(cached.event, Renderable_Observer_Event::Cache_Updated);
EXPECT_EQ(cached.cache_update_count, 1U);
EXPECT_EQ(cached.publish_count, 0U);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Result::none);
ASSERT_TRUE(plot.prepare_frame());
const auto published = spectrum->observation();
EXPECT_EQ(published.event, Renderable_Observer_Event::Published);
EXPECT_EQ(published.cache_update_count, 1U);
EXPECT_EQ(published.publish_count, 1U);
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Result::none);
ASSERT_TRUE(plot.render_prepared_frame());
}
TEST(Renderive_Core2, EveryStatefulRenderableOwnsItsStateObserver) {
Plot_Scene plot;
@@ -777,7 +777,7 @@ TEST(Renderive_Core2, EveryStatefulRenderableOwnsItsStateObserver) {
EXPECT_EQ(spectrum_update.cache_update_count, 1U);
EXPECT_EQ(power->observation().event, Renderable_Observer_Event::None);
ASSERT_EQ(plot.prepare_frame(), Plot_Render_Result::none);
ASSERT_TRUE(plot.prepare_frame());
const auto frequency_publish = frequency->observation();
const auto power_publish = power->observation();
const auto spectrum_publish = spectrum->observation();
@@ -791,7 +791,7 @@ TEST(Renderive_Core2, EveryStatefulRenderableOwnsItsStateObserver) {
EXPECT_EQ(power_publish.cache_update_count, 0U);
EXPECT_EQ(spectrum_publish.cache_update_count, 1U);
ASSERT_EQ(plot.render_prepared_frame(), Plot_Render_Result::none);
ASSERT_TRUE(plot.render_prepared_frame());
EXPECT_EQ(frequency->observation().event, Renderable_Observer_Event::Published);
EXPECT_EQ(power->observation().event, Renderable_Observer_Event::Published);
EXPECT_EQ(spectrum->observation().event, Renderable_Observer_Event::Published);
@@ -922,7 +922,7 @@ TEST(Renderive_Core2, PartitionedPlotsBuildPropertyDrivenRenderGraphs) {
EXPECT_EQ(spectrum->get<&Spectrum::Properties::partition_count>(), 4);
EXPECT_EQ(waterfall->get<&Waterfall::Properties::partition_count>(), 4);
EXPECT_EQ(afterglow->get<&Afterglow::Properties::partition_count>(), 4);
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
const auto partitioned_plan = plot.render_scene().render_plan_snapshot();
ASSERT_TRUE(partitioned_plan);
EXPECT_EQ(planned_node_count(*partitioned_plan, *spectrum), 6u);
@@ -941,7 +941,7 @@ TEST(Renderive_Core2, PartitionedPlotsBuildPropertyDrivenRenderGraphs) {
waterfall->set<&Waterfall::Properties::partition_count>(1);
afterglow->set<&Afterglow::Properties::partition_count>(1);
plot.render_scene().publish_frame_state();
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
const auto single_plan = plot.render_scene().render_plan_snapshot();
ASSERT_TRUE(single_plan);
EXPECT_EQ(planned_node_count(*single_plan, *spectrum), 3u);
@@ -952,7 +952,7 @@ TEST(Renderive_Core2, PartitionedPlotsBuildPropertyDrivenRenderGraphs) {
waterfall->set<&Waterfall::Properties::partition_mode>(Render_Partition_Mode::Automatic);
afterglow->set<&Afterglow::Properties::partition_mode>(Render_Partition_Mode::Automatic);
plot.render_scene().publish_frame_state();
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
const auto automatic_plan = plot.render_scene().render_plan_snapshot();
ASSERT_TRUE(automatic_plan);
EXPECT_EQ(planned_node_count(*automatic_plan, *spectrum), 3u);
@@ -1028,7 +1028,7 @@ TEST(Renderive_Core2, DynamicWaterfallCaptureStressPreservesPlansSlotsAndExactSe
}
if (frame % 4 == 0)
waterfall->append_row(static_cast<int>(tick++), samples);
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
}
ASSERT_EQ(scene.render_scene().wait_for_render(), Scene_Render_Result::none);
const auto session = scene.render_scene().capture_session(session_id);
@@ -1069,8 +1069,8 @@ TEST(Renderive_Core2, PaintOnlyStyleChangesPreservePrepareCache) {
});
const std::array samples{-80.0, -70.0, -60.0, -50.0};
spectrum->update_samples(samples);
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
ASSERT_EQ(plot.render_scene().wait_for_render(), Scene_Render_Result::none);
const auto cached_plan = plot.render_scene().render_plan_snapshot();
ASSERT_TRUE(cached_plan);
@@ -1087,7 +1087,7 @@ TEST(Renderive_Core2, PaintOnlyStyleChangesPreservePrepareCache) {
spectrum->set<&Spectrum::Properties::current_pen>(
Pen{Color{12, 34, 56, 255}, 2.0});
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
ASSERT_EQ(plot.render_scene().wait_for_render(), Scene_Render_Result::none);
const auto plan = plot.render_scene().render_plan_snapshot();
ASSERT_TRUE(plan);
@@ -1102,7 +1102,7 @@ TEST(Renderive_Core2, PaintOnlyStyleChangesPreservePrepareCache) {
EXPECT_TRUE(has_kind(Render_Node_Kind::paint));
frequency->set<&Axis_Base_Properties::color>(Color{90, 100, 110, 255});
ASSERT_EQ(plot.render_frame(true), Plot_Render_Result::none);
ASSERT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
ASSERT_EQ(plot.render_scene().wait_for_render(), Scene_Render_Result::none);
const auto axis_style_plan = plot.render_scene().render_plan_snapshot();
ASSERT_TRUE(axis_style_plan);