Extract brush UI operation planning

This commit is contained in:
2026-06-03 10:40:12 +02:00
parent 4f0909f30c
commit efd568a416
8 changed files with 511 additions and 52 deletions

View File

@@ -0,0 +1,85 @@
#include "app_core/brush_ui.h"
#include "test_harness.h"
#include <cmath>
namespace {
void color_plan_validates_all_channels(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_brush_ui_color(0.25F, 0.5F, 0.75F, 1.0F);
PP_EXPECT(harness, plan);
if (plan) {
PP_EXPECT(harness, plan.value().operation == pp::app::BrushUiOperation::set_tip_color);
PP_EXPECT(harness, plan.value().r == 0.25F);
PP_EXPECT(harness, plan.value().g == 0.5F);
PP_EXPECT(harness, plan.value().b == 0.75F);
PP_EXPECT(harness, plan.value().a == 1.0F);
PP_EXPECT(harness, plan.value().mutates_brush);
PP_EXPECT(harness, plan.value().update_color_ui);
PP_EXPECT(harness, !plan.value().update_brush_ui);
}
PP_EXPECT(harness, !pp::app::plan_brush_ui_color(-0.01F, 0.5F, 0.5F, 1.0F));
PP_EXPECT(harness, !pp::app::plan_brush_ui_color(0.5F, 1.01F, 0.5F, 1.0F));
PP_EXPECT(harness, !pp::app::plan_brush_ui_color(0.5F, 0.5F, std::nanf(""), 1.0F));
}
void texture_plan_validates_path_and_slot(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_brush_ui_texture(
pp::app::BrushUiTextureSlot::pattern,
"data/patterns/noise.png",
"data/patterns/thumbs/noise.png");
PP_EXPECT(harness, plan);
if (plan) {
PP_EXPECT(harness, plan.value().operation == pp::app::BrushUiOperation::set_texture);
PP_EXPECT(harness, plan.value().texture_slot == pp::app::BrushUiTextureSlot::pattern);
PP_EXPECT(harness, plan.value().path == "data/patterns/noise.png");
PP_EXPECT(harness, plan.value().thumbnail_path == "data/patterns/thumbs/noise.png");
PP_EXPECT(harness, plan.value().loads_brush_resources);
PP_EXPECT(harness, plan.value().update_color_ui);
PP_EXPECT(harness, plan.value().update_brush_ui);
}
PP_EXPECT(
harness,
!pp::app::plan_brush_ui_texture(pp::app::BrushUiTextureSlot::tip, "", "thumb.png"));
}
void preset_plan_preserves_color_and_requires_brush(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_brush_ui_preset_replace(true);
PP_EXPECT(harness, plan);
if (plan) {
PP_EXPECT(harness, plan.value().operation == pp::app::BrushUiOperation::replace_brush_from_preset);
PP_EXPECT(harness, plan.value().preserves_existing_color);
PP_EXPECT(harness, plan.value().loads_brush_resources);
PP_EXPECT(harness, plan.value().update_color_ui);
PP_EXPECT(harness, plan.value().update_brush_ui);
}
PP_EXPECT(harness, !pp::app::plan_brush_ui_preset_replace(false));
}
void stroke_settings_plan_updates_brush_preview(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_brush_ui_stroke_settings_changed();
PP_EXPECT(harness, plan.operation == pp::app::BrushUiOperation::stroke_settings_changed);
PP_EXPECT(harness, plan.mutates_brush);
PP_EXPECT(harness, plan.update_color_ui);
PP_EXPECT(harness, plan.update_brush_ui);
PP_EXPECT(harness, !plan.loads_brush_resources);
}
} // namespace
int main()
{
pp::tests::Harness harness;
harness.run("color plan validates all channels", color_plan_validates_all_channels);
harness.run("texture plan validates path and slot", texture_plan_validates_path_and_slot);
harness.run("preset plan preserves color and requires brush", preset_plan_preserves_color_and_requires_brush);
harness.run("stroke settings plan updates brush preview", stroke_settings_plan_updates_brush_preview);
return harness.finish();
}