Files
UnrealEngine/Engine/Source/Runtime/CoreUObject/Tests/PackageMetaDataTest.cpp
2025-05-18 13:04:45 +08:00

95 lines
5.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#if WITH_LOW_LEVEL_TESTS && WITH_METADATA
#include "TestHarness.h"
#include "UObject/Package.h"
#include "UObject/MetaData.h"
#include "UObject/ObjectRedirector.h"
namespace UE::CoreObject::Private::Tests
{
TEST_CASE("CoreUObject::UPackage::FMetaData", "[CoreUObject][Package][MetaData]")
{
#if WITH_EDITORONLY_DATA
// FMetaDataUtilities::FMoveMetadataHelperContext used to handle objects renaming with regards to metadata will only work if GIsEditor
// is set, so we must set it here.
TGuardValue<bool> GIsEditorGuard(GIsEditor, true);
#endif // WITH_EDITORONLY_DATA
const TCHAR* ObjectValueKey = TEXT("ObjectValueKey");
const TCHAR* ObjectValueValue = TEXT("ObjectValueValue");
UPackage* NewPackage = CreatePackage(TEXT("/Temp/TestPackage"));
TEST_NOT_NULL(TEXT("Should be able to create a new package"), NewPackage);
UObject* NewObject = ::NewObject<UObjectRedirector>(NewPackage, MakeUniversallyUniqueObjectName(NewPackage, NAME_Object));
TEST_NOT_NULL(TEXT("Should be able to create a new object"), NewObject);
UObject* NewSubObject = ::NewObject<UObjectRedirector>(NewObject, MakeUniversallyUniqueObjectName(NewObject, NAME_Object));
TEST_NOT_NULL(TEXT("Should be able to create a new sub object"), NewSubObject);
FMetaData& NewPackageMetaData = NewPackage->GetMetaData();
TEST_FALSE(TEXT("New object shouldn't have metadata values"), NewPackageMetaData.HasObjectValues(NewObject));
TEST_FALSE(TEXT("New sub object shouldn't have metadata values"), NewPackageMetaData.HasObjectValues(NewSubObject));
NewPackageMetaData.SetValue(NewObject, ObjectValueKey, ObjectValueValue);
TEST_TRUE(TEXT("New object should have metadata values"), NewPackageMetaData.HasObjectValues(NewObject));
NewPackageMetaData.SetValue(NewSubObject, ObjectValueKey, ObjectValueValue);
TEST_TRUE(TEXT("New sub object should have metadata values"), NewPackageMetaData.HasObjectValues(NewObject));
const FString* FoundObjectValue = NewPackageMetaData.FindValue(NewObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New object should have a valid metadata value"), FoundObjectValue);
TEST_TRUE(TEXT("New object should have valid metadata value"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
FoundObjectValue = NewPackageMetaData.FindValue(NewSubObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New sub object should have a valid metadata value"), FoundObjectValue);
TEST_TRUE(TEXT("New sub object should have valid metadata value"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
const FName NewObjectName = MakeUniversallyUniqueObjectName(NewPackage, NAME_Object);
const FString NewObjectNameString = NewObjectName.ToString();
TEST_TRUE(TEXT("Should be able to rename new object"), NewObject->Rename(*NewObjectNameString, nullptr));
FoundObjectValue = NewPackageMetaData.FindValue(NewObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New object should have a valid metadata value after rename"), FoundObjectValue);
TEST_TRUE(TEXT("New object should have valid metadata value after rename"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
FoundObjectValue = NewPackageMetaData.FindValue(NewSubObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New sub object should have a valid metadata value after parent rename"), FoundObjectValue);
TEST_TRUE(TEXT("New sub object should have valid metadata value after parent rename"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
UPackage* NewPackage2 = CreatePackage(TEXT("/Temp/TestPackage1"));
TEST_NOT_NULL(TEXT("Should be able to create a new package"), NewPackage2);
TEST_TRUE(TEXT("Should be able to rename new object into another package"), NewObject->Rename(nullptr, NewPackage2));
FoundObjectValue = NewPackageMetaData.FindValue(NewObject, ObjectValueKey);
TEST_NULL(TEXT("New object should have an invalid metadata value after rename in original package metadata"), FoundObjectValue);
FoundObjectValue = NewPackageMetaData.FindValue(NewSubObject, ObjectValueKey);
TEST_NULL(TEXT("New sub object should have a valid metadata value after parent rename in original package metadata"), FoundObjectValue);
FMetaData& NewPackage2MetaData = NewPackage2->GetMetaData();
FoundObjectValue = NewPackage2MetaData.FindValue(NewObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New object should have a valid metadata value in renamed package"), FoundObjectValue);
TEST_TRUE(TEXT("New object should have valid metadata value in renamed pacjage"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
FoundObjectValue = NewPackage2MetaData.FindValue(NewSubObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New sub object should have a valid metadata value in renamed package"), FoundObjectValue);
TEST_TRUE(TEXT("New sub object should have valid metadata value in renamed package"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
TEST_TRUE(TEXT("Should be able to rename new sub object"), NewSubObject->Rename(*NewObjectNameString, nullptr));
FoundObjectValue = NewPackage2MetaData.FindValue(NewSubObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New sub object should have a valid metadata value after rename"), FoundObjectValue);
TEST_TRUE(TEXT("New sub object should have valid metadata value after renamepackage"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
TEST_TRUE(TEXT("Should be able to rename new sub object"), NewSubObject->Rename(nullptr, NewPackage2));
FoundObjectValue = NewPackage2MetaData.FindValue(NewSubObject, ObjectValueKey);
TEST_NOT_NULL(TEXT("New object should have a valid metadata value after removing from parent"), FoundObjectValue);
TEST_TRUE(TEXT("New object should have valid metadata value after removing from parent"), FoundObjectValue && *FoundObjectValue == ObjectValueValue);
}
}
#endif // WITH_LOW_LEVEL_TESTS && WITH_METADATA