Add tools menu service boundary
This commit is contained in:
@@ -3,6 +3,33 @@
|
||||
|
||||
namespace {
|
||||
|
||||
class FakeToolsMenuServices final : public pp::app::ToolsMenuServices {
|
||||
public:
|
||||
void show_panels_submenu() override { panels_submenus += 1; }
|
||||
void show_options_submenu() override { options_submenus += 1; }
|
||||
void clear_grid_overlays() override { clear_grid_calls += 1; }
|
||||
void reset_camera() override { reset_camera_calls += 1; }
|
||||
void show_shortcuts_dialog() override { shortcut_dialogs += 1; }
|
||||
void start_sonarpen() override { sonarpen_starts += 1; }
|
||||
|
||||
[[nodiscard]] int total_calls() const noexcept
|
||||
{
|
||||
return panels_submenus
|
||||
+ options_submenus
|
||||
+ clear_grid_calls
|
||||
+ reset_camera_calls
|
||||
+ shortcut_dialogs
|
||||
+ sonarpen_starts;
|
||||
}
|
||||
|
||||
int panels_submenus = 0;
|
||||
int options_submenus = 0;
|
||||
int clear_grid_calls = 0;
|
||||
int reset_camera_calls = 0;
|
||||
int shortcut_dialogs = 0;
|
||||
int sonarpen_starts = 0;
|
||||
};
|
||||
|
||||
void tools_menu_maps_submenus_and_commands(pp::tests::Harness& harness)
|
||||
{
|
||||
const auto panels = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::panels);
|
||||
@@ -67,6 +94,45 @@ void tools_panel_no_ops_when_panel_is_already_visible(pp::tests::Harness& harnes
|
||||
PP_EXPECT(harness, visible.hides_embedded_title == hidden.hides_embedded_title);
|
||||
}
|
||||
|
||||
void tools_menu_executor_dispatches_direct_commands(pp::tests::Harness& harness)
|
||||
{
|
||||
FakeToolsMenuServices services;
|
||||
|
||||
const auto panels = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::panels);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(panels, services).ok());
|
||||
PP_EXPECT(harness, services.panels_submenus == 1);
|
||||
|
||||
const auto options = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::options);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(options, services).ok());
|
||||
PP_EXPECT(harness, services.options_submenus == 1);
|
||||
|
||||
const auto clear = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::clear_grids);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(clear, services).ok());
|
||||
PP_EXPECT(harness, services.clear_grid_calls == 1);
|
||||
|
||||
const auto camera = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::reset_camera);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(camera, services).ok());
|
||||
PP_EXPECT(harness, services.reset_camera_calls == 1);
|
||||
|
||||
const auto shortcuts = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::shortcuts);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(shortcuts, services).ok());
|
||||
PP_EXPECT(harness, services.shortcut_dialogs == 1);
|
||||
|
||||
const auto sonarpen = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::sonarpen, true);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(sonarpen, services).ok());
|
||||
PP_EXPECT(harness, services.sonarpen_starts == 1);
|
||||
}
|
||||
|
||||
void tools_menu_executor_preserves_unavailable_no_op(pp::tests::Harness& harness)
|
||||
{
|
||||
FakeToolsMenuServices services;
|
||||
|
||||
const auto unavailable = pp::app::plan_tools_menu_command(pp::app::ToolsMenuCommand::sonarpen, false);
|
||||
PP_EXPECT(harness, unavailable.action == pp::app::ToolsMenuAction::no_op_unavailable);
|
||||
PP_EXPECT(harness, pp::app::execute_tools_menu_plan(unavailable, services).ok());
|
||||
PP_EXPECT(harness, services.total_calls() == 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
@@ -76,5 +142,7 @@ int main()
|
||||
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);
|
||||
harness.run("tools menu executor dispatches direct commands", tools_menu_executor_dispatches_direct_commands);
|
||||
harness.run("tools menu executor preserves unavailable no op", tools_menu_executor_preserves_unavailable_no_op);
|
||||
return harness.finish();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user