feat(misc): add AssertionMacros.h and the corresponding testing

This commit is contained in:
_Redstone_c_ 2021-12-09 20:25:56 +08:00
parent 271a3f49c3
commit cfb53c21e0
3 changed files with 149 additions and 0 deletions

View File

@ -0,0 +1,70 @@
#include "Testing/AssertionMacrosTesting.h"
#include "Misc/AssertionMacros.h"
NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
void TestNoEntry()
{
check_no_entry();
always_check_no_entry();
}
void TestNoReentry()
{
check_no_reentry();
always_check_no_reentry();
}
void TestNoRecursion(int32 Depth)
{
if (Depth < 0) return;
check_no_recursion();
always_check_no_recursion();
TestNoRecursion(--Depth);
}
void TestUnimplemented()
{
unimplemented();
always_unimplemented();
}
void TestAssertionMacros()
{
check(true);
//check(false);
checkf(true, "True!");
//checkf(false, "False!");
always_check(true);
//always_check(false);
always_checkf(true, "True!");
//always_checkf(false, "False!");
//TestNoEntry();
TestNoReentry();
//TestNoReentry();
TestNoRecursion(0);
TestNoRecursion(0);
//TestNoRecursion(1);
//TestUnimplemented();
verify(true);
//verify(false);
int32 A = 1;
int32 B = 0;
verify(B = A);
always_check(B == A);
}
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END

View File

@ -0,0 +1,66 @@
#pragma once
#include "CoreTypes.h"
#include "Misc/PreprocessorHelpers.h"
#undef NDEBUG
#include <cassert>
NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
NAMESPACE_PRIVATE_BEGIN
class FRecursionScopeMarker
{
public:
FRecursionScopeMarker(uint8& InCounter) : Counter(InCounter) { ++Counter; }
~FRecursionScopeMarker() { --Counter; }
private:
uint8& Counter;
};
#define RS_CHECK_IMPL(InExpr) assert(InExpr)
#define RS_CHECK_F_IMPL(InExpr, InFormat, ...) assert(InExpr)
NAMESPACE_PRIVATE_END
#define always_check(InExpr) RS_CHECK_IMPL(InExpr)
#define always_checkf(InExpr, InFormat, ...) RS_CHECK_F_IMPL(InExpr, InFormat, ##__VA_ARGS__)
#define always_check_no_entry() always_checkf(false, "Enclosing block should never be called.")
#define always_check_no_reentry() { static bool PREPROCESSOR_JOIN(bBeenHere, __LINE__) = false; always_checkf(!PREPROCESSOR_JOIN(bBeenHere, __LINE__), "Enclosing block was called more than once."); PREPROCESSOR_JOIN(bBeenHere, __LINE__) = true; }
#define always_check_no_recursion() static uint8 PREPROCESSOR_JOIN(RecursionCounter, __LINE__) = 0; always_checkf(PREPROCESSOR_JOIN(RecursionCounter, __LINE__) == 0, "Enclosing block was entered recursively."); const NAMESPACE_PRIVATE::FRecursionScopeMarker PREPROCESSOR_JOIN(ScopeMarker, __LINE__)(PREPROCESSOR_JOIN(RecursionCounter, __LINE__))
#define always_unimplemented() always_checkf(false, "Unimplemented function called.")
#if BUILD_DEBUG
# define check(InExpr) always_check(InExpr)
# define checkf(InExpr, InFormat, ...) always_checkf(InExpr, InFormat, ##__VA_ARGS__)
# define check_no_entry() always_check_no_entry()
# define check_no_reentry() always_check_no_reentry()
# define check_no_recursion() always_check_no_recursion()
# define verify(InExpr) always_check(InExpr)
# define verifyf(InExpr, InFormat, ...) always_checkf(InExpr, InFormat, ##__VA_ARGS__)
# define unimplemented() always_unimplemented()
#else
# define check(InExpr)
# define checkf(InExpr, InFormat, ...)
# define check_no_entry()
# define check_no_reentry()
# define check_no_recursion()
# define verify(InExpr) { if(InExpr) { } }
# define verifyf(InExpr, InFormat, ...) { if(InExpr) { } }
# define unimplemented()
#endif
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END

View File

@ -0,0 +1,13 @@
#pragma once
#include "CoreTypes.h"
NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
void REDCRAFTUTILITY_API TestAssertionMacros();
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END