36#ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
37#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
61template <
class ParamType>
72 template <
class ParamType>
88 CodeLocation code_location);
91class ParamGeneratorInterface;
137 if (
this != &other) impl_.reset(other.impl_->Clone());
155 return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
158 return !(*
this == other);
164 std::unique_ptr<ParamIteratorInterface<T>> impl_;
203 std::shared_ptr<const ParamGeneratorInterface<T>> impl_;
210template <
typename T,
typename IncrementT>
217 end_index_(CalculateEndIndex(begin, end, step)) {}
221 return new Iterator(
this, begin_, 0, step_);
224 return new Iterator(
this, end_, end_index_, step_);
232 : base_(base), value_(
value), index_(index), step_(step) {}
233 ~Iterator()
override =
default;
235 const ParamGeneratorInterface<T>* BaseGenerator()
const override {
238 void Advance()
override {
239 value_ =
static_cast<T>(value_ + step_);
242 ParamIteratorInterface<T>* Clone()
const override {
243 return new Iterator(*
this);
245 const T* Current()
const override {
return &value_; }
246 bool Equals(
const ParamIteratorInterface<T>& other)
const override {
250 <<
"The program attempted to compare iterators "
251 <<
"from different generators." << std::endl;
252 const int other_index =
254 return index_ == other_index;
258 Iterator(
const Iterator& other)
259 : ParamIteratorInterface<
T>(),
261 value_(other.value_),
262 index_(other.index_),
263 step_(other.step_) {}
266 void operator=(
const Iterator& other);
268 const ParamGeneratorInterface<T>*
const base_;
271 const IncrementT step_;
274 static int CalculateEndIndex(
const T& begin,
const T& end,
275 const IncrementT& step) {
286 const IncrementT step_;
289 const int end_index_;
299 template <
typename ForwardIterator>
301 : container_(begin, end) {}
305 return new Iterator(
this, container_.begin());
308 return new Iterator(
this, container_.end());
312 typedef typename ::std::vector<T> ContainerType;
317 typename ContainerType::const_iterator iterator)
318 : base_(base), iterator_(iterator) {}
319 ~Iterator()
override =
default;
321 const ParamGeneratorInterface<T>* BaseGenerator()
const override {
324 void Advance()
override {
328 ParamIteratorInterface<T>* Clone()
const override {
329 return new Iterator(*
this);
338 const T* Current()
const override {
339 if (value_.get() ==
nullptr) value_.reset(
new T(*iterator_));
342 bool Equals(
const ParamIteratorInterface<T>& other)
const override {
346 <<
"The program attempted to compare iterators "
347 <<
"from different generators." << std::endl;
353 Iterator(
const Iterator& other)
356 : ParamIteratorInterface<
T>(),
358 iterator_(other.iterator_) {}
360 const ParamGeneratorInterface<T>*
const base_;
361 typename ContainerType::const_iterator iterator_;
367 mutable std::unique_ptr<const T> value_;
373 const ContainerType container_;
380template <
class ParamType>
383 name_stream << info.
index;
387template <
typename T =
int>
389 static_assert(
sizeof(
T) == 0,
"Empty arguments are not allowed.");
391template <
typename T =
int>
398template <
class TestClass>
403 : parameter_(parameter) {}
405 TestClass::SetParam(¶meter_);
406 return new TestClass();
420template <
class ParamType>
436template <
class TestSuite>
505template <
class TestSuite>
518 : test_suite_name_(name), code_location_(code_location) {}
522 return test_suite_name_;
535 tests_.push_back(std::shared_ptr<TestInfo>(
new TestInfo(
536 test_suite_name, test_base_name, meta_factory, code_location)));
541 GeneratorCreationFunc* func,
543 const char* file,
int line) {
544 instantiations_.push_back(
545 InstantiationInfo(instantiation_name, func, name_func, file, line));
554 bool generated_instantiations =
false;
556 for (
typename TestInfoContainer::iterator test_it = tests_.begin();
557 test_it != tests_.end(); ++test_it) {
558 std::shared_ptr<TestInfo> test_info = *test_it;
559 for (
typename InstantiationContainer::iterator gen_it =
560 instantiations_.begin();
561 gen_it != instantiations_.end(); ++gen_it) {
562 const std::string& instantiation_name = gen_it->name;
565 const char* file = gen_it->file;
566 int line = gen_it->line;
568 std::string test_suite_name;
569 if (!instantiation_name.empty())
570 test_suite_name = instantiation_name +
"/";
571 test_suite_name += test_info->test_suite_base_name;
574 std::set<std::string> test_param_names;
577 param_it != generator.
end(); ++param_it, ++
i) {
578 generated_instantiations =
true;
582 std::string param_name =
586 <<
"Parameterized test name '" << param_name
587 <<
"' is invalid, in " << file <<
" line " << line << std::endl;
590 <<
"Duplicate parameterized test name '" << param_name <<
"', in "
591 << file <<
" line " << line << std::endl;
593 test_param_names.insert(param_name);
595 if (!test_info->test_base_name.empty()) {
596 test_name_stream << test_info->test_base_name <<
"/";
598 test_name_stream << param_name;
600 test_suite_name.c_str(), test_name_stream.
GetString().c_str(),
606 test_info->test_meta_factory->CreateTestFactory(*param_it));
611 if (!generated_instantiations) {
622 TestInfo(
const char* a_test_suite_base_name,
const char* a_test_base_name,
625 : test_suite_base_name(a_test_suite_base_name),
626 test_base_name(a_test_base_name),
627 test_meta_factory(a_test_meta_factory),
628 code_location(a_code_location) {}
630 const std::string test_suite_base_name;
631 const std::string test_base_name;
632 const std::unique_ptr<TestMetaFactoryBase<ParamType>> test_meta_factory;
633 const CodeLocation code_location;
635 using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo>>;
639 struct InstantiationInfo {
640 InstantiationInfo(
const std::string& name_in,
641 GeneratorCreationFunc* generator_in,
645 generator(generator_in),
646 name_func(name_func_in),
651 GeneratorCreationFunc* generator;
656 typedef ::std::vector<InstantiationInfo> InstantiationContainer;
658 static bool IsValidParamName(
const std::string& name) {
660 if (name.empty())
return false;
663 for (std::string::size_type index = 0; index < name.size(); ++index) {
664 if (!
IsAlNum(name[index]) && name[index] !=
'_')
return false;
670 const std::string test_suite_name_;
671 CodeLocation code_location_;
672 TestInfoContainer tests_;
673 InstantiationContainer instantiations_;
681#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
682template <
class TestCase>
696 for (
auto& test_suite_info : test_suite_infos_) {
697 delete test_suite_info;
703 template <
class TestSuite>
705 const char* test_suite_name,
CodeLocation code_location) {
707 for (
auto& test_suite_info : test_suite_infos_) {
708 if (test_suite_info->GetTestSuiteName() == test_suite_name) {
725 if (typed_test_info ==
nullptr) {
727 test_suite_name, code_location);
728 test_suite_infos_.push_back(typed_test_info);
730 return typed_test_info;
733 for (
auto& test_suite_info : test_suite_infos_) {
734 test_suite_info->RegisterTests();
738#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
739 template <
class TestCase>
741 const char* test_case_name,
CodeLocation code_location) {
748 using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;
750 TestSuiteInfoContainer test_suite_infos_;
775 struct TypeParameterizedTestSuiteInfo {
777 : code_location(c), instantiated(
false) {}
783 std::map<std::string, TypeParameterizedTestSuiteInfo> suites_;
790template <
class Container>
792 const Container& container);
799template <typename... Ts>
804 template <
typename T>
810 template <
typename T,
size_t... I>
812 return std::vector<T>{
static_cast<T>(v_.template Get<I>())...};
820template <typename...
T>
831 return new Iterator(
this, generators_,
false);
834 return new Iterator(
this, generators_,
true);
840 template <
size_t... I>
848 begin_(
std::get<I>(generators).begin()...),
849 end_(
std::get<I>(generators).end()...),
850 current_(is_end ? end_ : begin_) {
851 ComputeCurrentValue();
853 ~IteratorImpl()
override =
default;
855 const ParamGeneratorInterface<ParamType>* BaseGenerator()
const override {
860 void Advance()
override {
863 ++std::get<
sizeof...(T) - 1>(current_);
865 AdvanceIfEnd<
sizeof...(T) - 1>();
866 ComputeCurrentValue();
868 ParamIteratorInterface<ParamType>* Clone()
const override {
869 return new IteratorImpl(*
this);
872 const ParamType* Current()
const override {
return current_value_.get(); }
874 bool Equals(
const ParamIteratorInterface<ParamType>& other)
const override {
878 <<
"The program attempted to compare iterators "
879 <<
"from different generators." << std::endl;
880 const IteratorImpl* typed_other =
881 CheckedDowncastToActualType<const IteratorImpl>(&other);
886 if (AtEnd() && typed_other->AtEnd())
return true;
890 (same = same && std::get<I>(current_) ==
891 std::get<I>(typed_other->current_))...};
897 template <
size_t ThisI>
898 void AdvanceIfEnd() {
899 if (std::get<ThisI>(current_) != std::get<ThisI>(end_))
return;
901 bool last = ThisI == 0;
907 constexpr size_t NextI = ThisI - (ThisI != 0);
908 std::get<ThisI>(current_) = std::get<ThisI>(begin_);
909 ++std::get<NextI>(current_);
910 AdvanceIfEnd<NextI>();
913 void ComputeCurrentValue() {
915 current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);
920 (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};
925 const ParamGeneratorInterface<ParamType>*
const base_;
926 std::tuple<typename ParamGenerator<T>::iterator...> begin_;
927 std::tuple<typename ParamGenerator<T>::iterator...> end_;
928 std::tuple<typename ParamGenerator<T>::iterator...> current_;
929 std::shared_ptr<ParamType> current_value_;
934 std::tuple<ParamGenerator<T>...> generators_;
937template <
class... Gen>
941 template <
typename...
T>
948 std::tuple<Gen...> generators_;
951template <
typename From,
typename To>
955 : generator_(
std::move(gen)) {}
958 return new Iterator(
this, generator_.
begin(), generator_.
end());
961 return new Iterator(
this, generator_.
end(), generator_.
end());
969 : base_(base), it_(it), end_(end) {
970 if (it_ != end_) value_ = std::make_shared<To>(
static_cast<To>(*it_));
972 ~Iterator()
override =
default;
974 const ParamGeneratorInterface<To>* BaseGenerator()
const override {
977 void Advance()
override {
979 if (it_ != end_) value_ = std::make_shared<To>(
static_cast<To
>(*it_));
981 ParamIteratorInterface<To>* Clone()
const override {
982 return new Iterator(*
this);
984 const To* Current()
const override {
return value_.get(); }
985 bool Equals(
const ParamIteratorInterface<To>& other)
const override {
989 <<
"The program attempted to compare iterators "
990 <<
"from different generators." << std::endl;
991 const ParamIterator<From> other_it =
993 return it_ == other_it;
997 Iterator(
const Iterator& other) =
default;
999 const ParamGeneratorInterface<To>*
const base_;
1000 ParamIterator<From> it_;
1001 ParamIterator<From> end_;
1002 std::shared_ptr<To> value_;
1005 ParamGenerator<From> generator_;
1012 : generator_(
std::move(g)) {}
1014 template <
typename T>
Definition gtest-message.h:101
std::string GetString() const
Definition gtest.cc:1301
Definition gtest-param-util.h:822
ParamIteratorInterface< ParamType > * Begin() const override
Definition gtest-param-util.h:830
~CartesianProductGenerator() override=default
ParamIteratorInterface< ParamType > * End() const override
Definition gtest-param-util.h:833
::std::tuple< T... > ParamType
Definition gtest-param-util.h:824
CartesianProductGenerator(const std::tuple< ParamGenerator< T >... > &g)
Definition gtest-param-util.h:826
Definition gtest-param-util.h:938
CartesianProductHolder(const Gen &... g)
Definition gtest-param-util.h:940
Definition gtest-param-util.h:1009
ParamConverterGenerator(ParamGenerator< Gen > g)
Definition gtest-param-util.h:1011
Definition gtest-param-util.h:952
ParamIteratorInterface< To > * End() const override
Definition gtest-param-util.h:960
ParamGeneratorConverter(ParamGenerator< From > gen)
Definition gtest-param-util.h:954
ParamIteratorInterface< To > * Begin() const override
Definition gtest-param-util.h:957
Definition gtest-param-util.h:170
virtual ParamIteratorInterface< T > * End() const =0
virtual ~ParamGeneratorInterface()=default
T ParamType
Definition gtest-param-util.h:172
virtual ParamIteratorInterface< T > * Begin() const =0
Definition gtest-param-util.h:187
iterator begin() const
Definition gtest-param-util.h:199
ParamIterator< T > iterator
Definition gtest-param-util.h:189
ParamGenerator(const ParamGenerator &other)
Definition gtest-param-util.h:192
ParamGenerator(ParamGeneratorInterface< T > *impl)
Definition gtest-param-util.h:191
iterator end() const
Definition gtest-param-util.h:200
ParamGenerator & operator=(const ParamGenerator &other)
Definition gtest-param-util.h:194
Definition gtest-param-util.h:98
virtual ParamIteratorInterface * Clone() const =0
virtual const ParamGeneratorInterface< T > * BaseGenerator() const =0
virtual const T * Current() const =0
virtual ~ParamIteratorInterface()=default
virtual bool Equals(const ParamIteratorInterface &other) const =0
Definition gtest-param-util.h:128
T value_type
Definition gtest-param-util.h:130
ptrdiff_t difference_type
Definition gtest-param-util.h:132
const T & operator*() const
Definition gtest-param-util.h:141
bool operator!=(const ParamIterator &other) const
Definition gtest-param-util.h:157
ParamIterator & operator++()
Definition gtest-param-util.h:144
ParamIterator(const ParamIterator &other)
Definition gtest-param-util.h:135
const T * operator->() const
Definition gtest-param-util.h:142
const T & reference
Definition gtest-param-util.h:131
ParamIterator & operator=(const ParamIterator &other)
Definition gtest-param-util.h:136
bool operator==(const ParamIterator &other) const
Definition gtest-param-util.h:154
ParamIterator operator++(int)
Definition gtest-param-util.h:149
Definition gtest-param-util.h:399
ParameterizedTestFactory(ParamType parameter)
Definition gtest-param-util.h:402
Test * CreateTest() override
Definition gtest-param-util.h:404
TestClass::ParamType ParamType
Definition gtest-param-util.h:401
Definition gtest-param-util.h:463
ParameterizedTestSuiteInfoBase()
Definition gtest-param-util.h:478
virtual void RegisterTests()=0
virtual const std::string & GetTestSuiteName() const =0
virtual ~ParameterizedTestSuiteInfoBase()=default
virtual TypeId GetTestSuiteTypeId() const =0
Definition gtest-param-util.h:506
typename TestSuite::ParamType ParamType
Definition gtest-param-util.h:511
int AddTestSuiteInstantiation(const std::string &instantiation_name, GeneratorCreationFunc *func, ParamNameGeneratorFunc *name_func, const char *file, int line)
Definition gtest-param-util.h:540
std::string(const TestParamInfo< ParamType > &) ParamNameGeneratorFunc
Definition gtest-param-util.h:514
ParameterizedTestSuiteInfo(const char *name, CodeLocation code_location)
Definition gtest-param-util.h:516
void RegisterTests() override
Definition gtest-param-util.h:553
void AddTestPattern(const char *test_suite_name, const char *test_base_name, TestMetaFactoryBase< ParamType > *meta_factory, CodeLocation code_location)
Definition gtest-param-util.h:532
typedef ParamGenerator(GeneratorCreationFunc)()
const std::string & GetTestSuiteName() const override
Definition gtest-param-util.h:521
TypeId GetTestSuiteTypeId() const override
Definition gtest-param-util.h:525
Definition gtest-param-util.h:692
void RegisterTests()
Definition gtest-param-util.h:732
ParameterizedTestCaseInfo< TestCase > * GetTestCasePatternHolder(const char *test_case_name, CodeLocation code_location)
Definition gtest-param-util.h:740
ParameterizedTestSuiteInfo< TestSuite > * GetTestSuitePatternHolder(const char *test_suite_name, CodeLocation code_location)
Definition gtest-param-util.h:704
ParameterizedTestSuiteRegistry()=default
~ParameterizedTestSuiteRegistry()
Definition gtest-param-util.h:695
Definition gtest-param-util.h:211
~RangeGenerator() override=default
RangeGenerator(T begin, T end, IncrementT step)
Definition gtest-param-util.h:213
ParamIteratorInterface< T > * Begin() const override
Definition gtest-param-util.h:220
ParamIteratorInterface< T > * End() const override
Definition gtest-param-util.h:223
Definition gtest-internal.h:436
Definition googletest-port-test.cc:195
Definition gtest-param-util.h:761
void RegisterTestSuite(const char *test_suite_name, CodeLocation code_location)
Definition gtest.cc:568
void CheckForInstantiations()
Definition gtest.cc:585
void RegisterInstantiation(const char *test_suite_name)
Definition gtest.cc:574
Definition gtest-param-util.h:800
ValueArray(Ts... v)
Definition gtest-param-util.h:802
Definition gtest-param-util.h:297
ParamIteratorInterface< T > * End() const override
Definition gtest-param-util.h:307
~ValuesInIteratorRangeGenerator() override=default
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
Definition gtest-param-util.h:300
ParamIteratorInterface< T > * Begin() const override
Definition gtest-param-util.h:304
pRC::Float<> T
Definition externs_nonTT.hpp:1
int value
Definition gmock-actions_test.cc:1714
int i
Definition gmock-matchers-comparisons_test.cc:603
#define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
Definition gtest-port.h:360
#define GTEST_API_
Definition gtest-port.h:842
#define GTEST_DISABLE_MSC_WARNINGS_POP_()
Definition gtest-port.h:361
#define GTEST_CHECK_(condition)
Definition gtest-port.h:1078
void Abort()
Definition gtest-port.h:2147
constexpr bool Equals(const char(&a)[N], const char(&b)[M])
Definition gmock-function-mocker.h:83
typename MakeIndexSequenceImpl< N >::type MakeIndexSequence
Definition gtest-internal.h:1175
GTEST_API_ void InsertSyntheticTestCase(const std::string &name, CodeLocation location, bool has_test_p)
Definition gtest.cc:513
TypeId GetTypeId()
Definition gtest-internal.h:419
GTEST_API_ TestInfo * MakeAndRegisterTestInfo(const char *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)
Definition gtest.cc:2763
bool IsAlNum(char ch)
Definition gtest-port.h:1932
std::string DefaultParamName(const TestParamInfo< ParamType > &info)
Definition gtest-param-util.h:381
void TestNotEmpty()
Definition gtest-param-util.h:388
const void * TypeId
Definition gtest-internal.h:401
GTEST_API_ void ReportInvalidTestSuiteType(const char *test_suite_name, CodeLocation code_location)
Definition gtest.cc:2775
Derived * CheckedDowncastToActualType(Base *base)
Definition gtest-port.h:1150
Definition gmock-actions.h:151
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
Definition gtest-param-test.h:297
::std::string PrintToString(const T &value)
Definition gtest-printers.h:1148
Definition gtest-param-util.h:71
std::string operator()(const TestParamInfo< ParamType > &info) const
Definition gtest-param-util.h:73
Definition gtest-param-util.h:62
ParamType param
Definition gtest-param-util.h:65
TestParamInfo(const ParamType &a_param, size_t an_index)
Definition gtest-param-util.h:63
size_t index
Definition gtest-param-util.h:66
Definition gtest-internal.h:477
Definition gtest-internal.h:1204
Definition gtest-internal.h:1148
Definition gtest-param-util.h:491
Definition gtest-internal.h:500