Extract tools menu planning

This commit is contained in:
2026-06-03 12:15:57 +02:00
parent fb844f79fd
commit c640519772
8 changed files with 651 additions and 51 deletions

View File

@@ -318,6 +318,16 @@ add_test(NAME pp_app_core_quick_ui_tests COMMAND pp_app_core_quick_ui_tests)
set_tests_properties(pp_app_core_quick_ui_tests PROPERTIES
LABELS "app;ui;paint;desktop-fast;fuzz")
add_executable(pp_app_core_tools_menu_tests
app_core/tools_menu_tests.cpp)
target_link_libraries(pp_app_core_tools_menu_tests PRIVATE
pp_app_core
pp_test_harness)
add_test(NAME pp_app_core_tools_menu_tests COMMAND pp_app_core_tools_menu_tests)
set_tests_properties(pp_app_core_tools_menu_tests PROPERTIES
LABELS "app;ui;desktop-fast;fuzz")
add_executable(pp_app_core_document_route_tests
app_core/document_route_tests.cpp)
target_link_libraries(pp_app_core_document_route_tests PRIVATE
@@ -811,6 +821,36 @@ if(TARGET pano_cli)
LABELS "app;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-app-preferences\".*\"scaleSelection\":\\{\"hasSelection\":false,\"index\":0\\}.*\"direction\":\"left-to-right\".*\"timelapse\":\\{\"enabled\":false,\"recordingAction\":\"stop-recording\"\\}.*\"vrControllers\":\\{\"enabled\":false\\}")
add_test(NAME pano_cli_plan_tools_menu_shortcuts_smoke
COMMAND pano_cli plan-tools-menu --command shortcuts)
set_tests_properties(pano_cli_plan_tools_menu_shortcuts_smoke PROPERTIES
LABELS "app;ui;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-tools-menu\".*\"command\":\"shortcuts\".*\"action\":\"show-shortcuts-dialog\".*\"closesRootPopup\":true")
add_test(NAME pano_cli_plan_tools_menu_sonarpen_unavailable_smoke
COMMAND pano_cli plan-tools-menu --command sonarpen)
set_tests_properties(pano_cli_plan_tools_menu_sonarpen_unavailable_smoke PROPERTIES
LABELS "app;ui;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-tools-menu\".*\"sonarpenAvailable\":false.*\"action\":\"no-op-unavailable\".*\"closesRootPopup\":false")
add_test(NAME pano_cli_plan_tools_panel_layers_smoke
COMMAND pano_cli plan-tools-panel --panel layers)
set_tests_properties(pano_cli_plan_tools_panel_layers_smoke PROPERTIES
LABELS "app;ui;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-tools-panel\".*\"panel\":\"layers\".*\"action\":\"open-floating-panel\".*\"title\":\"Layers\".*\"height\":300.*\"minHeight\":100.*\"hidesEmbeddedTitle\":true")
add_test(NAME pano_cli_plan_tools_panel_visible_noop_smoke
COMMAND pano_cli plan-tools-panel --panel animation --already-visible)
set_tests_properties(pano_cli_plan_tools_panel_visible_noop_smoke PROPERTIES
LABELS "app;ui;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-tools-panel\".*\"alreadyVisible\":true.*\"action\":\"no-op-already-visible\".*\"title\":\"Animation\".*\"droppable\":false")
add_test(NAME pano_cli_plan_tools_panel_rejects_unknown
COMMAND pano_cli plan-tools-panel --panel missing)
set_tests_properties(pano_cli_plan_tools_panel_rejects_unknown PROPERTIES
LABELS "app;ui;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_app_status_smoke
COMMAND pano_cli plan-app-status
--doc-name demo

View File

@@ -0,0 +1,80 @@
#include "app_core/tools_menu.h"
#include "test_harness.h"
namespace {
void tools_menu_maps_submenus_and_commands(pp::tests::Harness& harness)
{
const auto panels = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::panels);
const auto options = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::options);
const auto clear = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::clear_grids);
const auto camera = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::reset_camera);
const auto shortcuts = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::shortcuts);
PP_EXPECT(harness, panels.action == pp::app::ToolsMenuAction::show_panels_submenu);
PP_EXPECT(harness, !panels.closes_root_popup);
PP_EXPECT(harness, options.action == pp::app::ToolsMenuAction::show_options_submenu);
PP_EXPECT(harness, clear.action == pp::app::ToolsMenuAction::clear_grid_overlays);
PP_EXPECT(harness, clear.closes_root_popup);
PP_EXPECT(harness, camera.action == pp::app::ToolsMenuAction::reset_camera);
PP_EXPECT(harness, camera.closes_root_popup);
PP_EXPECT(harness, shortcuts.action == pp::app::ToolsMenuAction::show_shortcuts_dialog);
PP_EXPECT(harness, shortcuts.closes_root_popup);
}
void tools_menu_gates_platform_only_actions(pp::tests::Harness& harness)
{
const auto unavailable = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::sonarpen);
const auto available = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::sonarpen, true);
PP_EXPECT(harness, unavailable.action == pp::app::ToolsMenuAction::no_op_unavailable);
PP_EXPECT(harness, !unavailable.closes_root_popup);
PP_EXPECT(harness, available.action == pp::app::ToolsMenuAction::start_sonarpen);
PP_EXPECT(harness, available.closes_root_popup);
}
void tools_panel_plans_floating_panel_metadata(pp::tests::Harness& harness)
{
const auto presets = pp::app::plan_tools_panel(pp::app::ToolsPanel::presets, false);
const auto color = pp::app::plan_tools_panel(pp::app::ToolsPanel::color, false);
const auto layers = pp::app::plan_tools_panel(pp::app::ToolsPanel::layers, false);
const auto animation = pp::app::plan_tools_panel(pp::app::ToolsPanel::animation, false);
PP_EXPECT(harness, presets.action == pp::app::ToolsPanelAction::open_floating_panel);
PP_EXPECT(harness, presets.title == "Brushes");
PP_EXPECT(harness, presets.height == 300);
PP_EXPECT(harness, presets.min_height == 300);
PP_EXPECT(harness, presets.min_width == 100);
PP_EXPECT(harness, color.title == "Color Picker");
PP_EXPECT(harness, color.hides_embedded_title);
PP_EXPECT(harness, layers.title == "Layers");
PP_EXPECT(harness, layers.min_height == 100);
PP_EXPECT(harness, layers.hides_embedded_title);
PP_EXPECT(harness, animation.title == "Animation");
PP_EXPECT(harness, animation.width == 500);
PP_EXPECT(harness, animation.height == 300);
PP_EXPECT(harness, !animation.droppable);
}
void tools_panel_no_ops_when_panel_is_already_visible(pp::tests::Harness& harness)
{
const auto visible = pp::app::plan_tools_panel(pp::app::ToolsPanel::brush, true);
const auto hidden = pp::app::plan_tools_panel(pp::app::ToolsPanel::brush, false);
PP_EXPECT(harness, visible.action == pp::app::ToolsPanelAction::no_op_already_visible);
PP_EXPECT(harness, hidden.action == pp::app::ToolsPanelAction::open_floating_panel);
PP_EXPECT(harness, visible.title == hidden.title);
PP_EXPECT(harness, visible.hides_embedded_title == hidden.hides_embedded_title);
}
}
int main()
{
pp::tests::Harness harness;
harness.run("tools menu maps submenus and commands", tools_menu_maps_submenus_and_commands);
harness.run("tools menu gates platform only actions", tools_menu_gates_platform_only_actions);
harness.run("tools panel plans floating panel metadata", tools_panel_plans_floating_panel_metadata);
harness.run("tools panel no ops when panel is already visible", tools_panel_no_ops_when_panel_is_already_visible);
return harness.finish();
}