/* * 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 "RHITestFixture.h" #include #include #include #include #include #include #include #include namespace UnitTest { class NamedReflectionTests : public RHITestFixture { protected: void SetUp() override { RHITestFixture::SetUp(); AZ::IO::FileIOBase::SetInstance(aznew AZ::IO::LocalFileIO()); } void TearDown() override { delete AZ::IO::FileIOBase::GetInstance(); AZ::IO::FileIOBase::SetInstance(nullptr); RHITestFixture::TearDown(); } }; TEST_F(NamedReflectionTests, NameIdReflectionMap_Empty) { AZ::RHI::NameIdReflectionMap> map; EXPECT_EQ(map.Size(), 0); } TEST_F(NamedReflectionTests, NameIdReflectionMap_Insert) { AZ::RHI::NameIdReflectionMap> map; // insert() also sorts the vector map.Insert(AZ::Name("name1"), AZ::RHI::Handle<>(3)); map.Insert(AZ::Name("name2"), AZ::RHI::Handle<>(2)); map.Insert(AZ::Name("name3"), AZ::RHI::Handle<>(1)); EXPECT_EQ(map.Size(), 3); } TEST_F(NamedReflectionTests, NameIdReflectionMap_Serialize) { AZ::SerializeContext serializeContext; AZ::Name::Reflect(&serializeContext); AZ::RHI::Handle<>::Reflect(&serializeContext); AZ::RHI::NameIdReflectionMap>::Reflect(&serializeContext); AZ::RHI::NameIdReflectionMap> map; map.Insert(AZ::Name("name1"), AZ::RHI::Handle<>(3)); map.Insert(AZ::Name("name2"), AZ::RHI::Handle<>(2)); map.Insert(AZ::Name("name3"), AZ::RHI::Handle<>(1)); // XML AZStd::vector xmlBuffer; AZ::IO::ByteContainerStream > xmlStream(&xmlBuffer); AZ::ObjectStream* xmlObjStream = AZ::ObjectStream::Create(&xmlStream, serializeContext, AZ::ObjectStream::ST_XML); xmlObjStream->WriteClass(&map); xmlObjStream->Finalize(); const AZStd::string output(xmlBuffer.data(), xmlBuffer.size()); EXPECT_NE(output.size(), 0); } TEST_F(NamedReflectionTests, NameIdReflectionMap_Deserialize) { const char* serializeDataFormat = R"( )"; // The internal storage sorts by the hash value of strings, so name2 comes before name3, which comes before name1. // So the inpuit is specifically putting them out order with how it appears sorted when inserted. AZStd::string inputData = AZStd::string::format(serializeDataFormat, "name3", "3", "name2", "2", "name1", "1"); AZ::SerializeContext serializeContext; AZ::Name::Reflect(&serializeContext); AZ::RHI::Handle<>::Reflect(&serializeContext); AZ::RHI::NameIdReflectionMap>::Reflect(&serializeContext); AZStd::vector binaryData(inputData.begin(), inputData.end()); AZ::IO::ByteContainerStream > binaryStream(&binaryData); binaryStream.Seek(0, AZ::IO::GenericStream::ST_SEEK_BEGIN); { AZ::RHI::NameIdReflectionMap> map; EXPECT_TRUE(AZ::Utils::LoadObjectFromStreamInPlace(binaryStream, map, &serializeContext)); EXPECT_EQ(map.Size(), 3); EXPECT_EQ(map.Find(AZ::Name("name1")).m_index, 1); EXPECT_EQ(map.Find(AZ::Name("name2")).m_index, 2); EXPECT_EQ(map.Find(AZ::Name("name3")).m_index, 3); } } }