PrefabTestDataUtils.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 <Prefab/PrefabTestDataUtils.h>
  9. #include <AzToolsFramework/Prefab/PrefabDomTypes.h>
  10. #include <AzToolsFramework/Prefab/PrefabSystemComponentInterface.h>
  11. #include <AzToolsFramework/Prefab/PrefabDomUtils.h>
  12. #include <AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h>
  13. #include <Prefab/PrefabTestDomUtils.h>
  14. namespace UnitTest
  15. {
  16. namespace PrefabTestDataUtils
  17. {
  18. using namespace AzToolsFramework::Prefab;
  19. LinkData CreateLinkData(
  20. const InstanceData& instanceData,
  21. TemplateId sourceTemplateId,
  22. TemplateId targetTemplateId)
  23. {
  24. LinkData newLinkData;
  25. newLinkData.m_instanceData = instanceData;
  26. newLinkData.m_sourceTemplateId = sourceTemplateId;
  27. newLinkData.m_targetTemplateId = targetTemplateId;
  28. return newLinkData;
  29. }
  30. InstanceData CreateInstanceDataWithNoPatches(
  31. const AZStd::string& name,
  32. AZ::IO::PathView source)
  33. {
  34. InstanceData newInstanceData;
  35. newInstanceData.m_name = name;
  36. newInstanceData.m_source = source;
  37. return newInstanceData;
  38. }
  39. void ValidateTemplateLoad(
  40. const TemplateData& expectedTemplateData)
  41. {
  42. PrefabSystemComponentInterface* prefabSystemComponent = AZ::Interface<PrefabSystemComponentInterface>::Get();
  43. ASSERT_TRUE(prefabSystemComponent != nullptr);
  44. ASSERT_TRUE(expectedTemplateData.m_id != InvalidTemplateId);
  45. auto templateReference = prefabSystemComponent->FindTemplate(expectedTemplateData.m_id);
  46. ASSERT_TRUE(templateReference.has_value());
  47. auto& actualTemplate = templateReference->get();
  48. EXPECT_EQ(expectedTemplateData.m_filePath, actualTemplate.GetFilePath());
  49. EXPECT_EQ(expectedTemplateData.m_isValid, actualTemplate.IsValid());
  50. EXPECT_EQ(expectedTemplateData.m_isLoadedWithErrors, actualTemplate.IsLoadedWithErrors());
  51. auto& actualTemplateDom = actualTemplate.GetPrefabDom();
  52. EXPECT_FALSE(actualTemplateDom.HasMember(PrefabDomUtils::LinkIdName));
  53. auto& actualInstancesLinkIds = actualTemplate.GetLinks();
  54. EXPECT_EQ(expectedTemplateData.m_instancesData.size(), actualInstancesLinkIds.size());
  55. for (auto& actualLinkId : actualInstancesLinkIds)
  56. {
  57. auto linkReference = prefabSystemComponent->FindLink(actualLinkId);
  58. ASSERT_TRUE(linkReference.has_value());
  59. auto& actualLink = linkReference->get();
  60. AZStd::string actualLinkName(actualLink.GetInstanceName());
  61. EXPECT_EQ(expectedTemplateData.m_instancesData.count(actualLinkName), 1);
  62. auto& expectedInstanceData = expectedTemplateData.m_instancesData.find(actualLinkName)->second;
  63. EXPECT_EQ(expectedTemplateData.m_id, actualLink.GetTargetTemplateId());
  64. EXPECT_EQ(expectedInstanceData.m_name, actualLinkName);
  65. EXPECT_EQ(
  66. PrefabTestDomUtils::GetPrefabDomInstancePath(expectedInstanceData.m_name.c_str()),
  67. actualLink.GetInstancePath());
  68. ValidateTemplatePatches(actualLink, expectedInstanceData.m_patches);
  69. }
  70. }
  71. void ValidateTemplatePatches(const Link& actualLink, const PrefabDom& expectedTemplatePatches)
  72. {
  73. PrefabDom linkDom;
  74. actualLink.GetLinkDom(linkDom, linkDom.GetAllocator());
  75. PrefabDomValueReference patchesReference = PrefabDomUtils::FindPrefabDomValue(linkDom, PrefabDomUtils::PatchesName);
  76. if (!expectedTemplatePatches.IsNull())
  77. {
  78. EXPECT_EQ(AZ::JsonSerialization::Compare(expectedTemplatePatches, patchesReference->get()),
  79. AZ::JsonSerializerCompareResult::Equal);
  80. }
  81. else
  82. {
  83. EXPECT_FALSE(patchesReference.has_value());
  84. }
  85. }
  86. void CheckIfTemplatesConnected(
  87. const TemplateData& expectedSourceTemplateData,
  88. const TemplateData& expectedTargetTemplateData,
  89. const LinkData& expectedLinkData)
  90. {
  91. ValidateTemplateLoad(expectedSourceTemplateData);
  92. ValidateTemplateLoad(expectedTargetTemplateData);
  93. PrefabSystemComponentInterface* prefabSystemComponent = AZ::Interface<PrefabSystemComponentInterface>::Get();
  94. ASSERT_TRUE(prefabSystemComponent != nullptr);
  95. auto& actualSourceTemplate =
  96. prefabSystemComponent->FindTemplate(expectedSourceTemplateData.m_id)->get();
  97. auto& actualTargetTemplate =
  98. prefabSystemComponent->FindTemplate(expectedTargetTemplateData.m_id)->get();
  99. EXPECT_EQ(expectedLinkData.m_instanceData.m_source, actualSourceTemplate.GetFilePath());
  100. auto& actualTargetTemplateLinkIds = actualTargetTemplate.GetLinks();
  101. EXPECT_EQ(expectedTargetTemplateData.m_instancesData.size(), actualTargetTemplateLinkIds.size());
  102. bool expectedLinkFound = false;
  103. for (auto actualTargetTemplateLinkId : actualTargetTemplateLinkIds)
  104. {
  105. auto linkReference = prefabSystemComponent->FindLink(actualTargetTemplateLinkId);
  106. ASSERT_TRUE(linkReference.has_value());
  107. auto& actualLink = linkReference->get();
  108. if (expectedLinkData.m_instanceData.m_name == actualLink.GetInstanceName())
  109. {
  110. EXPECT_EQ(expectedLinkData.m_isValid, actualLink.IsValid());
  111. EXPECT_EQ(expectedLinkData.m_sourceTemplateId, actualLink.GetSourceTemplateId());
  112. EXPECT_EQ(expectedLinkData.m_targetTemplateId, actualLink.GetTargetTemplateId());
  113. ValidateTemplatePatches(actualLink, expectedLinkData.m_instanceData.m_patches);
  114. EXPECT_EQ(
  115. PrefabTestDomUtils::GetPrefabDomInstancePath(expectedLinkData.m_instanceData.m_name.c_str()),
  116. actualLink.GetInstancePath());
  117. expectedLinkFound = true;
  118. break;
  119. }
  120. }
  121. EXPECT_TRUE(expectedLinkFound);
  122. }
  123. }
  124. }