TestFixture.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 "TestFixture.h"
  9. #include "Clients/SimulationEntitiesManager.h"
  10. #include <SimulationInterfaces/SimulationEntityManagerRequestBus.h>
  11. namespace UnitTest
  12. {
  13. void SimulationInterfaceTestEnvironment::AddGemsAndComponents()
  14. {
  15. constexpr AZStd::array<AZStd::string_view, 3> requiredGems = { "PhysX5", // required for PhysX Dynamic
  16. "LmbrCentral", // for shapes
  17. "SimulationInterfaces" };
  18. AddActiveGems(requiredGems);
  19. AddDynamicModulePaths({ "PhysX5.Gem" });
  20. AddDynamicModulePaths({ "LmbrCentral" });
  21. AddComponentDescriptors({
  22. SimulationInterfaces::SimulationEntitiesManager::CreateDescriptor(),
  23. });
  24. AddRequiredComponents({ SimulationInterfaces::SimulationEntitiesManager::TYPEINFO_Uuid() });
  25. }
  26. void SimulationInterfaceTestEnvironment::PostSystemEntityActivate()
  27. {
  28. AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize);
  29. // load asset catalog
  30. }
  31. AZ::ComponentApplication* SimulationInterfaceTestEnvironment::CreateApplicationInstance()
  32. {
  33. // Using ToolsTestApplication to have AzFramework and AzToolsFramework components.
  34. return aznew UnitTest::ToolsTestApplication("SimulationInterfaceTestEnvironment");
  35. }
  36. void SimulationInterfaceTestFixture::AddAsset(const AZStd::string& assetPath)
  37. {
  38. AZ::Data::AssetInfo info;
  39. info.m_relativePath = assetPath;
  40. info.m_sizeBytes = 1;
  41. AZ::Data::AssetId id = AZ::Data::AssetId(AZ::Uuid::CreateRandom());
  42. AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequestBus::Events::RegisterAsset, id, info);
  43. m_registeredAssets.insert(id);
  44. }
  45. AzPhysics::SceneHandle SimulationInterfaceTestFixture::GetDefaultSceneHandle() const
  46. {
  47. return m_testSceneHandle;
  48. }
  49. AZ::EntityId SimulationInterfaceTestFixture::CreateEntityWithStaticBodyComponent(
  50. const AZStd::string& entityName, const AZ::Transform& transform)
  51. {
  52. AZStd::unique_ptr<AZ::Entity> entity = AZStd::make_unique<AZ::Entity>(entityName.c_str());
  53. auto* transformComponent = entity->CreateComponent(AZ::TransformComponentTypeId);
  54. AZ_Assert(transformComponent, "Failed to create TransformComponent");
  55. auto* transformInterface = azrtti_cast<AZ::TransformInterface*>(transformComponent);
  56. AZ_Assert(transformInterface, "Failed to get TransformInterface");
  57. transformInterface->SetWorldTM(transform);
  58. entity->CreateComponent(AZ::Uuid(PhysXRigidBodyComponentTypeId));
  59. entity->CreateComponent(AZ::Uuid(PhysXShapeColliderComponentTypeId));
  60. entity->CreateComponent(AZ::Uuid(SphereShapeComponentTypeId));
  61. entity->Init();
  62. entity->Activate();
  63. AZ_Assert(entity->GetState() == AZ::Entity::State::Active, "Entity is not active");
  64. auto id = entity->GetId();
  65. m_entities.emplace(AZStd::make_pair(id, AZStd::move(entity)));
  66. return id;
  67. }
  68. void SimulationInterfaceTestFixture::ClearEntities()
  69. {
  70. for (auto& entity : m_entities)
  71. {
  72. entity.second->Deactivate();
  73. }
  74. m_entities.clear();
  75. }
  76. void SimulationInterfaceTestFixture::DeleteEntity(const AZ::EntityId& entityId)
  77. {
  78. auto findIt = m_entities.find(entityId);
  79. if (findIt != m_entities.end())
  80. {
  81. findIt->second->Deactivate();
  82. m_entities.erase(findIt);
  83. }
  84. }
  85. void SimulationInterfaceTestFixture::SetUp()
  86. {
  87. if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get())
  88. {
  89. AzPhysics::SceneConfiguration sceneConfiguration = physicsSystem->GetDefaultSceneConfiguration();
  90. sceneConfiguration.m_sceneName = AzPhysics::DefaultPhysicsSceneName;
  91. m_testSceneHandle = physicsSystem->AddScene(sceneConfiguration);
  92. m_defaultScene = physicsSystem->GetScene(m_testSceneHandle);
  93. }
  94. Physics::DefaultWorldBus::Handler::BusConnect();
  95. }
  96. void SimulationInterfaceTestFixture::TearDown()
  97. {
  98. ClearEntities();
  99. Physics::DefaultWorldBus::Handler::BusDisconnect();
  100. m_defaultScene = nullptr;
  101. // Clean up the Test scene
  102. if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get())
  103. {
  104. physicsSystem->RemoveScene(m_testSceneHandle);
  105. }
  106. m_testSceneHandle = AzPhysics::InvalidSceneHandle;
  107. for (const auto& id : m_registeredAssets)
  108. {
  109. AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequestBus::Events::UnregisterAsset, id);
  110. }
  111. m_registeredAssets.clear();
  112. }
  113. void SimulationInterfaceTestFixture::StepPhysics(int numSteps)
  114. {
  115. for (int i = 0; i < numSteps; i++)
  116. {
  117. auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get();
  118. physicsSystem->Simulate(1.0f / 60.0f);
  119. }
  120. }
  121. void SimulationInterfaceTestFixture::TickApp(int numTicks)
  122. {
  123. AZ::ComponentApplication* app = nullptr;
  124. AZ::ComponentApplicationBus::BroadcastResult(app, &AZ::ComponentApplicationBus::Events::GetApplication);
  125. AZ_Assert(app, "Failed to get application");
  126. for (int i = 0; i < numTicks; i++)
  127. {
  128. app->Tick();
  129. }
  130. }
  131. } // namespace UnitTest