diff options
-rw-r--r-- | googletest/include/gtest/gtest-param-test.h | 14 | ||||
-rw-r--r-- | googletest/include/gtest/internal/gtest-param-util.h | 25 |
2 files changed, 32 insertions, 7 deletions
diff --git a/googletest/include/gtest/gtest-param-test.h b/googletest/include/gtest/gtest-param-test.h index a0eecc69..81b1a4bc 100644 --- a/googletest/include/gtest/gtest-param-test.h +++ b/googletest/include/gtest/gtest-param-test.h @@ -544,9 +544,9 @@ internal::CartesianProductHolder10<Generator1, Generator2, Generator3, GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() -// The optional last argument to INSTANTIATE_TEST_SUITE_P allows the user -// to specify a function or functor that generates custom test name suffixes -// based on the test parameters. The function should accept one argument of +// The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify generator +// and an optional function or functor that generates custom test name suffixes +// based on the test parameters. Such a function or functor should accept one argument of // type testing::TestParamInfo<class ParamType>, and return std::string. // // 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 // 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> \ gtest_##prefix##test_suite_name##_EvalGenerator_() { \ - return generator; \ + return VA_GETFIRST(__VA_ARGS__); \ } \ static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \ - return ::testing::internal::GetParamNameGen<test_suite_name::ParamType>( \ - __VA_ARGS__)(info); \ + return ::testing::internal::CreateParamGenerator< \ + test_suite_name::ParamType>(VA_GETREST(__VA_ARGS__, 0))(info); \ } \ static int gtest_##prefix##test_suite_name##_dummy_ \ GTEST_ATTRIBUTE_UNUSED_ = \ diff --git a/googletest/include/gtest/internal/gtest-param-util.h b/googletest/include/gtest/internal/gtest-param-util.h index bca72539..e0592222 100644 --- a/googletest/include/gtest/internal/gtest-param-util.h +++ b/googletest/include/gtest/internal/gtest-param-util.h @@ -41,6 +41,7 @@ #include <memory> #include <set> #include <tuple> +#include <type_traits> #include <utility> #include <vector> @@ -398,6 +399,30 @@ typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() { // 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. +// // Stores a parameter value and later creates tests parameterized with that // value. template <class TestClass> |