#include #include "Core/IUndoManager.h" #include "Viewport/SceneViewportChrome.h" #include "Viewport/SceneViewportMoveGizmo.h" #include "Viewport/SceneViewportRotateGizmo.h" #include "Viewport/SceneViewportScaleGizmo.h" namespace { using XCEngine::Editor::BuildSceneViewportToolCommand; using XCEngine::Editor::ExecuteSceneViewportToolCommand; using XCEngine::Editor::SceneViewportToolCommand; using XCEngine::Editor::SceneViewportToolMode; using XCEngine::Editor::SceneViewportToolOverlayResult; using XCEngine::Editor::SceneViewportToolShortcutAction; class StubUndoManager : public XCEngine::Editor::IUndoManager { public: void ClearHistory() override {} bool CanUndo() const override { return false; } bool CanRedo() const override { return false; } const std::string& GetUndoLabel() const override { return empty; } const std::string& GetRedoLabel() const override { return empty; } void Undo() override {} void Redo() override {} XCEngine::Editor::UndoStateSnapshot CaptureCurrentState() const override { return {}; } void PushCommand(const std::string&, XCEngine::Editor::UndoStateSnapshot, XCEngine::Editor::UndoStateSnapshot) override {} void BeginInteractiveChange(const std::string&) override {} bool HasPendingInteractiveChange() const override { return false; } void FinalizeInteractiveChange() override {} void CancelInteractiveChange() override {} private: std::string empty; }; } // namespace TEST(SceneViewportChromeTest, ToolCommandUsesOverlayClickAsFullToolSwitch) { SceneViewportToolOverlayResult overlay = {}; overlay.clicked = true; overlay.clickedTool = SceneViewportToolMode::Transform; const SceneViewportToolShortcutAction shortcut = {}; const SceneViewportToolCommand command = BuildSceneViewportToolCommand(overlay, shortcut); EXPECT_TRUE(command.HasAction()); EXPECT_EQ(command.targetTool, SceneViewportToolMode::Transform); EXPECT_TRUE(command.cancelMoveGizmo); EXPECT_TRUE(command.cancelRotateGizmo); EXPECT_TRUE(command.cancelScaleGizmo); } TEST(SceneViewportChromeTest, ToolCommandUsesShortcutWhenOverlayDidNotTrigger) { const SceneViewportToolOverlayResult overlay = {}; SceneViewportToolShortcutAction shortcut = {}; shortcut.triggered = true; shortcut.targetTool = SceneViewportToolMode::Rotate; shortcut.cancelMoveGizmo = true; shortcut.cancelScaleGizmo = true; const SceneViewportToolCommand command = BuildSceneViewportToolCommand(overlay, shortcut); EXPECT_TRUE(command.HasAction()); EXPECT_EQ(command.targetTool, SceneViewportToolMode::Rotate); EXPECT_TRUE(command.cancelMoveGizmo); EXPECT_FALSE(command.cancelRotateGizmo); EXPECT_TRUE(command.cancelScaleGizmo); } TEST(SceneViewportChromeTest, ShortcutOverridesOverlayTargetWhilePreservingCancelUnion) { SceneViewportToolOverlayResult overlay = {}; overlay.clicked = true; overlay.clickedTool = SceneViewportToolMode::Move; SceneViewportToolShortcutAction shortcut = {}; shortcut.triggered = true; shortcut.targetTool = SceneViewportToolMode::Scale; shortcut.cancelMoveGizmo = true; shortcut.cancelRotateGizmo = true; const SceneViewportToolCommand command = BuildSceneViewportToolCommand(overlay, shortcut); EXPECT_TRUE(command.HasAction()); EXPECT_EQ(command.targetTool, SceneViewportToolMode::Scale); EXPECT_TRUE(command.cancelMoveGizmo); EXPECT_TRUE(command.cancelRotateGizmo); EXPECT_TRUE(command.cancelScaleGizmo); } TEST(SceneViewportChromeTest, ExecuteToolCommandUpdatesToolModeWhenTriggered) { StubUndoManager undoManager = {}; XCEngine::Editor::SceneViewportMoveGizmo moveGizmo = {}; XCEngine::Editor::SceneViewportRotateGizmo rotateGizmo = {}; XCEngine::Editor::SceneViewportScaleGizmo scaleGizmo = {}; SceneViewportToolMode toolMode = SceneViewportToolMode::Move; SceneViewportToolCommand command = {}; command.triggered = true; command.targetTool = SceneViewportToolMode::ViewMove; ExecuteSceneViewportToolCommand( command, undoManager, moveGizmo, rotateGizmo, scaleGizmo, toolMode); EXPECT_EQ(toolMode, SceneViewportToolMode::ViewMove); }