Skip to content

Commit 015a78f

Browse files
committed
[GTest] support for disabling tc - DISABLED_GTEST, DISABLED_SHOULD
1 parent 504fa43 commit 015a78f

File tree

3 files changed

+87
-35
lines changed

3 files changed

+87
-35
lines changed

include/GUnit/Detail/TypeTraits.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ struct contains;
102102

103103
template <class T, class... TArgs>
104104
struct contains<T, std::tuple<TArgs...>>
105-
: std::integral_constant<bool, !std::is_same<std::integer_sequence<bool, false, std::is_same<T, TArgs>::value...>,
106-
std::integer_sequence<bool, std::is_same<T, TArgs>::value..., false>>::value> {
107-
};
105+
: std::integral_constant<bool,
106+
!std::is_same<std::integer_sequence<bool, false, std::is_same<T, TArgs>::value...>,
107+
std::integer_sequence<bool, std::is_same<T, TArgs>::value..., false>>::value> {};
108108

109109
} // detail
110110
} // v1

include/GUnit/GTest.h

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ inline namespace v1 {
2525
namespace detail {
2626

2727
struct TestCaseInfo {
28+
bool disabled = false;
2829
std::string symbol;
2930
std::string type;
3031
std::string name;
@@ -67,6 +68,8 @@ struct TestCaseInfoParser {
6768
};
6869

6970
std::getline(stream, token, '<');
71+
std::getline(stream, token, ',');
72+
ti.disabled = token == "true";
7073
parseString(ti.name);
7174
parseString(ti.file);
7275
std::getline(stream, token, ',');
@@ -85,31 +88,36 @@ inline auto& tests() {
8588
return ts;
8689
}
8790

88-
template <class T>
91+
template <bool DISABLED, class T>
8992
class GTestAutoRegister {
93+
static auto IsDisabled(bool disabled) { return DISABLED || disabled ? "DISABLED_" : ""; }
94+
9095
void MakeAndRegisterTestInfo(const TestCaseInfo& ti,
9196
detail::type<TestInfo*(const char*, const char*, const char*, const char*, const void*,
9297
void (*)(), void (*)(), internal::TestFactoryBase*)>) {
9398
if (ti.should.empty()) {
94-
internal::MakeAndRegisterTestInfo(ti.type.c_str(), ti.name.c_str(), nullptr, nullptr, internal::GetTestTypeId(),
95-
Test::SetUpTestCase, Test::TearDownTestCase, new internal::TestFactoryImpl<T>{});
99+
internal::MakeAndRegisterTestInfo((IsDisabled(ti.disabled) + ti.type).c_str(), ti.name.c_str(), nullptr, nullptr,
100+
internal::GetTestTypeId(), Test::SetUpTestCase, Test::TearDownTestCase,
101+
new internal::TestFactoryImpl<T>{});
96102
} else {
97-
internal::MakeAndRegisterTestInfo((ti.type + ti.name).c_str(), (std::string{GUNIT_SHOULD_PREFIX} + ti.should).c_str(),
98-
nullptr, nullptr, internal::GetTestTypeId(), Test::SetUpTestCase,
99-
Test::TearDownTestCase, new internal::TestFactoryImpl<T>{});
103+
internal::MakeAndRegisterTestInfo((IsDisabled(ti.disabled) + ti.type + ti.name).c_str(),
104+
(std::string{GUNIT_SHOULD_PREFIX} + ti.should).c_str(), nullptr, nullptr,
105+
internal::GetTestTypeId(), Test::SetUpTestCase, Test::TearDownTestCase,
106+
new internal::TestFactoryImpl<T>{});
100107
}
101108
}
102109

103110
template <class... Ts>
104111
void MakeAndRegisterTestInfo(const TestCaseInfo& ti, detail::type<TestInfo*(Ts...)>) {
105112
if (ti.should.empty()) {
106-
internal::MakeAndRegisterTestInfo(ti.type.c_str(), ti.name.c_str(), nullptr, nullptr, {ti.file.c_str(), ti.line},
107-
internal::GetTestTypeId(), Test::SetUpTestCase, Test::TearDownTestCase,
108-
new internal::TestFactoryImpl<T>{});
113+
internal::MakeAndRegisterTestInfo((IsDisabled(ti.disabled) + ti.type).c_str(), ti.name.c_str(), nullptr, nullptr,
114+
{ti.file.c_str(), ti.line}, internal::GetTestTypeId(), Test::SetUpTestCase,
115+
Test::TearDownTestCase, new internal::TestFactoryImpl<T>{});
109116
} else {
110-
internal::MakeAndRegisterTestInfo((ti.type + ti.name).c_str(), (std::string{GUNIT_SHOULD_PREFIX} + ti.should).c_str(),
111-
nullptr, nullptr, {ti.file.c_str(), ti.line}, internal::GetTestTypeId(),
112-
Test::SetUpTestCase, Test::TearDownTestCase, new internal::TestFactoryImpl<T>{});
117+
internal::MakeAndRegisterTestInfo((IsDisabled(ti.disabled) + ti.type + ti.name).c_str(),
118+
(std::string{GUNIT_SHOULD_PREFIX} + ti.should).c_str(), nullptr, nullptr,
119+
{ti.file.c_str(), ti.line}, internal::GetTestTypeId(), Test::SetUpTestCase,
120+
Test::TearDownTestCase, new internal::TestFactoryImpl<T>{});
113121
}
114122
}
115123

@@ -143,7 +151,7 @@ class GTestAutoRegister {
143151
UnitTest::GetInstance()
144152
->parameterized_test_registry()
145153
.GetTestCasePatternHolder<T>(ti.type.c_str(), {ti.file, ti.line})
146-
->AddTestPattern(ti.type.c_str(), std::string{GUNIT_SHOULD_PREFIX + ti.should}.c_str(),
154+
->AddTestPattern((IsDisabled(ti.disabled) + ti.type).c_str(), std::string{GUNIT_SHOULD_PREFIX + ti.should}.c_str(),
147155
new internal::TestMetaFactory<T>());
148156
registered = true;
149157
}
@@ -154,9 +162,14 @@ class GTestAutoRegister {
154162
public:
155163
GTestAutoRegister() {
156164
if (!RegisterShouldTestCase()) {
157-
MakeAndRegisterTestInfo(
158-
{{}, GetTypeName(detail::type<typename T::TEST_TYPE>{}), T::TEST_NAME::c_str(), T::TEST_FILE, T::TEST_LINE, {}},
159-
detail::type<decltype(internal::MakeAndRegisterTestInfo)>{});
165+
MakeAndRegisterTestInfo({DISABLED,
166+
{},
167+
GetTypeName(detail::type<typename T::TEST_TYPE>{}),
168+
T::TEST_NAME::c_str(),
169+
T::TEST_FILE,
170+
T::TEST_LINE,
171+
{}},
172+
detail::type<decltype(internal::MakeAndRegisterTestInfo)>{});
160173
}
161174
}
162175

@@ -173,7 +186,8 @@ class GTestAutoRegister {
173186
UnitTest::GetInstance()
174187
->parameterized_test_registry()
175188
.GetTestCasePatternHolder<T>(GetTypeName(detail::type<typename T::TEST_TYPE>{}), {T::TEST_FILE, T::TEST_LINE})
176-
->AddTestCaseInstantiation(T::TEST_NAME::c_str(), eval, genNames, T::TEST_FILE, T::TEST_LINE);
189+
->AddTestCaseInstantiation((std::string{IsDisabled(DISABLED)} + T::TEST_NAME::c_str()).c_str(), eval, genNames,
190+
T::TEST_FILE, T::TEST_LINE);
177191
}
178192
};
179193

@@ -210,7 +224,7 @@ class GTest<T, TParamType, std::false_type, TAny> : public Test {
210224
template <class T, class TParamType>
211225
class GTest<T, TParamType, std::true_type, std::true_type> : public T {};
212226

213-
template <class Name, class File, int Line, class Should, class T>
227+
template <bool Disabled, class Name, class File, int Line, class Should, class T>
214228
bool SHOULD_REGISTER_GTEST() {
215229
static auto shouldRegister = true;
216230
return shouldRegister;
@@ -223,7 +237,7 @@ class GTest : public detail::GTest<T, TParamType> {};
223237
} // v1
224238
} // testing
225239

226-
#define __GTEST_IMPL(TYPE, NAME, PARAMS, ...) \
240+
#define __GTEST_IMPL(DISABLED, TYPE, NAME, PARAMS, ...) \
227241
struct __GUNIT_CAT(GTEST_STRING_, __LINE__) { \
228242
const char* chrs = #TYPE; \
229243
}; \
@@ -244,16 +258,17 @@ class GTest : public detail::GTest<T, TParamType> {};
244258
static constexpr auto TEST_LINE = __LINE__; \
245259
void TestBody(); \
246260
}; \
247-
static ::testing::detail::GTestAutoRegister<GTEST<__GUNIT_CAT(GTEST_TYPE_, __LINE__), NAME>> __GUNIT_CAT( \
261+
static ::testing::detail::GTestAutoRegister<DISABLED, GTEST<__GUNIT_CAT(GTEST_TYPE_, __LINE__), NAME>> __GUNIT_CAT( \
248262
ar, __LINE__){__VA_ARGS__}; \
249263
void GTEST<__GUNIT_CAT(GTEST_TYPE_, __LINE__), NAME>::TestBody()
250264

251-
#define __GTEST_IMPL_1(TYPE) __GTEST_IMPL(TYPE, ::testing::detail::string<>, ::testing::detail::type<void>{}, )
252-
#define __GTEST_IMPL_2(TYPE, NAME) \
265+
#define __GTEST_IMPL_1(DISABLED, TYPE) \
266+
__GTEST_IMPL(DISABLED, TYPE, ::testing::detail::string<>, ::testing::detail::type<void>{}, )
267+
#define __GTEST_IMPL_2(DISABLED, TYPE, NAME) \
253268
using __GUNIT_CAT(GTEST_TEST_NAME, __LINE__) = decltype(__GUNIT_CAT(NAME, _gtest_string)); \
254-
__GTEST_IMPL(TYPE, __GUNIT_CAT(GTEST_TEST_NAME, __LINE__), ::testing::detail::type<void>{}, )
269+
__GTEST_IMPL(DISABLED, TYPE, __GUNIT_CAT(GTEST_TEST_NAME, __LINE__), ::testing::detail::type<void>{}, )
255270

256-
#define __GTEST_IMPL_3(TYPE, NAME, PARAMS) \
271+
#define __GTEST_IMPL_3(DISABLED, TYPE, NAME, PARAMS) \
257272
using __GUNIT_CAT(GTEST_TEST_NAME, __LINE__) = decltype(__GUNIT_CAT(NAME, _gtest_string)); \
258273
static ::testing::internal::ParamGenerator<::testing::detail::apply_t<std::common_type_t, decltype(PARAMS)>> __GUNIT_CAT( \
259274
GTEST_EVAL, __LINE__)() { \
@@ -263,13 +278,20 @@ class GTest : public detail::GTest<T, TParamType> {};
263278
const ::testing::TestParamInfo<::testing::detail::apply_t<std::common_type_t, decltype(PARAMS)>>& info) { \
264279
return ::testing::internal::GetParamNameGen<::testing::detail::apply_t<std::common_type_t, decltype(PARAMS)>>()(info); \
265280
} \
266-
__GTEST_IMPL(TYPE, __GUNIT_CAT(GTEST_TEST_NAME, __LINE__), PARAMS, &__GUNIT_CAT(GTEST_EVAL, __LINE__), \
281+
__GTEST_IMPL(DISABLED, TYPE, __GUNIT_CAT(GTEST_TEST_NAME, __LINE__), PARAMS, &__GUNIT_CAT(GTEST_EVAL, __LINE__), \
267282
&__GUNIT_CAT(GTEST_GENERATE_NAMES, __LINE__))
268283

269-
#define GTEST(...) __GUNIT_CAT(__GTEST_IMPL_, __GUNIT_SIZE(__VA_ARGS__))(__VA_ARGS__)
284+
#define GTEST(...) __GUNIT_CAT(__GTEST_IMPL_, __GUNIT_SIZE(__VA_ARGS__))(false, __VA_ARGS__)
285+
#define DISABLED_GTEST(...) __GUNIT_CAT(__GTEST_IMPL_, __GUNIT_SIZE(__VA_ARGS__))(true, __VA_ARGS__)
270286

271287
#define SHOULD(NAME) \
272-
if (::testing::detail::SHOULD_REGISTER_GTEST<TEST_NAME, decltype(__GUNIT_CAT(__FILE__, _gtest_string)), __LINE__, \
288+
if (::testing::detail::SHOULD_REGISTER_GTEST<false, TEST_NAME, decltype(__GUNIT_CAT(__FILE__, _gtest_string)), __LINE__, \
289+
decltype(__GUNIT_CAT(NAME, _gtest_string)), TEST_TYPE>() && \
290+
std::string{::testing::UnitTest::GetInstance()->current_test_info()->name()}.find(std::string{GUNIT_SHOULD_PREFIX} + \
291+
NAME) != std::string::npos)
292+
293+
#define DISABLED_SHOULD(NAME) \
294+
if (::testing::detail::SHOULD_REGISTER_GTEST<true, TEST_NAME, decltype(__GUNIT_CAT(__FILE__, _gtest_string)), __LINE__, \
273295
decltype(__GUNIT_CAT(NAME, _gtest_string)), TEST_TYPE>() && \
274296
std::string{::testing::UnitTest::GetInstance()->current_test_info()->name()}.find(std::string{GUNIT_SHOULD_PREFIX} + \
275297
NAME) != std::string::npos)

test/GTest.cpp

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ TEST(GTest, ShouldParseGivenStringAndProduceTestCaseInfo) {
3434
using namespace testing::detail;
3535
TestCaseInfoParser parser;
3636
const auto ti = parser.parse(
37-
"bool SHOULD_REGISTER_GTEST<testing::v1::detail::string<(char)97, (char)98>, testing::v1::detail::string<(char)98>, "
37+
"bool SHOULD_REGISTER_GTEST<true, testing::v1::detail::string<(char)97, (char)98>, "
38+
"testing::v1::detail::string<(char)98>, "
3839
"42ul, testing::v1::detail::string<(char)99, (char)100>, type >()::shouldRegister");
40+
EXPECT_TRUE(ti.disabled);
3941
EXPECT_EQ(std::string{"ab"}, ti.name);
4042
EXPECT_EQ(std::string{"b"}, ti.file);
4143
EXPECT_EQ(42, ti.line);
@@ -47,8 +49,10 @@ TEST(GTest, ShouldParseGivenStringWithTemplateTypeAndProduceTestCaseInfo) {
4749
using namespace testing::detail;
4850
TestCaseInfoParser parser;
4951
const auto ti = parser.parse(
50-
"bool SHOULD_REGISTER_GTEST<testing::v1::detail::string<(char)97, (char)98>, testing::v1::detail::string<(char)98>, "
52+
"bool SHOULD_REGISTER_GTEST<false, testing::v1::detail::string<(char)97, (char)98>, "
53+
"testing::v1::detail::string<(char)98>, "
5154
"42ul, testing::v1::detail::string<(char)99, (char)100>, n::type<int, other<float, double>, short> >()::shouldRegister");
55+
EXPECT_FALSE(ti.disabled);
5256
EXPECT_EQ(std::string{"ab"}, ti.name);
5357
EXPECT_EQ(std::string{"b"}, ti.file);
5458
EXPECT_EQ(42, ti.line);
@@ -60,8 +64,9 @@ TEST(GTest, ShouldParseGivenStringWithStringAsTypeAndProduceTestCaseInfo) {
6064
using namespace testing::detail;
6165
TestCaseInfoParser parser;
6266
const auto ti = parser.parse(
63-
"bool SHOULD_REGISTER_GTEST<testing::detail::string<(char)97, (char)98>, testing::detail::string<(char)98>, 42ul, "
67+
"bool SHOULD_REGISTER_GTEST<true, testing::detail::string<(char)97, (char)98>, testing::detail::string<(char)98>, 42ul, "
6468
"testing::detail::string<(char)99, (char)100>, testing::detail::string<(char)97, (char)99> >()::shouldRegister");
69+
EXPECT_TRUE(ti.disabled);
6570
EXPECT_EQ(std::string{"ab"}, ti.name);
6671
EXPECT_EQ(std::string{"b"}, ti.file);
6772
EXPECT_EQ(42, ti.line);
@@ -73,8 +78,9 @@ TEST(GTest, ShouldParseGivenEmptyStringAndProduceTestCaseInfo) {
7378
using namespace testing::detail;
7479
TestCaseInfoParser parser;
7580
const auto ti = parser.parse(
76-
"bool SHOULD_REGISTER_GTEST<testing::detail::string<>, testing::detail::string<(char)98>, 42ul, "
81+
"bool SHOULD_REGISTER_GTEST<true, testing::detail::string<>, testing::detail::string<(char)98>, 42ul, "
7782
"testing::detail::string<(char)99, (char)100>, testing::detail::string<(char)97, (char)99> >()::shouldRegister");
83+
EXPECT_TRUE(ti.disabled);
7884
EXPECT_EQ(std::string{}, ti.name);
7985
EXPECT_EQ(std::string{"b"}, ti.file);
8086
EXPECT_EQ(42, ti.line);
@@ -86,7 +92,8 @@ TEST(GTest, ShouldParseComplexStringAndProduceTestCaseInfo) {
8692
using namespace testing::detail;
8793
TestCaseInfoParser parser;
8894
const auto ti = parser.parse(
89-
"bool testing::v1::detail::SHOULD_REGISTER_GTEST<testing::v1::detail::string<>, testing::v1::detail::string<(char)47, "
95+
"bool testing::v1::detail::SHOULD_REGISTER_GTEST<true, testing::v1::detail::string<>, "
96+
"testing::v1::detail::string<(char)47, "
9097
"(char)104, (char)111, (char)109, (char)101, (char)47, (char)107, (char)114, (char)105, (char)115, (char)47, (char)80, "
9198
"(char)114, (char)111, (char)106, (char)101, (char)99, (char)116, (char)115, (char)47, (char)71, (char)85, (char)110, "
9299
"(char)105, (char)116, (char)47, (char)116, (char)101, (char)115, (char)116, (char)47, (char)71, (char)84, (char)101, "
@@ -95,6 +102,7 @@ TEST(GTest, ShouldParseComplexStringAndProduceTestCaseInfo) {
95102
"(char)117, (char)108, (char)116, (char)32, (char)99, (char)111, (char)110, (char)115, (char)116, (char)114, (char)117, "
96103
"(char)99, (char)116, (char)105, (char)98, (char)108, (char)101, (char)32, (char)116, (char)121, (char)112, (char)101>, "
97104
"is_default_constructible>()::shouldRegister");
105+
EXPECT_TRUE(ti.disabled);
98106
EXPECT_EQ(std::string{}, ti.name);
99107
EXPECT_EQ(std::string{"/home/kris/Projects/GUnit/test/GTest.cpp"}, ti.file);
100108
EXPECT_EQ(797, ti.line);
@@ -929,6 +937,28 @@ GTEST("Test2") {
929937
SHOULD("call this one but not this one") {}
930938
}
931939

940+
DISABLED_GTEST("TestDisabled1") {}
941+
DISABLED_GTEST("TestDisabled2", "[]") {}
942+
DISABLED_GTEST("TestDisabled3", "[]") {
943+
SHOULD("a") {}
944+
SHOULD("b") {}
945+
}
946+
947+
GTEST("TestDisabled4", "[]") {
948+
DISABLED_SHOULD("a") {}
949+
SHOULD("b") {}
950+
}
951+
952+
DISABLED_GTEST("TestDisabled5", "[]") {
953+
DISABLED_SHOULD("a") {}
954+
DISABLED_SHOULD("b") {}
955+
}
956+
957+
GTEST("TestDisabled6", "[]", testing::Values(1, 2, 3)) {
958+
SHOULD("a") {}
959+
DISABLED_SHOULD("b") {}
960+
}
961+
932962
// clang-format off
933963
#if __has_include(<boost/di.hpp>)
934964
// clang-format on

0 commit comments

Comments
 (0)