// Copyright Epic Games, Inc. All Rights Reserved. #include "PropertyPathHelpersTest.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(PropertyPathHelpersTest) #if WITH_DEV_AUTOMATION_TESTS DEFINE_LOG_CATEGORY_STATIC(LogPropertyPathHelpersTest, Log, All); /** * Coverage: * * SetPrimitives (Bool, Integer, Float) * SetInvalidInputIsNoOp * SetString * SetEnum * SetStruct * SetInnerObject * SetStructData * SetStructMember * SetStructInnerObjectMember * SetInnerStructMember * SetPrimitivesInnerObject * SetStringInnerObject * SetStructInnerObject * SetStructMemberInnerObject * SetInnerStructMemberInnerObject * SetInnerStructMemberEnumInnerObject * * GetPrimitives * GetString * GetStruct * GetInnerObject * GetEnum * GetStructMember * GetStructInnerObjectMember * GetInnerStructMember * GetPrimitivesInnerObject * GetStringInnerObject * GetStructInnerObject * GetStructMemberInnerObject * GetInnerStructMemberInnerObject * GetInnerStructMemberEnumInnerObject * * Note: * When a struct setter is called due to a struct member set we expect getter to be called. * This is because to call the struct setter we had to read the current struct value. */ // Begin Tests IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetPrimitivesTest, "System.PropertyPath.SetPrimitivesTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetPrimitivesTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->Bool = true; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Bool"), true); GPassing &= TestEqual(TEXT("Primitive Bool Set"), Test.Object->Bool, true); GPassing &= TestEqual(TEXT("Primitive Bool Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Primitive Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->Integer = 1; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Integer"), 1); GPassing &= TestEqual(TEXT("Primitive Integer Set"), Test.Object->Integer, 1); GPassing &= TestEqual(TEXT("Primitive Integer Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Primitive Integer Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Integer Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetFloat(1.5f); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Float"), 1.5f); GPassing &= TestEqual(TEXT("Primitive Float Set"), Test.Object->Float, 1.5f); GPassing &= TestEqual(TEXT("Primitive Float Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Primitive Float Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Primitive Float Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetInvalidInputIsNoOp, "System.PropertyPath.SetInvalidInputIsNoOp", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetInvalidInputIsNoOp::RunTest(const FString& Parameters) { bool GPassing = true; // Note: Skipping CppTests here since these are No Ops. { FPropertyPathTestBed Test = {}; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Bool"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Bool Invalid Input Set No Op"), Test.Object->Bool, false); GPassing &= TestEqual(TEXT("Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Integer"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Integer Invalid Input Set No Op"), Test.Object->Integer, 0); GPassing &= TestEqual(TEXT("Integer Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Integer Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Float"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Float Invalid Input Set No Op"), Test.Object->Float, 0.0f); GPassing &= TestEqual(TEXT("Float Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Float Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Struct"), 1); GPassing &= TestEqual(TEXT("Struct Invalid Input Set No Op"), Test.Object->Struct, Test.DefaultStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStringTest, "System.PropertyPath.SetStringTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStringTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->String = FString("NewValue"); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("String"), FString("NewValue")); GPassing &= TestEqual(TEXT("String Set"), Test.Object->String, FString("NewValue")); GPassing &= TestEqual(TEXT("String Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("String Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("String Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetEnumTest, "System.PropertyPath.SetEnumTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetEnumTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->EnumTwo = Two; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumTwo"), Two); GPassing &= TestEqual(TEXT("Enum Set"), Test.Object->EnumTwo, Two); GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Enum Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Enum Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { // Test for FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->EnumOne = Four; CppTest.Object->EnumTwo = Three; CppTest.Object->EnumThree = Two; CppTest.Object->EnumFour = One; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumOne"), Four); CppTest.Object->EnumOne = Four; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumTwo"), Three); CppTest.Object->EnumTwo = Three; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumThree"), Two); CppTest.Object->EnumThree = Two; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumFour"), One); CppTest.Object->EnumFour = One; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumOne, Four); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumTwo, Three); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumThree, Two); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumFour, One); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumFour"), Four); CppTest.Object->EnumFour = Four; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumThree"), Three); CppTest.Object->EnumThree = Three; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumTwo"), Two); CppTest.Object->EnumTwo = Two; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("EnumOne"), One); CppTest.Object->EnumOne = One; GPassing &= TestEqual(TEXT("Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumOne, One); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumTwo, Two); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumThree, Three); GPassing &= TestEqual(TEXT("Enum Close No Overwrite Set"), Test.Object->EnumFour, Four); GPassing &= TestEqual(TEXT("Enum Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Enum Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStructTest, "System.PropertyPath.SetStructTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStructTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetStruct(Test.ModifiedStruct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Struct"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Set"), Test.Object->Struct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetStructRef(Test.ModifiedStruct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructRef"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Ref Set"), Test.Object->StructRef, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Ref Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetStructConstRef(Test.ModifiedStruct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructConstRef"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Const Ref Set"), Test.Object->StructConstRef, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Const Ref Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetInnerObjectTest, "System.PropertyPath.SetInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject = CppTest.ModifiedObject; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Inner Object Set"), Test.Object->InnerObject, Test.ModifiedObject); GPassing &= TestEqual(TEXT("Inner Object Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Inner Object Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStructDataTest, "System.PropertyPath.SetStructDataTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStructDataTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetStruct(Test.ModifiedStruct); UScriptStruct* ScriptStruct = TBaseStructure::Get(); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Struct"), ScriptStruct, (const uint8*)&Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Data Set"), Test.Object->Struct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Data Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetStructRef(Test.ModifiedStruct); UScriptStruct* ScriptStruct = TBaseStructure::Get(); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructRef"), ScriptStruct, (const uint8*)&Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Ref Data Set"), Test.Object->StructRef, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Ref Data Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->SetStructConstRef(Test.ModifiedStruct); UScriptStruct* ScriptStruct = TBaseStructure::Get(); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructConstRef"), ScriptStruct, (const uint8*)&Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Const Ref Data Set"), Test.Object->StructConstRef, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Const Ref Data Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStructMemberTest, "System.PropertyPath.SetStructMemberTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStructMemberTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->Struct.Float = 1.5f; CppTest.Object->SetStruct(CppTest.Object->Struct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Struct.Float"), 1.5f); GPassing &= TestEqual(TEXT("Struct Member Set"), Test.Object->Struct.Float, 1.5f); GPassing &= TestEqual(TEXT("Struct Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->StructRef.Float = 1.5f; CppTest.Object->SetStructRef(CppTest.Object->StructRef); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructRef.Float"), 1.5f); GPassing &= TestEqual(TEXT("Struct Ref Member Set"), Test.Object->StructRef.Float, 1.5f); GPassing &= TestEqual(TEXT("Struct Ref Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->StructConstRef.Float = 1.5f; CppTest.Object->SetStructConstRef(CppTest.Object->StructConstRef); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructConstRef.Float"), 1.5f); GPassing &= TestEqual(TEXT("Struct Const Ref Member Set"), Test.Object->StructConstRef.Float, 1.5f); GPassing &= TestEqual(TEXT("Struct Const Ref Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStructInnerObjectMemberTest, "System.PropertyPath.SetStructInnerObjectMemberTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStructInnerObjectMemberTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->Struct.InnerObject = CppTest.ModifiedObject; CppTest.Object->SetStruct(CppTest.Object->Struct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Struct.InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Inner Object Member Set"), Test.Object->Struct.InnerObject, Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Inner Object Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->StructRef.InnerObject = CppTest.ModifiedObject; CppTest.Object->SetStructRef(CppTest.Object->StructRef); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructRef.InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Ref Inner Object Member Set"), Test.Object->StructRef.InnerObject, Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Ref Inner Object Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->StructConstRef.InnerObject = CppTest.ModifiedObject; CppTest.Object->SetStructConstRef(CppTest.Object->StructConstRef); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("StructConstRef.InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Const Ref Inner Object Member Set"), Test.Object->StructConstRef.InnerObject, Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Const Ref Inner Object Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetInnerStructMemberTest, "System.PropertyPath.SetInnerStructMemberTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetInnerStructMemberTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->Struct.InnerStruct.Float = 1.5f; CppTest.Object->SetStruct(CppTest.Object->Struct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("Struct.InnerStruct.Float"), 1.5f); GPassing &= TestEqual(TEXT("Inner Struct Member Set"), Test.Object->Struct.InnerStruct.Float, 1.5f); GPassing &= TestEqual(TEXT("Inner Struct Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetPrimitivesInnerObjectTest, "System.PropertyPath.SetPrimitivesInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetPrimitivesInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->Bool = true; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Bool"), true); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Set"), Test.Object->InnerObject->Bool, true); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->Integer = 1; PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Integer"), 1); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Set"), Test.Object->InnerObject->Integer, 1); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->SetFloat(1.5f); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Float"), 1.5f); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Set"), Test.Object->InnerObject->Float, 1.5f); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Setter Called"), Test.Object->InnerObject->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Float Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Float Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStringInnerObjectTest, "System.PropertyPath.SetStringInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStringInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->String = FString("NewValue"); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.String"), FString("NewValue")); GPassing &= TestEqual(TEXT("Inner Object String Set"), Test.Object->InnerObject->String, FString("NewValue")); GPassing &= TestEqual(TEXT("Inner Object String Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Inner Object String Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object String Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("String Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("String Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStructInnerObjectTest, "System.PropertyPath.SetStructInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStructInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->SetStruct(Test.ModifiedStruct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Struct"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Struct Set"), Test.Object->InnerObject->Struct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Struct Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Inner Object Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), true); GPassing &= TestEqual(TEXT("Inner Object Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetStructMemberInnerObjectTest, "System.PropertyPath.SetStructMemberInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetStructMemberInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->Struct.Float = 1.5f; CppTest.Object->InnerObject->SetStruct(CppTest.Object->InnerObject->Struct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Struct.Float"), 1.5f); GPassing &= TestEqual(TEXT("Inner Object Struct Member Set"), Test.Object->InnerObject->Struct.Float, 1.5f); GPassing &= TestEqual(TEXT("Inner Object Struct Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Inner Object Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Inner Object Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetInnerStructMemberInnerObjectTest, "System.PropertyPath.SetInnerStructMemberInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetInnerStructMemberInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->Struct.InnerStruct.Float = 1.5f; CppTest.Object->InnerObject->SetStruct(CppTest.Object->InnerObject->Struct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Struct.InnerStruct.Float"), 1.5f); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Set"), Test.Object->InnerObject->Struct.InnerStruct.Float, 1.5f); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Inner Object Inner Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Inner Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FSetInnerStructMemberEnumInnerObjectTest, "System.PropertyPath.SetInnerStructMemberEnumInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FSetInnerStructMemberEnumInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.Object->InnerObject->Struct.InnerStruct.EnumTwo = Two; CppTest.Object->InnerObject->SetStruct(CppTest.Object->InnerObject->Struct); PropertyPathHelpers::SetPropertyValue(Test.Object, FString("InnerObject.Struct.InnerStruct.EnumTwo"), Two); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Enum Set"), Test.Object->InnerObject->Struct.InnerStruct.EnumTwo, Two); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Enum Set Cpp Equivalent"), *Test.Object, *CppTest.Object); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), true); // Emphasis, see note under coverage at top GPassing &= TestEqual(TEXT("Inner Object Inner Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Inner Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetPrimitivesTest, "System.PropertyPath.GetPrimitivesTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetPrimitivesTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Bool = CppTest.Object->Bool; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Bool"), Test.ModifiedStruct.Bool); GPassing &= TestEqual(TEXT("Primitive Bool Get"), Test.DefaultStruct.Bool, Test.ModifiedStruct.Bool); GPassing &= TestEqual(TEXT("Primitive Bool Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Primitive Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Integer = CppTest.Object->Integer; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Integer"), Test.ModifiedStruct.Integer); GPassing &= TestEqual(TEXT("Primitive Integer Get"), Test.DefaultStruct.Integer, Test.ModifiedStruct.Integer); GPassing &= TestEqual(TEXT("Primitive Integer Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Primitive Integer Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Integer Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->GetFloat(); PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Primitive Float Get"), Test.DefaultStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Primitive Float Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Primitive Float Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Float Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStringTest, "System.PropertyPath.GetStringTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStringTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.String = CppTest.Object->String; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("String"), Test.ModifiedStruct.String); GPassing &= TestEqual(TEXT("String Get"), Test.DefaultStruct.String, Test.ModifiedStruct.String); GPassing &= TestEqual(TEXT("String Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("String Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("String Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetEnumTest, "System.PropertyPath.GetEnumTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetEnumTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.EnumTwo = CppTest.Object->EnumTwo; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("EnumTwo"), Test.ModifiedStruct.EnumTwo); GPassing &= TestEqual(TEXT("Enum Get"), Test.DefaultStruct.EnumTwo, Test.ModifiedStruct.EnumTwo); GPassing &= TestEqual(TEXT("Enum Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Enum Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Enum Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStructTest, "System.PropertyPath.GetStructTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStructTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct = CppTest.Object->GetStruct(); PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Struct"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Get"), Test.DefaultStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct = CppTest.Object->GetStructRef(); PropertyPathHelpers::GetPropertyValue(Test.Object, FString("StructRef"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Ref Get"), Test.DefaultStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Ref Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct = CppTest.Object->GetStructConstRef(); PropertyPathHelpers::GetPropertyValue(Test.Object, FString("StructConstRef"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Const Ref Get"), Test.DefaultStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Const Ref Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetInnerObjectTest, "System.PropertyPath.GetInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedObject = CppTest.Object->InnerObject; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Inner Object Get"), Test.Object->InnerObject, Test.ModifiedObject); GPassing &= TestEqual(TEXT("Inner Object Get Cpp Equivalent"), *CppTest.ModifiedObject, *Test.ModifiedObject); GPassing &= TestEqual(TEXT("Inner Object Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStructMemberTest, "System.PropertyPath.GetStructMemberTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStructMemberTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->GetStruct().Float; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Struct.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Struct Member Get"), Test.DefaultStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Struct Member Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->GetStructRef().Float; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("StructRef.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Struct Ref Member Get"), Test.DefaultStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Struct Ref Member Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->GetStructConstRef().Float; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("StructConstRef.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Struct Const Ref Member Get"), Test.DefaultStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Struct Const Ref Member Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStructInnerObjectMemberTest, "System.PropertyPath.GetStructInnerObjectMemberTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStructInnerObjectMemberTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedObject = CppTest.Object->GetStruct().InnerObject; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Struct.InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Member Get"), *Test.ModifiedObject, *Test.Object->Struct.InnerObject); GPassing &= TestEqual(TEXT("Struct Member Get Cpp Equivalent"), *CppTest.ModifiedObject, *Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedObject = CppTest.Object->GetStructRef().InnerObject; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("StructRef.InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Ref Member Get"), *Test.ModifiedObject, *Test.Object->StructRef.InnerObject); GPassing &= TestEqual(TEXT("Struct Ref Member Get Cpp Equivalent"), *CppTest.ModifiedObject, *Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedObject = CppTest.Object->GetStructConstRef().InnerObject; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("StructConstRef.InnerObject"), Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Const Ref Member Get"), *Test.ModifiedObject, *Test.Object->StructConstRef.InnerObject); GPassing &= TestEqual(TEXT("Struct Const Ref Member Get Cpp Equivalent"), *CppTest.ModifiedObject, *Test.ModifiedObject); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetInnerStructMemberTest, "System.PropertyPath.GetInnerStructMemberTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetInnerStructMemberTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->GetStruct().InnerStruct.Float; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("Struct.InnerStruct.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Inner Struct Member Get"), Test.DefaultStruct.InnerStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Inner Struct Member Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Struct Getter Called"), Test.Object->IsGetterCalled(), true); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetPrimitivesInnerObjectTest, "System.PropertyPath.GetPrimitivesInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetPrimitivesInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Bool = CppTest.Object->InnerObject->Bool; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Bool"), Test.ModifiedStruct.Bool); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Get"), Test.DefaultStruct.Bool, Test.ModifiedStruct.Bool); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Inner Object Bool Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Integer = CppTest.Object->InnerObject->Integer; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Integer"), Test.ModifiedStruct.Integer); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Get"), Test.DefaultStruct.Integer, Test.ModifiedStruct.Integer); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Inner Object Integer Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Bool Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->InnerObject->GetFloat(); PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Get"), Test.DefaultStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Inner Object Float Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Primitive Float Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Primitive Float Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStringInnerObjectTest, "System.PropertyPath.GetStringInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStringInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.String = CppTest.Object->InnerObject->String; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.String"), Test.ModifiedStruct.String); GPassing &= TestEqual(TEXT("Inner Object String Get"), Test.DefaultStruct.String, Test.ModifiedStruct.String); GPassing &= TestEqual(TEXT("Inner Object String Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object String Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object String Getter Called"), Test.Object->InnerObject->IsGetterCalled(), false); GPassing &= TestEqual(TEXT("String Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("String Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStructInnerObjectTest, "System.PropertyPath.GetStructInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStructInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct = CppTest.Object->InnerObject->GetStruct(); PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Struct"), Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Struct Get"), Test.DefaultStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Struct Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->InnerObject->ResetGetterSetterFlags(); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetStructMemberInnerObjectTest, "System.PropertyPath.GetStructMemberInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetStructMemberInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->InnerObject->GetStruct().Float; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Struct.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Inner Object Struct Member Get"), Test.DefaultStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Inner Object Struct Member Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetInnerStructMemberInnerObjectTest, "System.PropertyPath.GetInnerStructMemberInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetInnerStructMemberInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.Float = CppTest.Object->InnerObject->GetStruct().InnerStruct.Float; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Struct.InnerStruct.Float"), Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Get"), Test.DefaultStruct.InnerStruct.Float, Test.ModifiedStruct.Float); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Inner Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGetInnerStructMemberEnumInnerObjectTest, "System.PropertyPath.GetInnerStructMemberEnumInnerObjectTest", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter) bool FGetInnerStructMemberEnumInnerObjectTest::RunTest(const FString& Parameters) { bool GPassing = true; { FPropertyPathTestBed Test = {}; FPropertyPathTestBed CppTest = {}; CppTest.ModifiedStruct.EnumTwo = CppTest.Object->InnerObject->GetStruct().InnerStruct.EnumTwo; PropertyPathHelpers::GetPropertyValue(Test.Object, FString("InnerObject.Struct.InnerStruct.EnumTwo"), Test.ModifiedStruct.EnumTwo); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Enum Get"), Test.DefaultStruct.InnerStruct.EnumTwo, Test.ModifiedStruct.EnumTwo); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Member Enum Get Cpp Equivalent"), CppTest.ModifiedStruct, Test.ModifiedStruct); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Setter Called"), Test.Object->InnerObject->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Object Inner Struct Getter Called"), Test.Object->InnerObject->IsGetterCalled(), true); GPassing &= TestEqual(TEXT("Inner Struct Setter Called"), Test.Object->IsSetterCalled(), false); GPassing &= TestEqual(TEXT("Inner Struct Getter Called"), Test.Object->IsGetterCalled(), false); Test.Object->ResetGetterSetterFlags(); } return GPassing; } #endif // WITH_DEV_AUTOMATION_TESTS