114 lines
4.2 KiB
C++
114 lines
4.2 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#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);
|
|
}
|