Files
UnrealEngineUWP/Engine/Source/Runtime/CoreUObject/Tests/ObjectPtrTestClass.cpp
steve robb 28bf104b6a Added cvar to control if non-nullable properties produce an error, a warning or a default object when failing to resolve an object reference.
Default objects will not be created if the class is abstract.

#rb Francis.Hurteau
#jira UE-224118

#tests Ran editor, new unit tests

[CL 36747664 by steve robb in 5.5 branch]
2024-10-01 17:46:30 -04:00

248 lines
8.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#if WITH_LOW_LEVEL_TESTS
#include "ObjectPtrTestClass.h"
#include "UObject/Class.h"
#include "UObject/Package.h"
#include "UObject/MetaData.h"
#include "UObject/UnrealType.h"
#include "UObject/UObjectGlobals.h"
//can not put the #if inside as the expansion of IMPLEMENT_CORE_INTRINSIC_CLASS fails
#if WITH_EDITORONLY_DATA
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrTestClass, UObject,
{
auto MetaData = Class->GetOutermost()->GetMetaData();
if (MetaData)
{
MetaData->SetValue(Class, TEXT("LoadBehavior"), TEXT("LazyOnDemand"));
}
}
);
#else
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrTestClass, UObject,
{
});
#endif
#if WITH_EDITORONLY_DATA
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrAbstractTestClass, UObject,
{
auto MetaData = Class->GetOutermost()->GetMetaData();
if (MetaData)
{
MetaData->SetValue(Class, TEXT("LoadBehavior"), TEXT("LazyOnDemand"));
}
}
);
#else
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrAbstractTestClass, UObject,
{
});
#endif
#if WITH_EDITORONLY_DATA
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrAbstractDerivedTestClass, UObjectPtrAbstractTestClass,
{
auto MetaData = Class->GetOutermost()->GetMetaData();
if (MetaData)
{
MetaData->SetValue(Class, TEXT("LoadBehavior"), TEXT("LazyOnDemand"));
}
}
);
#else
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrAbstractDerivedTestClass, UObjectPtrAbstractTestClass,
{
});
#endif
#if WITH_EDITORONLY_DATA
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrTestClassWithRef, UObject,
{
//add reflection info for the two properties
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtr";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ObjectPtr);
Params.PropertyFlags = CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params );
Property->PropertyClass = UObjectPtrTestClass::StaticClass();
}
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtrNonNullable";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ObjectPtrNonNullable);
Params.PropertyFlags = EPropertyFlags::CPF_NonNullable | CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrTestClass::StaticClass();
}
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtrAbstractNonNullable";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ObjectPtrAbstractNonNullable);
Params.PropertyFlags = EPropertyFlags::CPF_NonNullable | CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrAbstractTestClass::StaticClass();
}
{
UECodeGen_Private::FArrayPropertyParams Params = { };
Params.NameUTF8 = "ArrayObjPtr";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ArrayObjPtr);
Params.PropertyFlags = CPF_None;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
auto Property = new FArrayProperty(Class, Params);
auto InnerProperty = new FObjectProperty(Property, TEXT("Inner"), EObjectFlags::RF_NoFlags);
InnerProperty->PropertyClass = UObjectPtrTestClass::StaticClass();
Property->AddCppProperty(InnerProperty);
}
auto MetaData = Class->GetOutermost()->GetMetaData();
if (MetaData)
{
MetaData->SetValue(Class, TEXT("LoadBehavior"), TEXT("LazyOnDemand"));
}
}
);
#else
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrTestClassWithRef, UObject,
{
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtr";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ObjectPtr);
Params.PropertyFlags = CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrTestClass::StaticClass();
}
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtrNonNullable";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ObjectPtrNonNullable);
Params.PropertyFlags = EPropertyFlags::CPF_NonNullable | CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrTestClass::StaticClass();
}
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtrAbstractNonNullable";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ObjectPtrAbstractNonNullable);
Params.PropertyFlags = EPropertyFlags::CPF_NonNullable | CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrAbstractTestClass::StaticClass();
}
{
UECodeGen_Private::FArrayPropertyParams Params = { };
Params.NameUTF8 = "ArrayObjPtr";
Params.Offset = STRUCT_OFFSET(UObjectPtrTestClassWithRef, ArrayObjPtr);
Params.PropertyFlags = CPF_None;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
auto Property = new FArrayProperty(Class, Params);
auto InnerProperty = new FObjectProperty(Property, TEXT("Inner"), EObjectFlags::RF_NoFlags);
InnerProperty->PropertyClass = UObjectPtrTestClass::StaticClass();
Property->AddCppProperty(InnerProperty);
}
});
#endif
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectWithClassProperty, UObject,
{
{
UECodeGen_Private::FClassPropertyParams Params = { };
Params.NameUTF8 = "ClassPtr";
Params.Offset = STRUCT_OFFSET(UObjectWithClassProperty, ClassPtr);
Params.PropertyFlags = CPF_TObjectPtrWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
Params.MetaClassFunc = []()
{
return UClass::StaticClass();
};
auto Property = new FClassProperty(Class, Params);
Property->PropertyClass = UObject::StaticClass();
}
{
UECodeGen_Private::FClassPropertyParams Params = { };
Params.NameUTF8 = "ClassRaw";
Params.Offset = STRUCT_OFFSET(UObjectWithClassProperty, ClassRaw);
Params.PropertyFlags = EPropertyFlags::CPF_None;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
Params.MetaClassFunc = []()
{
return UClass::StaticClass();
};
auto Property = new FClassProperty(Class, Params);
Property->PropertyClass = UObject::StaticClass();
}
{
UECodeGen_Private::FClassPropertyParams Params = { };
Params.NameUTF8 = "SubClass";
Params.Offset = STRUCT_OFFSET(UObjectWithClassProperty, SubClass);
Params.PropertyFlags = EPropertyFlags::CPF_UObjectWrapper;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
Params.MetaClassFunc = []()
{
return UObjectPtrTestClass::StaticClass();
};
auto Property = new FClassProperty(Class, Params);
Property->PropertyClass = UObject::StaticClass();
}
}
);
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectWithRawProperty, UObject,
{
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtr";
Params.Offset = STRUCT_OFFSET(UObjectWithRawProperty, ObjectPtr);
Params.PropertyFlags = CPF_None;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrTestClass::StaticClass();
}
{
UECodeGen_Private::FObjectPropertyParams Params = { };
Params.NameUTF8 = "ObjectPtrNonNullable";
Params.Offset = STRUCT_OFFSET(UObjectWithRawProperty, ObjectPtrNonNullable);
Params.PropertyFlags = EPropertyFlags::CPF_NonNullable;
Params.ObjectFlags = RF_Public | RF_Transient | RF_MarkAsNative;
Params.ClassFunc = nullptr;
auto Property = new FObjectProperty(Class, Params);
Property->PropertyClass = UObjectPtrTestClass::StaticClass();
}
}
);
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrDerrivedTestClass, UObjectPtrTestClass, {});
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrNotLazyTestClass, UObject, {});
IMPLEMENT_CORE_INTRINSIC_CLASS(UObjectPtrStressTestClass, UObject, {});
#endif