36 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
37 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
49 #include <type_traits>
50 #include <unordered_map>
62 template <
class ParamType>
73 template <
class ParamType>
89 const CodeLocation& code_location);
118 virtual const T*
Current()
const = 0;
128 template <
typename T>
138 if (
this != &other)
impl_.reset(other.
impl_->Clone());
159 return !(*
this == other);
165 std::unique_ptr<ParamIteratorInterface<T>>
impl_;
170 template <
typename T>
187 template <
typename T>
204 std::shared_ptr<const ParamGeneratorInterface<T>>
impl_;
211 template <
typename T,
typename IncrementT>
251 <<
"The program attempted to compare iterators "
252 <<
"from different generators." << std::endl;
253 const int other_index =
254 CheckedDowncastToActualType<const Iterator>(&other)->
index_;
255 return index_ == other_index;
276 const IncrementT& step) {
278 for (
T i = begin; i < end; i = static_cast<T>(
i + step)) end_index++;
297 template <
typename T>
300 template <
typename ForwardIterator>
318 typename ContainerType::const_iterator iterator)
347 <<
"The program attempted to compare iterators "
348 <<
"from different generators." << std::endl;
350 CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
381 template <
class ParamType>
383 return std::to_string(info.
index);
386 template <
typename T =
int>
388 static_assert(
sizeof(
T) == 0,
"Empty arguments are not allowed.");
390 template <
typename T =
int>
397 template <
class TestClass>
405 return new TestClass();
419 template <
class ParamType>
435 template <
class TestSuite>
504 template <
class TestSuite>
533 const char* test_base_name,
537 new TestInfo(test_base_name, meta_factory, std::move(code_location)));
542 GeneratorCreationFunc*
func,
544 const char* file,
int line) {
545 instantiations_.emplace_back(std::move(instantiation_name), func, name_func,
555 bool generated_instantiations =
false;
557 std::string test_suite_name;
558 std::string test_name;
559 for (
const std::shared_ptr<TestInfo>& test_info :
tests_) {
561 const std::string& instantiation_name = instantiation.name;
564 const char* file = instantiation.file;
565 int line = instantiation.line;
567 if (!instantiation_name.empty())
568 test_suite_name = instantiation_name +
"/";
570 test_suite_name.clear();
574 std::set<std::string> test_param_names;
575 for (
const auto& param : generator) {
576 generated_instantiations =
true;
580 std::string param_name =
584 <<
"Parameterized test name '" << param_name
585 <<
"' is invalid (contains spaces, dashes, or any "
586 "non-alphanumeric characters other than underscores), in "
587 << file <<
" line " << line <<
"" << std::endl;
590 <<
"Duplicate parameterized test name '" << param_name <<
"', in "
591 << file <<
" line " << line << std::endl;
593 if (!test_info->test_base_name.empty()) {
594 test_name.append(test_info->test_base_name).append(
"/");
596 test_name += param_name;
598 test_param_names.insert(std::move(param_name));
601 test_suite_name, test_name.c_str(),
607 test_info->test_meta_factory->CreateTestFactory(param));
613 if (!generated_instantiations) {
643 :
name(std::move(name_in)),
659 if (name.empty())
return false;
662 for (std::string::size_type index = 0; index < name.size(); ++index) {
663 if (!
IsAlNum(name[index]) && name[index] !=
'_')
return false;
680 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
681 template <
class TestCase>
683 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
696 delete test_suite_info;
702 template <
class TestSuite>
704 std::string test_suite_name,
CodeLocation code_location) {
710 if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
721 CheckedDowncastToActualType<ParameterizedTestSuiteInfo<TestSuite>>(
725 if (typed_test_info ==
nullptr) {
727 test_suite_name, std::move(code_location));
732 return typed_test_info;
736 test_suite_info->RegisterTests();
740 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
741 template <
class TestCase>
743 std::string test_case_name,
CodeLocation code_location) {
744 return GetTestSuitePatternHolder<TestCase>(std::move(test_case_name),
745 std::move(code_location));
748 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_
787 std::map<std::string, TypeParameterizedTestSuiteInfo>
suites_;
794 template <
class Container>
803 template <typename... Ts>
808 template <
typename T>
810 return ValuesIn(MakeVector<T>(std::make_index_sequence<
sizeof...(Ts)>()));
814 template <
typename T,
size_t... I>
816 return std::vector<T>{
static_cast<T>(v_.template Get<I>())...};
824 template <typename...
T>
825 class CartesianProductGenerator
828 typedef ::std::tuple<T...> ParamType;
832 ~CartesianProductGenerator()
override =
default;
834 ParamIteratorInterface<ParamType>* Begin()
const override {
835 return new Iterator(
this, generators_,
false);
837 ParamIteratorInterface<ParamType>* End()
const override {
838 return new Iterator(
this, generators_,
true);
844 template <
size_t... I>
845 class IteratorImpl<std::index_sequence<I...>>
846 :
public ParamIteratorInterface<ParamType> {
848 IteratorImpl(
const ParamGeneratorInterface<ParamType>* base,
849 const std::tuple<ParamGenerator<T>...>& generators,
852 begin_(std::get<I>(generators).begin()...),
853 end_(std::get<I>(generators).end()...),
854 current_(is_end ? end_ : begin_) {
855 ComputeCurrentValue();
857 ~IteratorImpl()
override =
default;
859 const ParamGeneratorInterface<ParamType>* BaseGenerator()
const override {
864 void Advance()
override {
867 ++std::get<
sizeof...(T) - 1>(current_);
869 AdvanceIfEnd<
sizeof...(T) - 1>();
870 ComputeCurrentValue();
872 ParamIteratorInterface<ParamType>* Clone()
const override {
873 return new IteratorImpl(*
this);
876 const ParamType* Current()
const override {
return current_value_.get(); }
878 bool Equals(
const ParamIteratorInterface<ParamType>& other)
const override {
882 <<
"The program attempted to compare iterators "
883 <<
"from different generators." << std::endl;
884 const IteratorImpl* typed_other =
885 CheckedDowncastToActualType<const IteratorImpl>(&other);
890 if (AtEnd() && typed_other->AtEnd())
return true;
894 (same = same && std::get<I>(current_) ==
895 std::get<I>(typed_other->current_))...};
901 template <
size_t ThisI>
902 void AdvanceIfEnd() {
903 if (std::get<ThisI>(current_) != std::get<ThisI>(end_))
return;
905 bool last = ThisI == 0;
911 constexpr
size_t NextI = ThisI - (ThisI != 0);
912 std::get<ThisI>(current_) = std::get<ThisI>(begin_);
913 ++std::get<NextI>(current_);
914 AdvanceIfEnd<NextI>();
917 void ComputeCurrentValue() {
919 current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);
924 (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};
929 const ParamGeneratorInterface<ParamType>*
const base_;
930 std::tuple<typename ParamGenerator<T>::iterator...> begin_;
931 std::tuple<typename ParamGenerator<T>::iterator...> end_;
932 std::tuple<typename ParamGenerator<T>::iterator...> current_;
933 std::shared_ptr<ParamType> current_value_;
936 using Iterator = IteratorImpl<std::make_index_sequence<
sizeof...(T)>>;
938 std::tuple<ParamGenerator<T>...> generators_;
941 template <
class... Gen>
945 template <
typename... T>
948 new CartesianProductGenerator<T...>(generators_));
955 template <
typename From,
typename To>
959 : generator_(std::move(gen)) {}
962 return new Iterator(
this, generator_.begin(), generator_.end());
965 return new Iterator(
this, generator_.end(), generator_.end());
973 : base_(base), it_(it), end_(end) {
974 if (it_ != end_)
value_ = std::make_shared<To>(
static_cast<To>(*it_));
983 if (it_ != end_)
value_ = std::make_shared<To>(
static_cast<To>(*it_));
993 <<
"The program attempted to compare iterators "
994 <<
"from different generators." << std::endl;
996 CheckedDowncastToActualType<const Iterator>(&other)->it_;
997 return it_ == other_it;
1012 template <
class Gen>
1016 : generator_(std::move(g)) {}
1018 template <
typename T>
1030 #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
::std::unordered_map< std::string, size_t > suite_name_to_info_index_
virtual TypeId GetTestSuiteTypeId() const =0
virtual ParamIteratorInterface< T > * End() const =0
::std::vector< T > ContainerType
::std::vector< std::shared_ptr< TestInfo >> TestInfoContainer
~RangeGenerator() override=default
const ParamGeneratorInterface< T > *const base_
ParamGenerator(const ParamGenerator &other)
static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char *filename, int line_num)
std::tuple< Gen...> generators_
void RegisterInstantiation(const char *test_suite_name)
void operator=(const RangeGenerator &other)
ParamIterator< T > iterator
std::shared_ptr< To > value_
TypeId GetTestSuiteTypeId() const override
const std::unique_ptr< TestMetaFactoryBase< ParamType > > test_meta_factory
Iterator(const ParamGeneratorInterface< T > *base, T value, int index, IncrementT step)
bool operator==(const ParamIterator &other) const
~ParameterizedTestSuiteRegistry()
ParamIteratorInterface< T > * End() const override
void operator=(const Iterator &other)
::std::string PrintToString(const T &value)
const ContainerType container_
virtual ~ParamIteratorInterface()=default
ParamIterator< From > it_
ParameterizedTestSuiteInfo< TestSuite > * GetTestSuitePatternHolder(std::string test_suite_name, CodeLocation code_location)
virtual bool Equals(const ParamIteratorInterface &other) const =0
const ParamGeneratorInterface< To > * BaseGenerator() const override
GeneratorCreationFunc * generator
Iterator(const Iterator &other)
ParameterizedTestSuiteRegistry & operator=(const ParameterizedTestSuiteRegistry &)=delete
constexpr bool Equals(const char(&a)[N], const char(&b)[M])
ParameterizedTestFactory & operator=(const ParameterizedTestFactory &)=delete
const To * Current() const override
ParamConverterGenerator(ParamGenerator< Gen > g)
::std::vector< InstantiationInfo > InstantiationContainer
TestSuiteInfoContainer test_suite_infos_
InstantiationInfo(std::string name_in, GeneratorCreationFunc *generator_in, ParamNameGeneratorFunc *name_func_in, const char *file_in, int line_in)
TestParamInfo(const ParamType &a_param, size_t an_index)
CartesianProductHolder(const Gen &...g)
static bool IsValidParamName(const std::string &name)
const CodeLocation code_location
std::vector< T > MakeVector(std::index_sequence< I...>) const
ParamIteratorInterface< To > * Begin() const override
RangeGenerator(T begin, T end, IncrementT step)
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
std::unique_ptr< const T > value_
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
ParamGenerator & operator=(const ParamGenerator &other)
bool Equals(const ParamIteratorInterface< T > &other) const override
GTEST_API_ void ReportInvalidTestSuiteType(const char *test_suite_name, const CodeLocation &code_location)
ParamIterator(const ParamIterator &other)
Test * CreateTest() override
CodeLocation code_location_
ParamIteratorInterface< T > * Begin() const override
virtual const T * Current() const =0
ParamGenerator< Gen > generator_
ParamIteratorInterface< T > * Clone() const override
ParamIteratorInterface< To > * End() const override
ParameterizedTestSuiteRegistry()=default
const ParamGeneratorInterface< T > *const base_
void RegisterTests() override
ContainerType::const_iterator iterator_
static int CalculateEndIndex(const T &begin, const T &end, const IncrementT &step)
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
Iterator(const ParamGeneratorInterface< To > *base, ParamIterator< From > it, ParamIterator< From > end)
~Iterator() override=default
ParamIteratorInterface< To > * Clone() const override
virtual ~ParamGeneratorInterface()=default
#define GTEST_CHECK_(condition)
TestClass::ParamType ParamType
ParameterizedTestSuiteInfoBase()
ParamIterator operator++(int)
ptrdiff_t difference_type
std::string(const TestParamInfo< ParamType > &) ParamNameGeneratorFunc
ParamGeneratorConverter(ParamGenerator< From > gen)
void operator=(const ValuesInIteratorRangeGenerator &other)
GTEST_DISABLE_MSC_WARNINGS_POP_() inline const char *SkipComma(const char *str)
std::map< std::string, TypeParameterizedTestSuiteInfo > suites_
int AddTestSuiteInstantiation(std::string instantiation_name, GeneratorCreationFunc *func, ParamNameGeneratorFunc *name_func, const char *file, int line)
~ValuesInIteratorRangeGenerator() override=default
ParameterizedTestSuiteInfo & operator=(const ParameterizedTestSuiteInfo &)=delete
const ParamGeneratorInterface< T > * BaseGenerator() const override
bool operator!=(const ParamIterator &other) const
TestInfo(const char *a_test_base_name, TestMetaFactoryBase< ParamType > *a_test_meta_factory, CodeLocation a_code_location)
const std::string test_base_name
ParameterizedTestCaseInfo< TestCase > * GetTestCasePatternHolder(std::string test_case_name, CodeLocation code_location)
virtual ~ParameterizedTestSuiteInfoBase()=default
bool Equals(const ParamIteratorInterface< To > &other) const override
InstantiationContainer instantiations_
const std::string test_suite_name_
virtual void RegisterTests()=0
virtual ParamIteratorInterface< T > * Begin() const =0
std::string operator()(const TestParamInfo< ParamType > &info) const
const ParamType parameter_
::std::vector< ParameterizedTestSuiteInfoBase * > TestSuiteInfoContainer
GTEST_API_ void InsertSyntheticTestCase(const std::string &name, CodeLocation location, bool has_test_p)
GTEST_API_ TestInfo * MakeAndRegisterTestInfo(std::string test_suite_name, const char *name, const char *type_param, const char *value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase *factory)
ParamNameGeneratorFunc * name_func
std::string DefaultParamName(const TestParamInfo< ParamType > &info)
ParamIterator(ParamIteratorInterface< T > *impl)
virtual const ParamGeneratorInterface< T > * BaseGenerator() const =0
ParamIteratorInterface< T > * Begin() const override
ParamGenerator(ParamGeneratorInterface< T > *impl)
const T * operator->() const
ParameterizedTestFactory(ParamType parameter)
const T * Current() const override
ParamIteratorInterface< T > * End() const override
void RegisterTestSuite(const char *test_suite_name, CodeLocation code_location)
TypeParameterizedTestSuiteInfo(CodeLocation c)
void CheckForInstantiations()
static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char *filename, int line_num)
std::unique_ptr< ParamIteratorInterface< T > > impl_
ParamGenerator< From > generator_
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251) class GTEST_API_ TypedTestSuitePState
const ParamGeneratorInterface< To > *const base_
const T func(int n, T *x)
ParameterizedTestSuiteInfo(std::string name, CodeLocation code_location)
Iterator(const ParamGeneratorInterface< T > *base, typename ContainerType::const_iterator iterator)
const std::string & GetTestSuiteName() const override
ParameterizedTestSuiteInfoBase & operator=(const ParameterizedTestSuiteInfoBase &)=delete
virtual ParamIteratorInterface * Clone() const =0
const T & operator*() const
ParamIteratorInterface< T > * Clone() const override
~Iterator() override=default
const ParamGeneratorInterface< T > * BaseGenerator() const override
const T * Current() const override
typename TestSuite::ParamType ParamType
void AddTestPattern(const char *, const char *test_base_name, TestMetaFactoryBase< ParamType > *meta_factory, CodeLocation code_location)
ParamIterator & operator=(const ParamIterator &other)
bool Equals(const ParamIteratorInterface< T > &other) const override
std::shared_ptr< const ParamGeneratorInterface< T > > impl_
virtual const std::string & GetTestSuiteName() const =0
CodeLocation code_location
ParamIterator< From > end_
ParamIterator & operator++()