mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-18 16:32:06 +00:00
Only one action source ever existed, so the IActionSource interface and ScriptActionSource are gone. ActionRegistry now subscribes to the plugin loader and enumerates actions directly in init() - no polymorphism for one impl. Replace the opaque FNV-hash SpeedDialActionId with a readable composed id of the form prefix:title:source_key. Split AppAction's single source field into source_key (stable identity, e.g. plugin_key) and source_name (display), so identity and display no longer share one field.
56 lines
2.0 KiB
C++
56 lines
2.0 KiB
C++
#include <catch2/catch_test_macros.hpp>
|
|
|
|
#include "slic3r/GUI/ActionRegistry.hpp"
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <type_traits>
|
|
|
|
using Slic3r::GUI::AppAction;
|
|
using Slic3r::GUI::AppActionRunResult;
|
|
using Slic3r::GUI::ActionRegistry;
|
|
|
|
namespace {
|
|
|
|
// AppAction is abstract; this minimal concrete action lets the tests exercise its
|
|
// constructor-composed identity without involving a plugin runner.
|
|
class TestAppAction final : public AppAction
|
|
{
|
|
public:
|
|
TestAppAction() : AppAction("test", "Action title", "src-key", "Action source") {}
|
|
|
|
AppActionRunResult run() const override { return {}; }
|
|
};
|
|
|
|
} // namespace
|
|
|
|
TEST_CASE("AppAction composes a stable id from prefix:title:source_key", "[speeddial][actions]")
|
|
{
|
|
CHECK(AppAction::compose_id("test", "Action title", "src-key") == "test:Action title:src-key");
|
|
// source_key (not the display name) carries identity, so it is the third field.
|
|
CHECK(AppAction::compose_id("script", "Do Thing", "pack.py") == "script:Do Thing:pack.py");
|
|
}
|
|
|
|
TEST_CASE("AppAction definitions are immutable after construction", "[speeddial][actions]")
|
|
{
|
|
using StringAccessor = const std::string& (AppAction::*)() const;
|
|
|
|
STATIC_CHECK(std::is_same_v<decltype(&AppAction::id), StringAccessor>);
|
|
STATIC_CHECK(std::is_same_v<decltype(&AppAction::title), StringAccessor>);
|
|
STATIC_CHECK(std::is_same_v<decltype(&AppAction::source_key), StringAccessor>);
|
|
STATIC_CHECK(std::is_same_v<decltype(&AppAction::source_name), StringAccessor>);
|
|
|
|
const TestAppAction action;
|
|
CHECK(action.id() == "test:Action title:src-key");
|
|
CHECK(action.title() == "Action title");
|
|
CHECK(action.source_key() == "src-key");
|
|
CHECK(action.source_name() == "Action source");
|
|
}
|
|
|
|
TEST_CASE("ActionRegistry takes exclusive ownership of published actions", "[speeddial][actions]")
|
|
{
|
|
using ExpectedUpsert = void (ActionRegistry::*)(std::unique_ptr<AppAction>);
|
|
|
|
STATIC_CHECK(std::is_same_v<decltype(&ActionRegistry::upsert), ExpectedUpsert>);
|
|
}
|