Files
EVEngine/test/editor_animation_editor.cpp
T
西风逍遥游andCursor 24502babef Nest satellite packages under their host modules.
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>
2026-09-06 17:56:12 +08:00

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);
}