3
0

UiTooltipComponentTest.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "LyShineTest.h"
  9. #include <ISerialize.h>
  10. #include "UiGameEntityContext.h"
  11. #include "UiButtonComponent.h"
  12. #include "UiTooltipComponent.h"
  13. #include "UiTooltipDisplayComponent.h"
  14. #include "UiElementComponent.h"
  15. #include "UiTransform2dComponent.h"
  16. #include "UiCanvasComponent.h"
  17. #include "UiImageComponent.h"
  18. #include <AzFramework/Application/Application.h>
  19. #include <AzFramework/Entity/GameEntityContextComponent.h>
  20. #include <AzFramework/Asset/AssetSystemComponent.h>
  21. #include <AzCore/Component/Entity.h>
  22. #include <AzCore/Asset/AssetManagerComponent.h>
  23. #include <AzCore/IO/Streamer/StreamerComponent.h>
  24. #include <AzCore/Jobs/JobManagerComponent.h>
  25. #include <AzCore/Slice/SliceSystemComponent.h>
  26. #include <AzCore/UnitTest/Mocks/MockITime.h>
  27. namespace UnitTest
  28. {
  29. struct UiTooltipTestStubTimer : public AZ::StubTimeSystem
  30. {
  31. AZ::TimeMs GetRealElapsedTimeMs() const override
  32. {
  33. m_time += AZ::TimeMs{ 1000 };
  34. return m_time;
  35. }
  36. mutable AZ::TimeMs m_time = AZ::Time::ZeroTimeMs;
  37. };
  38. class UiTooltipTestApplication
  39. : public AzFramework::Application
  40. {
  41. public:
  42. UiTooltipTestApplication()
  43. : AzFramework::Application()
  44. {
  45. m_timeSystem.reset();
  46. m_timeSystem = AZStd::make_unique<UiTooltipTestStubTimer>();
  47. }
  48. void Reflect(AZ::ReflectContext* context) override
  49. {
  50. AzFramework::Application::Reflect(context);
  51. UiSerialize::ReflectUiTypes(context); //< needed to serialize ui Anchor and Offset
  52. }
  53. private:
  54. // override and only include system components required for tests.
  55. AZ::ComponentTypeList GetRequiredSystemComponents() const override
  56. {
  57. return AZ::ComponentTypeList{
  58. azrtti_typeid<AZ::AssetManagerComponent>(),
  59. azrtti_typeid<AZ::JobManagerComponent>(),
  60. azrtti_typeid<AZ::StreamerComponent>(),
  61. azrtti_typeid<AZ::SliceSystemComponent>(),
  62. azrtti_typeid<AzFramework::GameEntityContextComponent>(),
  63. azrtti_typeid<AzFramework::AssetSystem::AssetSystemComponent>(),
  64. };
  65. }
  66. void RegisterCoreComponents() override
  67. {
  68. AzFramework::Application::RegisterCoreComponents();
  69. RegisterComponentDescriptor(UiTransform2dComponent::CreateDescriptor());
  70. RegisterComponentDescriptor(UiElementComponent::CreateDescriptor());
  71. RegisterComponentDescriptor(UiButtonComponent::CreateDescriptor());
  72. RegisterComponentDescriptor(UiTooltipComponent::CreateDescriptor());
  73. RegisterComponentDescriptor(UiTooltipDisplayComponent::CreateDescriptor());
  74. RegisterComponentDescriptor(UiImageComponent::CreateDescriptor());
  75. RegisterComponentDescriptor(UiCanvasComponent::CreateDescriptor());
  76. }
  77. };
  78. class UiTooltipComponentTest
  79. : public UnitTest::LeakDetectionFixture
  80. {
  81. protected:
  82. UiTooltipTestApplication* m_application = nullptr;
  83. protected:
  84. void SetUp() override
  85. {
  86. // start application
  87. AZ::ComponentApplication::Descriptor appDescriptor;
  88. appDescriptor.m_useExistingAllocator = true;
  89. m_application = aznew UiTooltipTestApplication();
  90. AZ::ComponentApplication::StartupParameters startupParameters;
  91. startupParameters.m_loadSettingsRegistry = false;
  92. m_application->Start(appDescriptor, startupParameters);
  93. }
  94. void TearDown() override
  95. {
  96. m_application->Stop();
  97. delete m_application;
  98. m_application = nullptr;
  99. }
  100. AZStd::tuple<UiCanvasComponent*, UiTooltipDisplayComponent*, UiTooltipComponent*> CreateUiCanvasWithTooltip()
  101. {
  102. // create a canvas
  103. UiGameEntityContext* entityContext = new UiGameEntityContext(); //< UiCanvasComponent takes ownership of this pointer and will free this when exiting
  104. UiCanvasComponent* uiCanvasComponent = UiCanvasComponent::CreateCanvasInternal(entityContext, false);
  105. // add scroll bar to the canvas
  106. AZ::Entity* tooltipDisplayEntity = uiCanvasComponent->CreateChildElement("Ui Tooltip");
  107. tooltipDisplayEntity->Deactivate(); //< deactivate so that we can add components
  108. tooltipDisplayEntity->CreateComponent<UiTransform2dComponent>(); //< required by UiTooltipDisplauComponent
  109. tooltipDisplayEntity->CreateComponent<UiImageComponent>(); //< required by UiTooltipDisplayComponent
  110. auto uiTooltipDisplayComponent = tooltipDisplayEntity->CreateComponent<UiTooltipDisplayComponent>();
  111. tooltipDisplayEntity->Activate();
  112. uiCanvasComponent->SetTooltipDisplayElement(tooltipDisplayEntity->GetId());
  113. // create the button entity
  114. AZ::Entity* buttonEntity = uiCanvasComponent->CreateChildElement("Ui Button");
  115. buttonEntity->Deactivate(); // deactivate to add component
  116. buttonEntity->CreateComponent<UiTransform2dComponent>();
  117. buttonEntity->CreateComponent<UiButtonComponent>();
  118. buttonEntity->CreateComponent<UiImageComponent>();
  119. auto uiTooltipComponent = buttonEntity->CreateComponent<UiTooltipComponent>();
  120. buttonEntity->Activate();
  121. return AZStd::make_tuple(uiCanvasComponent, uiTooltipDisplayComponent, uiTooltipComponent);
  122. }
  123. };
  124. TEST_F(UiTooltipComponentTest, UiTooltipComponent_WillAppearOnHover)
  125. {
  126. SSystemGlobalEnvironment env;
  127. SSystemGlobalEnvironment* prevEnv = gEnv;
  128. gEnv = &env;
  129. auto [uiCanvasComponent, uiTooltipDisplayComponent, uiTooltipComponent] = CreateUiCanvasWithTooltip();
  130. uiTooltipDisplayComponent->SetTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnHover);
  131. AZ::Entity* uiTooltipEntity = uiTooltipComponent->GetEntity();
  132. // test: verify tooltip is hidden by default, hover over button for tooltip to appear, hover off for tooltip to disappear
  133. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  134. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnHoverStart);
  135. AZ::EntityId canvasEntityId;
  136. UiElementBus::EventResult(canvasEntityId, uiTooltipComponent->GetEntityId(), &UiElementBus::Events::GetCanvasEntityId);
  137. uiTooltipDisplayComponent->Update();
  138. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Shown);
  139. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnHoverEnd);
  140. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  141. // clean up the canvas
  142. delete uiCanvasComponent->GetEntity();
  143. gEnv = prevEnv;
  144. }
  145. TEST_F(UiTooltipComponentTest, UiTooltipComponent_HoverTooltipDisappearsOnPress)
  146. {
  147. SSystemGlobalEnvironment env;
  148. SSystemGlobalEnvironment* prevEnv = gEnv;
  149. gEnv = &env;
  150. auto [uiCanvasComponent, uiTooltipDisplayComponent, uiTooltipComponent] = CreateUiCanvasWithTooltip();
  151. uiTooltipDisplayComponent->SetTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnHover);
  152. AZ::Entity* uiTooltipEntity = uiTooltipComponent->GetEntity();
  153. // test: verify tooltip is hidden by default, hover over button for tooltip to appear, press button for tooltip to disappear
  154. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  155. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnHoverStart);
  156. uiTooltipDisplayComponent->Update();
  157. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Shown);
  158. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnPressed);
  159. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  160. // clean up the canvas
  161. delete uiCanvasComponent->GetEntity();
  162. gEnv = prevEnv;
  163. }
  164. TEST_F(UiTooltipComponentTest, UiTooltipComponent_TooltipAppearsOnPress)
  165. {
  166. SSystemGlobalEnvironment env;
  167. SSystemGlobalEnvironment* prevEnv = gEnv;
  168. gEnv = &env;
  169. auto [uiCanvasComponent, uiTooltipDisplayComponent, uiTooltipComponent] = CreateUiCanvasWithTooltip();
  170. uiTooltipDisplayComponent->SetTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnPress);
  171. AZ::Entity* uiTooltipEntity = uiTooltipComponent->GetEntity();
  172. // test: verify tooltip is hidden by default, press button for tooltip to appear, release button for tooltip to disappear
  173. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  174. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnPressed);
  175. uiTooltipDisplayComponent->Update();
  176. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Shown);
  177. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnReleased);
  178. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  179. // clean up the canvas
  180. delete uiCanvasComponent->GetEntity();
  181. gEnv = prevEnv;
  182. }
  183. TEST_F(UiTooltipComponentTest, UiTooltipComponent_TooltipDisappearsOnCanvasPrimaryRelease)
  184. {
  185. SSystemGlobalEnvironment env;
  186. SSystemGlobalEnvironment* prevEnv = gEnv;
  187. gEnv = &env;
  188. auto [uiCanvasComponent, uiTooltipDisplayComponent, uiTooltipComponent] = CreateUiCanvasWithTooltip();
  189. uiTooltipDisplayComponent->SetTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnPress);
  190. AZ::Entity* uiTooltipEntity = uiTooltipComponent->GetEntity();
  191. // test: verify tooltip is hidden by default, press button for tooltip to appear, release mouse on canvas (not on button) for tooltip to disappear
  192. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  193. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnPressed);
  194. uiTooltipDisplayComponent->Update();
  195. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Shown);
  196. UiCanvasInputNotificationBus::Event(uiCanvasComponent->GetEntityId(), &UiCanvasInputNotificationBus::Events::OnCanvasPrimaryReleased, uiCanvasComponent->GetEntityId());
  197. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  198. // clean up the canvas
  199. delete uiCanvasComponent->GetEntity();
  200. gEnv = prevEnv;
  201. }
  202. TEST_F(UiTooltipComponentTest, UiTooltipComponent_TooltipAppearsOnClick)
  203. {
  204. SSystemGlobalEnvironment env;
  205. SSystemGlobalEnvironment* prevEnv = gEnv;
  206. gEnv = &env;
  207. auto [uiCanvasComponent, uiTooltipDisplayComponent, uiTooltipComponent] = CreateUiCanvasWithTooltip();
  208. uiTooltipDisplayComponent->SetTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnClick);
  209. AZ::Entity* uiTooltipEntity = uiTooltipComponent->GetEntity();
  210. // test: verify tooltip is hidden by default, click button for tooltip to appear, click off of button for tooltip to disappear
  211. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  212. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnPressed);
  213. UiInteractableNotificationBus::Event(uiTooltipEntity->GetId(), &UiInteractableNotificationBus::Events::OnReleased);
  214. uiTooltipDisplayComponent->Update();
  215. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Shown);
  216. UiCanvasInputNotificationBus::Event(uiCanvasComponent->GetEntityId(), &UiCanvasInputNotificationBus::Events::OnCanvasPrimaryReleased, uiCanvasComponent->GetEntityId());
  217. EXPECT_EQ(uiTooltipDisplayComponent->GetState(), UiTooltipDisplayComponent::State::Hidden);
  218. // clean up the canvas
  219. delete uiCanvasComponent->GetEntity();
  220. gEnv = prevEnv;
  221. }
  222. } //namespace UnitTest