This commit is contained in:
2026-08-24 10:45:26 +08:00
parent 4f21169ade
commit cb9822074b
31 changed files with 363 additions and 536 deletions
+29 -27
View File
@@ -36,7 +36,7 @@ std::unique_ptr<Frame_2D> render_frame(Scene* scene) {
return frame;
}
}
TEST(spectrum_data, publishes_samples_and_interpolates_power) {
TEST(spectrum_data, publishes_samples_through_tagged_frame_buffer) {
using Frequency = Impl<Frequency_Axis>;
using Power = Impl<Numeric_Axis>;
using Object = Impl<Spectrum>;
@@ -44,24 +44,16 @@ TEST(spectrum_data, publishes_samples_and_interpolates_power) {
auto frequency = build_object<Frequency>();
auto power = build_object<Power>();
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);
spectrum->set<&Spectrum::Prop::frequency_range>(Axis_Range{0.0, 100.0});
const double samples[]{-100.0, -50.0, 0.0};
spectrum->pending_buffer<Spectrum_Frame_Tag>() =
Spectrum_Frame{std::vector<Spectrum_Power>(std::begin(samples), std::end(samples))};
spectrum->mark_dirty<Prepare_Data_Tag>();
spectrum->advance();
EXPECT_EQ(spectrum->current_buffer<Spectrum_Frame_Tag>().samples.size(), 3u);
const auto value = spectrum->power_at(25.0);
ASSERT_TRUE(value.has_value());
EXPECT_DOUBLE_EQ(*value, -75.0);
const auto outside = spectrum->power_at(101.0);
ASSERT_FALSE(outside.has_value());
EXPECT_EQ(outside.error(), Spectrum::Power_At_Result::frequency_out_of_range);
EXPECT_EQ(spectrum->current_buffer<Spectrum_Frame_Tag>().samples,
(std::vector<Spectrum_Power>{-100.0, -50.0, 0.0}));
}
TEST(spectrum_markers, supports_selection_frequency_changes_and_known_results) {
TEST(spectrum_markers, uses_tagged_properties_as_the_only_marker_interface) {
using Frequency = Impl<Frequency_Axis>;
using Power = Impl<Numeric_Axis>;
using Object = Impl<Spectrum>;
@@ -69,25 +61,31 @@ TEST(spectrum_markers, supports_selection_frequency_changes_and_known_results) {
auto frequency = build_object<Frequency>();
auto power = build_object<Power>();
auto spectrum = build_object<Object>(frequency.get(), power.get());
spectrum->add_custom_marker(10.0);
spectrum->add_custom_line_marker(20.0);
spectrum->set<&Spectrum::Prop::custom_markers>(
std::vector<Spectrum_Frequency>{10.0, 20.0});
spectrum->advance();
EXPECT_EQ(spectrum->selectable_line_marker_count(), 2u);
spectrum->set_selected_marker_index(1);
EXPECT_EQ(spectrum->read_prop<Spectrum::Base_Tag>().custom_markers.size(), 2u);
spectrum->set<&Spectrum::Prop::selected_marker>(1);
spectrum->advance();
EXPECT_EQ(spectrum->selected_marker_index(), 1);
EXPECT_EQ(spectrum->set_current_marker_frequency(25.0), Spectrum::Set_Current_Marker_Frequency_Result::updated);
EXPECT_EQ(spectrum->read_prop<Spectrum::Base_Tag>().selected_marker, 1);
spectrum->update_prop<&Spectrum::Prop::custom_markers>(
[](Prop_Access<Object::Prop> props) {
props.get<Spectrum::Base_Tag>().custom_markers[1] = 25.0;
});
spectrum->advance();
const auto frequency_value = spectrum->marker_frequency(1);
ASSERT_TRUE(frequency_value.has_value());
EXPECT_DOUBLE_EQ(*frequency_value, 25.0);
const auto invalid = spectrum->marker_frequency(2);
ASSERT_FALSE(invalid.has_value());
EXPECT_EQ(invalid.error(), Spectrum::Marker_Frequency_Result::index_out_of_range);
spectrum->remove_selected_marker();
EXPECT_DOUBLE_EQ(
spectrum->read_prop<Spectrum::Base_Tag>().custom_markers[1], 25.0);
spectrum->update_prop<&Spectrum::Prop::custom_markers,
&Spectrum::Prop::selected_marker>(
[](Prop_Access<Object::Prop> props) {
auto& values = props.get<Spectrum::Base_Tag>();
values.custom_markers.erase(values.custom_markers.begin() +
values.selected_marker);
values.selected_marker = -1;
});
spectrum->advance();
EXPECT_EQ(spectrum->selectable_line_marker_count(), 1u);
EXPECT_EQ(spectrum->selected_marker_index(), -1);
EXPECT_EQ(spectrum->read_prop<Spectrum::Base_Tag>().custom_markers.size(), 1u);
EXPECT_EQ(spectrum->read_prop<Spectrum::Base_Tag>().selected_marker, -1);
}
TEST(render_scene_2d, composites_axes_and_spectrum_into_final_frame) {
using Frequency = Impl<Frequency_Axis>;
@@ -142,6 +140,10 @@ TEST(render_scene_2d, composites_axes_and_spectrum_into_final_frame) {
EXPECT_FALSE(spectrum->dirty<Paint_Tag>());
EXPECT_FALSE(frequency->dirty<Paint_Tag>());
EXPECT_FALSE(power->dirty<Paint_Tag>());
spectrum->set<&Renderable_2D::Prop::cache_enabled>(false);
output_frame = render_frame(scene.get());
EXPECT_TRUE(contains_color(output_frame->image()));
spectrum->set<&Renderable_2D::Prop::cache_enabled>(true);
output_frame = render_frame(scene.get());
EXPECT_TRUE(contains_color(output_frame->image()));
frequency->set<&Numeric_Axis::Prop::precision>(3);