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