Fix INSTANTIATE_TEST_CASE_P with zero variadic arguments

This commit is contained in:
Ayaz Salikhov 2019-01-18 14:53:25 +03:00
parent 0adeadd283
commit 7c4164bf40
2 changed files with 32 additions and 7 deletions

View File

@ -544,9 +544,9 @@ internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \
void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()
// The optional last argument to INSTANTIATE_TEST_SUITE_P allows the user // The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify generator
// to specify a function or functor that generates custom test name suffixes // and an optional function or functor that generates custom test name suffixes
// based on the test parameters. The function should accept one argument of // based on the test parameters. Such a function or functor should accept one argument of
// type testing::TestParamInfo<class ParamType>, and return std::string. // type testing::TestParamInfo<class ParamType>, and return std::string.
// //
// testing::PrintToStringParamName is a builtin test suffix generator that // testing::PrintToStringParamName is a builtin test suffix generator that
@ -556,15 +556,15 @@ internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
// alphanumeric characters or underscore. Because PrintToString adds quotes // alphanumeric characters or underscore. Because PrintToString adds quotes
// to std::string and C strings, it won't work for these types. // to std::string and C strings, it won't work for these types.
#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, generator, ...) \ #define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \
static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \ static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \
gtest_##prefix##test_suite_name##_EvalGenerator_() { \ gtest_##prefix##test_suite_name##_EvalGenerator_() { \
return generator; \ return VA_GETFIRST(__VA_ARGS__); \
} \ } \
static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \
const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \ const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \
return ::testing::internal::GetParamNameGen<test_suite_name::ParamType>( \ return ::testing::internal::CreateParamGenerator< \
__VA_ARGS__)(info); \ test_suite_name::ParamType>(VA_GETREST(__VA_ARGS__, 0))(info); \
} \ } \
static int gtest_##prefix##test_suite_name##_dummy_ \ static int gtest_##prefix##test_suite_name##_dummy_ \
GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_ATTRIBUTE_UNUSED_ = \

View File

@ -41,6 +41,7 @@
#include <memory> #include <memory>
#include <set> #include <set>
#include <tuple> #include <tuple>
#include <type_traits>
#include <utility> #include <utility>
#include <vector> #include <vector>
@ -396,6 +397,30 @@ typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() {
return DefaultParamName; return DefaultParamName;
} }
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Macroses allow to address an issue with zero element variadic macro
#define EXPAND(X) X
#define VA__GETFIRST(X, ...) X
#define VA_GETFIRST(...) EXPAND(VA__GETFIRST(__VA_ARGS__, 0))
#define VA_GETREST(X, ...) __VA_ARGS__
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Function is intended to swallow 0 as last argument and call GetParamNameGen
template <class ParamType>
auto CreateParamGenerator(int) -> decltype(GetParamNameGen<ParamType>()) {
return GetParamNameGen<ParamType>();
}
template <class ParamType, class Arg>
auto CreateParamGenerator(Arg&& arg, int) -> decltype(
GetParamNameGen<ParamType>(std::forward<Arg>(arg))) {
return GetParamNameGen<ParamType>(std::forward<Arg>(arg));
}
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
// //
// Stores a parameter value and later creates tests parameterized with that // Stores a parameter value and later creates tests parameterized with that