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(¶meter_); 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