Keep CMake module names and trim switches, but stop flattening editing/editor and runtime bridges as top-level src/modules directories. Parent scans skip nested facets so runtime-3d can drop authoring by directory leaf. Co-authored-by: Cursor <cursoragent@cursor.com>
56 lines
2.8 KiB
C++
56 lines
2.8 KiB
C++
#include "zeroerr/assert.h"
|
|
#include "zeroerr/unittest.h"
|
|
|
|
#include "animation/editor/AnimationEditorModule.h"
|
|
#include "animation/editor/EditorAnimationClip.h"
|
|
#include "common/Capability.h"
|
|
#include "common/EditorAutomation.h"
|
|
#include "editor/Editor.h"
|
|
|
|
using namespace eve::editor;
|
|
|
|
TEST_CASE("editor.animation.clip_automation_owns_headless_targets") {
|
|
Editor editor;
|
|
eve::animation_editor::AnimationEditorModule adapter;
|
|
auto* automation = eve::cap::query<eve::IEditorAutomation>();
|
|
REQUIRE(automation != nullptr);
|
|
|
|
const std::string commands = automation->invoke("commands", "{}");
|
|
CHECK(commands.find("animation.clip.settings.set.v1") != std::string::npos);
|
|
CHECK(commands.find("animation.clip.track.set.v1") != std::string::npos);
|
|
|
|
const std::string created =
|
|
automation->invoke("target-create", R"({"target":"agent.clip","type":"animation-clip"})");
|
|
REQUIRE(created.find("\"status\":\"applied\"") != std::string::npos);
|
|
|
|
const std::string settings = automation->invoke(
|
|
"execute",
|
|
R"({"target":"agent.clip","command":"animation.clip.settings.set.v1","payload":{"duration":2,"sampleRate":60,"loop":true}})");
|
|
REQUIRE(settings.find("\"status\":\"applied\"") != std::string::npos);
|
|
|
|
const std::string tracked = automation->invoke(
|
|
"execute",
|
|
R"({"target":"agent.clip","command":"animation.clip.track.set.v1","payload":{"id":"hips-track","bone":"Hips","keys":[{"id":"start","time":0,"px":0,"py":0,"pz":0,"rx":0,"ry":0,"rz":0,"rw":1,"sx":1,"sy":1,"sz":1},{"id":"end","time":2,"px":4,"py":0,"pz":0,"rx":0,"ry":0,"rz":0,"rw":1,"sx":1,"sy":1,"sz":1}]}})");
|
|
REQUIRE(tracked.find("\"status\":\"applied\"") != std::string::npos);
|
|
|
|
const std::string masked = automation->invoke(
|
|
"execute",
|
|
R"({"target":"agent.clip","command":"animation.clip.mask.set.v1","payload":{"bone":"Hips","weight":0.25}})");
|
|
REQUIRE(masked.find("\"status\":\"applied\"") != std::string::npos);
|
|
|
|
const std::string inspected = automation->invoke("inspect", R"({"target":"agent.clip"})");
|
|
CHECK(inspected.find("animation-clip-document") != std::string::npos);
|
|
CHECK(inspected.find("hips-track") != std::string::npos);
|
|
CHECK(inspected.find("Hips") != std::string::npos);
|
|
|
|
const std::string undone = automation->invoke("undo", R"({"target":"agent.clip"})");
|
|
CHECK(undone.find("\"status\":\"applied\"") != std::string::npos);
|
|
const std::string afterUndo = automation->invoke("inspect", R"({"target":"agent.clip"})");
|
|
CHECK(afterUndo.find("0.25") == std::string::npos);
|
|
|
|
const std::string closed = automation->invoke("target-close", R"({"target":"agent.clip"})");
|
|
CHECK(closed.find("\"status\":\"applied\"") != std::string::npos);
|
|
const std::string afterClose = automation->invoke("inspect", R"({"target":"agent.clip"})");
|
|
CHECK(afterClose.find("not-found") != std::string::npos);
|
|
}
|