#include #include "Core/EditorContext.h" #include "Managers/SceneManager.h" #include "Viewport/SceneViewportMoveGizmo.h" namespace XCEngine::Editor { namespace { class SceneViewportMoveGizmoTest : public ::testing::Test { protected: void SetUp() override { m_context.GetSceneManager().NewScene("Move Gizmo Test Scene"); } static SceneViewportOverlayData MakeOverlay() { SceneViewportOverlayData overlay = {}; overlay.valid = true; overlay.cameraPosition = Math::Vector3(0.0f, 0.0f, -5.0f); overlay.cameraForward = Math::Vector3::Forward(); overlay.cameraRight = Math::Vector3::Right(); overlay.cameraUp = Math::Vector3::Up(); overlay.verticalFovDegrees = 60.0f; overlay.nearClipPlane = 0.03f; overlay.farClipPlane = 2000.0f; return overlay; } static SceneViewportMoveGizmoContext MakeContext( Components::GameObject* selectedObject, const Math::Vector2& mousePosition) { SceneViewportMoveGizmoContext context = {}; context.overlay = MakeOverlay(); context.viewportSize = Math::Vector2(800.0f, 600.0f); context.mousePosition = mousePosition; context.selectedObject = selectedObject; return context; } SceneManager& GetSceneManager() { return dynamic_cast(m_context.GetSceneManager()); } EditorContext m_context; }; TEST_F(SceneViewportMoveGizmoTest, UpdateHighlightsXAxisWhenMouseIsNearXAxisHandle) { Components::GameObject* target = GetSceneManager().CreateEntity("Target"); ASSERT_NE(target, nullptr); m_context.GetSelectionManager().SetSelectedEntity(target->GetID()); SceneViewportMoveGizmo gizmo; gizmo.Update(MakeContext(target, Math::Vector2(436.0f, 300.0f))); ASSERT_TRUE(gizmo.GetDrawData().visible); EXPECT_TRUE(gizmo.IsHoveringHandle()); EXPECT_TRUE(gizmo.GetDrawData().handles[0].hovered); EXPECT_FALSE(gizmo.GetDrawData().handles[1].hovered); EXPECT_FALSE(gizmo.GetDrawData().handles[2].hovered); } TEST_F(SceneViewportMoveGizmoTest, DraggingXAxisOnlyChangesWorldXAndCreatesUndoStep) { Components::GameObject* target = GetSceneManager().CreateEntity("Target"); ASSERT_NE(target, nullptr); const uint64_t targetId = target->GetID(); m_context.GetSelectionManager().SetSelectedEntity(target->GetID()); SceneViewportMoveGizmo gizmo; const auto startContext = MakeContext(target, Math::Vector2(436.0f, 300.0f)); gizmo.Update(startContext); ASSERT_TRUE(gizmo.TryBeginDrag(startContext, m_context.GetUndoManager())); ASSERT_TRUE(gizmo.IsActive()); const auto dragContext = MakeContext(target, Math::Vector2(500.0f, 300.0f)); gizmo.Update(dragContext); gizmo.UpdateDrag(dragContext); gizmo.EndDrag(m_context.GetUndoManager()); const Math::Vector3 movedPosition = target->GetTransform()->GetPosition(); EXPECT_GT(movedPosition.x, 0.05f); EXPECT_NEAR(movedPosition.y, 0.0f, 1e-4f); EXPECT_NEAR(movedPosition.z, 0.0f, 1e-4f); EXPECT_TRUE(m_context.GetUndoManager().CanUndo()); m_context.GetUndoManager().Undo(); Components::GameObject* restoredTarget = GetSceneManager().GetEntity(targetId); ASSERT_NE(restoredTarget, nullptr); const Math::Vector3 restoredPosition = restoredTarget->GetTransform()->GetPosition(); EXPECT_NEAR(restoredPosition.x, 0.0f, 1e-4f); EXPECT_NEAR(restoredPosition.y, 0.0f, 1e-4f); EXPECT_NEAR(restoredPosition.z, 0.0f, 1e-4f); } } // namespace } // namespace XCEngine::Editor