[12746] | 1 | $$ -*- mode: c++; -*-
|
---|
| 2 | $var n = 50 $$ Maximum length of Values arguments we want to support.
|
---|
| 3 | $var maxtuple = 10 $$ Maximum number of Combine arguments we want to support.
|
---|
| 4 | // Copyright 2008 Google Inc.
|
---|
| 5 | // All Rights Reserved.
|
---|
| 6 | //
|
---|
| 7 | // Redistribution and use in source and binary forms, with or without
|
---|
| 8 | // modification, are permitted provided that the following conditions are
|
---|
| 9 | // met:
|
---|
| 10 | //
|
---|
| 11 | // * Redistributions of source code must retain the above copyright
|
---|
| 12 | // notice, this list of conditions and the following disclaimer.
|
---|
| 13 | // * Redistributions in binary form must reproduce the above
|
---|
| 14 | // copyright notice, this list of conditions and the following disclaimer
|
---|
| 15 | // in the documentation and/or other materials provided with the
|
---|
| 16 | // distribution.
|
---|
| 17 | // * Neither the name of Google Inc. nor the names of its
|
---|
| 18 | // contributors may be used to endorse or promote products derived from
|
---|
| 19 | // this software without specific prior written permission.
|
---|
| 20 | //
|
---|
| 21 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
---|
| 22 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
---|
| 23 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
---|
| 24 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
---|
| 25 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
---|
| 26 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
---|
| 27 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
---|
| 28 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
---|
| 29 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
---|
| 30 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
---|
| 31 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
---|
| 32 | //
|
---|
| 33 | // Author: vladl@google.com (Vlad Losev)
|
---|
| 34 |
|
---|
| 35 | // Type and function utilities for implementing parameterized tests.
|
---|
| 36 | // This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
|
---|
| 37 | //
|
---|
| 38 | // Currently Google Test supports at most $n arguments in Values,
|
---|
| 39 | // and at most $maxtuple arguments in Combine. Please contact
|
---|
| 40 | // googletestframework@googlegroups.com if you need more.
|
---|
| 41 | // Please note that the number of arguments to Combine is limited
|
---|
| 42 | // by the maximum arity of the implementation of tr1::tuple which is
|
---|
| 43 | // currently set at $maxtuple.
|
---|
| 44 |
|
---|
| 45 | #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
|
---|
| 46 | #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
|
---|
| 47 |
|
---|
| 48 | // scripts/fuse_gtest.py depends on gtest's own header being #included
|
---|
| 49 | // *unconditionally*. Therefore these #includes cannot be moved
|
---|
| 50 | // inside #if GTEST_HAS_PARAM_TEST.
|
---|
| 51 | #include "gtest/internal/gtest-param-util.h"
|
---|
| 52 | #include "gtest/internal/gtest-port.h"
|
---|
| 53 |
|
---|
| 54 | #if GTEST_HAS_PARAM_TEST
|
---|
| 55 |
|
---|
| 56 | namespace testing {
|
---|
| 57 |
|
---|
| 58 | // Forward declarations of ValuesIn(), which is implemented in
|
---|
| 59 | // include/gtest/gtest-param-test.h.
|
---|
| 60 | template <typename ForwardIterator>
|
---|
| 61 | internal::ParamGenerator<
|
---|
| 62 | typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
|
---|
| 63 | ValuesIn(ForwardIterator begin, ForwardIterator end);
|
---|
| 64 |
|
---|
| 65 | template <typename T, size_t N>
|
---|
| 66 | internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
|
---|
| 67 |
|
---|
| 68 | template <class Container>
|
---|
| 69 | internal::ParamGenerator<typename Container::value_type> ValuesIn(
|
---|
| 70 | const Container& container);
|
---|
| 71 |
|
---|
| 72 | namespace internal {
|
---|
| 73 |
|
---|
| 74 | // Used in the Values() function to provide polymorphic capabilities.
|
---|
| 75 | template <typename T1>
|
---|
| 76 | class ValueArray1 {
|
---|
| 77 | public:
|
---|
| 78 | explicit ValueArray1(T1 v1) : v1_(v1) {}
|
---|
| 79 |
|
---|
| 80 | template <typename T>
|
---|
| 81 | operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
|
---|
| 82 |
|
---|
| 83 | private:
|
---|
| 84 | // No implementation - assignment is unsupported.
|
---|
| 85 | void operator=(const ValueArray1& other);
|
---|
| 86 |
|
---|
| 87 | const T1 v1_;
|
---|
| 88 | };
|
---|
| 89 |
|
---|
| 90 | $range i 2..n
|
---|
| 91 | $for i [[
|
---|
| 92 | $range j 1..i
|
---|
| 93 |
|
---|
| 94 | template <$for j, [[typename T$j]]>
|
---|
| 95 | class ValueArray$i {
|
---|
| 96 | public:
|
---|
| 97 | ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
|
---|
| 98 |
|
---|
| 99 | template <typename T>
|
---|
| 100 | operator ParamGenerator<T>() const {
|
---|
| 101 | const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
|
---|
| 102 | return ValuesIn(array);
|
---|
| 103 | }
|
---|
| 104 |
|
---|
| 105 | private:
|
---|
| 106 | // No implementation - assignment is unsupported.
|
---|
| 107 | void operator=(const ValueArray$i& other);
|
---|
| 108 |
|
---|
| 109 | $for j [[
|
---|
| 110 |
|
---|
| 111 | const T$j v$(j)_;
|
---|
| 112 | ]]
|
---|
| 113 |
|
---|
| 114 | };
|
---|
| 115 |
|
---|
| 116 | ]]
|
---|
| 117 |
|
---|
| 118 | # if GTEST_HAS_COMBINE
|
---|
| 119 | // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
---|
| 120 | //
|
---|
| 121 | // Generates values from the Cartesian product of values produced
|
---|
| 122 | // by the argument generators.
|
---|
| 123 | //
|
---|
| 124 | $range i 2..maxtuple
|
---|
| 125 | $for i [[
|
---|
| 126 | $range j 1..i
|
---|
| 127 | $range k 2..i
|
---|
| 128 |
|
---|
| 129 | template <$for j, [[typename T$j]]>
|
---|
| 130 | class CartesianProductGenerator$i
|
---|
| 131 | : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {
|
---|
| 132 | public:
|
---|
| 133 | typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;
|
---|
| 134 |
|
---|
| 135 | CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
|
---|
| 136 | : $for j, [[g$(j)_(g$j)]] {}
|
---|
| 137 | virtual ~CartesianProductGenerator$i() {}
|
---|
| 138 |
|
---|
| 139 | virtual ParamIteratorInterface<ParamType>* Begin() const {
|
---|
| 140 | return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
|
---|
| 141 | }
|
---|
| 142 | virtual ParamIteratorInterface<ParamType>* End() const {
|
---|
| 143 | return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
|
---|
| 144 | }
|
---|
| 145 |
|
---|
| 146 | private:
|
---|
| 147 | class Iterator : public ParamIteratorInterface<ParamType> {
|
---|
| 148 | public:
|
---|
| 149 | Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
|
---|
| 150 |
|
---|
| 151 | const ParamGenerator<T$j>& g$j,
|
---|
| 152 | const typename ParamGenerator<T$j>::iterator& current$(j)]])
|
---|
| 153 | : base_(base),
|
---|
| 154 | $for j, [[
|
---|
| 155 |
|
---|
| 156 | begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
|
---|
| 157 | ]] {
|
---|
| 158 | ComputeCurrentValue();
|
---|
| 159 | }
|
---|
| 160 | virtual ~Iterator() {}
|
---|
| 161 |
|
---|
| 162 | virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
|
---|
| 163 | return base_;
|
---|
| 164 | }
|
---|
| 165 | // Advance should not be called on beyond-of-range iterators
|
---|
| 166 | // so no component iterators must be beyond end of range, either.
|
---|
| 167 | virtual void Advance() {
|
---|
| 168 | assert(!AtEnd());
|
---|
| 169 | ++current$(i)_;
|
---|
| 170 |
|
---|
| 171 | $for k [[
|
---|
| 172 | if (current$(i+2-k)_ == end$(i+2-k)_) {
|
---|
| 173 | current$(i+2-k)_ = begin$(i+2-k)_;
|
---|
| 174 | ++current$(i+2-k-1)_;
|
---|
| 175 | }
|
---|
| 176 |
|
---|
| 177 | ]]
|
---|
| 178 | ComputeCurrentValue();
|
---|
| 179 | }
|
---|
| 180 | virtual ParamIteratorInterface<ParamType>* Clone() const {
|
---|
| 181 | return new Iterator(*this);
|
---|
| 182 | }
|
---|
| 183 | virtual const ParamType* Current() const { return ¤t_value_; }
|
---|
| 184 | virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
|
---|
| 185 | // Having the same base generator guarantees that the other
|
---|
| 186 | // iterator is of the same type and we can downcast.
|
---|
| 187 | GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
|
---|
| 188 | << "The program attempted to compare iterators "
|
---|
| 189 | << "from different generators." << std::endl;
|
---|
| 190 | const Iterator* typed_other =
|
---|
| 191 | CheckedDowncastToActualType<const Iterator>(&other);
|
---|
| 192 | // We must report iterators equal if they both point beyond their
|
---|
| 193 | // respective ranges. That can happen in a variety of fashions,
|
---|
| 194 | // so we have to consult AtEnd().
|
---|
| 195 | return (AtEnd() && typed_other->AtEnd()) ||
|
---|
| 196 | ($for j && [[
|
---|
| 197 |
|
---|
| 198 | current$(j)_ == typed_other->current$(j)_
|
---|
| 199 | ]]);
|
---|
| 200 | }
|
---|
| 201 |
|
---|
| 202 | private:
|
---|
| 203 | Iterator(const Iterator& other)
|
---|
| 204 | : base_(other.base_), $for j, [[
|
---|
| 205 |
|
---|
| 206 | begin$(j)_(other.begin$(j)_),
|
---|
| 207 | end$(j)_(other.end$(j)_),
|
---|
| 208 | current$(j)_(other.current$(j)_)
|
---|
| 209 | ]] {
|
---|
| 210 | ComputeCurrentValue();
|
---|
| 211 | }
|
---|
| 212 |
|
---|
| 213 | void ComputeCurrentValue() {
|
---|
| 214 | if (!AtEnd())
|
---|
| 215 | current_value_ = ParamType($for j, [[*current$(j)_]]);
|
---|
| 216 | }
|
---|
| 217 | bool AtEnd() const {
|
---|
| 218 | // We must report iterator past the end of the range when either of the
|
---|
| 219 | // component iterators has reached the end of its range.
|
---|
| 220 | return
|
---|
| 221 | $for j || [[
|
---|
| 222 |
|
---|
| 223 | current$(j)_ == end$(j)_
|
---|
| 224 | ]];
|
---|
| 225 | }
|
---|
| 226 |
|
---|
| 227 | // No implementation - assignment is unsupported.
|
---|
| 228 | void operator=(const Iterator& other);
|
---|
| 229 |
|
---|
| 230 | const ParamGeneratorInterface<ParamType>* const base_;
|
---|
| 231 | // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
|
---|
| 232 | // current[i]_ is the actual traversing iterator.
|
---|
| 233 | $for j [[
|
---|
| 234 |
|
---|
| 235 | const typename ParamGenerator<T$j>::iterator begin$(j)_;
|
---|
| 236 | const typename ParamGenerator<T$j>::iterator end$(j)_;
|
---|
| 237 | typename ParamGenerator<T$j>::iterator current$(j)_;
|
---|
| 238 | ]]
|
---|
| 239 |
|
---|
| 240 | ParamType current_value_;
|
---|
| 241 | }; // class CartesianProductGenerator$i::Iterator
|
---|
| 242 |
|
---|
| 243 | // No implementation - assignment is unsupported.
|
---|
| 244 | void operator=(const CartesianProductGenerator$i& other);
|
---|
| 245 |
|
---|
| 246 |
|
---|
| 247 | $for j [[
|
---|
| 248 | const ParamGenerator<T$j> g$(j)_;
|
---|
| 249 |
|
---|
| 250 | ]]
|
---|
| 251 | }; // class CartesianProductGenerator$i
|
---|
| 252 |
|
---|
| 253 |
|
---|
| 254 | ]]
|
---|
| 255 |
|
---|
| 256 | // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
|
---|
| 257 | //
|
---|
| 258 | // Helper classes providing Combine() with polymorphic features. They allow
|
---|
| 259 | // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
|
---|
| 260 | // convertible to U.
|
---|
| 261 | //
|
---|
| 262 | $range i 2..maxtuple
|
---|
| 263 | $for i [[
|
---|
| 264 | $range j 1..i
|
---|
| 265 |
|
---|
| 266 | template <$for j, [[class Generator$j]]>
|
---|
| 267 | class CartesianProductHolder$i {
|
---|
| 268 | public:
|
---|
| 269 | CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
|
---|
| 270 | : $for j, [[g$(j)_(g$j)]] {}
|
---|
| 271 | template <$for j, [[typename T$j]]>
|
---|
| 272 | operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {
|
---|
| 273 | return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(
|
---|
| 274 | new CartesianProductGenerator$i<$for j, [[T$j]]>(
|
---|
| 275 | $for j,[[
|
---|
| 276 |
|
---|
| 277 | static_cast<ParamGenerator<T$j> >(g$(j)_)
|
---|
| 278 | ]]));
|
---|
| 279 | }
|
---|
| 280 |
|
---|
| 281 | private:
|
---|
| 282 | // No implementation - assignment is unsupported.
|
---|
| 283 | void operator=(const CartesianProductHolder$i& other);
|
---|
| 284 |
|
---|
| 285 |
|
---|
| 286 | $for j [[
|
---|
| 287 | const Generator$j g$(j)_;
|
---|
| 288 |
|
---|
| 289 | ]]
|
---|
| 290 | }; // class CartesianProductHolder$i
|
---|
| 291 |
|
---|
| 292 | ]]
|
---|
| 293 |
|
---|
| 294 | # endif // GTEST_HAS_COMBINE
|
---|
| 295 |
|
---|
| 296 | } // namespace internal
|
---|
| 297 | } // namespace testing
|
---|
| 298 |
|
---|
| 299 | #endif // GTEST_HAS_PARAM_TEST
|
---|
| 300 |
|
---|
| 301 | #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
|
---|