From 659e486cd791f7da4d1cf12fdd08fa2048bdb8b2 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Mon, 9 Aug 2021 11:56:19 +0100 Subject: [PATCH] Add an integration test to validate pick mode crash (#2935) * add an integration test to validate pick mode crash Signed-off-by: hultonha * update to test after review feedback Signed-off-by: hultonha --- .../UnitTest/AzToolsFrameworkTestHelpers.cpp | 29 +++++++++++++ .../UnitTest/AzToolsFrameworkTestHelpers.h | 26 ++++++----- .../Framework/AzToolsFramework/CMakeLists.txt | 2 + ...EditorTransformComponentSelectionTests.cpp | 43 +++++++++++++++++++ 4 files changed, 89 insertions(+), 11 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.cpp index 5ffbe1b4f3..1bec929223 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.cpp @@ -65,6 +65,35 @@ namespace UnitTest } } + bool FocusInteractionWidget::event(QEvent* event) + { + using AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus; + + auto eventType = event->type(); + + switch (eventType) + { + case QEvent::MouseButtonPress: + EditorInteractionSystemViewportSelectionRequestBus::Event( + AzToolsFramework::GetEntityContextId(), &EditorInteractionSystemViewportSelectionRequestBus::Events::SetDefaultHandler); + return true; + case QEvent::FocusIn: + case QEvent::FocusOut: + { + bool handled = false; + AzToolsFramework::ViewportInteraction::MouseInteraction mouseInteraction; + EditorInteractionSystemViewportSelectionRequestBus::EventResult( + handled, AzToolsFramework::GetEntityContextId(), + &EditorInteractionSystemViewportSelectionRequestBus::Events::InternalHandleMouseViewportInteraction, + AzToolsFramework::ViewportInteraction::MouseInteractionEvent( + mouseInteraction, AzToolsFramework::ViewportInteraction::MouseEvent::Down)); + return handled; + } + } + + return QWidget::event(event); + } + void TestEditorActions::Connect() { using AzToolsFramework::GetEntityContextId; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h index 7967f58bf6..3c413fd21e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h @@ -8,6 +8,7 @@ #pragma once +#if !defined(Q_MOC_RUN) #include #include #include @@ -31,6 +32,7 @@ #include #include #include +#endif // !defined(Q_MOC_RUN) #include @@ -40,7 +42,7 @@ AZ_POP_DISABLE_WARNING #define AUTO_RESULT_IF_SETTING_TRUE(_settingName, _result) \ { \ - bool settingValue = true; \ + bool settingValue = true; \ if (auto* registry = AZ::SettingsRegistry::Get()) \ { \ registry->Get(settingValue, _settingName); \ @@ -51,23 +53,16 @@ AZ_POP_DISABLE_WARNING EXPECT_TRUE(_result); \ return; \ } \ - } - -namespace AZ -{ - class Entity; - class EntityId; - -} // namespace AZ + } namespace UnitTest { constexpr AZStd::string_view prefabSystemSetting = "/Amazon/Preferences/EnablePrefabSystem"; /// Test widget to store QActions generated by EditorTransformComponentSelection. - class TestWidget - : public QWidget + class TestWidget : public QWidget { + Q_OBJECT public: TestWidget() : QWidget() @@ -79,6 +74,15 @@ namespace UnitTest bool eventFilter(QObject* watched, QEvent* event) override; }; + /// Widget used to trigger a viewport interaction event while a focus change is happening. + class FocusInteractionWidget : public QWidget + { + Q_OBJECT + public: + FocusInteractionWidget(QWidget* parent = nullptr) : QWidget(parent) {} + bool event(QEvent* event) override; + }; + /// Stores actions registered for either normal mode (regular viewport) editing and /// component mode editing. class TestEditorActions diff --git a/Code/Framework/AzToolsFramework/CMakeLists.txt b/Code/Framework/AzToolsFramework/CMakeLists.txt index a2138b8a0e..62f4f43d93 100644 --- a/Code/Framework/AzToolsFramework/CMakeLists.txt +++ b/Code/Framework/AzToolsFramework/CMakeLists.txt @@ -50,6 +50,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_target( NAME AzToolsFrameworkTestCommon STATIC NAMESPACE AZ + AUTOMOC FILES_CMAKE AzToolsFramework/aztoolsframeworktestcommon_files.cmake INCLUDE_DIRECTORIES @@ -68,6 +69,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_target( NAME AzToolsFramework.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} NAMESPACE AZ + AUTOMOC FILES_CMAKE Tests/aztoolsframeworktests_files.cmake INCLUDE_DIRECTORIES diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index f45b3c3b09..895c91b0a4 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -31,8 +31,10 @@ #include #include #include +#include #include #include +#include namespace AZ { @@ -188,6 +190,47 @@ namespace UnitTest /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // EditorTransformComponentSelection Tests + TEST_F(EditorTransformComponentSelectionFixture, Focus_is_not_changed_while_switching_viewport_interaction_request_instance) + { + // setup a dummy widget and make it the active window to ensure focus in/out events are fired + auto dummyWidget = AZStd::make_unique(); + QApplication::setActiveWindow(dummyWidget.get()); + + // note: it is important to make sure the focus widget is parented to the dummy widget to have focus in/out events fire + auto focusWidget = AZStd::make_unique(dummyWidget.get()); + + const auto previousFocusWidget = QApplication::focusWidget(); + + // Given + // setup viewport ui system + AzToolsFramework::ViewportUi::ViewportUiManager viewportUiManager; + viewportUiManager.ConnectViewportUiBus(AzToolsFramework::ViewportUi::DefaultViewportId); + viewportUiManager.InitializeViewportUi(&m_editorActions.m_defaultWidget, focusWidget.get()); + + // begin EditorPickEntitySelection + using AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus; + EditorInteractionSystemViewportSelectionRequestBus::Event( + AzToolsFramework::GetEntityContextId(), &EditorInteractionSystemViewportSelectionRequestBus::Events::SetHandler, + [](const AzToolsFramework::EditorVisibleEntityDataCache* entityDataCache) + { + return AZStd::make_unique(entityDataCache); + }); + + // When + // a mouse event is sent to the focus widget (set to be the render overlay in the viewport ui system) + QTest::mouseClick(focusWidget.get(), Qt::MouseButton::LeftButton); + + // Then + // focus should not change + EXPECT_FALSE(focusWidget->hasFocus()); + EXPECT_EQ(previousFocusWidget, QApplication::focusWidget()); + + // clean up + viewportUiManager.DisconnectViewportUiBus(); + focusWidget.reset(); + dummyWidget.reset(); + } + TEST_F(EditorTransformComponentSelectionFixture, ManipulatorOrientationIsResetWhenEntityOrientationIsReset) { using AzToolsFramework::EditorTransformComponentSelectionRequestBus;