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