Files
XCEngine/tests/editor/test_scene_viewport_chrome.cpp

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