PrefabGroupTests.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 <PrefabBuilderTests.h>
  9. #include <PrefabGroup/IPrefabGroup.h>
  10. #include <PrefabGroup/PrefabGroup.h>
  11. #include <AzCore/Serialization/Json/JsonSystemComponent.h>
  12. #include <AzCore/Serialization/Json/RegistrationContext.h>
  13. #include <AzFramework/FileFunc/FileFunc.h>
  14. namespace UnitTest
  15. {
  16. TEST_F(PrefabBuilderTests, PrefabGroup_FindsRequiredReflection_True)
  17. {
  18. using namespace AZ::SceneAPI;
  19. auto* serializeContext = m_app.GetSerializeContext();
  20. ASSERT_NE(nullptr, serializeContext);
  21. SceneData::PrefabGroup::Reflect(serializeContext);
  22. SceneData::PrefabGroup::Reflect(m_app.GetJsonRegistrationContext());
  23. ASSERT_NE(nullptr, serializeContext->FindClassData(azrtti_typeid<DataTypes::IPrefabGroup>()));
  24. ASSERT_NE(nullptr, serializeContext->FindClassData(azrtti_typeid<SceneData::PrefabGroup>()));
  25. auto findElementWithName = [](const AZ::SerializeContext::ClassData* classData, const char* name)
  26. {
  27. auto it = AZStd::find_if(classData->m_elements.begin(), classData->m_elements.end(), [name](const auto& element)
  28. {
  29. return strcmp(element.m_name, name) == 0;
  30. });
  31. return it != classData->m_elements.end();
  32. };
  33. auto* prefabGroupClassData = serializeContext->FindClassData(azrtti_typeid<SceneData::PrefabGroup>());
  34. EXPECT_TRUE(findElementWithName(prefabGroupClassData, "name"));
  35. EXPECT_TRUE(findElementWithName(prefabGroupClassData, "nodeSelectionList"));
  36. EXPECT_TRUE(findElementWithName(prefabGroupClassData, "rules"));
  37. EXPECT_TRUE(findElementWithName(prefabGroupClassData, "id"));
  38. EXPECT_TRUE(findElementWithName(prefabGroupClassData, "prefabDomData"));
  39. m_app.GetJsonRegistrationContext()->EnableRemoveReflection();
  40. SceneData::PrefabGroup::Reflect(m_app.GetJsonRegistrationContext());
  41. }
  42. TEST_F(PrefabBuilderTests, PrefabGroup_JsonWithPrefabArbitraryPrefab_Works)
  43. {
  44. namespace JSR = AZ::JsonSerializationResult;
  45. using namespace AZ::SceneAPI;
  46. auto* serializeContext = m_app.GetSerializeContext();
  47. ASSERT_NE(nullptr, serializeContext);
  48. SceneData::PrefabGroup::Reflect(serializeContext);
  49. AZ::Prefab::ProceduralPrefabAsset::Reflect(serializeContext);
  50. SceneData::PrefabGroup::Reflect(m_app.GetJsonRegistrationContext());
  51. AZ::Prefab::ProceduralPrefabAsset::Reflect(m_app.GetJsonRegistrationContext());
  52. // fill out a PrefabGroup using JSON
  53. AZStd::string_view input = R"JSON(
  54. {
  55. "name" : "tester",
  56. "id" : "{49698DBC-B447-49EF-9B56-25BB29342AFB}",
  57. "prefabDomData" : {"foo": "bar"}
  58. })JSON";
  59. rapidjson::Document document;
  60. document.Parse<rapidjson::kParseCommentsFlag>(input.data(), input.size());
  61. ASSERT_FALSE(document.HasParseError());
  62. SceneData::PrefabGroup instancePrefabGroup;
  63. EXPECT_EQ(AZ::JsonSerialization::Load(instancePrefabGroup, document).GetOutcome(), JSR::Outcomes::PartialDefaults);
  64. ASSERT_TRUE(instancePrefabGroup.GetPrefabDomRef().has_value());
  65. const AzToolsFramework::Prefab::PrefabDom& dom = instancePrefabGroup.GetPrefabDomRef().value();
  66. EXPECT_TRUE(dom.IsObject());
  67. EXPECT_TRUE(dom.GetObject().HasMember("foo"));
  68. EXPECT_STREQ(dom.GetObject().FindMember("foo")->value.GetString(), "bar");
  69. EXPECT_STREQ(instancePrefabGroup.GetName().c_str(), "tester");
  70. EXPECT_STREQ(instancePrefabGroup.GetId().ToString<AZStd::string>().c_str(), "{49698DBC-B447-49EF-9B56-25BB29342AFB}");
  71. m_app.GetJsonRegistrationContext()->EnableRemoveReflection();
  72. SceneData::PrefabGroup::Reflect(m_app.GetJsonRegistrationContext());
  73. AZ::Prefab::ProceduralPrefabAsset::Reflect(m_app.GetJsonRegistrationContext());
  74. }
  75. TEST_F(PrefabBuilderTests, PrefabGroup_InvalidPrefabJson_Detected)
  76. {
  77. using namespace AZ::SceneAPI;
  78. AZStd::string_view input = R"JSON(
  79. {
  80. bad json that will not parse
  81. })JSON";
  82. rapidjson::Document document;
  83. document.Parse<rapidjson::kParseCommentsFlag>(input.data(), input.size());
  84. SceneData::PrefabGroup prefabGroup;
  85. prefabGroup.SetId(AZ::Uuid::CreateRandom());
  86. prefabGroup.SetName("tester");
  87. prefabGroup.SetPrefabDom(AZStd::move(document));
  88. const AzToolsFramework::Prefab::PrefabDom& dom = prefabGroup.GetPrefabDomRef().value();
  89. EXPECT_TRUE(dom.IsNull());
  90. EXPECT_STREQ("tester", prefabGroup.GetName().c_str());
  91. }
  92. struct PrefabBuilderBehaviorTests
  93. : public PrefabBuilderTests
  94. {
  95. void SetUp() override
  96. {
  97. using namespace AZ::SceneAPI;
  98. PrefabBuilderTests::SetUp();
  99. SceneData::PrefabGroup::Reflect(m_app.GetSerializeContext());
  100. SceneData::PrefabGroup::Reflect(m_app.GetBehaviorContext());
  101. SceneData::PrefabGroup::Reflect(m_app.GetJsonRegistrationContext());
  102. m_scriptContext = AZStd::make_unique<AZ::ScriptContext>();
  103. m_scriptContext->BindTo(m_app.GetBehaviorContext());
  104. }
  105. void TearDown() override
  106. {
  107. using namespace AZ::SceneAPI;
  108. m_app.GetJsonRegistrationContext()->EnableRemoveReflection();
  109. SceneData::PrefabGroup::Reflect(m_app.GetJsonRegistrationContext());
  110. m_scriptContext.reset();
  111. PrefabBuilderTests::TearDown();
  112. }
  113. void ExpectExecute(AZStd::string_view script)
  114. {
  115. EXPECT_TRUE(m_scriptContext->Execute(script.data()));
  116. }
  117. AZStd::unique_ptr<AZ::ScriptContext> m_scriptContext;
  118. };
  119. TEST_F(PrefabBuilderBehaviorTests, PrefabGroup_PrefabGroupClass_Exists)
  120. {
  121. ExpectExecute("group = PrefabGroup()");
  122. ExpectExecute("assert(group)");
  123. ExpectExecute("assert(group.name)");
  124. ExpectExecute("assert(group.id)");
  125. ExpectExecute("assert(group.prefabDomData)");
  126. }
  127. TEST_F(PrefabBuilderBehaviorTests, PrefabGroup_PrefabGroupAssignment_Works)
  128. {
  129. ExpectExecute("group = PrefabGroup()");
  130. ExpectExecute("group.name = 'tester'");
  131. ExpectExecute("group.id = Uuid.CreateString('{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}', 0)");
  132. ExpectExecute("group.prefabDomData = '{\"foo\": \"bar\"}'");
  133. ExpectExecute("assert(group.name == 'tester')");
  134. ExpectExecute("assert(tostring(group.id) == '{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}')");
  135. ExpectExecute("assert(group.prefabDomData == '{\\n \"foo\": \"bar\"\\n}')");
  136. }
  137. }