| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384 |
- /*
- * 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 <AzTest/AzTest.h>
- #include <AzCore/Asset/AssetManagerBus.h>
- #include <AzCore/Serialization/Utils.h>
- #include <AzCore/UnitTest/TestTypes.h>
- #include <AzCore/UnitTest/UnitTest.h>
- #include <AzCore/UserSettings/UserSettingsComponent.h>
- #include <AzToolsFramework/API/EntityCompositionRequestBus.h>
- #include <AzToolsFramework/Entity/EditorEntityActionComponent.h>
- #include <AzToolsFramework/Entity/EditorEntityContextComponent.h>
- #include <AzToolsFramework/Entity/EditorEntityInfoBus.h>
- #include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
- #include <AzToolsFramework/ToolsComponents/EditorLayerComponent.h>
- #include <AzToolsFramework/ToolsComponents/EditorLockComponentBus.h>
- #include <AzToolsFramework/ToolsComponents/EditorVisibilityBus.h>
- #include <AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx>
- #include <AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h>
- #include <AzToolsFramework/UnitTest/ToolsTestApplication.h>
- #include <AzToolsFramework/API/EntityCompositionRequestBus.h>
- #include <QColor>
- namespace AzToolsFramework
- {
- // Used to promote some functions to public so the unit tests can access them.
- class EditorLayerComponentTestHelper :
- public Layers::EditorLayerComponent
- {
- public:
- AZ_EDITOR_COMPONENT(EditorLayerComponentTestHelper, "{E21CAB65-BFDC-4DFC-B550-A8BF7F235BDA}", Layers::EditorLayerComponent);
- static void Reflect(AZ::ReflectContext* context)
- {
- if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
- {
- serializeContext->Class<EditorLayerComponentTestHelper, Layers::EditorLayerComponent>()
- ->Version(1);
- }
- }
- void ClearUnsavedChanges() { m_hasUnsavedChanges = false; }
- void SetSaveAsBinary(bool saveAsBinary) { m_editableLayerProperties.m_saveAsBinary = saveAsBinary; }
- bool GetSaveAsBinary() const { return m_editableLayerProperties.m_saveAsBinary; }
- // Forces a state where a layer is written to a stream with 2 entities with the same ID.
- // This allows for testing that the layer load logic safely removes duplicates.
- Layers::LayerResult CreateLayerStreamWithDuplicateEntity(
- AZStd::vector<AZ::Entity*>& entityList,
- AZ::SliceComponent::SliceReferenceToInstancePtrs& layerInstances,
- AZ::IO::ByteContainerStream<AZStd::vector<char> >& layerStream,
- Layers::EditorLayer& layer)
- {
- Layers::LayerResult layerPrepareResult = PrepareLayerForSaving(layer, entityList, layerInstances);
- if (!layerPrepareResult.IsSuccess())
- {
- return layerPrepareResult;
- }
- // Add the first entity in the list twice.
- layer.m_layerEntities.push_back(layer.m_layerEntities.front());
- return WriteLayerToStream(layer, layerStream);
- }
- // The unit tests are just testing the ability to save and load layers,
- // and not the ability to write this information to disk.
- // These functions allow this testing to occur.
- Layers::LayerResult PopulateLayerWriteToStreamAndGetEntities(
- AZStd::vector<AZ::Entity*>& entityList,
- AZ::SliceComponent::SliceReferenceToInstancePtrs& layerInstances,
- AZ::IO::ByteContainerStream<AZStd::vector<char> >& layerStream,
- Layers::EditorLayer& layer)
- {
- Layers::LayerResult layerPrepareResult = PrepareLayerForSaving(layer, entityList, layerInstances);
- if (!layerPrepareResult.IsSuccess())
- {
- return layerPrepareResult;
- }
- return WriteLayerToStream(layer, layerStream);
- }
- Layers::LayerResult ReadFromLayerStream(
- AZ::IO::ByteContainerStream<AZStd::vector<char> >& layerStream,
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs& sliceInstances,
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*>& uniqueEntities)
- {
- m_loadedLayer = AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(layerStream);
- EXPECT_NE(m_loadedLayer, nullptr);
- return PopulateFromLoadedLayerData(*m_loadedLayer, sliceInstances, uniqueEntities);
- }
- };
- struct EntityAndLayerComponent
- {
- AZ::Entity* m_entity = nullptr;
- // Not all functions being tested are available on the ebus, some need direct access.
- EditorLayerComponentTestHelper* m_layer = nullptr;
- };
- bool IsEntityInList(const AZStd::vector<AZ::Entity*>& entityList, AZ::Entity* entity)
- {
- return AZStd::find(entityList.begin(), entityList.end(), entity) != entityList.end();
- }
- bool IsEntityInLooseEditorEntities(AZ::Entity* entity)
- {
- AZStd::vector<AZ::Entity*> editorEntities;
- AzToolsFramework::EditorEntityContextRequestBus::Broadcast(
- &AzToolsFramework::EditorEntityContextRequestBus::Events::GetLooseEditorEntities,
- editorEntities);
- return IsEntityInList(editorEntities, entity);
- }
- bool IsInstanceAndReferenceInRootSlice(AZ::SliceComponent* rootSlice, AZ::SliceComponent::SliceInstanceAddress sliceInstance)
- {
- // See if the rootSlice knows about the asset associated with the passed in instance.
- // These checks are round about, and not through FindSlice to make sure the root slice's list of references and instances is used.
- AZ::SliceComponent::SliceReference* sliceReference = rootSlice->GetSlice(sliceInstance.GetReference()->GetSliceAsset());
- if (!sliceReference)
- {
- return false;
- }
- // Checking this way makes sure we're using as much data from the rootSlice as possible.
- // When moving instances in and out of the root slice, the slice references can change.
- return sliceReference->FindInstance(sliceInstance.GetInstance()->GetId()) != nullptr;
- }
- bool IsLooseEntityInRootSlice(const AZ::SliceComponent* rootSlice, const AZ::EntityId layerEntityId)
- {
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- for (const auto& entity : looseEntities)
- {
- if (entity->GetId() == layerEntityId)
- {
- return true;
- }
- }
- return false;
- }
- AZ::Entity* CreateEditorReadyEntity(const char* entityName)
- {
- AZ::EntityId createdEntityId;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- createdEntityId,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::CreateNewEditorEntity,
- entityName);
- EXPECT_TRUE(createdEntityId.IsValid());
- AZ::Entity* createdEntity = nullptr;
- AZ::ComponentApplicationBus::BroadcastResult(createdEntity, &AZ::ComponentApplicationRequests::FindEntity, createdEntityId);
- EXPECT_NE(createdEntity, nullptr);
- EXPECT_EQ(createdEntity->GetState(), AZ::Entity::State::Active);
- createdEntity->Deactivate();
- EXPECT_EQ(createdEntity->GetState(), AZ::Entity::State::Init);
- AzToolsFramework::EditorEntityContextRequestBus::Broadcast(
- &AzToolsFramework::EditorEntityContextRequestBus::Events::AddRequiredComponents,
- *createdEntity);
- createdEntity->Activate();
- EXPECT_EQ(createdEntity->GetState(), AZ::Entity::State::Active);
- return createdEntity;
- }
- EntityAndLayerComponent CreateEntityWithLayer(const char* entityName)
- {
- EntityAndLayerComponent result;
- result.m_entity = CreateEditorReadyEntity(entityName);
- result.m_layer = aznew EditorLayerComponentTestHelper();
- AZStd::vector<AZ::Component*> newComponents;
- newComponents.push_back(result.m_layer);
- Components::EditorEntityActionComponent::AddExistingComponentsOutcome componentAddResult(
- AZ::Failure(AZStd::string("No listener on AddExistingComponentsToEntity bus.")));
- AzToolsFramework::EntityCompositionRequestBus::BroadcastResult(
- componentAddResult,
- &AzToolsFramework::EntityCompositionRequests::AddExistingComponentsToEntityById,
- result.m_entity->GetId(),
- newComponents);
- EXPECT_TRUE(componentAddResult.IsSuccess());
- // Make sure everything is setup correctly.
- EXPECT_NE(result.m_entity, nullptr);
- EXPECT_NE(result.m_layer, nullptr);
- EXPECT_EQ(result.m_entity->GetState(), AZ::Entity::State::Active);
- return result;
- }
- // Filter used to test component copyability.
- // Ensure filter passes everything to ensure layer component copyability is unaffected by filter results.
- bool DummyComponentFilter([[maybe_unused]] const AZ::SerializeContext::ClassData& classData)
- {
- return true;
- }
- class SliceToolsTestApplication : public UnitTest::ToolsTestApplication
- {
- public:
- explicit SliceToolsTestApplication(AZStd::string applicationName)
- : ToolsTestApplication(applicationName)
- {
- }
- protected:
- bool IsPrefabSystemEnabled() const override
- {
- return false;
- }
- };
- class EditorLayerComponentTest
- : public UnitTest::LeakDetectionFixture
- , public UnitTest::TraceBusRedirector
- {
- protected:
- void SetUp() override
- {
- AZ::ComponentApplication::StartupParameters startupParameters;
- startupParameters.m_loadSettingsRegistry = false;
- m_app.Start(m_descriptor, startupParameters);
- // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
- // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
- // in the unit tests.
- AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize);
- AZ::SerializeContext* context = m_app.GetSerializeContext();
- m_editorLayerComponentTestHelperDescriptor = EditorLayerComponentTestHelper::CreateDescriptor();
- m_editorLayerComponentTestHelperDescriptor->Reflect(context);
- m_layerEntity = CreateEntityWithLayer(m_entityName);
- AZ::Debug::TraceMessageBus::Handler::BusConnect();
- }
- void TearDown() override
- {
- if (m_layerEntity.m_entity)
- {
- m_layerEntity.m_layer->CleanupLoadedLayer();
- }
- m_editorLayerComponentTestHelperDescriptor->ReleaseDescriptor();
-
- m_app.Stop();
- AZ::Debug::TraceMessageBus::Handler::BusDisconnect();
- }
- // A few tests save a layer and want to check the state after saving.
- // A separate unit test actually validates all of the behavior in this function.
- Layers::LayerResult SaveMainLayer(Layers::EditorLayer& layerOutput)
- {
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- return SaveMainLayer(layerOutput, entitySaveStream);
- }
- Layers::LayerResult SaveMainLayer(
- Layers::EditorLayer& layerOutput,
- AZ::IO::ByteContainerStream<AZStd::vector<char> > &streamOutput,
- AZStd::vector<AZ::Entity*>& layerEntities,
- AZ::SliceComponent::SliceReferenceToInstancePtrs& instancesInLayers)
- {
- return m_layerEntity.m_layer->PopulateLayerWriteToStreamAndGetEntities(
- layerEntities,
- instancesInLayers,
- streamOutput,
- layerOutput);
- }
- Layers::LayerResult SaveMainLayer(
- Layers::EditorLayer& layerOutput,
- AZ::IO::ByteContainerStream<AZStd::vector<char> > &streamOutput)
- {
- AZStd::vector<AZ::Entity*> layerEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs instancesInLayers;
- return SaveMainLayer(layerOutput, streamOutput, layerEntities, instancesInLayers);
- }
- AZ::SliceComponent::SliceInstanceAddress CreateSliceInstanceFromSlice(
- AZ::SliceComponent* rootSlice,
- const AZ::Data::Asset<AZ::SliceAsset>& sliceAsset)
- {
- EXPECT_NE(rootSlice, nullptr);
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = rootSlice->AddSlice(sliceAsset);
- AZ::Entity* instanceEntity = GetEntityFromSliceInstance(instantiatedSlice);
- instanceEntity->Init();
- EXPECT_EQ(instanceEntity->GetState(), AZ::Entity::State::Init);
- instanceEntity->Activate();
- EXPECT_EQ(instanceEntity->GetState(), AZ::Entity::State::Active);
- return instantiatedSlice;
- }
- // Creates a slice instance, used to test serialization with layers.
- // Note that DeleteSliceInstance must be called.
- AZ::SliceComponent::SliceInstanceAddress CreateSliceInstance()
- {
- AZ::Data::Asset<AZ::SliceAsset> sliceAsset;
- AZ::Entity* sliceEntity = aznew AZ::Entity("SliceEntity");
- AZ::SliceComponent* sliceComponent = sliceEntity->CreateComponent<AZ::SliceComponent>();
- sliceComponent->SetSerializeContext(m_app.GetSerializeContext());
- AZ::Entity* entityInSlice = aznew AZ::Entity("EntityInSlice");
- AzToolsFramework::EditorEntityContextRequestBus::Broadcast(
- &AzToolsFramework::EditorEntityContextRequestBus::Events::AddRequiredComponents,
- *entityInSlice);
- EntityList entitiesToAddToSlice;
- entitiesToAddToSlice.push_back(entityInSlice);
- sliceComponent->AddEntities(entitiesToAddToSlice);
- AZStd::string sliceAssetFile("Temp/GeneratedSlices/LayerTestSlice.slice");
- AZ::Data::AssetId assetId;
- AZ::Data::AssetCatalogRequestBus::BroadcastResult(
- assetId,
- &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath,
- sliceAssetFile.c_str(),
- azrtti_typeid<AZ::SliceAsset>(),
- true);
- sliceAsset.Create(assetId, false);
- sliceAsset.Get()->SetData(sliceEntity, sliceComponent, false);
- sliceComponent->Instantiate();
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- return CreateSliceInstanceFromSlice(rootSlice, sliceAsset);
- }
- AZ::Entity* GetEntityFromSliceInstance(AZ::SliceComponent::SliceInstanceAddress instantiatedSlice)
- {
- EXPECT_TRUE(instantiatedSlice.IsValid());
- EXPECT_NE(instantiatedSlice.GetInstance(), nullptr);
- EXPECT_NE(instantiatedSlice.GetInstance()->GetInstantiated(), nullptr);
- EXPECT_EQ(instantiatedSlice.GetInstance()->GetInstantiated()->m_entities.size(), 1);
- return instantiatedSlice.GetInstance()->GetInstantiated()->m_entities[0];
- }
- void DeleteSliceInstance(AZ::SliceComponent::SliceInstanceAddress instance)
- {
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- rootSlice->RemoveSliceInstance(instance);
- }
- const char* m_entityName = "LayerEntityName";
- SliceToolsTestApplication m_app{ "EditorLayerComponentTest" };
- EntityAndLayerComponent m_layerEntity;
- AZ::ComponentApplication::Descriptor m_descriptor;
- AZ::ComponentDescriptor* m_editorLayerComponentTestHelperDescriptor = nullptr;
- };
- TEST_F(EditorLayerComponentTest, LayerTests_EntityCreatedWithLayer_HasLayerReturnsTrue)
- {
- bool isLayerEntity = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- isLayerEntity,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer);
- EXPECT_TRUE(isLayerEntity);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_GetLayerColor_ReturnsCorrectColor)
- {
- // Layers serialize color as an AZ::Color because it works with our serialization system,
- // but GetColor returns a QColor because it works with our UI system to render with the color.
- // Alpha is not tested because layers don't use alpha.
- AZ::Color setLayerColor(aznumeric_cast<uint8_t>(255), aznumeric_cast<uint8_t>(128), aznumeric_cast<uint8_t>(64), aznumeric_cast<uint8_t>(255));
- m_layerEntity.m_layer->SetLayerColor(setLayerColor);
- // Set the get color to specifically not be the same as the set, so we know if the ebus
- // was connected and worked.
- QColor getLayerColor(0, 0, 0);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- getLayerColor,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerColor);
- EXPECT_EQ(getLayerColor.red(), setLayerColor.GetR8());
- EXPECT_EQ(getLayerColor.green(), setLayerColor.GetG8());
- EXPECT_EQ(getLayerColor.blue(), setLayerColor.GetB8());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SingleLayer_LayerNameIsValid)
- {
- bool isLayerNameValid = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- isLayerNameValid,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsLayerNameValid);
- EXPECT_TRUE(isLayerNameValid);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_TwoLayersUniqueNames_LayerNameIsValid)
- {
- CreateEntityWithLayer("UniqueLayerName");
- bool isLayerNameValid = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- isLayerNameValid,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsLayerNameValid);
- EXPECT_TRUE(isLayerNameValid);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_TwoLayersConflictingNames_LayerNameIsNotValid)
- {
- CreateEntityWithLayer(m_entityName);
- bool isLayerNameValid = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- isLayerNameValid,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsLayerNameValid);
- EXPECT_FALSE(isLayerNameValid);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_TwoLayersConflictingNames_LayerNameConflictingMappingShowsConflict)
- {
- EntityAndLayerComponent secondLayer = CreateEntityWithLayer(m_entityName);
- AZStd::unordered_set<AZ::EntityId> layerEntities;
- layerEntities.insert(m_layerEntity.m_entity->GetId());
- layerEntities.insert(secondLayer.m_entity->GetId());
- AZStd::unordered_map<AZStd::string, int> nameConflictMapping;
- for (AZ::EntityId layerEntityId : layerEntities)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- layerEntityId,
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::UpdateLayerNameConflictMapping,
- nameConflictMapping);
- }
- EXPECT_EQ(nameConflictMapping[m_entityName], 2);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_TwoLayersSameNameDifferentCase_LayerNameConflictingMappingShowsConflict)
- {
- AZStd::string upperCaseName = m_entityName;
- AZStd::to_upper(upperCaseName.begin(), upperCaseName.end());
- // Verify that the casing actually changed. This catches if someone adjusts the
- // default layer name in these layer tests to be all upper case.
- EXPECT_NE(upperCaseName.compare(m_entityName), 0);
- EntityAndLayerComponent secondLayer = CreateEntityWithLayer(upperCaseName.c_str());
- AZStd::unordered_set<AZ::EntityId> layerEntities;
- layerEntities.insert(m_layerEntity.m_entity->GetId());
- layerEntities.insert(secondLayer.m_entity->GetId());
- AZStd::unordered_map<AZStd::string, int> nameConflictMapping;
- for (AZ::EntityId layerEntityId : layerEntities)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- layerEntityId,
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::UpdateLayerNameConflictMapping,
- nameConflictMapping);
- }
- EXPECT_EQ(nameConflictMapping[m_entityName], 2);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_TwoLayersUniqueNames_NameConflictMappingHasNoConflicts)
- {
- EntityAndLayerComponent secondLayer = CreateEntityWithLayer("UniqueLayerName");
- AZStd::unordered_set<AZ::EntityId> layerEntities;
- layerEntities.insert(m_layerEntity.m_entity->GetId());
- layerEntities.insert(secondLayer.m_entity->GetId());
- AZStd::unordered_map<AZStd::string, int> nameConflictMapping;
- for (AZ::EntityId layerEntityId : layerEntities)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- layerEntityId,
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::UpdateLayerNameConflictMapping,
- nameConflictMapping);
- }
- EXPECT_EQ(nameConflictMapping.find(m_entityName), nameConflictMapping.end());
- }
- // The design of this is expected to change, but this unit test validates current behavior.
- // Eventually we would like to decouple the layer name from the entity name.
- TEST_F(EditorLayerComponentTest, LayerTests_LayerWithNoParent_FileNameIsEntityName)
- {
- AZ::Outcome<AZStd::string, AZStd::string> layerFileNameResult(
- AZ::Failure(AZStd::string("No ebus listener available for this layer.")));
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerFileNameResult,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerBaseFileName);
- EXPECT_TRUE(layerFileNameResult.IsSuccess());
- EXPECT_EQ(layerFileNameResult.GetValue().compare(m_entityName), 0);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_LayerWithParent_FileNameIsParentDotEntityName)
- {
- const AZStd::string parentName = "AParentLayer";
- EntityAndLayerComponent parentLayer = CreateEntityWithLayer(parentName.c_str());
-
- AZ::TransformBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- parentLayer.m_entity->GetId());
- AZ::Outcome<AZStd::string, AZStd::string> layerFileNameResult(
- AZ::Failure(AZStd::string("No ebus listener available for this layer.")));
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerFileNameResult,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerBaseFileName);
- EXPECT_TRUE(layerFileNameResult.IsSuccess());
- AZStd::string expectedParentName = parentName + "." + m_entityName;
- EXPECT_EQ(layerFileNameResult.GetValue().compare(expectedParentName), 0);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SetVisibility_GetVisibilityReturnsCorrectValue)
- {
- bool currentVisibility = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- currentVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- EXPECT_EQ(currentVisibility, true);
- bool flippedVisibility = !currentVisibility;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- flippedVisibility);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- currentVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- EXPECT_EQ(flippedVisibility, currentVisibility);
- // Change the visibility again to make sure setting it to both values works.
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- !flippedVisibility);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- currentVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- EXPECT_EQ(!flippedVisibility, currentVisibility);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_NewLayer_HasUnsavedChanges)
- {
- bool hasUnsavedChanges = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- hasUnsavedChanges,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasUnsavedChanges);
- EXPECT_TRUE(hasUnsavedChanges);
- }
-
- TEST_F(EditorLayerComponentTest, LayerTests_SavedLayer_DoesNotHaveUnsavedChanges)
- {
- m_layerEntity.m_layer->ClearUnsavedChanges();
- bool hasUnsavedChanges = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- hasUnsavedChanges,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasUnsavedChanges);
- EXPECT_FALSE(hasUnsavedChanges);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_AddedEntityToLayer_HasUnsavedChanges)
- {
- m_layerEntity.m_layer->ClearUnsavedChanges();
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- // An undo batch needs to begin before the entity can be registered as dirty
- AzToolsFramework::ScopedUndoBatch undoBatch("Reparent Entity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- bool hasUnsavedChanges = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- hasUnsavedChanges,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasUnsavedChanges);
- EXPECT_TRUE(hasUnsavedChanges);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_ModifiedEntityInLayer_HasUnsavedChanges)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
-
- m_layerEntity.m_layer->ClearUnsavedChanges();
- // Change the scale of the child entity so it registers as an unsaved change on the layer.
- // An undo batch needs to begin before the entity can be registered as dirty
- AzToolsFramework::ScopedUndoBatch undoBatch("Scale Entity");
- float scale = 0.0f;
- AZ::TransformBus::EventResult(
- scale,
- childEntity->GetId(),
- &AZ::TransformBus::Events::GetLocalUniformScale);
- scale += 1.0f;
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetLocalUniformScale,
- scale);
- bool hasUnsavedChanges = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- hasUnsavedChanges,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasUnsavedChanges);
- EXPECT_TRUE(hasUnsavedChanges);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_CanParentChangeToNonLayer_ReturnsFalse)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- bool canParentChange = true;
- AZ::TransformNotificationBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformNotificationBus::Events::CanParentChange,
- canParentChange,
- AZ::EntityId(),
- childEntity->GetId());
- EXPECT_FALSE(canParentChange);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_CanParentChangeToLayer_ReturnsTrue)
- {
- EntityAndLayerComponent secondLayer = CreateEntityWithLayer("UniqueLayerName");
- // Most tests around ebuses, the value is initialized to the opposite of the expected result.
- // This particular message is an aggregate message that goes out to multiple listeners,
- // and any of them can decline the parent change. This means that the initial
- // value needs to start true.
- bool canParentChange = true;
- AZ::TransformNotificationBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformNotificationBus::Events::CanParentChange,
- canParentChange,
- AZ::EntityId(),
- secondLayer.m_entity->GetId());
- EXPECT_TRUE(canParentChange);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_CanParentChangeFromLayerToInvalid_ReturnsTrue)
- {
- EntityAndLayerComponent secondLayer = CreateEntityWithLayer("UniqueLayerName");
- AZ::TransformBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- secondLayer.m_entity->GetId());
- bool canParentChange = true;
- AZ::TransformNotificationBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformNotificationBus::Events::CanParentChange,
- canParentChange,
- secondLayer.m_entity->GetId(),
- AZ::EntityId());
- EXPECT_TRUE(canParentChange);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_AttemptToSetParentToNonLayer_ParentDoesNotChange)
- {
- AZ::Entity* nonLayerEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- nonLayerEntity->GetId());
- AZ::EntityId parentId = nonLayerEntity->GetId();
- AZ::TransformBus::EventResult(
- parentId,
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformBus::Events::GetParentId);
- EXPECT_EQ(parentId, AZ::EntityId());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_VisibleLayerVisibleChild_BothVisible)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- bool layerChildrenVisibility = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerChildrenVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- bool isChildVisible = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildVisible,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsVisible);
- bool isChildVisibilityFlagSet = false;
- AzToolsFramework::EditorVisibilityRequestBus::EventResult(
- isChildVisibilityFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::GetVisibilityFlag);
- EXPECT_TRUE(layerChildrenVisibility);
- EXPECT_TRUE(isChildVisible);
- EXPECT_TRUE(isChildVisibilityFlagSet);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_InvisibleLayerVisibleChild_BothInvisibleChildPreservesVisibility)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- false);
- // This is necessary to prevent a warning in the undo system.
- // This unit test had modified an entity to make it dirty, so it needs to be marked as such.
- AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast(
- &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity,
- m_layerEntity.m_entity->GetId());
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- bool layerChildrenVisibility = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerChildrenVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- bool isChildVisible = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildVisible,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsVisible);
- bool isChildVisibilityFlagSet = false;
- AzToolsFramework::EditorVisibilityRequestBus::EventResult(
- isChildVisibilityFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::GetVisibilityFlag);
- EXPECT_FALSE(layerChildrenVisibility);
- EXPECT_FALSE(isChildVisible);
- EXPECT_TRUE(isChildVisibilityFlagSet);
- }
- // Layer visibility toggle only works one way: Invisible layers make all children invisible, but
- // visible layers do not force children to be visible.
- TEST_F(EditorLayerComponentTest, LayerTests_VisibleLayerInvisibleChild_ChildIsInvisible)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AzToolsFramework::EditorVisibilityRequestBus::Event(
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::SetVisibilityFlag,
- false);
- bool layerChildrenVisibility = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerChildrenVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- bool isChildVisible = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildVisible,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsVisible);
- bool isChildVisibilityFlagSet = true;
- AzToolsFramework::EditorVisibilityRequestBus::EventResult(
- isChildVisibilityFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::GetVisibilityFlag);
- EXPECT_TRUE(layerChildrenVisibility);
- EXPECT_FALSE(isChildVisible);
- EXPECT_FALSE(isChildVisibilityFlagSet);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_InvisibleLayerInvisibleChild_BothInvisibleChildPreservesVisibility)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- false);
- AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast(
- &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity,
- m_layerEntity.m_entity->GetId());
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AzToolsFramework::EditorVisibilityRequestBus::Event(
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::SetVisibilityFlag,
- false);
- bool layerChildrenVisibility = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerChildrenVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- bool isChildVisible = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildVisible,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsVisible);
- bool isChildVisibilityFlagSet = true;
- AzToolsFramework::EditorVisibilityRequestBus::EventResult(
- isChildVisibilityFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::GetVisibilityFlag);
- EXPECT_FALSE(layerChildrenVisibility);
- EXPECT_FALSE(isChildVisible);
- EXPECT_FALSE(isChildVisibilityFlagSet);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_InvisLayerVisLayerVisChild_AllInvisiblePreservingVisibility)
- {
- const AZStd::string parentName = "AParentLayer";
- EntityAndLayerComponent parentLayer = CreateEntityWithLayer(parentName.c_str());
- AZ::TransformBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- parentLayer.m_entity->GetId());
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- parentLayer.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- false);
- AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast(
- &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity,
- parentLayer.m_entity->GetId());
- bool parentLayerChildrenVisible = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- parentLayerChildrenVisible,
- parentLayer.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- bool layerChildrenVisibility = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerChildrenVisibility,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- bool isChildVisible = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildVisible,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsVisible);
- bool isChildVisibilityFlagSet = false;
- AzToolsFramework::EditorVisibilityRequestBus::EventResult(
- isChildVisibilityFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorVisibilityRequestBus::Events::GetVisibilityFlag);
- EXPECT_FALSE(parentLayerChildrenVisible);
- EXPECT_TRUE(layerChildrenVisibility);
- EXPECT_FALSE(isChildVisible);
- EXPECT_TRUE(isChildVisibilityFlagSet);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_UnlockedLayerUnlockedChild_BothUnlocked)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- bool isLayerLocked = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isLayerLocked,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockFlagSet = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockedViaHierarchy = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockedViaHierarchy,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsLocked);
- EXPECT_FALSE(isLayerLocked);
- EXPECT_FALSE(isChildLockFlagSet);
- EXPECT_FALSE(isChildLockedViaHierarchy);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_LockedLayerUnlockedChild_ChildLockedAndPreservesLockState)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AzToolsFramework::EditorLockComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorLockComponentRequests::SetLocked,
- true);
- bool isLayerLocked = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isLayerLocked,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockFlagSet = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockedViaHierarchy = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockedViaHierarchy,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsLocked);
- EXPECT_TRUE(isLayerLocked);
- EXPECT_FALSE(isChildLockFlagSet);
- EXPECT_TRUE(isChildLockedViaHierarchy);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_LockedLayerLockedChild_AllLocked)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AzToolsFramework::EditorLockComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorLockComponentRequests::SetLocked,
- true);
- AzToolsFramework::EditorLockComponentRequestBus::Event(
- childEntity->GetId(),
- &AzToolsFramework::EditorLockComponentRequests::SetLocked,
- true);
- bool isLayerLocked = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isLayerLocked,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockFlagSet = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockedViaHierarchy = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockedViaHierarchy,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsLocked);
- EXPECT_TRUE(isLayerLocked);
- EXPECT_TRUE(isChildLockFlagSet);
- EXPECT_TRUE(isChildLockedViaHierarchy);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_LockLayerUnlockLayerUnlockChild_AllLockedPreservingVisibility)
- {
- const AZStd::string parentName = "AParentLayer";
- EntityAndLayerComponent parentLayer = CreateEntityWithLayer(parentName.c_str());
- AZ::TransformBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- parentLayer.m_entity->GetId());
- AZ::Entity* childEntity = CreateEditorReadyEntity("NonLayerEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AzToolsFramework::EditorLockComponentRequestBus::Event(
- parentLayer.m_entity->GetId(),
- &AzToolsFramework::EditorLockComponentRequests::SetLocked,
- true);
- bool isParentLocked = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isParentLocked,
- parentLayer.m_entity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isLayerLockFlagSet = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isLayerLockFlagSet,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isLayerLockedViaHierarchy = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isLayerLockedViaHierarchy,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsLocked);
- bool isChildLockFlagSet = true;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockFlagSet,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsJustThisEntityLocked);
- bool isChildLockedViaHierarchy = false;
- AzToolsFramework::EditorEntityInfoRequestBus::EventResult(
- isChildLockedViaHierarchy,
- childEntity->GetId(),
- &AzToolsFramework::EditorEntityInfoRequestBus::Events::IsLocked);
- EXPECT_TRUE(isParentLocked);
- EXPECT_TRUE(isLayerLockedViaHierarchy);
- EXPECT_FALSE(isLayerLockFlagSet);
- EXPECT_TRUE(isLayerLockedViaHierarchy);
- EXPECT_FALSE(isChildLockFlagSet);
- EXPECT_TRUE(isChildLockedViaHierarchy);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveEmptyLayer_SavesWithoutError)
- {
- // SaveMainLayer is not called here because this test is testing behavior
- // that SaveMainLayer assumes will work.
- AZStd::vector<AZ::Entity*> layerEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs instancesInLayers;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- Layers::EditorLayer layer;
- Layers::LayerResult layerResult = m_layerEntity.m_layer->PopulateLayerWriteToStreamAndGetEntities(
- layerEntities,
- instancesInLayers,
- entitySaveStream,
- layer);
- EXPECT_TRUE(layerResult.IsSuccess());
- EXPECT_EQ(layer.m_layerEntities.size(), 0);
- EXPECT_EQ(layer.m_sliceAssetsToSliceInstances.size(), 0);
- }
- // To minimize the need to modify the level file, the color should save to the layer
- // and not the level. This is tested by verifying the color is set to zero on the
- // layer component after the save, and the color is set correctly in the EditorLayer object.
- TEST_F(EditorLayerComponentTest, LayerTests_SaveColorModified_ColorSavedCorrectly)
- {
- AZ::Color setLayerColor(aznumeric_cast<uint8_t>(64), aznumeric_cast<uint8_t>(255), aznumeric_cast<uint8_t>(128), aznumeric_cast<uint8_t>(255));
- m_layerEntity.m_layer->SetLayerColor(setLayerColor);
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- QColor getLayerColor(2, 4, 8);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- getLayerColor,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerColor);
- EXPECT_EQ(getLayerColor.red(), 255);
- EXPECT_EQ(getLayerColor.green(), 255);
- EXPECT_EQ(getLayerColor.blue(), 255);
- EXPECT_EQ(layer.m_layerProperties.m_color.GetR8(), setLayerColor.GetR8());
- EXPECT_EQ(layer.m_layerProperties.m_color.GetG8(), setLayerColor.GetG8());
- EXPECT_EQ(layer.m_layerProperties.m_color.GetB8(), setLayerColor.GetB8());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_ColorModifiedRestoreLayerAfterSave_ColorRestoresCorrectly)
- {
- AZ::Color setLayerColor(aznumeric_cast<uint8_t>(10), aznumeric_cast<uint8_t>(30), aznumeric_cast<uint8_t>(20), aznumeric_cast<uint8_t>(255));
- m_layerEntity.m_layer->SetLayerColor(setLayerColor);
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- QColor getLayerColor(2, 4, 8);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- getLayerColor,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerColor);
- EXPECT_EQ(getLayerColor.red(), setLayerColor.GetR8());
- EXPECT_EQ(getLayerColor.green(), setLayerColor.GetG8());
- EXPECT_EQ(getLayerColor.blue(), setLayerColor.GetB8());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveFormatModifiedRestoreLayerAfterSave_SaveFormatRestoresCorrectly)
- {
- // Set the save format to binary, as the default is xml.
- AzToolsFramework::Layers::LayerProperties::SaveFormat setSaveFormat = AzToolsFramework::Layers::LayerProperties::SaveFormat::Binary;
- m_layerEntity.m_layer->SetSaveFormat(setSaveFormat);
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- // Check the save format is still binary after a restoring the layer.
- AzToolsFramework::Layers::LayerProperties::SaveFormat getSaveFormat = AzToolsFramework::Layers::LayerProperties::SaveFormat::Xml;
- bool saveFormatIsBinary = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- saveFormatIsBinary,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsSaveFormatBinary);
- if (saveFormatIsBinary)
- {
- getSaveFormat = AzToolsFramework::Layers::LayerProperties::SaveFormat::Binary;
- }
- EXPECT_EQ(getSaveFormat, setSaveFormat);
- // Now change the save format back to xml and redo the test.
- setSaveFormat = AzToolsFramework::Layers::LayerProperties::SaveFormat::Xml;
- m_layerEntity.m_layer->SetSaveFormat(setSaveFormat);
- saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- getSaveFormat = AzToolsFramework::Layers::LayerProperties::SaveFormat::Xml;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- saveFormatIsBinary,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::IsSaveFormatBinary);
- if (saveFormatIsBinary)
- {
- getSaveFormat = AzToolsFramework::Layers::LayerProperties::SaveFormat::Binary;
- }
- EXPECT_EQ(getSaveFormat, setSaveFormat);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadColorModified_ColorLoadsCorrectly)
- {
- AZ::Color savedLayerColor(aznumeric_cast<uint8_t>(6), aznumeric_cast<uint8_t>(7), aznumeric_cast<uint8_t>(8), aznumeric_cast<uint8_t>(255));
- m_layerEntity.m_layer->SetLayerColor(savedLayerColor);
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream);
- EXPECT_TRUE(saveResult.IsSuccess());
- // After saving the layer, restore the editor data and set the color to something else.
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AZ::Color unsavedLayerColor(aznumeric_cast<uint8_t>(20), aznumeric_cast<uint8_t>(30), aznumeric_cast<uint8_t>(40), aznumeric_cast<uint8_t>(255));
- m_layerEntity.m_layer->SetLayerColor(unsavedLayerColor);
-
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs sliceInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, sliceInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- QColor getLayerColor(2, 4, 8);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- getLayerColor,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::GetLayerColor);
- EXPECT_FLOAT_EQ(aznumeric_cast<float>(getLayerColor.redF()), savedLayerColor.GetR());
- EXPECT_FLOAT_EQ(aznumeric_cast<float>(getLayerColor.greenF()), savedLayerColor.GetG());
- EXPECT_FLOAT_EQ(aznumeric_cast<float>(getLayerColor.blueF()), savedLayerColor.GetB());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveLayerVisibilityModified_VisibilitySavesCorrectly)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- false);
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- bool visibilityAfterSave = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- visibilityAfterSave,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- EXPECT_TRUE(visibilityAfterSave);
- EXPECT_FALSE(layer.m_layerProperties.m_isLayerVisible);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerAfterSave_VisibilityRestoresCorrectly)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- false);
- AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast(
- &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- bool visibilityAfterSave = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- visibilityAfterSave,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- EXPECT_FALSE(visibilityAfterSave);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadVisibilityModified_VisibilityLoadsCorrectly)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- false);
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream);
- EXPECT_TRUE(saveResult.IsSuccess());
- // After saving the layer, restore the editor data and set the visibility to true, the value that wasn't saved.
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetLayerChildrenVisibility,
- true);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs sliceInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, sliceInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- bool visibilityAfterLoad = true;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- visibilityAfterLoad,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::AreLayerChildrenVisible);
- EXPECT_FALSE(visibilityAfterLoad);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveLayerBinaryModified_BinarySavesCorrectly)
- {
- m_layerEntity.m_layer->SetSaveAsBinary(true);
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_FALSE(m_layerEntity.m_layer->GetSaveAsBinary());
- EXPECT_TRUE(layer.m_layerProperties.m_saveAsBinary);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerAfterSave_BinaryRestoresCorrectly)
- {
- m_layerEntity.m_layer->SetSaveAsBinary(true);
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- EXPECT_TRUE(m_layerEntity.m_layer->GetSaveAsBinary());
- }
-
- TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadBinarySaveTypeModified_BinarySaveTypeLoadsCorrectly)
- {
- m_layerEntity.m_layer->SetSaveAsBinary(true);
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream);
- EXPECT_TRUE(saveResult.IsSuccess());
- // After saving the layer, restore the editor data and set the save as binary to false, the value that wasn't saved.
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- m_layerEntity.m_layer->SetSaveAsBinary(false);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs sliceInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, sliceInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- EXPECT_TRUE(m_layerEntity.m_layer->GetSaveAsBinary());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadEntityInLayer_EntityLoadsCorrectly)
- {
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 1);
- EXPECT_NE(savedEntities[0], nullptr);
- EXPECT_EQ(savedEntities[0]->GetId(), childEntity->GetId());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, loadedInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- EXPECT_EQ(uniqueEntities.size(), 1);
- EXPECT_NE(uniqueEntities.begin(), uniqueEntities.end());
- EXPECT_EQ(uniqueEntities.begin()->first, childEntity->GetId());
- EXPECT_NE(uniqueEntities.begin()->second, nullptr);
- EXPECT_EQ(uniqueEntities.begin()->second->GetId(), childEntity->GetId());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RootSliceEntityEraseRestore_EntitiesRemovedAndRestoredCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 1);
- EXPECT_NE(savedEntities[0], nullptr);
- EXPECT_EQ(savedEntities[0]->GetId(), childEntity->GetId());
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- // First, verify that childEntity is in the loose entity list.
- // Size of 2 is the layer and the child entity.
- EXPECT_TRUE(IsEntityInLooseEditorEntities(childEntity));
- // After erasing the saved entities, verify childEntity is no longer a loose entity.
- rootSlice->EraseEntities(savedEntities);
- EXPECT_FALSE(IsEntityInLooseEditorEntities(childEntity));
- rootSlice->ReplaceEntities(savedEntities);
- EXPECT_TRUE(IsEntityInLooseEditorEntities(childEntity));
- }
- TEST_F(EditorLayerComponentTest, LayerTests_NestedLayersDoNotSaveLayersInLayers_LayersLoadCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZStd::string childLayerName = "ChildLayerName";
- EntityAndLayerComponent childLayer = CreateEntityWithLayer(childLayerName.c_str());
- AZ::TransformBus::Event(
- childLayer.m_entity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 0);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, loadedInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- EXPECT_EQ(uniqueEntities.size(), 0);
- }
- // With a hierarchy of: LayerEntityName -> ChildLayer -> ChildEntity, when the parent and child layer are saved,
- // then loaded, the ChildEntity should be saved in the ChildLayer and not the LayerEntityName, and the ChildLayer should not
- // be saved to the LayerEntityName.
- TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadLayerLayerEntityHierarchy_LayersAndEntityLoadCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZStd::string childLayerName = "ChildLayer";
- EntityAndLayerComponent childLayerEntityAndComponent = CreateEntityWithLayer(childLayerName.c_str());
- AZ::EntityId childLayerEntityId = childLayerEntityAndComponent.m_entity->GetId();
- AZ::TransformBus::Event(
- childLayerEntityId,
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- childLayerEntityId);
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 0);
- Layers::EditorLayer childLayer;
- AZStd::vector<char> childLayerEntitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > childLayerEntitySaveStream(&childLayerEntitySaveBuffer);
- AZStd::vector<AZ::Entity*> childLayerSavedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs childLayerSavedInstances;
- Layers::LayerResult childSaveResult = childLayerEntityAndComponent.m_layer->PopulateLayerWriteToStreamAndGetEntities(
- childLayerSavedEntities,
- childLayerSavedInstances,
- childLayerEntitySaveStream,
- childLayer);
- EXPECT_TRUE(childSaveResult.IsSuccess());
- EXPECT_EQ(childLayerSavedEntities.size(), 1);
- EXPECT_NE(childLayerSavedEntities[0], nullptr);
- EXPECT_EQ(childLayerSavedEntities[0]->GetId(), childEntity->GetId());
- // Restore the cached editor data for both the parent and child layers.
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- childLayerEntityId,
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- // Verify that the outermost layer loads correctly and has no entities in it.
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, loadedInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- EXPECT_EQ(uniqueEntities.size(), 0);
- // Verify the inner layer loads correctly and has the entity in it we are looking for.
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueChildEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedChildInstances;
- Layers::LayerResult childReadResult =
- childLayerEntityAndComponent.m_layer->ReadFromLayerStream(childLayerEntitySaveStream, loadedChildInstances, uniqueChildEntities);
- EXPECT_TRUE(childReadResult.IsSuccess());
- EXPECT_EQ(uniqueChildEntities.size(), 1);
- EXPECT_NE(uniqueChildEntities.begin(), uniqueChildEntities.end());
- EXPECT_EQ(uniqueChildEntities.begin()->first, childEntity->GetId());
- EXPECT_NE(uniqueChildEntities.begin()->second, nullptr);
- EXPECT_EQ(uniqueChildEntities.begin()->second->GetId(), childEntity->GetId());
- childLayerEntityAndComponent.m_layer->CleanupLoadedLayer();
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SliceInstanceAddedToLayer_LayerHasUnsavedChanges)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice);
- m_layerEntity.m_layer->ClearUnsavedChanges();
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- bool hasUnsavedChanges = false;
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- hasUnsavedChanges,
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasUnsavedChanges);
- EXPECT_TRUE(hasUnsavedChanges);
- DeleteSliceInstance(instantiatedSlice);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_SaveAndLoadInstanceInLayer_InstanceLoadsCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice);
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 0);
- EXPECT_EQ(savedInstances.size(), 1);
- AZ::SliceComponent::SliceReferenceToInstancePtrs::iterator refToInstanceIterator =
- savedInstances.find(instantiatedSlice.GetReference());
- EXPECT_NE(refToInstanceIterator, savedInstances.end());
- EXPECT_NE(refToInstanceIterator->second.find(instantiatedSlice.GetInstance()), refToInstanceIterator->second.end());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, loadedInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- EXPECT_EQ(uniqueEntities.size(), 0);
- EXPECT_EQ(loadedInstances.size(), 1);
- EXPECT_NE(loadedInstances.find(instantiatedSlice.GetReference()->GetSliceAsset()), loadedInstances.end());
- DeleteSliceInstance(instantiatedSlice);
- }
- // Temporarily disabled until fix provided in mainline - instantiatedSlice is no longer valid to access after RemoveAndCacheInstances
- /*
- TEST_F(EditorLayerComponentTest, LayerTests_SliceInstanceOnlyInLayerRootSliceRemoveRestore_InstanceRemovedAndRestoredCorrectly)
- {
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice);
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 0);
- EXPECT_EQ(savedInstances.size(), 1);
- AZ::SliceComponent::SliceReferenceToInstancePtrs::iterator refToInstanceIterator =
- savedInstances.find(instantiatedSlice.GetReference());
- EXPECT_NE(refToInstanceIterator, savedInstances.end());
- EXPECT_NE(refToInstanceIterator->second.find(instantiatedSlice.GetInstance()), refToInstanceIterator->second.end());
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
-
- // First, verify the the instance is in the root slice.
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- // After removing the instances, verify the instance and reference is no longer in the root slice.
- rootSlice->RemoveAndCacheInstances(savedInstances);
- EXPECT_FALSE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- rootSlice->RestoreCachedInstances();
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- DeleteSliceInstance(instantiatedSlice);
- }
- // Tests that the slice reference remains in the root scene if there is an instance of the slice in the layer and in the root scene.
- TEST_F(EditorLayerComponentTest, LayerTests_MultipleSliceInstanceInLayerRootSliceRemoveRestore_InstanceRemovedAndRestoredCorrectly)
- {
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- // Put the first instance in the layer
- AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice);
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- // Create a second slice instance that is not in the layer.
- AZ::SliceComponent::SliceInstanceAddress secondSliceInstance = CreateSliceInstanceFromSlice(
- rootSlice,
- instantiatedSlice.GetReference()->GetSliceAsset());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 0);
- EXPECT_EQ(savedInstances.size(), 1);
- AZ::SliceComponent::SliceReferenceToInstancePtrs::iterator refToInstanceIterator =
- savedInstances.find(instantiatedSlice.GetReference());
- EXPECT_NE(refToInstanceIterator, savedInstances.end());
- EXPECT_NE(refToInstanceIterator->second.find(instantiatedSlice.GetInstance()), refToInstanceIterator->second.end());
- // Make sure the second slice instance is not saved.
- EXPECT_EQ(refToInstanceIterator->second.find(secondSliceInstance.GetInstance()), refToInstanceIterator->second.end());
- // First, verify the the instances are in the root slice.
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, secondSliceInstance));
- // After removing the instances, verify the first instance is no longer in the root slice, but the reference and second instance are.
- rootSlice->RemoveAndCacheInstances(savedInstances);
- EXPECT_FALSE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- AZ::SliceComponent::SliceReference* sliceReference = rootSlice->GetSlice(instantiatedSlice.GetReference()->GetSliceAsset());
- EXPECT_NE(sliceReference, nullptr);
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, secondSliceInstance));
- rootSlice->RestoreCachedInstances();
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, secondSliceInstance));
- DeleteSliceInstance(instantiatedSlice);
- DeleteSliceInstance(secondSliceInstance);
- }
- */
- TEST_F(EditorLayerComponentTest, LayerTests_DuplicateEntitiesInSceneAndLayer_DuplicateEntityIsDeleted)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 1);
- EXPECT_NE(savedEntities[0], nullptr);
- EXPECT_EQ(savedEntities[0]->GetId(), childEntity->GetId());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- // ReadFromLayerStream will delete the older entities, so create an entity here that can be safely deleted.
- AZ::Entity* duplicateToBeDeletedEntity = aznew AZ::Entity(childEntity->GetId(), "GoingToBeDeleted");
- uniqueEntities[childEntity->GetId()] = duplicateToBeDeletedEntity;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, loadedInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
- EXPECT_EQ(uniqueEntities.size(), 1);
- EXPECT_NE(uniqueEntities.begin(), uniqueEntities.end());
- EXPECT_EQ(uniqueEntities.begin()->first, childEntity->GetId());
- EXPECT_NE(uniqueEntities.begin()->second, nullptr);
- EXPECT_EQ(uniqueEntities.begin()->second->GetId(), childEntity->GetId());
- EXPECT_NE(uniqueEntities.begin()->second, duplicateToBeDeletedEntity);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_DuplicateEntitiesInLayer_DuplicateEntityIsDeleted)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- m_layerEntity.m_entity->GetId());
- Layers::EditorLayer layer;
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::LayerResult saveResult =
- m_layerEntity.m_layer->CreateLayerStreamWithDuplicateEntity(
- savedEntities,
- savedInstances,
- entitySaveStream,
- layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- EXPECT_EQ(savedEntities.size(), 1);
- EXPECT_NE(savedEntities[0], nullptr);
- EXPECT_EQ(savedEntities[0]->GetId(), childEntity->GetId());
- EXPECT_EQ(layer.m_layerEntities.size(), 2);
- // Make sure the saved data has a duplicate entity in it.
- EXPECT_EQ(layer.m_layerEntities[0]->GetId(), layer.m_layerEntities[1]->GetId());
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::RestoreEditorData);
- AZStd::unordered_map<AZ::EntityId, AZ::Entity*> uniqueEntities;
- AZ::SliceComponent::SliceAssetToSliceInstancePtrs loadedInstances;
- Layers::LayerResult readResult = m_layerEntity.m_layer->ReadFromLayerStream(entitySaveStream, loadedInstances, uniqueEntities);
- EXPECT_TRUE(readResult.IsSuccess());
-
- // Verify there is only one entity loaded from the layer.
- EXPECT_EQ(uniqueEntities.size(), 1);
- EXPECT_NE(uniqueEntities.begin(), uniqueEntities.end());
- EXPECT_EQ(uniqueEntities.begin()->first, childEntity->GetId());
- EXPECT_NE(uniqueEntities.begin()->second, nullptr);
- EXPECT_EQ(uniqueEntities.begin()->second->GetId(), childEntity->GetId());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreNullLayer_FailsToRestore)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(nullptr, "RecoveredLayerName", invalidParentId);
- EXPECT_FALSE(recoveryResult.IsSuccess());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreEmptyLayer_RestoresCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- // Check that the layer is in the scene.
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), layerEntityId);
- // Next, save that layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Delete the layer from the scene.
- bool layerDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- layerDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- m_layerEntity.m_entity->GetId());
- EXPECT_TRUE(layerDeleted);
- m_layerEntity.m_entity = nullptr;
- // Verify that the layer is gone.
- EXPECT_EQ(looseEntities.size(), 0);
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Attempt to recover the empty layer, which should succeed.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- EXPECT_TRUE(recoveryResult.IsSuccess());
- // Verify the layer was restored.
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), layerEntityId);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerButLayerStillInScene_FailsToRestore)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- // Check that the layer is in the scene.
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), layerEntityId);
- AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast(
- &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity,
- layerEntityId);
- // Next, save that layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Attempt to recover the layer, which should fail because it's still in the scene.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- EXPECT_FALSE(recoveryResult.IsSuccess());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithEntityChild_RestoresCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- const AZ::EntityId childEntityId = childEntity->GetId();
- AZ::TransformBus::Event(
- childEntityId,
- &AZ::TransformBus::Events::SetParent,
- layerEntityId);
- // Check that the layer and the child entity are in the scene.
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 2);
- bool foundLayer = false;
- bool foundChild = false;
- for (const auto& entity : looseEntities)
- {
- if (entity->GetId() == layerEntityId)
- {
- foundLayer = true;
- }
- else if (entity->GetId() == childEntityId)
- {
- foundChild = true;
- }
- }
- EXPECT_TRUE(foundLayer);
- EXPECT_TRUE(foundChild);
- // Next, save that layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Delete the child from the scene.
- bool childDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- childDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- childEntityId);
- EXPECT_TRUE(childDeleted);
- childEntity = nullptr;
- // Delete the layer from the scene.
- bool layerDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- layerDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- layerEntityId);
- EXPECT_TRUE(layerDeleted);
- m_layerEntity.m_entity = nullptr;
- // Verify that the layer is gone.
- EXPECT_EQ(looseEntities.size(), 0);
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Recover the layer.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- EXPECT_TRUE(recoveryResult.IsSuccess());
- // Verify the layer and child were restored.
- EXPECT_EQ(looseEntities.size(), 2);
- foundLayer = false;
- foundChild = false;
- for (const auto& entity : looseEntities)
- {
- if (entity->GetId() == layerEntityId)
- {
- foundLayer = true;
- }
- else if (entity->GetId() == childEntityId)
- {
- foundChild = true;
- }
- }
- EXPECT_TRUE(foundLayer);
- EXPECT_TRUE(foundChild);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithEntityChildStillInScene_FailsToRestore)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- const AZ::EntityId childEntityId = childEntity->GetId();
- AZ::TransformBus::Event(
- childEntityId,
- &AZ::TransformBus::Events::SetParent,
- layerEntityId);
- // Check that the layer and the child entity are in the scene.
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 2);
- bool foundLayer = false;
- bool foundChild = false;
- for (const auto& entity : looseEntities)
- {
- if (entity->GetId() == layerEntityId)
- {
- foundLayer = true;
- }
- else if (entity->GetId() == childEntityId)
- {
- foundChild = true;
- }
- }
- EXPECT_TRUE(foundLayer);
- EXPECT_TRUE(foundChild);
- // Next, save that layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Set the child's parent to invalid, so it sticks around after the layer is deleted
- AZ::TransformBus::Event(
- childEntityId,
- &AZ::TransformBus::Events::SetParent,
- AZ::EntityId());
- // Delete the layer from the scene.
- bool layerDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- layerDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- layerEntityId);
- EXPECT_TRUE(layerDeleted);
- m_layerEntity.m_entity = nullptr;
- // Verify that the layer is gone, but the child is still in the scene.
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), childEntityId);
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Attempt to recover the layer, which should fail because the child is still in the scene.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- EXPECT_FALSE(recoveryResult.IsSuccess());
- // Verify the layer was not restored.
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), childEntityId);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithSliceInstance_RestoresCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- // First, set up a layer with a slice instance in it.
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- AZ::Data::Asset<AZ::SliceAsset> loadedSliceAsset = instantiatedSlice.first->GetSliceAsset();
- AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice);
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- layerEntityId);
- // Check that the layer is in the scene.
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), layerEntityId);
- // Next, save that layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Clear out the scene, delete the instance and the layer.
- DeleteSliceInstance(instantiatedSlice);
- bool layerDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- layerDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- layerEntityId);
- EXPECT_TRUE(layerDeleted);
- m_layerEntity.m_entity = nullptr;
- // Verify the slice instance and layer have been removed from the scene.
- AZStd::list<AZ::SliceComponent::SliceReference>& sliceList = rootSlice->GetSlices();
- EXPECT_EQ(sliceList.size(), 0);
- // Verify the layer is gone.
- EXPECT_EQ(looseEntities.size(), 0);
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Recover the layer. It has no parent, so use an invalid ID.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- EXPECT_TRUE(recoveryResult.IsSuccess());
- // Verify the slice instance is now in the scene.
- EXPECT_EQ(sliceList.size(), 1);
- EXPECT_EQ(sliceList.front().GetSliceAsset(), loadedSliceAsset);
- AZStd::unordered_set<AZ::SliceComponent::SliceInstance>& sliceInstances = sliceList.front().GetInstances();
- EXPECT_EQ(sliceInstances.size(), 1);
- // Verify the layer is now in the scene.
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), layerEntityId);
- // Clean up the slice instance.
- // There's only one instance, so no need to loop to clear it out.
- // Convert the instance from an iterator to a pointer, to remove it.
- rootSlice->RemoveSliceInstance(&(*sliceInstances.begin()));
- }
- TEST_F(EditorLayerComponentTest, LayerTests_RestoreLayerWithSliceInstanceStillInScene_FailsToRestore)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- // First, set up a layer with a slice instance in it.
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- AZ::Data::Asset<AZ::SliceAsset> loadedSliceAsset = instantiatedSlice.first->GetSliceAsset();
- AZ::Entity* childEntity = GetEntityFromSliceInstance(instantiatedSlice);
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- layerEntityId);
- // Check that the layer is in the scene.
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice, &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 1);
- EXPECT_EQ(looseEntities[0]->GetId(), layerEntityId);
- // Next, save that layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = SaveMainLayer(layer, entitySaveStream, savedEntities, savedInstances);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Move the slice instance out of the layer, so the entity ID remains active and conflicts with the layer.
- AZ::TransformBus::Event(
- childEntity->GetId(),
- &AZ::TransformBus::Events::SetParent,
- AZ::EntityId());
- bool layerDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- layerDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- layerEntityId);
- EXPECT_TRUE(layerDeleted);
- m_layerEntity.m_entity = nullptr;
- // Verify the layer is gone.
- EXPECT_EQ(looseEntities.size(), 0);
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Attempt to recover the layer. It has no parent, so use an invalid ID.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- // Verify it failed to recover.
- EXPECT_FALSE(recoveryResult.IsSuccess());
- // Verify the slice instance is now in the scene.
- AZStd::list<AZ::SliceComponent::SliceReference>& sliceList = rootSlice->GetSlices();
- EXPECT_EQ(sliceList.size(), 1);
- EXPECT_EQ(sliceList.front().GetSliceAsset(), loadedSliceAsset);
- AZStd::unordered_set<AZ::SliceComponent::SliceInstance>& sliceInstances = sliceList.front().GetInstances();
- EXPECT_EQ(sliceInstances.size(), 1);
- // Verify the layer is not in the scene. If it failed, it shouldn't create the layer.
- EXPECT_EQ(looseEntities.size(), 0);
- // Clean up the slice instance.
- DeleteSliceInstance(instantiatedSlice);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_AttemptToCopyLayerComponent_IsNotCopyable)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- AZ::Entity::ComponentArrayType components;
- components.push_back(m_layerEntity.m_layer);
- bool isCopyable = EntityPropertyEditor::AreComponentsCopyable(components, DummyComponentFilter);
-
- EXPECT_FALSE(isCopyable);
- }
- TEST_F(EditorLayerComponentTest, LayerTests_CheckOverwriteFlag_IsSetCorrectly)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- // Check layer created with correct value
- EXPECT_FALSE(m_layerEntity.m_layer->GetOverwriteFlag());
- //check direct call works correctly
- m_layerEntity.m_layer->SetOverwriteFlag(true);
- EXPECT_TRUE(m_layerEntity.m_layer->GetOverwriteFlag());
- // check bus works correctly
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::Event(
- m_layerEntity.m_entity->GetId(),
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::SetOverwriteFlag, true);
- EXPECT_TRUE(m_layerEntity.m_layer->GetOverwriteFlag());
- }
- TEST_F(EditorLayerComponentTest, LayerTests_UndoRedoRestoreLayerWithChildren_AllRestoredEntitiesCorrect)
- {
- AUTO_RESULT_IF_SETTING_TRUE(UnitTest::prefabSystemSetting, true)
- const AZ::EntityId layerEntityId = m_layerEntity.m_entity->GetId();
- AZ::SliceComponent* rootSlice;
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::BroadcastResult(
- rootSlice,
- &AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Events::GetEditorRootSlice);
- EXPECT_NE(rootSlice, nullptr);
- // Set up a an entity and a slice instance as children of the layer.
- AZ::Entity* childEntity = CreateEditorReadyEntity("ChildEntity");
- const AZ::EntityId childEntityId = childEntity->GetId();
- AZ::TransformBus::Event(
- childEntityId,
- &AZ::TransformBus::Events::SetParent,
- layerEntityId);
- AZ::SliceComponent::SliceInstanceAddress instantiatedSlice = CreateSliceInstance();
- AZ::Data::Asset<AZ::SliceAsset> loadedSliceAsset = instantiatedSlice.first->GetSliceAsset();
- AZ::Entity* sliceEntity = GetEntityFromSliceInstance(instantiatedSlice);
- const AZ::EntityId sliceEntityId = sliceEntity->GetId();
- AZ::TransformBus::Event(
- sliceEntityId,
- &AZ::TransformBus::Events::SetParent,
- layerEntityId);
- const EntityList& looseEntities(rootSlice->GetNewEntities());
- EXPECT_EQ(looseEntities.size(), 2);
- // Check that the layers, the entity, and the slice are in the scene.
- EXPECT_TRUE(IsLooseEntityInRootSlice(rootSlice, layerEntityId));
- EXPECT_TRUE(IsLooseEntityInRootSlice(rootSlice, childEntityId));
- EXPECT_TRUE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
- // Next, save the layer to a stream.
- AZStd::vector<char> entitySaveBuffer;
- AZ::IO::ByteContainerStream<AZStd::vector<char> > entitySaveStream(&entitySaveBuffer);
- AZStd::vector<AZ::Entity*> savedEntities;
- AZ::SliceComponent::SliceReferenceToInstancePtrs savedInstances;
- Layers::EditorLayer layer;
- Layers::LayerResult saveResult = m_layerEntity.m_layer->PopulateLayerWriteToStreamAndGetEntities(
- savedEntities,
- savedInstances,
- entitySaveStream,
- layer);
- EXPECT_TRUE(saveResult.IsSuccess());
- // Delete all the objects.
- bool entityDeleted = false;
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- entityDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- childEntityId);
- EXPECT_TRUE(entityDeleted);
- childEntity = nullptr;
- DeleteSliceInstance(instantiatedSlice);
-
- AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
- entityDeleted,
- &AzToolsFramework::EditorEntityContextRequestBus::Events::DestroyEditorEntity,
- layerEntityId);
- EXPECT_TRUE(entityDeleted);
- m_layerEntity.m_entity = nullptr;
- // Check that everything is gone.
- EXPECT_EQ(looseEntities.size(), 0);
- EXPECT_FALSE(IsInstanceAndReferenceInRootSlice(rootSlice, instantiatedSlice));
-
- // Load the layer object from the stream it was saved to.
- AZStd::shared_ptr<Layers::EditorLayer> loadedFromStream(AZ::Utils::LoadObjectFromStream<Layers::EditorLayer>(entitySaveStream));
- EXPECT_NE(loadedFromStream, nullptr);
- // Attempt to recover the layer. It has no parent, so use an invalid ID.
- AZ::EntityId invalidParentId;
- Layers::LayerResult recoveryResult = AzToolsFramework::Layers::EditorLayerComponent::RecoverEditorLayer(loadedFromStream, "RecoveredLayerName", invalidParentId);
- // Verify it recovered successfully.
- EXPECT_TRUE(recoveryResult.IsSuccess());
-
- // Verify the slice instance is now in the scene.
- AZStd::list<AZ::SliceComponent::SliceReference>& sliceList = rootSlice->GetSlices();
- EXPECT_EQ(sliceList.size(), 1);
- EXPECT_EQ(sliceList.front().GetSliceAsset(), loadedSliceAsset);
- AZStd::unordered_set<AZ::SliceComponent::SliceInstance>& sliceInstances = sliceList.front().GetInstances();
- EXPECT_EQ(sliceInstances.size(), 1);
- // Verify the loose entities are restored.
- EXPECT_EQ(looseEntities.size(), 2);
- // Check the hierarchy is correct.
- AZ::EntityId childParentId;
- AZ::TransformBus::EventResult(
- childParentId,
- childEntityId,
- &AZ::TransformBus::Events::GetParentId);
- EXPECT_EQ(childParentId, layerEntityId);
- AZ::EntityId sliceParentId;
- AZ::TransformBus::EventResult(
- sliceParentId,
- sliceEntityId,
- &AZ::TransformBus::Events::GetParentId);
- EXPECT_EQ(sliceParentId, layerEntityId);
- // Undo.
- AzToolsFramework::ToolsApplicationRequestBus::Broadcast(&AzToolsFramework::ToolsApplicationRequestBus::Events::UndoPressed);
-
- // Check everything's gone again.
- EXPECT_EQ(looseEntities.size(), 0);
- EXPECT_EQ(sliceList.size(), 0);
-
- // Redo.
- AzToolsFramework::ToolsApplicationRequestBus::Broadcast(&AzToolsFramework::ToolsApplicationRequestBus::Events::RedoPressed);
-
- // Check everything's back and the hierarchy is correct.
- EXPECT_EQ(looseEntities.size(), 2);
- EXPECT_TRUE(IsLooseEntityInRootSlice(rootSlice, layerEntityId));
- EXPECT_TRUE(IsLooseEntityInRootSlice(rootSlice, childEntityId));
- EXPECT_EQ(sliceList.size(), 1);
- AZ::EntityId childParentIdAfterRedo;
- AZ::TransformBus::EventResult(
- childParentIdAfterRedo,
- childEntityId,
- &AZ::TransformBus::Events::GetParentId);
- EXPECT_EQ(childParentIdAfterRedo, layerEntityId);
- AZ::EntityId sliceParentIdAfterRedo;
- AZ::TransformBus::EventResult(
- sliceParentIdAfterRedo,
- sliceEntityId,
- &AZ::TransformBus::Events::GetParentId);
- EXPECT_EQ(sliceParentIdAfterRedo, layerEntityId);
- rootSlice->RemoveAllEntities();
- }
- }
|