/* * Copyright (c) Contributors to the Open 3D Engine Project * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #pragma once #include #include #include #include namespace UnitTest { template class SerializeTester { public: SerializeTester(AZ::SerializeContext* serializeContext) : m_serializeContext{serializeContext} , m_outStream{&m_buffer} {} // Serializes an object out to a the internal stream. Resets the stream with each call. virtual void SerializeOut(T* object, AZ::DataStream::StreamType streamType = AZ::DataStream::ST_XML); // Serializes the object back in. Requires that you call SerializeOut first. virtual AZ::Data::Asset SerializeIn(const AZ::Data::AssetId& assetId, AZ::ObjectStream::FilterDescriptor filterDesc = AZ::ObjectStream::FilterDescriptor()); private: AZ::SerializeContext* m_serializeContext = nullptr; AZStd::vector m_buffer; AZ::IO::ByteContainerStream> m_outStream; }; template void SerializeTester::SerializeOut(T* object, AZ::DataStream::StreamType streamType) { m_buffer.clear(); m_outStream.Seek(0, AZ::IO::GenericStream::ST_SEEK_BEGIN); AZ::ObjectStream* objStream = AZ::ObjectStream::Create(&m_outStream, *m_serializeContext, streamType); bool writeOK = objStream->WriteClass(object); ASSERT_TRUE(writeOK); // NOTE: This looks like a leak, but Finalize calls 'delete this'. bool finalizeOK = objStream->Finalize(); ASSERT_TRUE(finalizeOK); m_outStream.Seek(0, AZ::IO::GenericStream::ST_SEEK_BEGIN); } template AZ::Data::Asset SerializeTester::SerializeIn(const AZ::Data::AssetId& assetId, AZ::ObjectStream::FilterDescriptor filterDesc) { AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().CreateAsset(assetId); [[maybe_unused]] bool success = AZ::Utils::LoadObjectFromStreamInPlace(m_outStream, *asset.Get(), m_serializeContext, filterDesc); AZ_Assert(success, "Failed to load object from stream"); return AZStd::move(asset); } // Helper class to test asset saving and loading by utilizing asset handler. // Unlike SerializeTester, it's not restricted to testing assets which are saved with ObjectStream. template class AssetTester { public: AssetTester() { m_assetHandler = AZ::Data::AssetManager::Instance().GetHandler(AssetDataT::RTTI_Type()); } ~AssetTester() = default; void SerializeOut(AZ::Data::Asset assetToSave) { m_streamBuffer.clear(); AZ::IO::ByteContainerStream> stream(&m_streamBuffer); m_assetHandler->SaveAssetData(assetToSave, &stream); } AZ::Data::Asset SerializeIn(const AZ::Data::AssetId& assetId) { AZ::Data::Asset assetToLoad = AZ::Data::AssetManager::Instance().CreateAsset(assetId); AZStd::shared_ptr assetDataStream = AZStd::make_shared(); assetDataStream->Open(AZStd::move(m_streamBuffer)); m_assetHandler->LoadAssetDataFromStream(assetToLoad, assetDataStream, {}); SetAssetReady(assetToLoad); return assetToLoad; } virtual void SetAssetReady([[maybe_unused]] AZ::Data::Asset& asset) {}; protected: AZ::Data::AssetHandler* m_assetHandler = nullptr; AZStd::vector m_streamBuffer; }; }