Extract main toolbar action planning

This commit is contained in:
2026-06-03 12:37:32 +02:00
parent b5bd6d42f7
commit 62561624ed
8 changed files with 536 additions and 15 deletions

View File

@@ -318,6 +318,16 @@ add_test(NAME pp_app_core_history_ui_tests COMMAND pp_app_core_history_ui_tests)
set_tests_properties(pp_app_core_history_ui_tests PROPERTIES
LABELS "app;document;ui;desktop-fast;fuzz")
add_executable(pp_app_core_main_toolbar_tests
app_core/main_toolbar_tests.cpp)
target_link_libraries(pp_app_core_main_toolbar_tests PRIVATE
pp_app_core
pp_test_harness)
add_test(NAME pp_app_core_main_toolbar_tests COMMAND pp_app_core_main_toolbar_tests)
set_tests_properties(pp_app_core_main_toolbar_tests PROPERTIES
LABELS "app;document;ui;desktop-fast;fuzz")
add_executable(pp_app_core_quick_ui_tests
app_core/quick_ui_tests.cpp)
target_link_libraries(pp_app_core_quick_ui_tests PRIVATE
@@ -1182,6 +1192,30 @@ if(TARGET pano_cli)
LABELS "app;document;ui;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_main_toolbar_undo_smoke
COMMAND pano_cli plan-main-toolbar --command undo --undo-count 2)
set_tests_properties(pano_cli_plan_main_toolbar_undo_smoke PROPERTIES
LABELS "app;document;ui;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-main-toolbar\".*\"command\":\"undo\".*\"action\":\"invoke-undo\".*\"updatesMemoryLabel\":true.*\"updatesTitle\":true.*\"noOp\":false")
add_test(NAME pano_cli_plan_main_toolbar_redo_empty_smoke
COMMAND pano_cli plan-main-toolbar --command redo)
set_tests_properties(pano_cli_plan_main_toolbar_redo_empty_smoke PROPERTIES
LABELS "app;document;ui;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-main-toolbar\".*\"command\":\"redo\".*\"action\":\"no-op-unavailable\".*\"label\":\"Redo \\(No history\\)\".*\"noOp\":true")
add_test(NAME pano_cli_plan_main_toolbar_clear_canvas_no_canvas_smoke
COMMAND pano_cli plan-main-toolbar --command clear-canvas --no-canvas)
set_tests_properties(pano_cli_plan_main_toolbar_clear_canvas_no_canvas_smoke PROPERTIES
LABELS "app;document;ui;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-main-toolbar\".*\"hasCanvas\":false.*\"action\":\"no-op-unavailable\".*\"label\":\"Clear Canvas \\(No canvas\\)\".*\"requiresCanvas\":true.*\"recordsUndo\":false.*\"marksUnsaved\":false.*\"noOp\":true")
add_test(NAME pano_cli_plan_main_toolbar_rejects_negative_count
COMMAND pano_cli plan-main-toolbar --command undo --undo-count -1)
set_tests_properties(pano_cli_plan_main_toolbar_rejects_negative_count PROPERTIES
LABELS "app;document;ui;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_quick_operation_select_brush_smoke
COMMAND pano_cli plan-quick-operation --kind brush --current-index 0 --slot-index 2)
set_tests_properties(pano_cli_plan_quick_operation_select_brush_smoke PROPERTIES

View File

@@ -0,0 +1,114 @@
#include "app_core/main_toolbar.h"
#include "test_harness.h"
namespace {
void direct_dialog_commands_are_available(pp::tests::Harness& harness)
{
const auto open = pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::open_document);
PP_EXPECT(harness, open);
if (open) {
PP_EXPECT(harness, open.value().action == pp::app::MainToolbarAction::show_open_dialog);
PP_EXPECT(harness, open.value().label == "Open");
PP_EXPECT(harness, !open.value().no_op);
}
const auto save = pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::save_document);
PP_EXPECT(harness, save);
if (save) {
PP_EXPECT(harness, save.value().action == pp::app::MainToolbarAction::show_save_dialog);
PP_EXPECT(harness, save.value().label == "Save");
}
const auto settings = pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::show_settings);
PP_EXPECT(harness, settings);
if (settings) {
PP_EXPECT(harness, settings.value().action == pp::app::MainToolbarAction::show_settings_dialog);
PP_EXPECT(harness, settings.value().label == "Settings");
}
}
void history_commands_reuse_history_breakpoints(pp::tests::Harness& harness)
{
const auto undo = pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::undo, 2);
PP_EXPECT(harness, undo);
if (undo) {
PP_EXPECT(harness, undo.value().action == pp::app::MainToolbarAction::invoke_undo);
PP_EXPECT(harness, undo.value().updates_memory_label);
PP_EXPECT(harness, undo.value().updates_title);
PP_EXPECT(harness, !undo.value().no_op);
}
const auto redo_empty = pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::redo, 0, 0);
PP_EXPECT(harness, redo_empty);
if (redo_empty) {
PP_EXPECT(harness, redo_empty.value().action == pp::app::MainToolbarAction::no_op_unavailable);
PP_EXPECT(harness, redo_empty.value().label == "Redo (No history)");
PP_EXPECT(harness, redo_empty.value().no_op);
}
const auto clear = pp::app::plan_main_toolbar_command(
pp::app::MainToolbarCommand::clear_history,
0,
0,
2048);
PP_EXPECT(harness, clear);
if (clear) {
PP_EXPECT(harness, clear.value().action == pp::app::MainToolbarAction::clear_history);
PP_EXPECT(harness, clear.value().updates_memory_label);
PP_EXPECT(harness, !clear.value().updates_title);
}
}
void canvas_clear_requires_live_canvas(pp::tests::Harness& harness)
{
const auto clear = pp::app::plan_main_toolbar_command(
pp::app::MainToolbarCommand::clear_canvas,
0,
0,
0,
true);
PP_EXPECT(harness, clear);
if (clear) {
PP_EXPECT(harness, clear.value().action == pp::app::MainToolbarAction::clear_canvas);
PP_EXPECT(harness, clear.value().requires_canvas);
PP_EXPECT(harness, clear.value().records_undo);
PP_EXPECT(harness, clear.value().marks_unsaved);
PP_EXPECT(harness, !clear.value().no_op);
}
const auto missing_canvas = pp::app::plan_main_toolbar_command(
pp::app::MainToolbarCommand::clear_canvas,
0,
0,
0,
false);
PP_EXPECT(harness, missing_canvas);
if (missing_canvas) {
PP_EXPECT(harness, missing_canvas.value().action == pp::app::MainToolbarAction::no_op_unavailable);
PP_EXPECT(harness, missing_canvas.value().label == "Clear Canvas (No canvas)");
PP_EXPECT(harness, missing_canvas.value().requires_canvas);
PP_EXPECT(harness, !missing_canvas.value().records_undo);
PP_EXPECT(harness, !missing_canvas.value().marks_unsaved);
PP_EXPECT(harness, missing_canvas.value().no_op);
}
}
void rejects_negative_history_metrics(pp::tests::Harness& harness)
{
PP_EXPECT(harness, !pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::undo, -1));
PP_EXPECT(harness, !pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::redo, 0, -1));
PP_EXPECT(harness, !pp::app::plan_main_toolbar_command(pp::app::MainToolbarCommand::clear_history, 0, 0, -1));
}
} // namespace
int main()
{
pp::tests::Harness harness;
harness.run("direct dialog commands are available", direct_dialog_commands_are_available);
harness.run("history commands reuse history breakpoints", history_commands_reuse_history_breakpoints);
harness.run("canvas clear requires live canvas", canvas_clear_requires_live_canvas);
harness.run("rejects negative history metrics", rejects_negative_history_metrics);
return harness.finish();
}