Route startup resources through app core

This commit is contained in:
2026-06-05 05:55:23 +02:00
parent e42afcc83f
commit 678bf2dcd6
10 changed files with 347 additions and 21 deletions

View File

@@ -934,6 +934,19 @@ if(TARGET pano_cli)
WILL_FAIL TRUE
PASS_REGULAR_EXPRESSION "\"command\":\"plan-app-startup\".*\"message\":\"run counter must not be negative\"")
add_test(NAME pano_cli_plan_app_startup_resources_smoke
COMMAND pano_cli plan-app-startup-resources --width 1280 --height 720)
set_tests_properties(pano_cli_plan_app_startup_resources_smoke PROPERTIES
LABELS "app;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-app-startup-resources\".*\"uiRenderTargetWidth\":1280.*\"uiRenderTargetHeight\":720.*\"initializeShaders\":true.*\"initializeAssets\":true.*\"initializeLayout\":true.*\"updateTitle\":true.*\"createUiRenderTarget\":true")
add_test(NAME pano_cli_plan_app_startup_resources_rejects_bad_size
COMMAND pano_cli plan-app-startup-resources --bad-size)
set_tests_properties(pano_cli_plan_app_startup_resources_rejects_bad_size PROPERTIES
LABELS "app;integration;desktop-fast;fuzz"
WILL_FAIL TRUE
PASS_REGULAR_EXPRESSION "\"command\":\"plan-app-startup-resources\".*\"message\":\"startup resource dimensions")
add_test(NAME pano_cli_plan_brush_package_import_ppbr_smoke
COMMAND pano_cli plan-brush-package-import
--kind ppbr

View File

@@ -1,12 +1,15 @@
#include "app_core/app_startup.h"
#include "test_harness.h"
#include <cmath>
#include <limits>
#include <string>
namespace {
class FakeAppStartupServices final : public pp::app::AppStartupServices {
class FakeAppStartupServices final
: public pp::app::AppStartupServices
, public pp::app::AppStartupResourceServices {
public:
void store_run_counter(int value) override
{
@@ -38,11 +41,50 @@ public:
call_order += "license;";
}
void initialize_shaders() override
{
shader_initializations += 1;
call_order += "shaders;";
}
void initialize_assets() override
{
asset_initializations += 1;
call_order += "assets;";
}
void initialize_layout() override
{
layout_initializations += 1;
call_order += "layout;";
}
void update_title() override
{
title_updates += 1;
call_order += "title;";
}
void create_ui_render_target(int width, int height) override
{
ui_render_target_width = width;
ui_render_target_height = height;
ui_render_target_creations += 1;
call_order += "ui-rtt;";
}
int stored_run_counter = 0;
int save_calls = 0;
int timelapse_starts = 0;
bool vr_controllers_enabled = false;
int license_warnings = 0;
int shader_initializations = 0;
int asset_initializations = 0;
int layout_initializations = 0;
int title_updates = 0;
int ui_render_target_creations = 0;
int ui_render_target_width = 0;
int ui_render_target_height = 0;
std::string call_order;
};
@@ -144,6 +186,57 @@ void startup_executor_rejects_malformed_counter_state(pp::tests::Harness& harnes
PP_EXPECT(harness, services.call_order.empty());
}
void startup_resource_plan_projects_ui_target_size(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_app_startup_resources(1280.9F, 720.1F);
PP_EXPECT(harness, plan);
if (plan) {
PP_EXPECT(harness, plan.value().ui_render_target_width == 1280);
PP_EXPECT(harness, plan.value().ui_render_target_height == 720);
PP_EXPECT(harness, plan.value().initialize_shaders);
PP_EXPECT(harness, plan.value().initialize_assets);
PP_EXPECT(harness, plan.value().initialize_layout);
PP_EXPECT(harness, plan.value().update_title);
PP_EXPECT(harness, plan.value().create_ui_render_target);
}
}
void startup_resource_plan_rejects_invalid_dimensions(pp::tests::Harness& harness)
{
PP_EXPECT(harness, !pp::app::plan_app_startup_resources(0.0F, 720.0F));
PP_EXPECT(harness, !pp::app::plan_app_startup_resources(1280.0F, -1.0F));
PP_EXPECT(harness, !pp::app::plan_app_startup_resources(std::nanf(""), 720.0F));
}
void startup_resource_executor_dispatches_in_stable_order(pp::tests::Harness& harness)
{
FakeAppStartupServices services;
const auto plan = pp::app::plan_app_startup_resources(1024.0F, 512.0F);
PP_EXPECT(harness, plan);
PP_EXPECT(harness, pp::app::execute_app_startup_resources(plan.value(), services).ok());
PP_EXPECT(harness, services.shader_initializations == 1);
PP_EXPECT(harness, services.asset_initializations == 1);
PP_EXPECT(harness, services.layout_initializations == 1);
PP_EXPECT(harness, services.title_updates == 1);
PP_EXPECT(harness, services.ui_render_target_creations == 1);
PP_EXPECT(harness, services.ui_render_target_width == 1024);
PP_EXPECT(harness, services.ui_render_target_height == 512);
PP_EXPECT(harness, services.call_order == "shaders;assets;layout;title;ui-rtt;");
}
void startup_resource_executor_rejects_invalid_render_target_size(pp::tests::Harness& harness)
{
FakeAppStartupServices services;
pp::app::AppStartupResourcePlan plan;
plan.ui_render_target_width = 0;
plan.ui_render_target_height = 720;
PP_EXPECT(harness, !pp::app::execute_app_startup_resources(plan, services).ok());
PP_EXPECT(harness, services.call_order.empty());
}
}
int main()
@@ -160,5 +253,13 @@ int main()
"startup split executors keep persistence and runtime separate",
startup_split_executors_keep_persistence_and_runtime_separate);
harness.run("startup executor rejects malformed counter state", startup_executor_rejects_malformed_counter_state);
harness.run("startup resource plan projects UI target size", startup_resource_plan_projects_ui_target_size);
harness.run("startup resource plan rejects invalid dimensions", startup_resource_plan_rejects_invalid_dimensions);
harness.run(
"startup resource executor dispatches in stable order",
startup_resource_executor_dispatches_in_stable_order);
harness.run(
"startup resource executor rejects invalid render target size",
startup_resource_executor_rejects_invalid_render_target_size);
return harness.finish();
}