35 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 36 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 47 #include "gtest/internal/gtest-internal.h" 48 #include "gtest/internal/gtest-port.h" 49 #include "gtest/gtest-printers.h" 54 template <
class ParamType>
66 template <
class ParamType>
68 return PrintToString(info.param);
81 GTEST_API_
void ReportInvalidTestSuiteType(
const char* test_suite_name,
82 CodeLocation code_location);
101 virtual void Advance() = 0;
109 virtual const T* Current()
const = 0;
119 template <
typename T>
122 typedef T value_type;
123 typedef const T& reference;
124 typedef ptrdiff_t difference_type;
130 impl_.reset(other.impl_->Clone());
134 const T& operator*()
const {
return *impl_->Current(); }
135 const T* operator->()
const {
return impl_->Current(); }
148 return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
151 return !(*
this == other);
157 std::unique_ptr<ParamIteratorInterface<T> > impl_;
162 template <
typename T>
192 iterator begin()
const {
return iterator(impl_->Begin()); }
193 iterator end()
const {
return iterator(impl_->End()); }
196 std::shared_ptr<const ParamGeneratorInterface<T> > impl_;
203 template <
typename T,
typename IncrementT>
207 : begin_(begin), end_(end),
208 step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
212 return new Iterator(
this, begin_, 0, step_);
215 return new Iterator(
this, end_, end_index_, step_);
223 : base_(base), value_(value), index_(index), step_(step) {}
224 ~Iterator()
override {}
229 void Advance()
override {
230 value_ =
static_cast<T
>(value_ + step_);
234 return new Iterator(*
this);
236 const T* Current()
const override {
return &value_; }
240 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
241 <<
"The program attempted to compare iterators " 242 <<
"from different generators." << std::endl;
243 const int other_index =
244 CheckedDowncastToActualType<const Iterator>(&other)->index_;
245 return index_ == other_index;
249 Iterator(
const Iterator& other)
251 base_(other.base_), value_(other.value_), index_(other.index_),
252 step_(other.step_) {}
255 void operator=(
const Iterator& other);
260 const IncrementT step_;
263 static int CalculateEndIndex(
const T& begin,
265 const IncrementT& step) {
267 for (T i = begin; i < end; i = static_cast<T>(i + step))
277 const IncrementT step_;
280 const int end_index_;
288 template <
typename T>
291 template <
typename ForwardIterator>
293 : container_(begin, end) {}
297 return new Iterator(
this, container_.begin());
300 return new Iterator(
this, container_.end());
304 typedef typename ::std::vector<T> ContainerType;
309 typename ContainerType::const_iterator iterator)
310 : base_(base), iterator_(iterator) {}
311 ~Iterator()
override {}
316 void Advance()
override {
321 return new Iterator(*
this);
330 const T* Current()
const override {
331 if (value_.get() ==
nullptr) value_.reset(
new T(*iterator_));
337 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
338 <<
"The program attempted to compare iterators " 339 <<
"from different generators." << std::endl;
341 CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
345 Iterator(
const Iterator& other)
350 iterator_(other.iterator_) {}
353 typename ContainerType::const_iterator iterator_;
359 mutable std::unique_ptr<const T> value_;
365 const ContainerType container_;
372 template <
class ParamType>
375 name_stream << info.index;
376 return name_stream.GetString();
379 template <
typename T =
int>
380 void TestNotEmpty() {
381 static_assert(
sizeof(T) == 0,
"Empty arguments are not allowed.");
383 template <
typename T =
int>
384 void TestNotEmpty(
const T&) {}
390 template <
class TestClass>
393 typedef typename TestClass::ParamType ParamType;
395 parameter_(parameter) {}
396 Test* CreateTest()
override {
397 TestClass::SetParam(¶meter_);
398 return new TestClass();
402 const ParamType parameter_;
411 template <
class ParamType>
427 template <
class TestSuite>
431 using ParamType =
typename TestSuite::ParamType;
458 virtual const std::string& GetTestSuiteName()
const = 0;
460 virtual TypeId GetTestSuiteTypeId()
const = 0;
465 virtual void RegisterTests() = 0;
481 template <
class TestSuite>
487 using ParamType =
typename TestSuite::ParamType;
494 : test_suite_name_(name), code_location_(code_location) {}
497 const std::string& GetTestSuiteName()
const override {
498 return test_suite_name_;
501 TypeId GetTestSuiteTypeId()
const override {
return GetTypeId<TestSuite>(); }
508 void AddTestPattern(
const char* test_suite_name,
const char* test_base_name,
510 tests_.push_back(std::shared_ptr<TestInfo>(
511 new TestInfo(test_suite_name, test_base_name, meta_factory)));
515 int AddTestSuiteInstantiation(
const std::string& instantiation_name,
516 GeneratorCreationFunc* func,
517 ParamNameGeneratorFunc* name_func,
518 const char* file,
int line) {
519 instantiations_.push_back(
520 InstantiationInfo(instantiation_name, func, name_func, file, line));
528 void RegisterTests()
override {
529 for (
typename TestInfoContainer::iterator test_it = tests_.begin();
530 test_it != tests_.end(); ++test_it) {
531 std::shared_ptr<TestInfo> test_info = *test_it;
532 for (
typename InstantiationContainer::iterator gen_it =
533 instantiations_.begin(); gen_it != instantiations_.end();
535 const std::string& instantiation_name = gen_it->name;
536 ParamGenerator<ParamType> generator((*gen_it->generator)());
537 ParamNameGeneratorFunc* name_func = gen_it->name_func;
538 const char* file = gen_it->file;
539 int line = gen_it->line;
541 std::string test_suite_name;
542 if ( !instantiation_name.empty() )
543 test_suite_name = instantiation_name +
"/";
544 test_suite_name += test_info->test_suite_base_name;
547 std::set<std::string> test_param_names;
550 param_it != generator.end(); ++param_it, ++i) {
553 std::string param_name = name_func(
556 GTEST_CHECK_(IsValidParamName(param_name))
557 <<
"Parameterized test name '" << param_name
558 <<
"' is invalid, in " << file
559 <<
" line " << line << std::endl;
561 GTEST_CHECK_(test_param_names.count(param_name) == 0)
562 <<
"Duplicate parameterized test name '" << param_name
563 <<
"', in " << file <<
" line " << line << std::endl;
565 test_param_names.insert(param_name);
567 test_name_stream << test_info->test_base_name <<
"/" << param_name;
568 MakeAndRegisterTestInfo(
569 test_suite_name.c_str(), test_name_stream.GetString().c_str(),
571 PrintToString(*param_it).c_str(), code_location_,
572 GetTestSuiteTypeId(),
575 test_info->test_meta_factory->CreateTestFactory(*param_it));
585 TestInfo(
const char* a_test_suite_base_name,
const char* a_test_base_name,
587 : test_suite_base_name(a_test_suite_base_name),
588 test_base_name(a_test_base_name),
589 test_meta_factory(a_test_meta_factory) {}
591 const std::string test_suite_base_name;
592 const std::string test_base_name;
593 const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
595 using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;
599 struct InstantiationInfo {
600 InstantiationInfo(
const std::string &name_in,
601 GeneratorCreationFunc* generator_in,
602 ParamNameGeneratorFunc* name_func_in,
606 generator(generator_in),
607 name_func(name_func_in),
612 GeneratorCreationFunc* generator;
613 ParamNameGeneratorFunc* name_func;
617 typedef ::std::vector<InstantiationInfo> InstantiationContainer;
619 static bool IsValidParamName(
const std::string& name) {
625 for (std::string::size_type index = 0; index < name.size(); ++index) {
626 if (!isalnum(name[index]) && name[index] !=
'_')
633 const std::string test_suite_name_;
635 TestInfoContainer tests_;
636 InstantiationContainer instantiations_;
642 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 643 template <
class TestCase>
645 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 657 for (
auto& test_suite_info : test_suite_infos_) {
658 delete test_suite_info;
664 template <
class TestSuite>
666 const char* test_suite_name,
CodeLocation code_location) {
668 for (
auto& test_suite_info : test_suite_infos_) {
669 if (test_suite_info->GetTestSuiteName() == test_suite_name) {
670 if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
674 ReportInvalidTestSuiteType(test_suite_name, code_location);
680 typed_test_info = CheckedDowncastToActualType<
686 if (typed_test_info ==
nullptr) {
688 test_suite_name, code_location);
689 test_suite_infos_.push_back(typed_test_info);
691 return typed_test_info;
693 void RegisterTests() {
694 for (
auto& test_suite_info : test_suite_infos_) {
695 test_suite_info->RegisterTests();
699 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 700 template <
class TestCase>
702 const char* test_case_name,
CodeLocation code_location) {
703 return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);
706 #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 709 using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;
711 TestSuiteInfoContainer test_suite_infos_;
720 template <
class Container>
722 const Container& container);
727 template <
typename... Ts>
732 template <
typename T>
738 template <
typename T,
size_t... I>
740 return std::vector<T>{
static_cast<T
>(v_.template Get<I>())...};
749 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
Definition: gmock-actions.h:59
Definition: gtest-param-util.h:204
Definition: gtest-internal.h:535
Definition: gtest-param-util.h:289
Definition: gtest-param-util.h:55
Definition: gtest-message.h:90
Definition: gtest-internal.h:472
Definition: gtest-internal.h:512
Definition: gtest-param-util.h:482
Definition: gtest-param-util.h:391
Definition: gtest-param-util.h:653
Definition: gtest-internal.h:1200
Definition: gtest-internal.h:1181
Definition: gtest-param-util.h:453
Definition: gtest-param-util.h:728
Definition: gtest-param-util.h:90
Definition: gtest-param-util.h:120
Definition: gtest-param-util.h:84
Definition: gtest-internal.h:1228
Definition: gtest-param-util.h:85
Definition: gtest-param-util.h:65