⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtest-param-util.h

📁 Search s framework 老外写的
💻 H
📖 第 1 页 / 共 2 页
字号:
// Copyright 2008 Google Inc.// All Rights Reserved.//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.//     * Neither the name of Google Inc. nor the names of its// contributors may be used to endorse or promote products derived from// this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.//// Author: vladl@google.com (Vlad Losev)// Type and function utilities for implementing parameterized tests.#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_#include <iterator>#include <utility>#include <vector>#include <gtest/internal/gtest-port.h>#ifdef GTEST_HAS_PARAM_TEST#if GTEST_HAS_RTTI#include <typeinfo>#endif  // GTEST_HAS_RTTI#include <gtest/internal/gtest-linked_ptr.h>#include <gtest/internal/gtest-internal.h>namespace testing {namespace internal {// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.//// Outputs a message explaining invalid registration of different// fixture class for the same test case. This may happen when// TEST_P macro is used to define two tests with the same name// but in different namespaces.void ReportInvalidTestCaseType(const char* test_case_name,                               const char* file, int line);// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.//// Downcasts the pointer of type Base to Derived.// Derived must be a subclass of Base. The parameter MUST// point to a class of type Derived, not any subclass of it.// When RTTI is available, the function performs a runtime// check to enforce this.template <class Derived, class Base>Derived* CheckedDowncastToActualType(Base* base) {#if GTEST_HAS_RTTI  GTEST_CHECK_(typeid(*base) == typeid(Derived));  Derived* derived = dynamic_cast<Derived*>(base);  // NOLINT#else  Derived* derived = static_cast<Derived*>(base);  // Poor man's downcast.#endif  // GTEST_HAS_RTTI  return derived;}template <typename> class ParamGeneratorInterface;template <typename> class ParamGenerator;// Interface for iterating over elements provided by an implementation// of ParamGeneratorInterface<T>.template <typename T>class ParamIteratorInterface { public:  virtual ~ParamIteratorInterface() {}  // A pointer to the base generator instance.  // Used only for the purposes of iterator comparison  // to make sure that two iterators belong to the same generator.  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;  // Advances iterator to point to the next element  // provided by the generator. The caller is responsible  // for not calling Advance() on an iterator equal to  // BaseGenerator()->End().  virtual void Advance() = 0;  // Clones the iterator object. Used for implementing copy semantics  // of ParamIterator<T>.  virtual ParamIteratorInterface* Clone() const = 0;  // Dereferences the current iterator and provides (read-only) access  // to the pointed value. It is the caller's responsibility not to call  // Current() on an iterator equal to BaseGenerator()->End().  // Used for implementing ParamGenerator<T>::operator*().  virtual const T* Current() const = 0;  // Determines whether the given iterator and other point to the same  // element in the sequence generated by the generator.  // Used for implementing ParamGenerator<T>::operator==().  virtual bool Equals(const ParamIteratorInterface& other) const = 0;};// Class iterating over elements provided by an implementation of// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>// and implements the const forward iterator concept.template <typename T>class ParamIterator { public:  typedef T value_type;  typedef const T& reference;  typedef ptrdiff_t difference_type;  // ParamIterator assumes ownership of the impl_ pointer.  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}  ParamIterator& operator=(const ParamIterator& other) {    if (this != &other)      impl_.reset(other.impl_->Clone());    return *this;  }  const T& operator*() const { return *impl_->Current(); }  const T* operator->() const { return impl_->Current(); }  // Prefix version of operator++.  ParamIterator& operator++() {    impl_->Advance();    return *this;  }  // Postfix version of operator++.  ParamIterator operator++(int /*unused*/) {    ParamIteratorInterface<T>* clone = impl_->Clone();    impl_->Advance();    return ParamIterator(clone);  }  bool operator==(const ParamIterator& other) const {    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);  }  bool operator!=(const ParamIterator& other) const {    return !(*this == other);  } private:  friend class ParamGenerator<T>;  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}  scoped_ptr<ParamIteratorInterface<T> > impl_;};// ParamGeneratorInterface<T> is the binary interface to access generators// defined in other translation units.template <typename T>class ParamGeneratorInterface { public:  typedef T ParamType;  virtual ~ParamGeneratorInterface() {}  // Generator interface definition  virtual ParamIteratorInterface<T>* Begin() const = 0;  virtual ParamIteratorInterface<T>* End() const = 0;};// Wraps ParamGeneratorInetrface<T> and provides general generator syntax// compatible with the STL Container concept.// This class implements copy initialization semantics and the contained// ParamGeneratorInterface<T> instance is shared among all copies// of the original object. This is possible because that instance is immutable.template<typename T>class ParamGenerator { public:  typedef ParamIterator<T> iterator;  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}  ParamGenerator& operator=(const ParamGenerator& other) {    impl_ = other.impl_;    return *this;  }  iterator begin() const { return iterator(impl_->Begin()); }  iterator end() const { return iterator(impl_->End()); } private:  ::testing::internal::linked_ptr<const ParamGeneratorInterface<T> > impl_;};// Generates values from a range of two comparable values. Can be used to// generate sequences of user-defined types that implement operator+() and// operator<().// This class is used in the Range() function.template <typename T, typename IncrementT>class RangeGenerator : public ParamGeneratorInterface<T> { public:  RangeGenerator(T begin, T end, IncrementT step)      : begin_(begin), end_(end),        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}  virtual ~RangeGenerator() {}  virtual ParamIteratorInterface<T>* Begin() const {    return new Iterator(this, begin_, 0, step_);  }  virtual ParamIteratorInterface<T>* End() const {    return new Iterator(this, end_, end_index_, step_);  } private:  class Iterator : public ParamIteratorInterface<T> {   public:    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,             IncrementT step)        : base_(base), value_(value), index_(index), step_(step) {}    virtual ~Iterator() {}    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {      return base_;    }    virtual void Advance() {      value_ = value_ + step_;      index_++;    }    virtual ParamIteratorInterface<T>* Clone() const {      return new Iterator(*this);    }    virtual const T* Current() const { return &value_; }    virtual bool Equals(const ParamIteratorInterface<T>& other) const {      // Having the same base generator guarantees that the other      // iterator is of the same type and we can downcast.      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())          << "The program attempted to compare iterators "          << "from different generators." << std::endl;      const int other_index =          CheckedDowncastToActualType<const Iterator>(&other)->index_;      return index_ == other_index;    }   private:    Iterator(const Iterator& other)        : base_(other.base_), value_(other.value_), index_(other.index_),          step_(other.step_) {}    const ParamGeneratorInterface<T>* const base_;    T value_;    int index_;    const IncrementT step_;  };  // class RangeGenerator::Iterator  static int CalculateEndIndex(const T& begin,                               const T& end,                               const IncrementT& step) {    int end_index = 0;    for (T i = begin; i < end; i = i + step)      end_index++;    return end_index;  }  const T begin_;  const T end_;  const IncrementT step_;  // The index for the end() iterator. All the elements in the generated  // sequence are indexed (0-based) to aid iterator comparison.  const int end_index_;};  // class RangeGenerator// Generates values from a pair of STL-style iterators. Used in the// ValuesIn() function. The elements are copied from the source range// since the source can be located on the stack, and the generator// is likely to persist beyond that stack frame.template <typename T>class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> { public:  template <typename ForwardIterator>  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)      : container_(begin, end) {}  virtual ~ValuesInIteratorRangeGenerator() {}  virtual ParamIteratorInterface<T>* Begin() const {    return new Iterator(this, container_.begin());  }  virtual ParamIteratorInterface<T>* End() const {    return new Iterator(this, container_.end());  } private:  typedef typename ::std::vector<T> ContainerType;  class Iterator : public ParamIteratorInterface<T> {   public:    Iterator(const ParamGeneratorInterface<T>* base,             typename ContainerType::const_iterator iterator)        :  base_(base), iterator_(iterator) {}    virtual ~Iterator() {}    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {      return base_;    }    virtual void Advance() {      ++iterator_;      value_.reset();    }    virtual ParamIteratorInterface<T>* Clone() const {      return new Iterator(*this);    }    // We need to use cached value referenced by iterator_ because *iterator_    // can return a temporary object (and of type other then T), so just

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -