/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include namespace UnitTest { TEST_F(PrefabBuilderTests, PrefabGroup_FindsRequiredReflection_True) { using namespace AZ::SceneAPI; auto* serializeContext = m_app.GetSerializeContext(); ASSERT_NE(nullptr, serializeContext); SceneData::PrefabGroup::Reflect(serializeContext); ASSERT_NE(nullptr, serializeContext->FindClassData(azrtti_typeid())); ASSERT_NE(nullptr, serializeContext->FindClassData(azrtti_typeid())); auto findElementWithName = [](const AZ::SerializeContext::ClassData* classData, const char* name) { auto it = AZStd::find_if(classData->m_elements.begin(), classData->m_elements.end(), [name](const auto& element) { return strcmp(element.m_name, name) == 0; }); return it != classData->m_elements.end(); }; auto* prefabGroupClassData = serializeContext->FindClassData(azrtti_typeid()); EXPECT_TRUE(findElementWithName(prefabGroupClassData, "name")); EXPECT_TRUE(findElementWithName(prefabGroupClassData, "nodeSelectionList")); EXPECT_TRUE(findElementWithName(prefabGroupClassData, "rules")); EXPECT_TRUE(findElementWithName(prefabGroupClassData, "id")); EXPECT_TRUE(findElementWithName(prefabGroupClassData, "prefabDomBuffer")); } TEST_F(PrefabBuilderTests, PrefabGroup_JsonWithPrefabArbitraryPrefab_Works) { using namespace AZ::SceneAPI; auto* serializeContext = m_app.GetSerializeContext(); ASSERT_NE(nullptr, serializeContext); SceneData::PrefabGroup::Reflect(serializeContext); // fill out a PrefabGroup using JSON AZStd::string_view input = R"JSON( { "name" : "tester", "id" : "{49698DBC-B447-49EF-9B56-25BB29342AFB}", "prefabDomBuffer" : "{\"foo\":\"bar\"}" })JSON"; rapidjson::Document document; document.Parse(input.data(), input.size()); ASSERT_FALSE(document.HasParseError()); SceneData::PrefabGroup instancePrefabGroup; AZ::JsonSerialization::Load(instancePrefabGroup, document); const auto& dom = instancePrefabGroup.GetPrefabDom(); EXPECT_TRUE(dom.GetObject().HasMember("foo")); EXPECT_STREQ(dom.GetObject().FindMember("foo")->value.GetString(), "bar"); EXPECT_STREQ(instancePrefabGroup.GetName().c_str(), "tester"); EXPECT_STREQ( instancePrefabGroup.GetId().ToString().c_str(), "{49698DBC-B447-49EF-9B56-25BB29342AFB}"); EXPECT_TRUE(instancePrefabGroup.GetPrefabDom().IsObject()); } TEST_F(PrefabBuilderTests, PrefabGroup_InvalidPrefabJson_Detected) { using namespace AZ::SceneAPI; AZStd::string_view input = R"JSON( { bad json that will not parse })JSON"; rapidjson::Document document; document.Parse(input.data(), input.size()); SceneData::PrefabGroup prefabGroup; prefabGroup.SetId(AZStd::move(AZ::Uuid::CreateRandom())); prefabGroup.SetName(AZStd::move("tester")); prefabGroup.SetPrefabDom(AZStd::move(document)); const auto& dom = prefabGroup.GetPrefabDom(); EXPECT_TRUE(dom.IsNull()); EXPECT_STREQ("tester", prefabGroup.GetName().c_str()); } TEST_F(PrefabBuilderTests, PrefabGroup_InvalidPrefabJsonBuffer_Detected) { using namespace AZ::SceneAPI; AZStd::string_view inputJson = R"JSON( { bad json that will not parse })JSON"; SceneData::PrefabGroup prefabGroup; prefabGroup.SetId(AZStd::move(AZ::Uuid::CreateRandom())); prefabGroup.SetName(AZStd::move("tester")); prefabGroup.SetPrefabDomBuffer(std::move(inputJson)); const auto& dom = prefabGroup.GetPrefabDom(); EXPECT_TRUE(dom.IsNull()); EXPECT_STREQ("tester", prefabGroup.GetName().c_str()); } struct PrefabBuilderBehaviorTests : public PrefabBuilderTests { void SetUp() override { using namespace AZ::SceneAPI; PrefabBuilderTests::SetUp(); SceneData::PrefabGroup::Reflect(m_app.GetSerializeContext()); SceneData::PrefabGroup::Reflect(m_app.GetBehaviorContext()); m_scriptContext = AZStd::make_unique(); m_scriptContext->BindTo(m_app.GetBehaviorContext()); } void TearDown() override { m_scriptContext.reset(); PrefabBuilderTests::TearDown(); } void ExpectExecute(AZStd::string_view script) { EXPECT_TRUE(m_scriptContext->Execute(script.data())); } AZStd::unique_ptr m_scriptContext; }; TEST_F(PrefabBuilderBehaviorTests, PrefabGroup_PrefabGroupClass_Exists) { ExpectExecute("group = PrefabGroup()"); ExpectExecute("assert(group)"); ExpectExecute("assert(group.name)"); ExpectExecute("assert(group.id)"); ExpectExecute("assert(group.prefabDomBuffer)"); } TEST_F(PrefabBuilderBehaviorTests, PrefabGroup_PrefabGroupAssignment_Works) { ExpectExecute("group = PrefabGroup()"); ExpectExecute("group.name = 'tester'"); ExpectExecute("group.id = Uuid.CreateString('{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}', 0)"); ExpectExecute("group.prefabDomBuffer = '{}'"); ExpectExecute("assert(group.name == 'tester')"); ExpectExecute("assert(tostring(group.id) == '{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}')"); ExpectExecute("assert(group.prefabDomBuffer == '{}')"); } }