Skip to content

Commit

Permalink
Add support for variadic
Browse files Browse the repository at this point in the history
  • Loading branch information
slonopotamus committed Aug 2, 2024
1 parent ba79c92 commit b01e9ef
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 22 deletions.
30 changes: 24 additions & 6 deletions Source/UEST/Private/UESTTests.cpp
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
#include "UEST.h"

TEST_CLASS(UEST_TestClass)
TEST_CLASS(TestClass)
{
TEST_METHOD(Test1)
TEST_METHOD(Test1)
{
ASSERT_THAT(true);
ASSERT_THAT(true);
}

TEST_METHOD(Test2)
{
ASSERT_THAT(true);
ASSERT_THAT(true);
}
};

TEST(UEST_Test)
TEST(Test)
{
ASSERT_THAT(true);
}

TEST(Test, With, Deep, Naming)
{
ASSERT_THAT(true);
}

TEST_CLASS(TestClass, With, Deep, Naming)
{
TEST_METHOD(Test1)
{
ASSERT_THAT(true);
}

TEST_METHOD(Test2)
{
ASSERT_THAT(true);
}
};
49 changes: 33 additions & 16 deletions Source/UEST/Public/UEST.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,20 +43,38 @@ struct TUESTInstantiator
#endif
};

#define TEST_CLASS_WITH_BASE(ClassName, BaseClass, PrettyName) \
struct F##ClassName##Impl; \
struct F##ClassName : public BaseClass \
// TODO: Get rid of Boost
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/greater.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/fold_left.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>

#define UEST_CONCAT_SEQ_1(seq, op) BOOST_PP_SEQ_HEAD(seq)
#define UEST_CONCAT_SEQ_N(seq, op) BOOST_PP_SEQ_FOLD_LEFT(op, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq))
#define UEST_CONCAT_SEQ(seq, op) BOOST_PP_IF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(seq), 1), UEST_CONCAT_SEQ_N, UEST_CONCAT_SEQ_1)(seq, op)

#define UEST_PRETTY_NAME_OP(s, state, x) BOOST_PP_CAT(state, BOOST_PP_CAT(., x))
#define UEST_PRETTY_NAME(...) UEST_CONCAT_SEQ(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__), UEST_PRETTY_NAME_OP)

#define UEST_CLASS_NAME_OP(s, state, x) BOOST_PP_CAT(state, BOOST_PP_CAT(_, x))
#define UEST_CLASS_NAME(...) UEST_CONCAT_SEQ(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__), UEST_CLASS_NAME_OP)

#define TEST_CLASS_WITH_BASE_IMPL(BaseClass, ClassName, PrettyName) \
struct BOOST_PP_CAT(F, BOOST_PP_CAT(ClassName, Impl)); \
struct BOOST_PP_CAT(F, ClassName) : public BaseClass \
{ \
typedef BaseClass Super; \
F##ClassName() \
: Super(TEXT(#PrettyName)) \
BOOST_PP_CAT(F, ClassName)() \
: Super(UE_MODULE_NAME "." BOOST_PP_STRINGIZE(PrettyName)) \
{ \
} \
/* This using is needed so Rider understands that we are a runnable test */ \
using Super::RunTest; \
virtual FString GetBeautifiedTestName() const override \
{ \
return TEXT(#PrettyName); \
return UE_MODULE_NAME "." BOOST_PP_STRINGIZE(PrettyName); \
} \
virtual FString GetTestSourceFileName() const override \
{ \
Expand All @@ -67,15 +85,17 @@ struct TUESTInstantiator
return __LINE__; \
} \
}; \
static TUESTInstantiator<F##ClassName##Impl> ClassName##Instantiator; \
struct F##ClassName##Impl : public F##ClassName
static TUESTInstantiator<BOOST_PP_CAT(F, BOOST_PP_CAT(ClassName, Impl))> BOOST_PP_CAT(ClassName, Instantiator); \
struct BOOST_PP_CAT(F, BOOST_PP_CAT(ClassName, Impl)) : public BOOST_PP_CAT(F, ClassName)

#define TEST_CLASS_WITH_BASE(BaseClass, ...) TEST_CLASS_WITH_BASE_IMPL(BaseClass, UEST_CLASS_NAME(__VA_ARGS__), UEST_PRETTY_NAME(__VA_ARGS__))

#define TEST_WITH_BASE(TestName, BaseClass, PrettyName) \
TEST_CLASS_WITH_BASE(TestName, BaseClass, PrettyName) \
#define TEST_WITH_BASE(BaseClass, ...) \
TEST_CLASS_WITH_BASE(BaseClass, __VA_ARGS__) \
{ \
virtual void DoTest(const FString& Parameters) override; \
}; \
void F##TestName##Impl::DoTest(const FString& Parameters)
void BOOST_PP_CAT(BOOST_PP_CAT(F, UEST_CLASS_NAME(__VA_ARGS__)), Impl)::DoTest(const FString& Parameters)

/**
* Simple macro for a test.
Expand All @@ -87,8 +107,7 @@ struct TUESTInstantiator
* ASSERT_THAT(...);
* }
*/
// TODO: Add proper support for variadics
#define TEST(...) TEST_WITH_BASE(__VA_ARGS__, FUESTTestBase, __VA_ARGS__)
#define TEST(...) TEST_WITH_BASE(FUESTTestBase, __VA_ARGS__)

/**
* Declares a test class
Expand All @@ -111,9 +130,7 @@ struct TUESTInstantiator
* // You can put helper fields or methods here
* }
*/
// TODO: Add proper support for variadics
#define TEST_CLASS(...) TEST_CLASS_WITH_BASE(__VA_ARGS__, FUESTTestBase, __VA_ARGS__)
#define TEST_CLASS(...) TEST_CLASS_WITH_BASE(FUESTTestBase, __VA_ARGS__)

// TODO: Add proper support for variadics
// TODO: This is just a stub, we need to register method in test class
#define TEST_METHOD(MethodName) void MethodName()
1 change: 1 addition & 0 deletions Source/UEST/UEST.Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public UEST(ReadOnlyTargetRules Target) : base(Target)
PublicDependencyModuleNames.AddRange(
new[]
{
"Boost",
"Core",
"CoreUObject",
"Engine",
Expand Down

0 comments on commit b01e9ef

Please sign in to comment.