1// Copyright 2008 Google Inc.
2// All Rights Reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10//     * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14//     * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
31// Type and function utilities for implementing parameterized tests.
32
33// GOOGLETEST_CM0001 DO NOT DELETE
34
35#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
36#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
37
38#include <ctype.h>
39
40#include <cassert>
41#include <iterator>
42#include <memory>
43#include <set>
44#include <tuple>
45#include <utility>
46#include <vector>
47
48#include "gtest/internal/gtest-internal.h"
49#include "gtest/internal/gtest-port.h"
50#include "gtest/gtest-printers.h"
51
52namespace testing {
53// Input to a parameterized test name generator, describing a test parameter.
54// Consists of the parameter value and the integer parameter index.
55template <class ParamType>
56struct TestParamInfo {
57  TestParamInfo(const ParamType& a_param, size_t an_index) :
58    param(a_param),
59    index(an_index) {}
60  ParamType param;
61  size_t index;
62};
63
64// A builtin parameterized test name generator which returns the result of
65// testing::PrintToString.
66struct PrintToStringParamName {
67  template <class ParamType>
68  std::string operator()(const TestParamInfo<ParamType>& info) const {
69    return PrintToString(info.param);
70  }
71};
72
73namespace internal {
74
75// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
76// Utility Functions
77
78// Outputs a message explaining invalid registration of different
79// fixture class for the same test suite. This may happen when
80// TEST_P macro is used to define two tests with the same name
81// but in different namespaces.
82GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name,
83                                           CodeLocation code_location);
84
85template <typename> class ParamGeneratorInterface;
86template <typename> class ParamGenerator;
87
88// Interface for iterating over elements provided by an implementation
89// of ParamGeneratorInterface<T>.
90template <typename T>
91class ParamIteratorInterface {
92 public:
93  virtual ~ParamIteratorInterface() {}
94  // A pointer to the base generator instance.
95  // Used only for the purposes of iterator comparison
96  // to make sure that two iterators belong to the same generator.
97  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
98  // Advances iterator to point to the next element
99  // provided by the generator. The caller is responsible
100  // for not calling Advance() on an iterator equal to
101  // BaseGenerator()->End().
102  virtual void Advance() = 0;
103  // Clones the iterator object. Used for implementing copy semantics
104  // of ParamIterator<T>.
105  virtual ParamIteratorInterface* Clone() const = 0;
106  // Dereferences the current iterator and provides (read-only) access
107  // to the pointed value. It is the caller's responsibility not to call
108  // Current() on an iterator equal to BaseGenerator()->End().
109  // Used for implementing ParamGenerator<T>::operator*().
110  virtual const T* Current() const = 0;
111  // Determines whether the given iterator and other point to the same
112  // element in the sequence generated by the generator.
113  // Used for implementing ParamGenerator<T>::operator==().
114  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
115};
116
117// Class iterating over elements provided by an implementation of
118// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
119// and implements the const forward iterator concept.
120template <typename T>
121class ParamIterator {
122 public:
123  typedef T value_type;
124  typedef const T& reference;
125  typedef ptrdiff_t difference_type;
126
127  // ParamIterator assumes ownership of the impl_ pointer.
128  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
129  ParamIterator& operator=(const ParamIterator& other) {
130    if (this != &other)
131      impl_.reset(other.impl_->Clone());
132    return *this;
133  }
134
135  const T& operator*() const { return *impl_->Current(); }
136  const T* operator->() const { return impl_->Current(); }
137  // Prefix version of operator++.
138  ParamIterator& operator++() {
139    impl_->Advance();
140    return *this;
141  }
142  // Postfix version of operator++.
143  ParamIterator operator++(int /*unused*/) {
144    ParamIteratorInterface<T>* clone = impl_->Clone();
145    impl_->Advance();
146    return ParamIterator(clone);
147  }
148  bool operator==(const ParamIterator& other) const {
149    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
150  }
151  bool operator!=(const ParamIterator& other) const {
152    return !(*this == other);
153  }
154
155 private:
156  friend class ParamGenerator<T>;
157  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
158  std::unique_ptr<ParamIteratorInterface<T> > impl_;
159};
160
161// ParamGeneratorInterface<T> is the binary interface to access generators
162// defined in other translation units.
163template <typename T>
164class ParamGeneratorInterface {
165 public:
166  typedef T ParamType;
167
168  virtual ~ParamGeneratorInterface() {}
169
170  // Generator interface definition
171  virtual ParamIteratorInterface<T>* Begin() const = 0;
172  virtual ParamIteratorInterface<T>* End() const = 0;
173};
174
175// Wraps ParamGeneratorInterface<T> and provides general generator syntax
176// compatible with the STL Container concept.
177// This class implements copy initialization semantics and the contained
178// ParamGeneratorInterface<T> instance is shared among all copies
179// of the original object. This is possible because that instance is immutable.
180template<typename T>
181class ParamGenerator {
182 public:
183  typedef ParamIterator<T> iterator;
184
185  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
186  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
187
188  ParamGenerator& operator=(const ParamGenerator& other) {
189    impl_ = other.impl_;
190    return *this;
191  }
192
193  iterator begin() const { return iterator(impl_->Begin()); }
194  iterator end() const { return iterator(impl_->End()); }
195
196 private:
197  std::shared_ptr<const ParamGeneratorInterface<T> > impl_;
198};
199
200// Generates values from a range of two comparable values. Can be used to
201// generate sequences of user-defined types that implement operator+() and
202// operator<().
203// This class is used in the Range() function.
204template <typename T, typename IncrementT>
205class RangeGenerator : public ParamGeneratorInterface<T> {
206 public:
207  RangeGenerator(T begin, T end, IncrementT step)
208      : begin_(begin), end_(end),
209        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
210  ~RangeGenerator() override {}
211
212  ParamIteratorInterface<T>* Begin() const override {
213    return new Iterator(this, begin_, 0, step_);
214  }
215  ParamIteratorInterface<T>* End() const override {
216    return new Iterator(this, end_, end_index_, step_);
217  }
218
219 private:
220  class Iterator : public ParamIteratorInterface<T> {
221   public:
222    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
223             IncrementT step)
224        : base_(base), value_(value), index_(index), step_(step) {}
225    ~Iterator() override {}
226
227    const ParamGeneratorInterface<T>* BaseGenerator() const override {
228      return base_;
229    }
230    void Advance() override {
231      value_ = static_cast<T>(value_ + step_);
232      index_++;
233    }
234    ParamIteratorInterface<T>* Clone() const override {
235      return new Iterator(*this);
236    }
237    const T* Current() const override { return &value_; }
238    bool Equals(const ParamIteratorInterface<T>& other) const override {
239      // Having the same base generator guarantees that the other
240      // iterator is of the same type and we can downcast.
241      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
242          << "The program attempted to compare iterators "
243          << "from different generators." << std::endl;
244      const int other_index =
245          CheckedDowncastToActualType<const Iterator>(&other)->index_;
246      return index_ == other_index;
247    }
248
249   private:
250    Iterator(const Iterator& other)
251        : ParamIteratorInterface<T>(),
252          base_(other.base_), value_(other.value_), index_(other.index_),
253          step_(other.step_) {}
254
255    // No implementation - assignment is unsupported.
256    void operator=(const Iterator& other);
257
258    const ParamGeneratorInterface<T>* const base_;
259    T value_;
260    int index_;
261    const IncrementT step_;
262  };  // class RangeGenerator::Iterator
263
264  static int CalculateEndIndex(const T& begin,
265                               const T& end,
266                               const IncrementT& step) {
267    int end_index = 0;
268    for (T i = begin; i < end; i = static_cast<T>(i + step))
269      end_index++;
270    return end_index;
271  }
272
273  // No implementation - assignment is unsupported.
274  void operator=(const RangeGenerator& other);
275
276  const T begin_;
277  const T end_;
278  const IncrementT step_;
279  // The index for the end() iterator. All the elements in the generated
280  // sequence are indexed (0-based) to aid iterator comparison.
281  const int end_index_;
282};  // class RangeGenerator
283
284
285// Generates values from a pair of STL-style iterators. Used in the
286// ValuesIn() function. The elements are copied from the source range
287// since the source can be located on the stack, and the generator
288// is likely to persist beyond that stack frame.
289template <typename T>
290class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
291 public:
292  template <typename ForwardIterator>
293  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
294      : container_(begin, end) {}
295  ~ValuesInIteratorRangeGenerator() override {}
296
297  ParamIteratorInterface<T>* Begin() const override {
298    return new Iterator(this, container_.begin());
299  }
300  ParamIteratorInterface<T>* End() const override {
301    return new Iterator(this, container_.end());
302  }
303
304 private:
305  typedef typename ::std::vector<T> ContainerType;
306
307  class Iterator : public ParamIteratorInterface<T> {
308   public:
309    Iterator(const ParamGeneratorInterface<T>* base,
310             typename ContainerType::const_iterator iterator)
311        : base_(base), iterator_(iterator) {}
312    ~Iterator() override {}
313
314    const ParamGeneratorInterface<T>* BaseGenerator() const override {
315      return base_;
316    }
317    void Advance() override {
318      ++iterator_;
319      value_.reset();
320    }
321    ParamIteratorInterface<T>* Clone() const override {
322      return new Iterator(*this);
323    }
324    // We need to use cached value referenced by iterator_ because *iterator_
325    // can return a temporary object (and of type other then T), so just
326    // having "return &*iterator_;" doesn't work.
327    // value_ is updated here and not in Advance() because Advance()
328    // can advance iterator_ beyond the end of the range, and we cannot
329    // detect that fact. The client code, on the other hand, is
330    // responsible for not calling Current() on an out-of-range iterator.
331    const T* Current() const override {
332      if (value_.get() == nullptr) value_.reset(new T(*iterator_));
333      return value_.get();
334    }
335    bool Equals(const ParamIteratorInterface<T>& other) const override {
336      // Having the same base generator guarantees that the other
337      // iterator is of the same type and we can downcast.
338      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
339          << "The program attempted to compare iterators "
340          << "from different generators." << std::endl;
341      return iterator_ ==
342          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
343    }
344
345   private:
346    Iterator(const Iterator& other)
347          // The explicit constructor call suppresses a false warning
348          // emitted by gcc when supplied with the -Wextra option.
349        : ParamIteratorInterface<T>(),
350          base_(other.base_),
351          iterator_(other.iterator_) {}
352
353    const ParamGeneratorInterface<T>* const base_;
354    typename ContainerType::const_iterator iterator_;
355    // A cached value of *iterator_. We keep it here to allow access by
356    // pointer in the wrapping iterator's operator->().
357    // value_ needs to be mutable to be accessed in Current().
358    // Use of std::unique_ptr helps manage cached value's lifetime,
359    // which is bound by the lifespan of the iterator itself.
360    mutable std::unique_ptr<const T> value_;
361  };  // class ValuesInIteratorRangeGenerator::Iterator
362
363  // No implementation - assignment is unsupported.
364  void operator=(const ValuesInIteratorRangeGenerator& other);
365
366  const ContainerType container_;
367};  // class ValuesInIteratorRangeGenerator
368
369// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
370//
371// Default parameterized test name generator, returns a string containing the
372// integer test parameter index.
373template <class ParamType>
374std::string DefaultParamName(const TestParamInfo<ParamType>& info) {
375  Message name_stream;
376  name_stream << info.index;
377  return name_stream.GetString();
378}
379
380template <typename T = int>
381void TestNotEmpty() {
382  static_assert(sizeof(T) == 0, "Empty arguments are not allowed.");
383}
384template <typename T = int>
385void TestNotEmpty(const T&) {}
386
387// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
388//
389// Stores a parameter value and later creates tests parameterized with that
390// value.
391template <class TestClass>
392class ParameterizedTestFactory : public TestFactoryBase {
393 public:
394  typedef typename TestClass::ParamType ParamType;
395  explicit ParameterizedTestFactory(ParamType parameter) :
396      parameter_(parameter) {}
397  Test* CreateTest() override {
398    TestClass::SetParam(&parameter_);
399    return new TestClass();
400  }
401
402 private:
403  const ParamType parameter_;
404
405  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
406};
407
408// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
409//
410// TestMetaFactoryBase is a base class for meta-factories that create
411// test factories for passing into MakeAndRegisterTestInfo function.
412template <class ParamType>
413class TestMetaFactoryBase {
414 public:
415  virtual ~TestMetaFactoryBase() {}
416
417  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
418};
419
420// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
421//
422// TestMetaFactory creates test factories for passing into
423// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
424// ownership of test factory pointer, same factory object cannot be passed
425// into that method twice. But ParameterizedTestSuiteInfo is going to call
426// it for each Test/Parameter value combination. Thus it needs meta factory
427// creator class.
428template <class TestSuite>
429class TestMetaFactory
430    : public TestMetaFactoryBase<typename TestSuite::ParamType> {
431 public:
432  using ParamType = typename TestSuite::ParamType;
433
434  TestMetaFactory() {}
435
436  TestFactoryBase* CreateTestFactory(ParamType parameter) override {
437    return new ParameterizedTestFactory<TestSuite>(parameter);
438  }
439
440 private:
441  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
442};
443
444// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
445//
446// ParameterizedTestSuiteInfoBase is a generic interface
447// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase
448// accumulates test information provided by TEST_P macro invocations
449// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations
450// and uses that information to register all resulting test instances
451// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds
452// a collection of pointers to the ParameterizedTestSuiteInfo objects
453// and calls RegisterTests() on each of them when asked.
454class ParameterizedTestSuiteInfoBase {
455 public:
456  virtual ~ParameterizedTestSuiteInfoBase() {}
457
458  // Base part of test suite name for display purposes.
459  virtual const std::string& GetTestSuiteName() const = 0;
460  // Test case id to verify identity.
461  virtual TypeId GetTestSuiteTypeId() const = 0;
462  // UnitTest class invokes this method to register tests in this
463  // test suite right before running them in RUN_ALL_TESTS macro.
464  // This method should not be called more than once on any single
465  // instance of a ParameterizedTestSuiteInfoBase derived class.
466  virtual void RegisterTests() = 0;
467
468 protected:
469  ParameterizedTestSuiteInfoBase() {}
470
471 private:
472  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase);
473};
474
475// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
476//
477// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P
478// macro invocations for a particular test suite and generators
479// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that
480// test suite. It registers tests with all values generated by all
481// generators when asked.
482template <class TestSuite>
483class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase {
484 public:
485  // ParamType and GeneratorCreationFunc are private types but are required
486  // for declarations of public methods AddTestPattern() and
487  // AddTestSuiteInstantiation().
488  using ParamType = typename TestSuite::ParamType;
489  // A function that returns an instance of appropriate generator type.
490  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
491  using ParamNameGeneratorFunc = std::string(const TestParamInfo<ParamType>&);
492
493  explicit ParameterizedTestSuiteInfo(const char* name,
494                                      CodeLocation code_location)
495      : test_suite_name_(name), code_location_(code_location) {}
496
497  // Test case base name for display purposes.
498  const std::string& GetTestSuiteName() const override {
499    return test_suite_name_;
500  }
501  // Test case id to verify identity.
502  TypeId GetTestSuiteTypeId() const override { return GetTypeId<TestSuite>(); }
503  // TEST_P macro uses AddTestPattern() to record information
504  // about a single test in a LocalTestInfo structure.
505  // test_suite_name is the base name of the test suite (without invocation
506  // prefix). test_base_name is the name of an individual test without
507  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
508  // test suite base name and DoBar is test base name.
509  void AddTestPattern(const char* test_suite_name, const char* test_base_name,
510                      TestMetaFactoryBase<ParamType>* meta_factory) {
511    tests_.push_back(std::shared_ptr<TestInfo>(
512        new TestInfo(test_suite_name, test_base_name, meta_factory)));
513  }
514  // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information
515  // about a generator.
516  int AddTestSuiteInstantiation(const std::string& instantiation_name,
517                                GeneratorCreationFunc* func,
518                                ParamNameGeneratorFunc* name_func,
519                                const char* file, int line) {
520    instantiations_.push_back(
521        InstantiationInfo(instantiation_name, func, name_func, file, line));
522    return 0;  // Return value used only to run this method in namespace scope.
523  }
524  // UnitTest class invokes this method to register tests in this test suite
525  // test suites right before running tests in RUN_ALL_TESTS macro.
526  // This method should not be called more than once on any single
527  // instance of a ParameterizedTestSuiteInfoBase derived class.
528  // UnitTest has a guard to prevent from calling this method more than once.
529  void RegisterTests() override {
530    for (typename TestInfoContainer::iterator test_it = tests_.begin();
531         test_it != tests_.end(); ++test_it) {
532      std::shared_ptr<TestInfo> test_info = *test_it;
533      for (typename InstantiationContainer::iterator gen_it =
534               instantiations_.begin(); gen_it != instantiations_.end();
535               ++gen_it) {
536        const std::string& instantiation_name = gen_it->name;
537        ParamGenerator<ParamType> generator((*gen_it->generator)());
538        ParamNameGeneratorFunc* name_func = gen_it->name_func;
539        const char* file = gen_it->file;
540        int line = gen_it->line;
541
542        std::string test_suite_name;
543        if ( !instantiation_name.empty() )
544          test_suite_name = instantiation_name + "/";
545        test_suite_name += test_info->test_suite_base_name;
546
547        size_t i = 0;
548        std::set<std::string> test_param_names;
549        for (typename ParamGenerator<ParamType>::iterator param_it =
550                 generator.begin();
551             param_it != generator.end(); ++param_it, ++i) {
552          Message test_name_stream;
553
554          std::string param_name = name_func(
555              TestParamInfo<ParamType>(*param_it, i));
556
557          GTEST_CHECK_(IsValidParamName(param_name))
558              << "Parameterized test name '" << param_name
559              << "' is invalid, in " << file
560              << " line " << line << std::endl;
561
562          GTEST_CHECK_(test_param_names.count(param_name) == 0)
563              << "Duplicate parameterized test name '" << param_name
564              << "', in " << file << " line " << line << std::endl;
565
566          test_param_names.insert(param_name);
567
568          if (!test_info->test_base_name.empty()) {
569            test_name_stream << test_info->test_base_name << "/";
570          }
571          test_name_stream << param_name;
572          MakeAndRegisterTestInfo(
573              test_suite_name.c_str(), test_name_stream.GetString().c_str(),
574              nullptr,  // No type parameter.
575              PrintToString(*param_it).c_str(), code_location_,
576              GetTestSuiteTypeId(),
577              SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line),
578              SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line),
579              test_info->test_meta_factory->CreateTestFactory(*param_it));
580        }  // for param_it
581      }  // for gen_it
582    }  // for test_it
583  }    // RegisterTests
584
585 private:
586  // LocalTestInfo structure keeps information about a single test registered
587  // with TEST_P macro.
588  struct TestInfo {
589    TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name,
590             TestMetaFactoryBase<ParamType>* a_test_meta_factory)
591        : test_suite_base_name(a_test_suite_base_name),
592          test_base_name(a_test_base_name),
593          test_meta_factory(a_test_meta_factory) {}
594
595    const std::string test_suite_base_name;
596    const std::string test_base_name;
597    const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
598  };
599  using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;
600  // Records data received from INSTANTIATE_TEST_SUITE_P macros:
601  //  <Instantiation name, Sequence generator creation function,
602  //     Name generator function, Source file, Source line>
603  struct InstantiationInfo {
604      InstantiationInfo(const std::string &name_in,
605                        GeneratorCreationFunc* generator_in,
606                        ParamNameGeneratorFunc* name_func_in,
607                        const char* file_in,
608                        int line_in)
609          : name(name_in),
610            generator(generator_in),
611            name_func(name_func_in),
612            file(file_in),
613            line(line_in) {}
614
615      std::string name;
616      GeneratorCreationFunc* generator;
617      ParamNameGeneratorFunc* name_func;
618      const char* file;
619      int line;
620  };
621  typedef ::std::vector<InstantiationInfo> InstantiationContainer;
622
623  static bool IsValidParamName(const std::string& name) {
624    // Check for empty string
625    if (name.empty())
626      return false;
627
628    // Check for invalid characters
629    for (std::string::size_type index = 0; index < name.size(); ++index) {
630      if (!isalnum(name[index]) && name[index] != '_')
631        return false;
632    }
633
634    return true;
635  }
636
637  const std::string test_suite_name_;
638  CodeLocation code_location_;
639  TestInfoContainer tests_;
640  InstantiationContainer instantiations_;
641
642  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo);
643};  // class ParameterizedTestSuiteInfo
644
645//  Legacy API is deprecated but still available
646#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
647template <class TestCase>
648using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;
649#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
650
651// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
652//
653// ParameterizedTestSuiteRegistry contains a map of
654// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P
655// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding
656// ParameterizedTestSuiteInfo descriptors.
657class ParameterizedTestSuiteRegistry {
658 public:
659  ParameterizedTestSuiteRegistry() {}
660  ~ParameterizedTestSuiteRegistry() {
661    for (auto& test_suite_info : test_suite_infos_) {
662      delete test_suite_info;
663    }
664  }
665
666  // Looks up or creates and returns a structure containing information about
667  // tests and instantiations of a particular test suite.
668  template <class TestSuite>
669  ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder(
670      const char* test_suite_name, CodeLocation code_location) {
671    ParameterizedTestSuiteInfo<TestSuite>* typed_test_info = nullptr;
672    for (auto& test_suite_info : test_suite_infos_) {
673      if (test_suite_info->GetTestSuiteName() == test_suite_name) {
674        if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
675          // Complain about incorrect usage of Google Test facilities
676          // and terminate the program since we cannot guaranty correct
677          // test suite setup and tear-down in this case.
678          ReportInvalidTestSuiteType(test_suite_name, code_location);
679          posix::Abort();
680        } else {
681          // At this point we are sure that the object we found is of the same
682          // type we are looking for, so we downcast it to that type
683          // without further checks.
684          typed_test_info = CheckedDowncastToActualType<
685              ParameterizedTestSuiteInfo<TestSuite> >(test_suite_info);
686        }
687        break;
688      }
689    }
690    if (typed_test_info == nullptr) {
691      typed_test_info = new ParameterizedTestSuiteInfo<TestSuite>(
692          test_suite_name, code_location);
693      test_suite_infos_.push_back(typed_test_info);
694    }
695    return typed_test_info;
696  }
697  void RegisterTests() {
698    for (auto& test_suite_info : test_suite_infos_) {
699      test_suite_info->RegisterTests();
700    }
701  }
702//  Legacy API is deprecated but still available
703#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
704  template <class TestCase>
705  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
706      const char* test_case_name, CodeLocation code_location) {
707    return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);
708  }
709
710#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
711
712 private:
713  using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;
714
715  TestSuiteInfoContainer test_suite_infos_;
716
717  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);
718};
719
720}  // namespace internal
721
722// Forward declarations of ValuesIn(), which is implemented in
723// include/gtest/gtest-param-test.h.
724template <class Container>
725internal::ParamGenerator<typename Container::value_type> ValuesIn(
726    const Container& container);
727
728namespace internal {
729// Used in the Values() function to provide polymorphic capabilities.
730
731template <typename... Ts>
732class ValueArray {
733 public:
734  ValueArray(Ts... v) : v_{std::move(v)...} {}
735
736  template <typename T>
737  operator ParamGenerator<T>() const {  // NOLINT
738    return ValuesIn(MakeVector<T>(MakeIndexSequence<sizeof...(Ts)>()));
739  }
740
741 private:
742  template <typename T, size_t... I>
743  std::vector<T> MakeVector(IndexSequence<I...>) const {
744    return std::vector<T>{static_cast<T>(v_.template Get<I>())...};
745  }
746
747  FlatTuple<Ts...> v_;
748};
749
750template <typename... T>
751class CartesianProductGenerator
752    : public ParamGeneratorInterface<::std::tuple<T...>> {
753 public:
754  typedef ::std::tuple<T...> ParamType;
755
756  CartesianProductGenerator(const std::tuple<ParamGenerator<T>...>& g)
757      : generators_(g) {}
758  ~CartesianProductGenerator() override {}
759
760  ParamIteratorInterface<ParamType>* Begin() const override {
761    return new Iterator(this, generators_, false);
762  }
763  ParamIteratorInterface<ParamType>* End() const override {
764    return new Iterator(this, generators_, true);
765  }
766
767 private:
768  template <class I>
769  class IteratorImpl;
770  template <size_t... I>
771  class IteratorImpl<IndexSequence<I...>>
772      : public ParamIteratorInterface<ParamType> {
773   public:
774    IteratorImpl(const ParamGeneratorInterface<ParamType>* base,
775             const std::tuple<ParamGenerator<T>...>& generators, bool is_end)
776        : base_(base),
777          begin_(std::get<I>(generators).begin()...),
778          end_(std::get<I>(generators).end()...),
779          current_(is_end ? end_ : begin_) {
780      ComputeCurrentValue();
781    }
782    ~IteratorImpl() override {}
783
784    const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {
785      return base_;
786    }
787    // Advance should not be called on beyond-of-range iterators
788    // so no component iterators must be beyond end of range, either.
789    void Advance() override {
790      assert(!AtEnd());
791      // Advance the last iterator.
792      ++std::get<sizeof...(T) - 1>(current_);
793      // if that reaches end, propagate that up.
794      AdvanceIfEnd<sizeof...(T) - 1>();
795      ComputeCurrentValue();
796    }
797    ParamIteratorInterface<ParamType>* Clone() const override {
798      return new IteratorImpl(*this);
799    }
800
801    const ParamType* Current() const override { return current_value_.get(); }
802
803    bool Equals(const ParamIteratorInterface<ParamType>& other) const override {
804      // Having the same base generator guarantees that the other
805      // iterator is of the same type and we can downcast.
806      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
807          << "The program attempted to compare iterators "
808          << "from different generators." << std::endl;
809      const IteratorImpl* typed_other =
810          CheckedDowncastToActualType<const IteratorImpl>(&other);
811
812      // We must report iterators equal if they both point beyond their
813      // respective ranges. That can happen in a variety of fashions,
814      // so we have to consult AtEnd().
815      if (AtEnd() && typed_other->AtEnd()) return true;
816
817      bool same = true;
818      bool dummy[] = {
819          (same = same && std::get<I>(current_) ==
820                              std::get<I>(typed_other->current_))...};
821      (void)dummy;
822      return same;
823    }
824
825   private:
826    template <size_t ThisI>
827    void AdvanceIfEnd() {
828      if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) return;
829
830      bool last = ThisI == 0;
831      if (last) {
832        // We are done. Nothing else to propagate.
833        return;
834      }
835
836      constexpr size_t NextI = ThisI - (ThisI != 0);
837      std::get<ThisI>(current_) = std::get<ThisI>(begin_);
838      ++std::get<NextI>(current_);
839      AdvanceIfEnd<NextI>();
840    }
841
842    void ComputeCurrentValue() {
843      if (!AtEnd())
844        current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);
845    }
846    bool AtEnd() const {
847      bool at_end = false;
848      bool dummy[] = {
849          (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};
850      (void)dummy;
851      return at_end;
852    }
853
854    const ParamGeneratorInterface<ParamType>* const base_;
855    std::tuple<typename ParamGenerator<T>::iterator...> begin_;
856    std::tuple<typename ParamGenerator<T>::iterator...> end_;
857    std::tuple<typename ParamGenerator<T>::iterator...> current_;
858    std::shared_ptr<ParamType> current_value_;
859  };
860
861  using Iterator = IteratorImpl<typename MakeIndexSequence<sizeof...(T)>::type>;
862
863  std::tuple<ParamGenerator<T>...> generators_;
864};
865
866template <class... Gen>
867class CartesianProductHolder {
868 public:
869  CartesianProductHolder(const Gen&... g) : generators_(g...) {}
870  template <typename... T>
871  operator ParamGenerator<::std::tuple<T...>>() const {
872    return ParamGenerator<::std::tuple<T...>>(
873        new CartesianProductGenerator<T...>(generators_));
874  }
875
876 private:
877  std::tuple<Gen...> generators_;
878};
879
880}  // namespace internal
881}  // namespace testing
882
883#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
884