From 889aca7a0b7a5c3f7e7081f90d6db6a88fb48e2c Mon Sep 17 00:00:00 2001 From: npruehs Date: Fri, 15 May 2020 11:40:29 +0200 Subject: [PATCH] Add comparing primitive number types for order. --- .../Content/TestCompare/BP_TestCompare.uasset | Bin 0 -> 102997 bytes .../Content/TestCompare/TestCompare.umap | Bin 0 -> 47449 bytes .../DaeTestAssertBlueprintFunctionLibrary.cpp | 44 +++++++++ .../DaeTestAssertBlueprintFunctionLibrary.h | 84 ++++++++++++++++++ .../Public/DaeTestComparisonMethod.h | 12 +++ 5 files changed, 140 insertions(+) create mode 100644 DaedalicTestAutomationPlugin/Content/TestCompare/BP_TestCompare.uasset create mode 100644 DaedalicTestAutomationPlugin/Content/TestCompare/TestCompare.umap create mode 100644 DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestComparisonMethod.h diff --git a/DaedalicTestAutomationPlugin/Content/TestCompare/BP_TestCompare.uasset b/DaedalicTestAutomationPlugin/Content/TestCompare/BP_TestCompare.uasset new file mode 100644 index 0000000000000000000000000000000000000000..c1b763260bd6e15b18208e837afdc9358f52ff6e GIT binary patch literal 102997 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 {2}, but was not."); + +const FString UDaeTestAssertBlueprintFunctionLibrary::ErrorMessageFormatGreaterThanOrEqualTo = + TEXT("Assertion failed - {0} - Expected: {1} >= {2}, but was not."); + const FString UDaeTestAssertBlueprintFunctionLibrary::ErrorMessageFormatInRange = TEXT("Assertion failed - {0} - Expected: between {1} and {2}, but was: {3}"); @@ -126,6 +138,14 @@ void UDaeTestAssertBlueprintFunctionLibrary::AssertNotEqualByte(uint8 Actual, ui AssertNotEqual(Context, What, Actual, Unexpected); } +void UDaeTestAssertBlueprintFunctionLibrary::AssertCompareByte(uint8 First, + EDaeTestComparisonMethod ShouldBe, + uint8 Second, const FString& What, + UObject* Context /*= nullptr*/) +{ + AssertCompare(Context, What, First, ShouldBe, Second); +} + void UDaeTestAssertBlueprintFunctionLibrary::AssertEqualInt32(int32 Actual, int32 Expected, const FString& What, UObject* Context /*= nullptr*/) @@ -140,6 +160,14 @@ void UDaeTestAssertBlueprintFunctionLibrary::AssertNotEqualInt32(int32 Actual, i AssertNotEqual(Context, What, Actual, Unexpected); } +void UDaeTestAssertBlueprintFunctionLibrary::AssertCompareInt32(int32 First, + EDaeTestComparisonMethod ShouldBe, + int32 Second, const FString& What, + UObject* Context /*= nullptr*/) +{ + AssertCompare(Context, What, First, ShouldBe, Second); +} + void UDaeTestAssertBlueprintFunctionLibrary::AssertEqualInt64(int64 Actual, int64 Expected, const FString& What, UObject* Context /*= nullptr*/) @@ -154,6 +182,14 @@ void UDaeTestAssertBlueprintFunctionLibrary::AssertNotEqualInt64(int64 Actual, i AssertNotEqual(Context, What, Actual, Unexpected); } +void UDaeTestAssertBlueprintFunctionLibrary::AssertCompareInt64(int64 First, + EDaeTestComparisonMethod ShouldBe, + int64 Second, const FString& What, + UObject* Context /*= nullptr*/) +{ + AssertCompare(Context, What, First, ShouldBe, Second); +} + void UDaeTestAssertBlueprintFunctionLibrary::AssertEqualFloat(float Actual, float Expected, const FString& What, UObject* Context /*= nullptr*/) @@ -176,6 +212,14 @@ void UDaeTestAssertBlueprintFunctionLibrary::AssertNotEqualFloat(float Actual, f } } +void UDaeTestAssertBlueprintFunctionLibrary::AssertCompareFloat(float First, + EDaeTestComparisonMethod ShouldBe, + float Second, const FString& What, + UObject* Context /*= nullptr*/) +{ + AssertCompare(Context, What, First, ShouldBe, Second); +} + void UDaeTestAssertBlueprintFunctionLibrary::AssertEqualName(const FName& Actual, const FName& Expected, bool bIgnoreCase, const FString& What, diff --git a/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestAssertBlueprintFunctionLibrary.h b/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestAssertBlueprintFunctionLibrary.h index 666c3c8..c1872f9 100644 --- a/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestAssertBlueprintFunctionLibrary.h +++ b/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestAssertBlueprintFunctionLibrary.h @@ -1,5 +1,6 @@ #pragma once +#include "DaeTestComparisonMethod.h" #include #include #include "DaeTestAssertBlueprintFunctionLibrary.generated.h" @@ -60,6 +61,12 @@ class DAEDALICTESTAUTOMATIONPLUGIN_API UDaeTestAssertBlueprintFunctionLibrary static void AssertNotEqualByte(uint8 Actual, uint8 Unexpected, const FString& What, UObject* Context = nullptr); + /** Compares the specified bytes for order. */ + UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", + DisplayName = "Assert Compare (Byte)")) + static void AssertCompareByte(uint8 First, EDaeTestComparisonMethod ShouldBe, uint8 Second, + const FString& What, UObject* Context = nullptr); + /** Expects the specified 32-bit integers to be equal. */ UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", DisplayName = "Assert Equal (Integer)")) @@ -72,6 +79,12 @@ class DAEDALICTESTAUTOMATIONPLUGIN_API UDaeTestAssertBlueprintFunctionLibrary static void AssertNotEqualInt32(int32 Actual, int32 Unexpected, const FString& What, UObject* Context = nullptr); + /** Compares the specified 32-bit integers for order. */ + UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", + DisplayName = "Assert Compare (Integer)")) + static void AssertCompareInt32(int32 First, EDaeTestComparisonMethod ShouldBe, int32 Second, + const FString& What, UObject* Context = nullptr); + /** Expects the specified 64-bit integers to be equal. */ UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", DisplayName = "Assert Equal (Integer64)")) @@ -84,6 +97,12 @@ class DAEDALICTESTAUTOMATIONPLUGIN_API UDaeTestAssertBlueprintFunctionLibrary static void AssertNotEqualInt64(int64 Actual, int64 Unexpected, const FString& What, UObject* Context = nullptr); + /** Compares the specified 64-bit integers for order. */ + UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", + DisplayName = "Assert Compare (Integer64)")) + static void AssertCompareInt64(int64 First, EDaeTestComparisonMethod ShouldBe, int64 Second, + const FString& What, UObject* Context = nullptr); + /** Expects the specified floats to be (nearly) equal. */ UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", DisplayName = "Assert Equal (Float)")) @@ -96,6 +115,12 @@ class DAEDALICTESTAUTOMATIONPLUGIN_API UDaeTestAssertBlueprintFunctionLibrary static void AssertNotEqualFloat(float Actual, float Unexpected, const FString& What, UObject* Context = nullptr); + /** Compares the specified floats for order. */ + UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", + DisplayName = "Assert Compare (Float)")) + static void AssertCompareFloat(float First, EDaeTestComparisonMethod ShouldBe, float Second, + const FString& What, UObject* Context = nullptr); + /** Expects the specified names to be equal. */ UFUNCTION(BlueprintCallable, meta = (HidePin = "Context", DefaultToSelf = "Context", DisplayName = "Assert Equal (Name)")) @@ -239,6 +264,10 @@ class DAEDALICTESTAUTOMATIONPLUGIN_API UDaeTestAssertBlueprintFunctionLibrary private: static const FString ErrorMessageFormatEqual; static const FString ErrorMessageFormatNotEqual; + static const FString ErrorMessageFormatLessThan; + static const FString ErrorMessageFormatLessThanOrEqualTo; + static const FString ErrorMessageFormatGreaterThan; + static const FString ErrorMessageFormatGreaterThanOrEqualTo; static const FString ErrorMessageFormatInRange; static const FString ErrorMessageFormatNotInRange; @@ -263,4 +292,59 @@ class DAEDALICTESTAUTOMATIONPLUGIN_API UDaeTestAssertBlueprintFunctionLibrary OnTestFailed(Context, Message); } } + + template + static void AssertCompare(UObject* Context, const FString& What, T First, + EDaeTestComparisonMethod ShouldBe, T Second) + { + bool bFulfilled = false; + + switch (ShouldBe) + { + case EDaeTestComparisonMethod::LessThan: + bFulfilled = First < Second; + break; + + case EDaeTestComparisonMethod::LessThanOrEqualTo: + bFulfilled = First <= Second; + break; + + case EDaeTestComparisonMethod::GreaterThanOrEqualTo: + bFulfilled = First >= Second; + break; + + case EDaeTestComparisonMethod::GreaterThan: + bFulfilled = First > Second; + break; + } + + if (bFulfilled) + { + return; + } + + FString FormatString; + + switch (ShouldBe) + { + case EDaeTestComparisonMethod::LessThan: + FormatString = ErrorMessageFormatLessThan; + break; + + case EDaeTestComparisonMethod::LessThanOrEqualTo: + FormatString = ErrorMessageFormatLessThanOrEqualTo; + break; + + case EDaeTestComparisonMethod::GreaterThanOrEqualTo: + FormatString = ErrorMessageFormatGreaterThanOrEqualTo; + break; + + case EDaeTestComparisonMethod::GreaterThan: + FormatString = ErrorMessageFormatGreaterThan; + break; + } + + FString Message = FString::Format(*FormatString, {What, First, Second}); + OnTestFailed(Context, Message); + } }; diff --git a/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestComparisonMethod.h b/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestComparisonMethod.h new file mode 100644 index 0000000..82afbbd --- /dev/null +++ b/DaedalicTestAutomationPlugin/Source/DaedalicTestAutomationPlugin/Public/DaeTestComparisonMethod.h @@ -0,0 +1,12 @@ +#pragma once + +#include "DaeTestComparisonMethod.generated.h" + +UENUM(BlueprintType) +enum class EDaeTestComparisonMethod : uint8 +{ + LessThan, + LessThanOrEqualTo, + GreaterThanOrEqualTo, + GreaterThan +};