Move project save target planning to app core

This commit is contained in:
2026-06-06 11:52:49 +02:00
parent 9d9b93abb1
commit ed9709ade8
8 changed files with 217 additions and 7 deletions

View File

@@ -1526,6 +1526,24 @@ if(TARGET pano_cli)
LABELS "app;document;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_canvas_project_save_target_smoke
COMMAND pano_cli plan-canvas-project-save-target --data-dir D:/Paint/data --path D:/Paint/projects/demo.ppi)
set_tests_properties(pano_cli_plan_canvas_project_save_target_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-canvas-project-save-target\".*\"dataDirectory\":\"D:/Paint/data\".*\"targetPath\":\"D:/Paint/projects/demo.ppi\".*\"fileName\":\"demo\".*\"temporaryPath\":\"D:/Paint/data/demo.tmp.ppi\".*\"timelapsePath\":\"D:/Paint/data/demo.pptl\"")
add_test(NAME pano_cli_plan_canvas_project_save_target_backslash_smoke
COMMAND pano_cli plan-canvas-project-save-target --data-dir D:/Paint/data --path "D:\\Paint\\projects\\demo.ppi")
set_tests_properties(pano_cli_plan_canvas_project_save_target_backslash_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-canvas-project-save-target\".*\"fileName\":\"demo\".*\"temporaryPath\":\"D:/Paint/data/demo.tmp.ppi\".*\"timelapsePath\":\"D:/Paint/data/demo.pptl\"")
add_test(NAME pano_cli_plan_canvas_project_save_target_rejects_empty_path
COMMAND pano_cli plan-canvas-project-save-target --path "")
set_tests_properties(pano_cli_plan_canvas_project_save_target_rejects_empty_path PROPERTIES
LABELS "app;document;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_canvas_document_snapshot_smoke
COMMAND pano_cli plan-canvas-document-snapshot --width 128 --height 64 --layers 3 --frames 2 --current-layer 2 --current-frame 1 --hidden-layer 0 --alpha-locked-layer 2 --opacity 0.5 --blend-mode 4 --pending-face-payloads-per-layer 6)
set_tests_properties(pano_cli_plan_canvas_document_snapshot_smoke PROPERTIES

View File

@@ -240,6 +240,53 @@ void save_writer_route_falls_back_for_pending_payloads(pp::tests::Harness& harne
plan.fallback_reason == "canvas document snapshot still requires renderer payload readback");
}
void project_save_target_plan_preserves_legacy_paths(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_document_canvas_project_save_target(
"D:/Paint/data",
"D:/Paint/projects/demo.ppi");
PP_EXPECT(harness, plan);
if (!plan) {
return;
}
PP_EXPECT(harness, plan.value().target_path == "D:/Paint/projects/demo.ppi");
PP_EXPECT(harness, plan.value().file_name == "demo");
PP_EXPECT(harness, plan.value().temporary_path == "D:/Paint/data/demo.tmp.ppi");
PP_EXPECT(harness, plan.value().timelapse_path == "D:/Paint/data/demo.pptl");
}
void project_save_target_plan_accepts_windows_backslashes(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_document_canvas_project_save_target(
"D:/Paint/data",
"D:\\Paint\\projects\\demo.ppi");
PP_EXPECT(harness, plan);
if (!plan) {
return;
}
PP_EXPECT(harness, plan.value().file_name == "demo");
PP_EXPECT(harness, plan.value().temporary_path == "D:/Paint/data/demo.tmp.ppi");
PP_EXPECT(harness, plan.value().timelapse_path == "D:/Paint/data/demo.pptl");
}
void project_save_target_plan_rejects_empty_inputs(pp::tests::Harness& harness)
{
const auto no_data = pp::app::plan_document_canvas_project_save_target("", "D:/Paint/demo.ppi");
const auto no_target = pp::app::plan_document_canvas_project_save_target("D:/Paint/data", "");
const auto no_name = pp::app::plan_document_canvas_project_save_target("D:/Paint/data", "D:/Paint/");
PP_EXPECT(harness, !no_data);
PP_EXPECT(harness, !no_target);
PP_EXPECT(harness, !no_name);
PP_EXPECT(harness, no_data.status().code == pp::foundation::StatusCode::invalid_argument);
PP_EXPECT(harness, no_target.status().code == pp::foundation::StatusCode::invalid_argument);
PP_EXPECT(harness, no_name.status().code == pp::foundation::StatusCode::invalid_argument);
}
void snapshot_plan_rejects_invalid_canvas_state(pp::tests::Harness& harness)
{
const std::uint32_t frames[] { 100U };
@@ -421,6 +468,9 @@ int main()
harness.run("snapshot plan attaches captured face payloads", snapshot_plan_attaches_captured_face_payloads);
harness.run("save writer route uses ppi writer for complete payloads", save_writer_route_uses_ppi_writer_for_complete_payloads);
harness.run("save writer route falls back for pending payloads", save_writer_route_falls_back_for_pending_payloads);
harness.run("project save target plan preserves legacy paths", project_save_target_plan_preserves_legacy_paths);
harness.run("project save target plan accepts windows backslashes", project_save_target_plan_accepts_windows_backslashes);
harness.run("project save target plan rejects empty inputs", project_save_target_plan_rejects_empty_inputs);
harness.run("snapshot plan rejects invalid canvas state", snapshot_plan_rejects_invalid_canvas_state);
harness.run("clear plan records legacy canvas effects", clear_plan_records_legacy_canvas_effects);
harness.run("clear plan noops without canvas", clear_plan_noops_without_canvas);