Files
sebastian lewicki 695acb1980 Upgrading the CQTest plugin to an Engine module
Introducing the CQTestEnhancedInput plugin as this requires use of the EnhancedInput Engine Plugin (Engine modules cannot make use of the Engine Plugin)
#jira UE-217806
#rb Devin.Doucette, Jerome.Delattre, rob.huyett, sean.sweeney

[CL 36039088 by sebastian lewicki in ue5-main branch]
2024-09-05 10:24:20 -04:00

106 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Components/ActorTestSpawner.h"
#include "TestGameInstance.h"
#include "EngineUtils.h"
#include "Engine/Engine.h"
namespace
{
static constexpr bool bTriggerWorldDestroyCallbacks = true;
void DestroyWorld(UWorld* GameWorld)
{
if (GameWorld->AreActorsInitialized())
{
for (AActor* const Actor : FActorRange(GameWorld))
{
if (Actor)
{
Actor->RouteEndPlay(EEndPlayReason::LevelTransition);
}
}
}
GEngine->ShutdownWorldNetDriver(GameWorld);
GameWorld->DestroyWorld(bTriggerWorldDestroyCallbacks);
GameWorld->SetPhysicsScene(nullptr);
GEngine->DestroyWorldContext(GameWorld);
}
void DestroySpawnedActors(TArray<TWeakObjectPtr<AActor>>& SpawnedActors)
{
// Destroy actors in reverse order of creation
for (int32 Index = SpawnedActors.Num() - 1; Index >= 0; Index--)
{
if (AActor* CastActor = SpawnedActors[Index].Get())
{
CastActor->Destroy(true);
}
}
SpawnedActors.Empty();
}
void DestroySpawnedObjects(TArray<TWeakObjectPtr<UObject>>& InSpawnedObjects)
{
// Destroy objects in reverse order of creation
for (int32 Index = InSpawnedObjects.Num() - 1; Index >= 0; Index--)
{
if (UObject* Obj = InSpawnedObjects[Index].Get())
{
Obj->ConditionalBeginDestroy();
}
}
InSpawnedObjects.Empty();
}
} // namespace
FActorTestSpawner::~FActorTestSpawner() {
if (GameInstance)
{
GameInstance->Shutdown();
GameInstance->RemoveFromRoot();
GameInstance = nullptr;
}
DestroySpawnedActors(SpawnedActors);
DestroySpawnedObjects(SpawnedObjects);
if (GameWorld)
{
DestroyWorld(GameWorld);
GameWorld->RemoveFromRoot();
GameWorld = nullptr;
}
}
UWorld* FActorTestSpawner::CreateWorld()
{
FName WorldName = MakeUniqueObjectName(nullptr, UWorld::StaticClass(), NAME_None, EUniqueObjectNameOptions::GloballyUnique);
FWorldContext& WorldContext = GEngine->CreateNewWorldContext(EWorldType::Game);
UWorld* Result = UWorld::CreateWorld(EWorldType::Game, false, WorldName, GetTransientPackage());
check(Result != nullptr);
Result->AddToRoot();
WorldContext.SetCurrentWorld(Result);
Result->InitializeActorsForPlay(FURL());
check(Result->GetPhysicsScene() != nullptr);
return Result;
}
void FActorTestSpawner::InitializeGameSubsystems()
{
GameInstance = NewObject<UTestGameInstance>();
GameInstance->AddToRoot();
GameInstance->InitializeForTest(GetWorld());
}
UTestGameInstance* FActorTestSpawner::GetGameInstance()
{
return GameInstance;
}