ProceduralPrefabAssetTests.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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 <AzToolsFramework/ToolsComponents/TransformComponent.h>
  9. #include <Entity/EntityUtilityComponent.h>
  10. #include <Prefab/PrefabTestComponent.h>
  11. #include <Prefab/PrefabTestDomUtils.h>
  12. #include <Prefab/PrefabTestFixture.h>
  13. #include <Prefab/Procedural/ProceduralPrefabAsset.h>
  14. #include <AzCore/Serialization/Json/RegistrationContext.h>
  15. #include <AzToolsFramework/Prefab/Template/Template.h>
  16. namespace UnitTest
  17. {
  18. class ProceduralPrefabAssetTest
  19. : public PrefabTestFixture
  20. {
  21. void SetUpEditorFixtureImpl() override
  22. {
  23. AZ::ComponentApplicationRequests* componentApplicationRequests = AZ::Interface<AZ::ComponentApplicationRequests>::Get();
  24. ASSERT_NE(componentApplicationRequests, nullptr);
  25. auto* behaviorContext = componentApplicationRequests->GetBehaviorContext();
  26. ASSERT_NE(behaviorContext, nullptr);
  27. auto* jsonRegistrationContext = componentApplicationRequests->GetJsonRegistrationContext();
  28. ASSERT_NE(jsonRegistrationContext, nullptr);
  29. auto* serializeContext = componentApplicationRequests->GetSerializeContext();
  30. ASSERT_NE(serializeContext, nullptr);
  31. AZ::Prefab::ProceduralPrefabAsset::Reflect(serializeContext);
  32. AZ::Prefab::ProceduralPrefabAsset::Reflect(behaviorContext);
  33. AZ::Prefab::ProceduralPrefabAsset::Reflect(jsonRegistrationContext);
  34. }
  35. void TearDownEditorFixtureImpl() override
  36. {
  37. AZ::ComponentApplicationRequests* componentApplicationRequests = AZ::Interface<AZ::ComponentApplicationRequests>::Get();
  38. componentApplicationRequests->GetJsonRegistrationContext()->EnableRemoveReflection();
  39. AZ::Prefab::ProceduralPrefabAsset::Reflect(componentApplicationRequests->GetJsonRegistrationContext());
  40. }
  41. };
  42. TEST_F(ProceduralPrefabAssetTest, ReflectContext_AccessMethods_Works)
  43. {
  44. AZ::ComponentApplicationRequests* componentApplicationRequests = AZ::Interface<AZ::ComponentApplicationRequests>::Get();
  45. auto* serializeContext = componentApplicationRequests->GetSerializeContext();
  46. EXPECT_TRUE(!serializeContext->CreateAny(azrtti_typeid<AZ::Prefab::ProceduralPrefabAsset>()).empty());
  47. EXPECT_TRUE(!serializeContext->CreateAny(azrtti_typeid<AZ::Prefab::PrefabDomData>()).empty());
  48. auto* jsonRegistrationContext = componentApplicationRequests->GetJsonRegistrationContext();
  49. EXPECT_TRUE(jsonRegistrationContext->GetSerializerForSerializerType(azrtti_typeid<AZ::Prefab::PrefabDomDataJsonSerializer>()));
  50. }
  51. TEST_F(ProceduralPrefabAssetTest, ProceduralPrefabAsset_AccessMethods_Works)
  52. {
  53. const auto templateId = TemplateId(1);
  54. const auto prefabString = "fake.prefab";
  55. AZ::Prefab::ProceduralPrefabAsset asset{};
  56. asset.SetTemplateId(templateId);
  57. EXPECT_EQ(asset.GetTemplateId(), templateId);
  58. asset.SetTemplateName(prefabString);
  59. EXPECT_EQ(asset.GetTemplateName(), prefabString);
  60. }
  61. TEST_F(ProceduralPrefabAssetTest, PrefabDomData_AccessMethods_Works)
  62. {
  63. AzToolsFramework::Prefab::PrefabDom dom;
  64. dom.SetObject();
  65. dom.AddMember("boolValue", true, dom.GetAllocator());
  66. AZ::Prefab::PrefabDomData prefabDomData;
  67. prefabDomData.CopyValue(dom);
  68. const AzToolsFramework::Prefab::PrefabDom& result = prefabDomData.GetValue();
  69. EXPECT_TRUE(result.HasMember("boolValue"));
  70. EXPECT_TRUE(result.FindMember("boolValue")->value.GetBool());
  71. }
  72. TEST_F(ProceduralPrefabAssetTest, PrefabDomDataJsonSerializer_Load_Works)
  73. {
  74. AZ::Prefab::PrefabDomData prefabDomData;
  75. AzToolsFramework::Prefab::PrefabDom dom;
  76. dom.SetObject();
  77. dom.AddMember("member", "value", dom.GetAllocator());
  78. AZ::Prefab::PrefabDomDataJsonSerializer prefabDomDataJsonSerializer;
  79. AZ::JsonDeserializerSettings settings;
  80. settings.m_reporting = [](auto, auto, auto)
  81. {
  82. AZ::JsonSerializationResult::ResultCode result(AZ::JsonSerializationResult::Tasks::ReadField);
  83. return result;
  84. };
  85. AZ::JsonDeserializerContext context{ settings };
  86. auto result = prefabDomDataJsonSerializer.Load(&prefabDomData, azrtti_typeid(prefabDomData), dom, context);
  87. EXPECT_EQ(result.GetResultCode().GetOutcome(), AZ::JsonSerializationResult::Outcomes::DefaultsUsed);
  88. EXPECT_TRUE(prefabDomData.GetValue().HasMember("member"));
  89. EXPECT_STREQ(prefabDomData.GetValue().FindMember("member")->value.GetString(), "value");
  90. }
  91. TEST_F(ProceduralPrefabAssetTest, PrefabDomDataJsonSerializer_Store_Works)
  92. {
  93. AzToolsFramework::Prefab::PrefabDom dom;
  94. dom.SetObject();
  95. dom.AddMember("member", "value", dom.GetAllocator());
  96. AZ::Prefab::PrefabDomData prefabDomData;
  97. prefabDomData.CopyValue(dom);
  98. AZ::Prefab::PrefabDomDataJsonSerializer prefabDomDataJsonSerializer;
  99. AzToolsFramework::Prefab::PrefabDom outputValue;
  100. AZ::JsonSerializerSettings settings;
  101. settings.m_reporting = [](auto, auto, auto)
  102. {
  103. AZ::JsonSerializationResult::ResultCode result(AZ::JsonSerializationResult::Tasks::WriteValue);
  104. return result;
  105. };
  106. AZ::JsonSerializerContext context{ settings, outputValue.GetAllocator() };
  107. auto result = prefabDomDataJsonSerializer.Store(outputValue, &prefabDomData, nullptr, azrtti_typeid(prefabDomData), context);
  108. EXPECT_EQ(result.GetResultCode().GetOutcome(), AZ::JsonSerializationResult::Outcomes::DefaultsUsed);
  109. EXPECT_TRUE(outputValue.HasMember("member"));
  110. EXPECT_STREQ(outputValue.FindMember("member")->value.GetString(), "value");
  111. }
  112. TEST_F(ProceduralPrefabAssetTest, Template_IsProcPrefab_DefaultsToNotProcPrefab)
  113. {
  114. AzToolsFramework::Prefab::PrefabDom dom;
  115. dom.SetObject();
  116. dom.AddMember("Source", "foo.prefab", dom.GetAllocator());
  117. AzToolsFramework::Prefab::Template fooTemplate("foo", AZStd::move(dom));
  118. EXPECT_FALSE(fooTemplate.IsProcedural());
  119. }
  120. TEST_F(ProceduralPrefabAssetTest, Template_IsProcPrefab_DomDrivesFlagToTrue)
  121. {
  122. AzToolsFramework::Prefab::PrefabDom dom;
  123. dom.SetObject();
  124. dom.AddMember("Source", "foo.procprefab", dom.GetAllocator());
  125. AzToolsFramework::Prefab::Template fooTemplate("foo", AZStd::move(dom));
  126. EXPECT_TRUE(fooTemplate.IsProcedural());
  127. // the second time should use the cached version of the flag
  128. EXPECT_TRUE(fooTemplate.IsProcedural());
  129. }
  130. TEST_F(ProceduralPrefabAssetTest, Template_IsProcPrefab_FailsWithNoSource)
  131. {
  132. AzToolsFramework::Prefab::PrefabDom dom;
  133. dom.SetObject();
  134. AzToolsFramework::Prefab::Template fooTemplate("foo", AZStd::move(dom));
  135. EXPECT_FALSE(fooTemplate.IsProcedural());
  136. }
  137. }