1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008 Google Inc.
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All Rights Reserved.
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: vladl@google.com (Vlad Losev)
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Type and function utilities for implementing parameterized tests.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <iterator>
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <utility>
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <vector>
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// scripts/fuse_gtest.py depends on gtest's own header being #included
4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// *unconditionally*.  Therefore these #includes cannot be moved
4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// inside #if GTEST_HAS_PARAM_TEST.
4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-internal.h"
4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-linked_ptr.h"
4646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-port.h"
4746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest-printers.h"
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_PARAM_TEST
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Outputs a message explaining invalid registration of different
57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// fixture class for the same test case. This may happen when
58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TEST_P macro is used to define two tests with the same name
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// but in different namespaces.
6046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
6146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                          const char* file, int line);
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename> class ParamGeneratorInterface;
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename> class ParamGenerator;
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Interface for iterating over elements provided by an implementation
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of ParamGeneratorInterface<T>.
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T>
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParamIteratorInterface {
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~ParamIteratorInterface() {}
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // A pointer to the base generator instance.
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Used only for the purposes of iterator comparison
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // to make sure that two iterators belong to the same generator.
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Advances iterator to point to the next element
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // provided by the generator. The caller is responsible
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // for not calling Advance() on an iterator equal to
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // BaseGenerator()->End().
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void Advance() = 0;
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Clones the iterator object. Used for implementing copy semantics
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // of ParamIterator<T>.
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface* Clone() const = 0;
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Dereferences the current iterator and provides (read-only) access
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // to the pointed value. It is the caller's responsibility not to call
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Current() on an iterator equal to BaseGenerator()->End().
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Used for implementing ParamGenerator<T>::operator*().
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual const T* Current() const = 0;
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Determines whether the given iterator and other point to the same
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // element in the sequence generated by the generator.
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Used for implementing ParamGenerator<T>::operator==().
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Class iterating over elements provided by an implementation of
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and implements the const forward iterator concept.
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T>
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParamIterator {
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef T value_type;
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef const T& reference;
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ptrdiff_t difference_type;
104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // ParamIterator assumes ownership of the impl_ pointer.
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParamIterator& operator=(const ParamIterator& other) {
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (this != &other)
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      impl_.reset(other.impl_->Clone());
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return *this;
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T& operator*() const { return *impl_->Current(); }
114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T* operator->() const { return impl_->Current(); }
115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Prefix version of operator++.
116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParamIterator& operator++() {
117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    impl_->Advance();
118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return *this;
119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Postfix version of operator++.
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParamIterator operator++(int /*unused*/) {
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParamIteratorInterface<T>* clone = impl_->Clone();
123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    impl_->Advance();
124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return ParamIterator(clone);
125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool operator==(const ParamIterator& other) const {
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool operator!=(const ParamIterator& other) const {
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return !(*this == other);
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  friend class ParamGenerator<T>;
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  scoped_ptr<ParamIteratorInterface<T> > impl_;
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ParamGeneratorInterface<T> is the binary interface to access generators
140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// defined in other translation units.
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T>
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParamGeneratorInterface {
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef T ParamType;
145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~ParamGeneratorInterface() {}
147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Generator interface definition
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<T>* Begin() const = 0;
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<T>* End() const = 0;
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
15346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Wraps ParamGeneratorInterface<T> and provides general generator syntax
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// compatible with the STL Container concept.
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This class implements copy initialization semantics and the contained
156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ParamGeneratorInterface<T> instance is shared among all copies
157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of the original object. This is possible because that instance is immutable.
158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate<typename T>
159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParamGenerator {
160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ParamIterator<T> iterator;
162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParamGenerator& operator=(const ParamGenerator& other) {
167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    impl_ = other.impl_;
168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return *this;
169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  iterator begin() const { return iterator(impl_->Begin()); }
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  iterator end() const { return iterator(impl_->End()); }
173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
17546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  linked_ptr<const ParamGeneratorInterface<T> > impl_;
176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Generates values from a range of two comparable values. Can be used to
179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// generate sequences of user-defined types that implement operator+() and
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// operator<().
181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This class is used in the Range() function.
182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T, typename IncrementT>
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass RangeGenerator : public ParamGeneratorInterface<T> {
184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  RangeGenerator(T begin, T end, IncrementT step)
186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : begin_(begin), end_(end),
187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~RangeGenerator() {}
189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<T>* Begin() const {
191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, begin_, 0, step_);
192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<T>* End() const {
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, end_, end_index_, step_);
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<T> {
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter             IncrementT step)
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : base_(base), value_(value), index_(index), step_(step) {}
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      value_ = value_ + step_;
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      index_++;
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<T>* Clone() const {
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const T* Current() const { return &value_; }
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const int other_index =
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other)->index_;
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return index_ == other_index;
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
22946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        : ParamIteratorInterface<T>(),
23046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          base_(other.base_), value_(other.value_), index_(other.index_),
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          step_(other.step_) {}
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
23346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // No implementation - assignment is unsupported.
23446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    void operator=(const Iterator& other);
23546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<T>* const base_;
237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T value_;
238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int index_;
239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const IncrementT step_;
240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };  // class RangeGenerator::Iterator
241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static int CalculateEndIndex(const T& begin,
243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                               const T& end,
244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                               const IncrementT& step) {
245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int end_index = 0;
246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (T i = begin; i < end; i = i + step)
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      end_index++;
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return end_index;
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
25146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
25246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const RangeGenerator& other);
25346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T begin_;
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T end_;
256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const IncrementT step_;
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // The index for the end() iterator. All the elements in the generated
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // sequence are indexed (0-based) to aid iterator comparison.
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const int end_index_;
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};  // class RangeGenerator
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Generates values from a pair of STL-style iterators. Used in the
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ValuesIn() function. The elements are copied from the source range
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// since the source can be located on the stack, and the generator
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is likely to persist beyond that stack frame.
267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T>
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename ForwardIterator>
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : container_(begin, end) {}
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~ValuesInIteratorRangeGenerator() {}
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<T>* Begin() const {
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, container_.begin());
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ParamIteratorInterface<T>* End() const {
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new Iterator(this, container_.end());
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef typename ::std::vector<T> ContainerType;
284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class Iterator : public ParamIteratorInterface<T> {
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const ParamGeneratorInterface<T>* base,
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter             typename ContainerType::const_iterator iterator)
28946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        : base_(base), iterator_(iterator) {}
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ~Iterator() {}
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return base_;
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual void Advance() {
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ++iterator_;
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      value_.reset();
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual ParamIteratorInterface<T>* Clone() const {
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return new Iterator(*this);
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // We need to use cached value referenced by iterator_ because *iterator_
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // can return a temporary object (and of type other then T), so just
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // having "return &*iterator_;" doesn't work.
305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // value_ is updated here and not in Advance() because Advance()
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // can advance iterator_ beyond the end of the range, and we cannot
307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // detect that fact. The client code, on the other hand, is
308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // responsible for not calling Current() on an out-of-range iterator.
309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual const T* Current() const {
310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (value_.get() == NULL)
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        value_.reset(new T(*iterator_));
312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return value_.get();
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // Having the same base generator guarantees that the other
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // iterator is of the same type and we can downcast.
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "The program attempted to compare iterators "
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          << "from different generators." << std::endl;
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return iterator_ ==
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   private:
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Iterator(const Iterator& other)
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // The explicit constructor call suppresses a false warning
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // emitted by gcc when supplied with the -Wextra option.
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        : ParamIteratorInterface<T>(),
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          base_(other.base_),
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          iterator_(other.iterator_) {}
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const ParamGeneratorInterface<T>* const base_;
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ContainerType::const_iterator iterator_;
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // A cached value of *iterator_. We keep it here to allow access by
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // pointer in the wrapping iterator's operator->().
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // value_ needs to be mutable to be accessed in Current().
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Use of scoped_ptr helps manage cached value's lifetime,
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // which is bound by the lifespan of the iterator itself.
339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    mutable scoped_ptr<const T> value_;
34046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  };  // class ValuesInIteratorRangeGenerator::Iterator
34146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
34246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // No implementation - assignment is unsupported.
34346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void operator=(const ValuesInIteratorRangeGenerator& other);
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ContainerType container_;
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};  // class ValuesInIteratorRangeGenerator
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Stores a parameter value and later creates tests parameterized with that
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// value.
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class TestClass>
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParameterizedTestFactory : public TestFactoryBase {
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef typename TestClass::ParamType ParamType;
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ParameterizedTestFactory(ParamType parameter) :
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      parameter_(parameter) {}
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual Test* CreateTest() {
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    TestClass::SetParam(&parameter_);
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new TestClass();
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ParamType parameter_;
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TestMetaFactoryBase is a base class for meta-factories that create
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test factories for passing into MakeAndRegisterTestInfo function.
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class ParamType>
374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TestMetaFactoryBase {
375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~TestMetaFactoryBase() {}
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TestMetaFactory creates test factories for passing into
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ownership of test factory pointer, same factory object cannot be passed
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// into that method twice. But ParameterizedTestCaseInfo is going to call
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// it for each Test/Parameter value combination. Thus it needs meta factory
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// creator class.
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class TestCase>
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TestMetaFactory
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    : public TestMetaFactoryBase<typename TestCase::ParamType> {
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef typename TestCase::ParamType ParamType;
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestMetaFactory() {}
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return new ParameterizedTestFactory<TestCase>(parameter);
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ParameterizedTestCaseInfoBase is a generic interface
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// accumulates test information provided by TEST_P macro invocations
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and uses that information to register all resulting test instances
412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a collection of pointers to the ParameterizedTestCaseInfo objects
414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and calls RegisterTests() on each of them when asked.
415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParameterizedTestCaseInfoBase {
416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~ParameterizedTestCaseInfoBase() {}
418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Base part of test case name for display purposes.
42046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  virtual const string& GetTestCaseName() const = 0;
421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Test case id to verify identity.
422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual TypeId GetTestCaseTypeId() const = 0;
423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // UnitTest class invokes this method to register tests in this
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // test case right before running them in RUN_ALL_TESTS macro.
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // This method should not be called more then once on any single
426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // instance of a ParameterizedTestCaseInfoBase derived class.
427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void RegisterTests() = 0;
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected:
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParameterizedTestCaseInfoBase() {}
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// macro invocations for a particular test case and generators
440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test case. It registers tests with all values generated by all
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// generators when asked.
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class TestCase>
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // ParamType and GeneratorCreationFunc are private types but are required
447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // for declarations of public methods AddTestPattern() and
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // AddTestCaseInstantiation().
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef typename TestCase::ParamType ParamType;
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // A function that returns an instance of appropriate generator type.
451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ParameterizedTestCaseInfo(const char* name)
454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : test_case_name_(name) {}
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Test case base name for display purposes.
45746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  virtual const string& GetTestCaseName() const { return test_case_name_; }
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Test case id to verify identity.
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // TEST_P macro uses AddTestPattern() to record information
461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // about a single test in a LocalTestInfo structure.
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // test_case_name is the base name of the test case (without invocation
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // prefix). test_base_name is the name of an individual test without
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // test case base name and DoBar is test base name.
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void AddTestPattern(const char* test_case_name,
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                      const char* test_base_name,
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                      TestMetaFactoryBase<ParamType>* meta_factory) {
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                                       test_base_name,
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                                       meta_factory)));
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // about a generator.
47546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  int AddTestCaseInstantiation(const string& instantiation_name,
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                               GeneratorCreationFunc* func,
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                               const char* /* file */,
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                               int /* line */) {
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    instantiations_.push_back(::std::make_pair(instantiation_name, func));
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return 0;  // Return value used only to run this method in namespace scope.
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // UnitTest class invokes this method to register tests in this test case
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // test cases right before running tests in RUN_ALL_TESTS macro.
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // This method should not be called more then once on any single
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // instance of a ParameterizedTestCaseInfoBase derived class.
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // UnitTest has a guard to prevent from calling this method more then once.
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void RegisterTests() {
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (typename TestInfoContainer::iterator test_it = tests_.begin();
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         test_it != tests_.end(); ++test_it) {
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      linked_ptr<TestInfo> test_info = *test_it;
491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      for (typename InstantiationContainer::iterator gen_it =
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               instantiations_.begin(); gen_it != instantiations_.end();
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               ++gen_it) {
49446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const string& instantiation_name = gen_it->first;
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ParamGenerator<ParamType> generator((*gen_it->second)());
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Message test_case_name_stream;
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        if ( !instantiation_name.empty() )
49946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          test_case_name_stream << instantiation_name << "/";
50046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        test_case_name_stream << test_info->test_case_base_name;
501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        int i = 0;
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        for (typename ParamGenerator<ParamType>::iterator param_it =
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                 generator.begin();
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter             param_it != generator.end(); ++param_it, ++i) {
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          Message test_name_stream;
50746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          test_name_stream << test_info->test_base_name << "/" << i;
50846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          MakeAndRegisterTestInfo(
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              test_case_name_stream.GetString().c_str(),
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              test_name_stream.GetString().c_str(),
51146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              NULL,  // No type parameter.
51246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              PrintToString(*param_it).c_str(),
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              GetTestCaseTypeId(),
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              TestCase::SetUpTestCase,
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              TestCase::TearDownTestCase,
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              test_info->test_meta_factory->CreateTestFactory(*param_it));
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        }  // for param_it
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }  // for gen_it
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }  // for test_it
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }  // RegisterTests
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // LocalTestInfo structure keeps information about a single test registered
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // with TEST_P macro.
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  struct TestInfo {
52646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    TestInfo(const char* a_test_case_base_name,
52746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan             const char* a_test_base_name,
52846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
52946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        test_case_base_name(a_test_case_base_name),
53046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        test_base_name(a_test_base_name),
53146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        test_meta_factory(a_test_meta_factory) {}
53246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
53346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const string test_case_base_name;
53446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const string test_base_name;
535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Keeps pairs of <Instantiation name, Sequence generator creation function>
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // received from INSTANTIATE_TEST_CASE_P macros.
54046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      InstantiationContainer;
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
54346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const string test_case_name_;
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestInfoContainer tests_;
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  InstantiationContainer instantiations_;
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};  // class ParameterizedTestCaseInfo
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// macros use it to locate their corresponding ParameterizedTestCaseInfo
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// descriptors.
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ParameterizedTestCaseRegistry {
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParameterizedTestCaseRegistry() {}
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ~ParameterizedTestCaseRegistry() {
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         it != test_case_infos_.end(); ++it) {
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      delete *it;
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Looks up or creates and returns a structure containing information about
567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // tests and instantiations of a particular test case.
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <class TestCase>
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const char* test_case_name,
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const char* file,
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      int line) {
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         it != test_case_infos_.end(); ++it) {
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if ((*it)->GetTestCaseName() == test_case_name) {
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // Complain about incorrect usage of Google Test facilities
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // and terminate the program since we cannot guaranty correct
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // test case setup and tear-down in this case.
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          ReportInvalidTestCaseType(test_case_name,  file, line);
58246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          posix::Abort();
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        } else {
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // At this point we are sure that the object we found is of the same
585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // type we are looking for, so we downcast it to that type
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          // without further checks.
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          typed_test_info = CheckedDowncastToActualType<
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              ParameterizedTestCaseInfo<TestCase> >(*it);
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        }
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        break;
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (typed_test_info == NULL) {
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      test_case_infos_.push_back(typed_test_info);
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return typed_test_info;
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void RegisterTests() {
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         it != test_case_infos_.end(); ++it) {
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      (*it)->RegisterTests();
603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestCaseInfoContainer test_case_infos_;
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  //  GTEST_HAS_PARAM_TEST
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
620