完美一版
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include <render_2D/plottable/Spectrum.hpp>
|
||||
#include <render_2D/base/Frame_2D.hpp>
|
||||
#include <render_2D/scene/Render_Scene_2D.hpp>
|
||||
#include <gtest/gtest.h>
|
||||
namespace {
|
||||
@@ -11,6 +12,14 @@ std::unique_ptr<Object> build_object(Args&&... args) {
|
||||
if (!result) std::terminate();
|
||||
return std::move(result).value();
|
||||
}
|
||||
template <typename Scene, typename... Renderables>
|
||||
std::unique_ptr<Scene> build_scene(Renderables*... renderables) {
|
||||
typename Scene::Builder builder;
|
||||
(builder.add_renderable(renderables), ...);
|
||||
auto result = builder.build();
|
||||
if (!result) std::terminate();
|
||||
return std::move(result).value();
|
||||
}
|
||||
bool contains_color(Image_View view) {
|
||||
for (int y = 0; y < view.height; ++y) {
|
||||
const auto* row = reinterpret_cast<const Pixel*>(view.data + static_cast<std::ptrdiff_t>(y) * view.stride);
|
||||
@@ -19,16 +28,22 @@ bool contains_color(Image_View view) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
template <typename Scene>
|
||||
std::unique_ptr<Frame_2D> render_frame(Scene* scene) {
|
||||
static std::uint64_t sequence{1};
|
||||
auto frame = std::make_unique<Frame_2D>(Frame_Identity{sequence++, 0});
|
||||
EXPECT_EQ(scene->render(frame.get()), Render_Scene_2D::Render_Result::completed);
|
||||
return frame;
|
||||
}
|
||||
}
|
||||
TEST(spectrum_data, publishes_samples_and_interpolates_power) {
|
||||
using Frequency = Impl<Frequency_Axis>;
|
||||
using Power = Impl<Numeric_Axis>;
|
||||
using Object = Impl<Spectrum>;
|
||||
using Scene_Object = Impl<Render_Scene_2D>;
|
||||
auto scene = build_object<Scene_Object>();
|
||||
auto frequency = build_object<Frequency>();
|
||||
auto power = build_object<Power>();
|
||||
auto spectrum = build_object<Object>(scene.get(), frequency.get(), power.get());
|
||||
auto spectrum = build_object<Object>(frequency.get(), power.get());
|
||||
const auto missing = spectrum->power_at(25.0);
|
||||
ASSERT_FALSE(missing.has_value());
|
||||
EXPECT_EQ(missing.error(), Spectrum::Power_At_Result::no_samples);
|
||||
@@ -49,10 +64,9 @@ TEST(spectrum_markers, supports_selection_frequency_changes_and_known_results) {
|
||||
using Power = Impl<Numeric_Axis>;
|
||||
using Object = Impl<Spectrum>;
|
||||
using Scene_Object = Impl<Render_Scene_2D>;
|
||||
auto scene = build_object<Scene_Object>();
|
||||
auto frequency = build_object<Frequency>();
|
||||
auto power = build_object<Power>();
|
||||
auto spectrum = build_object<Object>(scene.get(), frequency.get(), power.get());
|
||||
auto spectrum = build_object<Object>(frequency.get(), power.get());
|
||||
spectrum->add_custom_marker(10.0);
|
||||
spectrum->add_custom_line_marker(20.0);
|
||||
spectrum->advance();
|
||||
@@ -79,10 +93,10 @@ TEST(render_scene_2d, composites_axes_and_spectrum_into_final_frame) {
|
||||
using Spectrum_Object = Impl<Spectrum>;
|
||||
using Scene_Object = Impl<Render_Scene_2D>;
|
||||
initialize_runtime(2);
|
||||
auto scene = build_object<Scene_Object>();
|
||||
auto frequency = build_object<Frequency>();
|
||||
auto power = build_object<Power>();
|
||||
auto spectrum = build_object<Spectrum_Object>(scene.get(), frequency.get(), power.get());
|
||||
auto spectrum = build_object<Spectrum_Object>(frequency.get(), power.get());
|
||||
auto scene = build_scene<Scene_Object>(spectrum.get());
|
||||
const Size canvas{160, 120};
|
||||
frequency->set<&Abs_Axis::Prop::position>(Point_F{20.0, 100.0});
|
||||
frequency->set<&Abs_Axis::Prop::pixel_length>(120.0);
|
||||
@@ -112,48 +126,49 @@ TEST(render_scene_2d, composites_axes_and_spectrum_into_final_frame) {
|
||||
EXPECT_TRUE(cache_graph.depends_on(spectrum.get(), scene.get()));
|
||||
EXPECT_TRUE(cache_graph.depends_on(spectrum.get(), frequency.get()));
|
||||
EXPECT_TRUE(cache_graph.depends_on(spectrum.get(), power.get()));
|
||||
scene->render();
|
||||
auto output_frame = render_frame(scene.get());
|
||||
EXPECT_GT(spectrum->rendered_point_count(), 0u);
|
||||
const auto& render_state = spectrum->read_state<Renderable::Base_Tag>();
|
||||
EXPECT_EQ(render_state.prepare_task_count, 4u);
|
||||
EXPECT_EQ(render_state.paint_task_count, 1u);
|
||||
const Image_View frame = scene->frame_view();
|
||||
const Image_View frame = output_frame->image();
|
||||
ASSERT_FALSE(frame.empty());
|
||||
EXPECT_TRUE(contains_color(frame));
|
||||
EXPECT_FALSE(spectrum->dirty<Paint_Cache_Tag>());
|
||||
EXPECT_FALSE(spectrum->dirty<Paint_Tag>());
|
||||
EXPECT_FALSE(frequency->dirty<Paint_Tag>());
|
||||
EXPECT_FALSE(power->dirty<Paint_Tag>());
|
||||
scene->render();
|
||||
EXPECT_TRUE(contains_color(scene->frame_view()));
|
||||
output_frame = render_frame(scene.get());
|
||||
EXPECT_TRUE(contains_color(output_frame->image()));
|
||||
frequency->set<&Numeric_Axis::Prop::precision>(3);
|
||||
EXPECT_FALSE(spectrum->dirty<Paint_Cache_Tag>());
|
||||
scene->render();
|
||||
output_frame = render_frame(scene.get());
|
||||
EXPECT_TRUE(spectrum->read_state<Renderable::Base_Tag>().paint_executed);
|
||||
EXPECT_TRUE(frequency->read_state<Renderable::Base_Tag>().paint_executed);
|
||||
EXPECT_TRUE(power->read_state<Renderable::Base_Tag>().paint_executed);
|
||||
EXPECT_TRUE(contains_color(scene->frame_view()));
|
||||
EXPECT_TRUE(contains_color(output_frame->image()));
|
||||
frequency->set<&Numeric_Axis::Prop::coordinate_range>(Axis_Range{0.0, 120.0});
|
||||
EXPECT_TRUE(spectrum->dirty<Paint_Cache_Tag>());
|
||||
scene->render();
|
||||
output_frame = render_frame(scene.get());
|
||||
EXPECT_FALSE(spectrum->dirty<Paint_Cache_Tag>());
|
||||
EXPECT_TRUE(spectrum->read_state<Renderable::Base_Tag>().prepare_executed);
|
||||
spectrum->set<&Spectrum::Prop::partition_count>(2u);
|
||||
spectrum->update_samples(samples);
|
||||
scene->render();
|
||||
output_frame = render_frame(scene.get());
|
||||
const auto& rebuilt_state = spectrum->read_state<Renderable::Base_Tag>();
|
||||
EXPECT_TRUE(rebuilt_state.prepare_graph_rebuilt);
|
||||
EXPECT_EQ(rebuilt_state.prepare_task_count, 3u);
|
||||
EXPECT_TRUE(contains_color(scene->frame_view()));
|
||||
EXPECT_TRUE(contains_color(output_frame->image()));
|
||||
const Size resized_canvas{200, 140};
|
||||
scene->set<&Render_Scene_2D::Prop::viewport>(resized_canvas);
|
||||
EXPECT_TRUE(frequency->dirty<Prepare_Data_Tag>());
|
||||
EXPECT_TRUE(power->dirty<Prepare_Data_Tag>());
|
||||
scene->render();
|
||||
EXPECT_TRUE(spectrum->dirty<Paint_Cache_Tag>());
|
||||
EXPECT_FALSE(frequency->dirty<Prepare_Data_Tag>());
|
||||
EXPECT_FALSE(power->dirty<Prepare_Data_Tag>());
|
||||
output_frame = render_frame(scene.get());
|
||||
EXPECT_EQ(scene->read_prop<Render_Scene_2D::Base_Tag>().viewport, resized_canvas);
|
||||
EXPECT_TRUE(frequency->read_state<Renderable::Base_Tag>().prepare_executed);
|
||||
EXPECT_FALSE(frequency->read_state<Renderable::Base_Tag>().prepare_executed);
|
||||
EXPECT_TRUE(frequency->read_state<Renderable::Base_Tag>().paint_executed);
|
||||
const Image_View resized_frame = scene->frame_view();
|
||||
const Image_View resized_frame = output_frame->image();
|
||||
EXPECT_EQ(resized_frame.width, resized_canvas.width);
|
||||
EXPECT_EQ(resized_frame.height, resized_canvas.height);
|
||||
EXPECT_TRUE(contains_color(resized_frame));
|
||||
|
||||
Reference in New Issue
Block a user