PrefabTestDomUtils.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. #pragma once
  9. #include <AzCore/Component/EntityId.h>
  10. #include <AzCore/Math/Uuid.h>
  11. #include <AzCore/std/containers/unordered_set.h>
  12. #include <AzToolsFramework/Prefab/PrefabDomTypes.h>
  13. #include <AzToolsFramework/Prefab/PrefabDomUtils.h>
  14. #include <Prefab/PrefabTestData.h>
  15. #include <AzToolsFramework/Prefab/Instance/Instance.h>
  16. namespace UnitTest
  17. {
  18. namespace PrefabTestDomUtils
  19. {
  20. using namespace AzToolsFramework::Prefab;
  21. inline static constexpr const char* ComponentsValueName = "Components";
  22. inline static constexpr const char* ComponentIdName = "Id";
  23. inline static constexpr const char* EntitiesValueName = "Entities";
  24. inline static constexpr const char* EntityNameValueName = "Name";
  25. inline static constexpr const char* BoolPropertyName = "BoolProperty";
  26. inline PrefabDomPath GetPrefabDomEntitiesPath()
  27. {
  28. return PrefabDomPath()
  29. .Append(EntitiesValueName);
  30. };
  31. inline PrefabDomPath GetPrefabDomEntityPath(
  32. const EntityAlias& entityAlias)
  33. {
  34. return GetPrefabDomEntitiesPath()
  35. .Append(entityAlias.c_str(), static_cast<rapidjson::SizeType>(entityAlias.length()));
  36. };
  37. inline PrefabDomPath GetPrefabDomEntityNamePath(
  38. const EntityAlias& entityAlias)
  39. {
  40. return GetPrefabDomEntityPath(entityAlias)
  41. .Append(EntityNameValueName);
  42. };
  43. inline PrefabDomPath GetPrefabDomComponentsPath(const EntityAlias& entityAlias)
  44. {
  45. return GetPrefabDomEntityPath(entityAlias).Append(ComponentsValueName);
  46. };
  47. inline PrefabDomPath GetPrefabDomInstancesPath()
  48. {
  49. return PrefabDomPath()
  50. .Append(PrefabDomUtils::InstancesName);
  51. };
  52. inline PrefabDomPath GetPrefabDomInstancePath(
  53. const InstanceAlias& instanceAlias)
  54. {
  55. return GetPrefabDomInstancesPath().Append(instanceAlias.c_str(), static_cast<rapidjson::SizeType>(instanceAlias.length()));
  56. };
  57. inline PrefabDomPath GetPrefabDomInstancePath(
  58. const char* instanceName)
  59. {
  60. return GetPrefabDomInstancesPath().Append(instanceName);
  61. };
  62. inline PrefabDomPath GetPrefabDomSourcePath(
  63. const char* instanceName)
  64. {
  65. return GetPrefabDomInstancePath(instanceName).Append(PrefabDomUtils::SourceName);
  66. };
  67. inline PrefabDomPath GetPrefabDomPatchesPath(
  68. const char* instanceName)
  69. {
  70. return GetPrefabDomInstancePath(instanceName).Append(PrefabDomUtils::PatchesName);
  71. };
  72. inline const PrefabDomValue* GetPrefabDomComponents(
  73. const PrefabDom& prefabDom,
  74. const EntityAlias& entityAlias)
  75. {
  76. return PrefabTestDomUtils::GetPrefabDomComponentsPath(entityAlias).Get(prefabDom);
  77. }
  78. inline const PrefabDomValue* GetPrefabDomInstance(
  79. const PrefabDom& prefabDom,
  80. const InstanceAlias& instanceAlias)
  81. {
  82. return PrefabTestDomUtils::GetPrefabDomInstancePath(instanceAlias).Get(prefabDom);
  83. }
  84. inline const PrefabDomValue* GetPrefabDomEntity(
  85. const PrefabDom& prefabDom,
  86. const EntityAlias& entityAlias)
  87. {
  88. return PrefabTestDomUtils::GetPrefabDomEntityPath(entityAlias).Get(prefabDom);
  89. }
  90. inline const PrefabDomValue* GetPrefabDomEntityName(
  91. const PrefabDom& prefabDom,
  92. const EntityAlias& entityAlias)
  93. {
  94. return PrefabTestDomUtils::GetPrefabDomEntityNamePath(entityAlias).Get(prefabDom);
  95. }
  96. void SetPrefabDomInstance(
  97. PrefabDom& prefabDom,
  98. const char* instanceName,
  99. const char* source,
  100. const PrefabDomValue& patches);
  101. void ValidateInstances(
  102. TemplateId templateId,
  103. const PrefabDomValue& expectedContent,
  104. const PrefabDomPath& contentPath,
  105. bool isContentAnInstance = false,
  106. bool shouldCompareContainerEntities = true);
  107. PrefabDom CreatePrefabDom();
  108. PrefabDom CreatePrefabDom(const AZStd::vector<InstanceData>& instancesData);
  109. /**
  110. * Validates that the entities with the given entity aliases are present in the given prefab DOM.
  111. */
  112. void ValidatePrefabDomEntities(const AZStd::vector<EntityAlias>& entityAliases,
  113. PrefabDom& prefabDom);
  114. /**
  115. * Extracts the DOM of the instances using the given instance aliases from the prefab DOM and
  116. * validates that they match with the expectedNestedInstanceDom.
  117. */
  118. void ValidatePrefabDomInstances(const AZStd::vector<InstanceAlias>& instanceAliases,
  119. const PrefabDom& prefabDom,
  120. const PrefabDom& expectedNestedInstanceDom,
  121. bool shouldCompareContainerEntities = true);
  122. void ComparePrefabDoms(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB, bool shouldCompareLinkIds = true,
  123. bool shouldCompareContainerEntities = true);
  124. void ComparePrefabDomValues(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB);
  125. void ValidateEntitiesOfInstances(
  126. AzToolsFramework::Prefab::TemplateId templateId,
  127. const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
  128. const AZStd::vector<EntityAlias>& entityAliases);
  129. void ValidateNestedInstancesOfInstances(
  130. AzToolsFramework::Prefab::TemplateId templateId,
  131. const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
  132. const AZStd::vector<InstanceAlias>& nestedInstanceAliases);
  133. void ValidateComponentsDomHasId(const PrefabDomValue& componentsDom, const char* componentName, AZ::u64 componentId);
  134. //! Serializes Dom into a string
  135. AZStd::string DomToString(const AzToolsFramework::Prefab::PrefabDom& dom);
  136. }
  137. }