Extract layer menu action planning

This commit is contained in:
2026-06-03 12:05:13 +02:00
parent 6dac909869
commit fb844f79fd
7 changed files with 440 additions and 40 deletions

View File

@@ -898,6 +898,30 @@ if(TARGET pano_cli)
LABELS "app;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_layer_menu_merge_smoke
COMMAND pano_cli plan-layer-menu --command merge --current-index 2 --current-name Ink --lower-name Paint)
set_tests_properties(pano_cli_plan_layer_menu_merge_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-layer-menu\".*\"command\":\"merge\".*\"action\":\"merge-with-lower-layer\".*\"label\":\"Merge with Paint\".*\"fromIndex\":2.*\"toIndex\":1")
add_test(NAME pano_cli_plan_layer_menu_merge_animated_blocked_smoke
COMMAND pano_cli plan-layer-menu --command merge --current-index 2 --current-name Ink --lower-name Paint --animation-duration 3)
set_tests_properties(pano_cli_plan_layer_menu_merge_animated_blocked_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-layer-menu\".*\"animationDuration\":3.*\"action\":\"show-merge-animated-not-supported\"")
add_test(NAME pano_cli_plan_layer_menu_missing_selection_smoke
COMMAND pano_cli plan-layer-menu --command rename --no-current-layer)
set_tests_properties(pano_cli_plan_layer_menu_missing_selection_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast;fuzz"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-layer-menu\".*\"hasCurrentLayer\":false.*\"action\":\"no-op-select-layer\".*\"label\":\"Rename Layer \\(Select a layer\\)\"")
add_test(NAME pano_cli_plan_layer_menu_rejects_bad_state
COMMAND pano_cli plan-layer-menu --command merge --current-index -1)
set_tests_properties(pano_cli_plan_layer_menu_rejects_bad_state PROPERTIES
LABELS "app;document;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_layer_operation_add_smoke
COMMAND pano_cli plan-layer-operation --kind add --layer-count 2 --index 1 --name Paint)
set_tests_properties(pano_cli_plan_layer_operation_add_smoke PROPERTIES

View File

@@ -178,6 +178,115 @@ void layer_highlight_is_transient(pp::tests::Harness& harness)
PP_EXPECT(harness, !pp::app::plan_document_layer_highlight(2, 2, true));
}
void layer_menu_labels_selected_layer_commands(pp::tests::Harness& harness)
{
const auto clear = pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::clear,
true,
1,
1,
"Paint",
"Base");
const auto rename = pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::rename,
true,
1,
1,
"Paint",
"Base");
PP_EXPECT(harness, clear);
PP_EXPECT(harness, rename);
if (clear) {
PP_EXPECT(harness, clear.value().label == "Clear Layer Paint");
PP_EXPECT(harness, clear.value().action == pp::app::DocumentLayerMenuAction::clear_current_layer);
}
if (rename) {
PP_EXPECT(harness, rename.value().label == "Rename Layer Paint");
PP_EXPECT(harness, rename.value().action == pp::app::DocumentLayerMenuAction::show_rename_dialog);
}
}
void layer_menu_plans_merge_down_or_blocks_it(pp::tests::Harness& harness)
{
const auto merge = pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::merge_down,
true,
2,
1,
"Ink",
"Paint");
const auto base_layer = pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::merge_down,
true,
0,
1,
"Base",
"");
const auto animated = pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::merge_down,
true,
2,
3,
"Ink",
"Paint");
PP_EXPECT(harness, merge);
PP_EXPECT(harness, base_layer);
PP_EXPECT(harness, animated);
if (merge) {
PP_EXPECT(harness, merge.value().label == "Merge with Paint");
PP_EXPECT(harness, merge.value().from_index == 2);
PP_EXPECT(harness, merge.value().to_index == 1);
PP_EXPECT(harness, merge.value().action == pp::app::DocumentLayerMenuAction::merge_with_lower_layer);
}
if (base_layer) {
PP_EXPECT(harness, base_layer.value().action == pp::app::DocumentLayerMenuAction::no_op_select_upper_layer);
PP_EXPECT(harness, base_layer.value().label == "Merge Layer (Select upper layers)");
}
if (animated) {
PP_EXPECT(
harness,
animated.value().action == pp::app::DocumentLayerMenuAction::show_merge_animated_not_supported);
}
}
void layer_menu_handles_missing_selection_and_bad_state(pp::tests::Harness& harness)
{
const auto missing = pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::rename,
false,
0,
1,
"",
"");
PP_EXPECT(harness, missing);
if (missing) {
PP_EXPECT(harness, missing.value().action == pp::app::DocumentLayerMenuAction::no_op_select_layer);
PP_EXPECT(harness, missing.value().label == "Rename Layer (Select a layer)");
}
PP_EXPECT(
harness,
!pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::merge_down,
true,
-1,
1,
"Ink",
"Paint"));
PP_EXPECT(
harness,
!pp::app::plan_document_layer_menu(
pp::app::DocumentLayerMenuCommand::merge_down,
true,
1,
-1,
"Ink",
"Paint"));
}
}
int main()
@@ -192,5 +301,8 @@ int main()
harness.run("layer remove keeps at least one layer", layer_remove_keeps_at_least_one_layer);
harness.run("layer metadata plans validate values", layer_metadata_plans_validate_values);
harness.run("layer highlight is transient", layer_highlight_is_transient);
harness.run("layer menu labels selected layer commands", layer_menu_labels_selected_layer_commands);
harness.run("layer menu plans merge down or blocks it", layer_menu_plans_merge_down_or_blocks_it);
harness.run("layer menu handles missing selection and bad state", layer_menu_handles_missing_selection_and_bad_state);
return harness.finish();
}