1 // This file was GENERATED by command: 2 // pump.py gmock-generated-matchers.h.pump 3 // DO NOT EDIT BY HAND!!! 4 5 // Copyright 2008, Google Inc. 6 // All rights reserved. 7 // 8 // Redistribution and use in source and binary forms, with or without 9 // modification, are permitted provided that the following conditions are 10 // met: 11 // 12 // * Redistributions of source code must retain the above copyright 13 // notice, this list of conditions and the following disclaimer. 14 // * Redistributions in binary form must reproduce the above 15 // copyright notice, this list of conditions and the following disclaimer 16 // in the documentation and/or other materials provided with the 17 // distribution. 18 // * Neither the name of Google Inc. nor the names of its 19 // contributors may be used to endorse or promote products derived from 20 // this software without specific prior written permission. 21 // 22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 34 // Google Mock - a framework for writing C++ mock classes. 35 // 36 // This file implements some commonly used variadic matchers. 37 38 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 39 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 40 41 #include <sstream> 42 #include <string> 43 #include <vector> 44 #include "gmock/gmock-matchers.h" 45 46 namespace testing { 47 namespace internal { 48 49 // The type of the i-th (0-based) field of Tuple. 50 #define GMOCK_FIELD_TYPE_(Tuple, i) \ 51 typename ::std::tr1::tuple_element<i, Tuple>::type 52 53 // TupleFields<Tuple, k0, ..., kn> is for selecting fields from a 54 // tuple of type Tuple. It has two members: 55 // 56 // type: a tuple type whose i-th field is the ki-th field of Tuple. 57 // GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. 58 // 59 // For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have: 60 // 61 // type is tuple<int, bool>, and 62 // GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). 63 64 template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, 65 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 66 int k9 = -1> 67 class TupleFields; 68 69 // This generic version is used when there are 10 selectors. 70 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 71 int k7, int k8, int k9> 72 class TupleFields { 73 public: 74 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 75 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 76 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 77 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 78 GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8), 79 GMOCK_FIELD_TYPE_(Tuple, k9)> type; 80 static type GetSelectedFields(const Tuple& t) { 81 using ::std::tr1::get; 82 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 83 get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t)); 84 } 85 }; 86 87 // The following specialization is used for 0 ~ 9 selectors. 88 89 template <class Tuple> 90 class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 91 public: 92 typedef ::std::tr1::tuple<> type; 93 static type GetSelectedFields(const Tuple& /* t */) { 94 using ::std::tr1::get; 95 return type(); 96 } 97 }; 98 99 template <class Tuple, int k0> 100 class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 101 public: 102 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type; 103 static type GetSelectedFields(const Tuple& t) { 104 using ::std::tr1::get; 105 return type(get<k0>(t)); 106 } 107 }; 108 109 template <class Tuple, int k0, int k1> 110 class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> { 111 public: 112 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 113 GMOCK_FIELD_TYPE_(Tuple, k1)> type; 114 static type GetSelectedFields(const Tuple& t) { 115 using ::std::tr1::get; 116 return type(get<k0>(t), get<k1>(t)); 117 } 118 }; 119 120 template <class Tuple, int k0, int k1, int k2> 121 class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> { 122 public: 123 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 124 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type; 125 static type GetSelectedFields(const Tuple& t) { 126 using ::std::tr1::get; 127 return type(get<k0>(t), get<k1>(t), get<k2>(t)); 128 } 129 }; 130 131 template <class Tuple, int k0, int k1, int k2, int k3> 132 class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> { 133 public: 134 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 135 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 136 GMOCK_FIELD_TYPE_(Tuple, k3)> type; 137 static type GetSelectedFields(const Tuple& t) { 138 using ::std::tr1::get; 139 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t)); 140 } 141 }; 142 143 template <class Tuple, int k0, int k1, int k2, int k3, int k4> 144 class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> { 145 public: 146 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 147 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 148 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type; 149 static type GetSelectedFields(const Tuple& t) { 150 using ::std::tr1::get; 151 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t)); 152 } 153 }; 154 155 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5> 156 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> { 157 public: 158 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 159 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 160 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 161 GMOCK_FIELD_TYPE_(Tuple, k5)> type; 162 static type GetSelectedFields(const Tuple& t) { 163 using ::std::tr1::get; 164 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 165 get<k5>(t)); 166 } 167 }; 168 169 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6> 170 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> { 171 public: 172 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 173 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 174 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 175 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type; 176 static type GetSelectedFields(const Tuple& t) { 177 using ::std::tr1::get; 178 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 179 get<k5>(t), get<k6>(t)); 180 } 181 }; 182 183 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 184 int k7> 185 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> { 186 public: 187 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 188 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 189 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 190 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 191 GMOCK_FIELD_TYPE_(Tuple, k7)> type; 192 static type GetSelectedFields(const Tuple& t) { 193 using ::std::tr1::get; 194 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 195 get<k5>(t), get<k6>(t), get<k7>(t)); 196 } 197 }; 198 199 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 200 int k7, int k8> 201 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> { 202 public: 203 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 204 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 205 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 206 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 207 GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type; 208 static type GetSelectedFields(const Tuple& t) { 209 using ::std::tr1::get; 210 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 211 get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t)); 212 } 213 }; 214 215 #undef GMOCK_FIELD_TYPE_ 216 217 // Implements the Args() matcher. 218 template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, 219 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 220 int k9 = -1> 221 class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> { 222 public: 223 // ArgsTuple may have top-level const or reference modifiers. 224 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple; 225 typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, 226 k6, k7, k8, k9>::type SelectedArgs; 227 typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher; 228 229 template <typename InnerMatcher> 230 explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) 231 : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {} 232 233 virtual bool MatchAndExplain(ArgsTuple args, 234 MatchResultListener* listener) const { 235 const SelectedArgs& selected_args = GetSelectedArgs(args); 236 if (!listener->IsInterested()) 237 return inner_matcher_.Matches(selected_args); 238 239 PrintIndices(listener->stream()); 240 *listener << "are " << PrintToString(selected_args); 241 242 StringMatchResultListener inner_listener; 243 const bool match = inner_matcher_.MatchAndExplain(selected_args, 244 &inner_listener); 245 PrintIfNotEmpty(inner_listener.str(), listener->stream()); 246 return match; 247 } 248 249 virtual void DescribeTo(::std::ostream* os) const { 250 *os << "are a tuple "; 251 PrintIndices(os); 252 inner_matcher_.DescribeTo(os); 253 } 254 255 virtual void DescribeNegationTo(::std::ostream* os) const { 256 *os << "are a tuple "; 257 PrintIndices(os); 258 inner_matcher_.DescribeNegationTo(os); 259 } 260 261 private: 262 static SelectedArgs GetSelectedArgs(ArgsTuple args) { 263 return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, 264 k9>::GetSelectedFields(args); 265 } 266 267 // Prints the indices of the selected fields. 268 static void PrintIndices(::std::ostream* os) { 269 *os << "whose fields ("; 270 const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 }; 271 for (int i = 0; i < 10; i++) { 272 if (indices[i] < 0) 273 break; 274 275 if (i >= 1) 276 *os << ", "; 277 278 *os << "#" << indices[i]; 279 } 280 *os << ") "; 281 } 282 283 const MonomorphicInnerMatcher inner_matcher_; 284 285 GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); 286 }; 287 288 template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1, 289 int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, 290 int k8 = -1, int k9 = -1> 291 class ArgsMatcher { 292 public: 293 explicit ArgsMatcher(const InnerMatcher& inner_matcher) 294 : inner_matcher_(inner_matcher) {} 295 296 template <typename ArgsTuple> 297 operator Matcher<ArgsTuple>() const { 298 return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5, 299 k6, k7, k8, k9>(inner_matcher_)); 300 } 301 302 private: 303 const InnerMatcher inner_matcher_; 304 305 GTEST_DISALLOW_ASSIGN_(ArgsMatcher); 306 }; 307 308 // Implements ElementsAre() of 1-10 arguments. 309 310 template <typename T1> 311 class ElementsAreMatcher1 { 312 public: 313 explicit ElementsAreMatcher1(const T1& e1) : e1_(e1) {} 314 315 template <typename Container> 316 operator Matcher<Container>() const { 317 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 318 typedef typename internal::StlContainerView<RawContainer>::type::value_type 319 Element; 320 321 // Nokia's Symbian Compiler has a nasty bug where the object put 322 // in a one-element local array is not destructed when the array 323 // goes out of scope. This leads to obvious badness as we've 324 // added the linked_ptr in it to our other linked_ptrs list. 325 // Hence we implement ElementsAreMatcher1 specially to avoid using 326 // a local array. 327 const Matcher<const Element&> matcher = 328 MatcherCast<const Element&>(e1_); 329 return MakeMatcher(new ElementsAreMatcherImpl<Container>(&matcher, 1)); 330 } 331 332 private: 333 const T1& e1_; 334 335 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher1); 336 }; 337 338 template <typename T1, typename T2> 339 class ElementsAreMatcher2 { 340 public: 341 ElementsAreMatcher2(const T1& e1, const T2& e2) : e1_(e1), e2_(e2) {} 342 343 template <typename Container> 344 operator Matcher<Container>() const { 345 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 346 typedef typename internal::StlContainerView<RawContainer>::type::value_type 347 Element; 348 349 const Matcher<const Element&> matchers[] = { 350 MatcherCast<const Element&>(e1_), 351 MatcherCast<const Element&>(e2_), 352 }; 353 354 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 2)); 355 } 356 357 private: 358 const T1& e1_; 359 const T2& e2_; 360 361 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher2); 362 }; 363 364 template <typename T1, typename T2, typename T3> 365 class ElementsAreMatcher3 { 366 public: 367 ElementsAreMatcher3(const T1& e1, const T2& e2, const T3& e3) : e1_(e1), 368 e2_(e2), e3_(e3) {} 369 370 template <typename Container> 371 operator Matcher<Container>() const { 372 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 373 typedef typename internal::StlContainerView<RawContainer>::type::value_type 374 Element; 375 376 const Matcher<const Element&> matchers[] = { 377 MatcherCast<const Element&>(e1_), 378 MatcherCast<const Element&>(e2_), 379 MatcherCast<const Element&>(e3_), 380 }; 381 382 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 3)); 383 } 384 385 private: 386 const T1& e1_; 387 const T2& e2_; 388 const T3& e3_; 389 390 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher3); 391 }; 392 393 template <typename T1, typename T2, typename T3, typename T4> 394 class ElementsAreMatcher4 { 395 public: 396 ElementsAreMatcher4(const T1& e1, const T2& e2, const T3& e3, 397 const T4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {} 398 399 template <typename Container> 400 operator Matcher<Container>() const { 401 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 402 typedef typename internal::StlContainerView<RawContainer>::type::value_type 403 Element; 404 405 const Matcher<const Element&> matchers[] = { 406 MatcherCast<const Element&>(e1_), 407 MatcherCast<const Element&>(e2_), 408 MatcherCast<const Element&>(e3_), 409 MatcherCast<const Element&>(e4_), 410 }; 411 412 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 4)); 413 } 414 415 private: 416 const T1& e1_; 417 const T2& e2_; 418 const T3& e3_; 419 const T4& e4_; 420 421 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher4); 422 }; 423 424 template <typename T1, typename T2, typename T3, typename T4, typename T5> 425 class ElementsAreMatcher5 { 426 public: 427 ElementsAreMatcher5(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 428 const T5& e5) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {} 429 430 template <typename Container> 431 operator Matcher<Container>() const { 432 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 433 typedef typename internal::StlContainerView<RawContainer>::type::value_type 434 Element; 435 436 const Matcher<const Element&> matchers[] = { 437 MatcherCast<const Element&>(e1_), 438 MatcherCast<const Element&>(e2_), 439 MatcherCast<const Element&>(e3_), 440 MatcherCast<const Element&>(e4_), 441 MatcherCast<const Element&>(e5_), 442 }; 443 444 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 5)); 445 } 446 447 private: 448 const T1& e1_; 449 const T2& e2_; 450 const T3& e3_; 451 const T4& e4_; 452 const T5& e5_; 453 454 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher5); 455 }; 456 457 template <typename T1, typename T2, typename T3, typename T4, typename T5, 458 typename T6> 459 class ElementsAreMatcher6 { 460 public: 461 ElementsAreMatcher6(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 462 const T5& e5, const T6& e6) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), 463 e5_(e5), e6_(e6) {} 464 465 template <typename Container> 466 operator Matcher<Container>() const { 467 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 468 typedef typename internal::StlContainerView<RawContainer>::type::value_type 469 Element; 470 471 const Matcher<const Element&> matchers[] = { 472 MatcherCast<const Element&>(e1_), 473 MatcherCast<const Element&>(e2_), 474 MatcherCast<const Element&>(e3_), 475 MatcherCast<const Element&>(e4_), 476 MatcherCast<const Element&>(e5_), 477 MatcherCast<const Element&>(e6_), 478 }; 479 480 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 6)); 481 } 482 483 private: 484 const T1& e1_; 485 const T2& e2_; 486 const T3& e3_; 487 const T4& e4_; 488 const T5& e5_; 489 const T6& e6_; 490 491 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher6); 492 }; 493 494 template <typename T1, typename T2, typename T3, typename T4, typename T5, 495 typename T6, typename T7> 496 class ElementsAreMatcher7 { 497 public: 498 ElementsAreMatcher7(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 499 const T5& e5, const T6& e6, const T7& e7) : e1_(e1), e2_(e2), e3_(e3), 500 e4_(e4), e5_(e5), e6_(e6), e7_(e7) {} 501 502 template <typename Container> 503 operator Matcher<Container>() const { 504 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 505 typedef typename internal::StlContainerView<RawContainer>::type::value_type 506 Element; 507 508 const Matcher<const Element&> matchers[] = { 509 MatcherCast<const Element&>(e1_), 510 MatcherCast<const Element&>(e2_), 511 MatcherCast<const Element&>(e3_), 512 MatcherCast<const Element&>(e4_), 513 MatcherCast<const Element&>(e5_), 514 MatcherCast<const Element&>(e6_), 515 MatcherCast<const Element&>(e7_), 516 }; 517 518 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 7)); 519 } 520 521 private: 522 const T1& e1_; 523 const T2& e2_; 524 const T3& e3_; 525 const T4& e4_; 526 const T5& e5_; 527 const T6& e6_; 528 const T7& e7_; 529 530 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher7); 531 }; 532 533 template <typename T1, typename T2, typename T3, typename T4, typename T5, 534 typename T6, typename T7, typename T8> 535 class ElementsAreMatcher8 { 536 public: 537 ElementsAreMatcher8(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 538 const T5& e5, const T6& e6, const T7& e7, const T8& e8) : e1_(e1), 539 e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8) {} 540 541 template <typename Container> 542 operator Matcher<Container>() const { 543 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 544 typedef typename internal::StlContainerView<RawContainer>::type::value_type 545 Element; 546 547 const Matcher<const Element&> matchers[] = { 548 MatcherCast<const Element&>(e1_), 549 MatcherCast<const Element&>(e2_), 550 MatcherCast<const Element&>(e3_), 551 MatcherCast<const Element&>(e4_), 552 MatcherCast<const Element&>(e5_), 553 MatcherCast<const Element&>(e6_), 554 MatcherCast<const Element&>(e7_), 555 MatcherCast<const Element&>(e8_), 556 }; 557 558 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 8)); 559 } 560 561 private: 562 const T1& e1_; 563 const T2& e2_; 564 const T3& e3_; 565 const T4& e4_; 566 const T5& e5_; 567 const T6& e6_; 568 const T7& e7_; 569 const T8& e8_; 570 571 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher8); 572 }; 573 574 template <typename T1, typename T2, typename T3, typename T4, typename T5, 575 typename T6, typename T7, typename T8, typename T9> 576 class ElementsAreMatcher9 { 577 public: 578 ElementsAreMatcher9(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 579 const T5& e5, const T6& e6, const T7& e7, const T8& e8, 580 const T9& e9) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), 581 e7_(e7), e8_(e8), e9_(e9) {} 582 583 template <typename Container> 584 operator Matcher<Container>() const { 585 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 586 typedef typename internal::StlContainerView<RawContainer>::type::value_type 587 Element; 588 589 const Matcher<const Element&> matchers[] = { 590 MatcherCast<const Element&>(e1_), 591 MatcherCast<const Element&>(e2_), 592 MatcherCast<const Element&>(e3_), 593 MatcherCast<const Element&>(e4_), 594 MatcherCast<const Element&>(e5_), 595 MatcherCast<const Element&>(e6_), 596 MatcherCast<const Element&>(e7_), 597 MatcherCast<const Element&>(e8_), 598 MatcherCast<const Element&>(e9_), 599 }; 600 601 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 9)); 602 } 603 604 private: 605 const T1& e1_; 606 const T2& e2_; 607 const T3& e3_; 608 const T4& e4_; 609 const T5& e5_; 610 const T6& e6_; 611 const T7& e7_; 612 const T8& e8_; 613 const T9& e9_; 614 615 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher9); 616 }; 617 618 template <typename T1, typename T2, typename T3, typename T4, typename T5, 619 typename T6, typename T7, typename T8, typename T9, typename T10> 620 class ElementsAreMatcher10 { 621 public: 622 ElementsAreMatcher10(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 623 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, 624 const T10& e10) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), 625 e7_(e7), e8_(e8), e9_(e9), e10_(e10) {} 626 627 template <typename Container> 628 operator Matcher<Container>() const { 629 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 630 typedef typename internal::StlContainerView<RawContainer>::type::value_type 631 Element; 632 633 const Matcher<const Element&> matchers[] = { 634 MatcherCast<const Element&>(e1_), 635 MatcherCast<const Element&>(e2_), 636 MatcherCast<const Element&>(e3_), 637 MatcherCast<const Element&>(e4_), 638 MatcherCast<const Element&>(e5_), 639 MatcherCast<const Element&>(e6_), 640 MatcherCast<const Element&>(e7_), 641 MatcherCast<const Element&>(e8_), 642 MatcherCast<const Element&>(e9_), 643 MatcherCast<const Element&>(e10_), 644 }; 645 646 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 10)); 647 } 648 649 private: 650 const T1& e1_; 651 const T2& e2_; 652 const T3& e3_; 653 const T4& e4_; 654 const T5& e5_; 655 const T6& e6_; 656 const T7& e7_; 657 const T8& e8_; 658 const T9& e9_; 659 const T10& e10_; 660 661 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10); 662 }; 663 664 } // namespace internal 665 666 // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected 667 // fields of it matches a_matcher. C++ doesn't support default 668 // arguments for function templates, so we have to overload it. 669 template <typename InnerMatcher> 670 inline internal::ArgsMatcher<InnerMatcher> 671 Args(const InnerMatcher& matcher) { 672 return internal::ArgsMatcher<InnerMatcher>(matcher); 673 } 674 675 template <int k1, typename InnerMatcher> 676 inline internal::ArgsMatcher<InnerMatcher, k1> 677 Args(const InnerMatcher& matcher) { 678 return internal::ArgsMatcher<InnerMatcher, k1>(matcher); 679 } 680 681 template <int k1, int k2, typename InnerMatcher> 682 inline internal::ArgsMatcher<InnerMatcher, k1, k2> 683 Args(const InnerMatcher& matcher) { 684 return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher); 685 } 686 687 template <int k1, int k2, int k3, typename InnerMatcher> 688 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3> 689 Args(const InnerMatcher& matcher) { 690 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher); 691 } 692 693 template <int k1, int k2, int k3, int k4, typename InnerMatcher> 694 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4> 695 Args(const InnerMatcher& matcher) { 696 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher); 697 } 698 699 template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher> 700 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5> 701 Args(const InnerMatcher& matcher) { 702 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher); 703 } 704 705 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher> 706 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6> 707 Args(const InnerMatcher& matcher) { 708 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher); 709 } 710 711 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, 712 typename InnerMatcher> 713 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7> 714 Args(const InnerMatcher& matcher) { 715 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, 716 k7>(matcher); 717 } 718 719 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 720 typename InnerMatcher> 721 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8> 722 Args(const InnerMatcher& matcher) { 723 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, 724 k8>(matcher); 725 } 726 727 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 728 int k9, typename InnerMatcher> 729 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9> 730 Args(const InnerMatcher& matcher) { 731 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, 732 k9>(matcher); 733 } 734 735 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 736 int k9, int k10, typename InnerMatcher> 737 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9, 738 k10> 739 Args(const InnerMatcher& matcher) { 740 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, 741 k9, k10>(matcher); 742 } 743 744 // ElementsAre(e0, e1, ..., e_n) matches an STL-style container with 745 // (n + 1) elements, where the i-th element in the container must 746 // match the i-th argument in the list. Each argument of 747 // ElementsAre() can be either a value or a matcher. We support up to 748 // 10 arguments. 749 // 750 // NOTE: Since ElementsAre() cares about the order of the elements, it 751 // must not be used with containers whose elements's order is 752 // undefined (e.g. hash_map). 753 754 inline internal::ElementsAreMatcher0 ElementsAre() { 755 return internal::ElementsAreMatcher0(); 756 } 757 758 template <typename T1> 759 inline internal::ElementsAreMatcher1<T1> ElementsAre(const T1& e1) { 760 return internal::ElementsAreMatcher1<T1>(e1); 761 } 762 763 template <typename T1, typename T2> 764 inline internal::ElementsAreMatcher2<T1, T2> ElementsAre(const T1& e1, 765 const T2& e2) { 766 return internal::ElementsAreMatcher2<T1, T2>(e1, e2); 767 } 768 769 template <typename T1, typename T2, typename T3> 770 inline internal::ElementsAreMatcher3<T1, T2, T3> ElementsAre(const T1& e1, 771 const T2& e2, const T3& e3) { 772 return internal::ElementsAreMatcher3<T1, T2, T3>(e1, e2, e3); 773 } 774 775 template <typename T1, typename T2, typename T3, typename T4> 776 inline internal::ElementsAreMatcher4<T1, T2, T3, T4> ElementsAre(const T1& e1, 777 const T2& e2, const T3& e3, const T4& e4) { 778 return internal::ElementsAreMatcher4<T1, T2, T3, T4>(e1, e2, e3, e4); 779 } 780 781 template <typename T1, typename T2, typename T3, typename T4, typename T5> 782 inline internal::ElementsAreMatcher5<T1, T2, T3, T4, 783 T5> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 784 const T5& e5) { 785 return internal::ElementsAreMatcher5<T1, T2, T3, T4, T5>(e1, e2, e3, e4, e5); 786 } 787 788 template <typename T1, typename T2, typename T3, typename T4, typename T5, 789 typename T6> 790 inline internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, 791 T6> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 792 const T5& e5, const T6& e6) { 793 return internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, T6>(e1, e2, e3, e4, 794 e5, e6); 795 } 796 797 template <typename T1, typename T2, typename T3, typename T4, typename T5, 798 typename T6, typename T7> 799 inline internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, 800 T7> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 801 const T5& e5, const T6& e6, const T7& e7) { 802 return internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, T7>(e1, e2, e3, 803 e4, e5, e6, e7); 804 } 805 806 template <typename T1, typename T2, typename T3, typename T4, typename T5, 807 typename T6, typename T7, typename T8> 808 inline internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, 809 T8> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 810 const T5& e5, const T6& e6, const T7& e7, const T8& e8) { 811 return internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, T8>(e1, e2, 812 e3, e4, e5, e6, e7, e8); 813 } 814 815 template <typename T1, typename T2, typename T3, typename T4, typename T5, 816 typename T6, typename T7, typename T8, typename T9> 817 inline internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, 818 T9> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 819 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { 820 return internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(e1, 821 e2, e3, e4, e5, e6, e7, e8, e9); 822 } 823 824 template <typename T1, typename T2, typename T3, typename T4, typename T5, 825 typename T6, typename T7, typename T8, typename T9, typename T10> 826 inline internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9, 827 T10> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 828 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, 829 const T10& e10) { 830 return internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9, 831 T10>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); 832 } 833 834 // ElementsAreArray(array) and ElementAreArray(array, count) are like 835 // ElementsAre(), except that they take an array of values or 836 // matchers. The former form infers the size of 'array', which must 837 // be a static C-style array. In the latter form, 'array' can either 838 // be a static array or a pointer to a dynamically created array. 839 840 template <typename T> 841 inline internal::ElementsAreArrayMatcher<T> ElementsAreArray( 842 const T* first, size_t count) { 843 return internal::ElementsAreArrayMatcher<T>(first, count); 844 } 845 846 template <typename T, size_t N> 847 inline internal::ElementsAreArrayMatcher<T> 848 ElementsAreArray(const T (&array)[N]) { 849 return internal::ElementsAreArrayMatcher<T>(array, N); 850 } 851 852 // AllOf(m1, m2, ..., mk) matches any value that matches all of the given 853 // sub-matchers. AllOf is called fully qualified to prevent ADL from firing. 854 855 template <typename Matcher1, typename Matcher2> 856 inline internal::BothOfMatcher<Matcher1, Matcher2> 857 AllOf(Matcher1 m1, Matcher2 m2) { 858 return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); 859 } 860 861 template <typename Matcher1, typename Matcher2, typename Matcher3> 862 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 863 Matcher3> > 864 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { 865 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3)); 866 } 867 868 template <typename Matcher1, typename Matcher2, typename Matcher3, 869 typename Matcher4> 870 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 871 internal::BothOfMatcher<Matcher3, Matcher4> > > 872 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { 873 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4)); 874 } 875 876 template <typename Matcher1, typename Matcher2, typename Matcher3, 877 typename Matcher4, typename Matcher5> 878 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 879 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 880 Matcher5> > > > 881 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { 882 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5)); 883 } 884 885 template <typename Matcher1, typename Matcher2, typename Matcher3, 886 typename Matcher4, typename Matcher5, typename Matcher6> 887 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 888 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 889 internal::BothOfMatcher<Matcher5, Matcher6> > > > > 890 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 891 Matcher6 m6) { 892 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6)); 893 } 894 895 template <typename Matcher1, typename Matcher2, typename Matcher3, 896 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> 897 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 898 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 899 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 900 Matcher7> > > > > > 901 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 902 Matcher6 m6, Matcher7 m7) { 903 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7)); 904 } 905 906 template <typename Matcher1, typename Matcher2, typename Matcher3, 907 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 908 typename Matcher8> 909 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 910 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 911 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 912 internal::BothOfMatcher<Matcher7, Matcher8> > > > > > > 913 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 914 Matcher6 m6, Matcher7 m7, Matcher8 m8) { 915 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8)); 916 } 917 918 template <typename Matcher1, typename Matcher2, typename Matcher3, 919 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 920 typename Matcher8, typename Matcher9> 921 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 922 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 923 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 924 internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, 925 Matcher9> > > > > > > > 926 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 927 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { 928 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9)); 929 } 930 931 template <typename Matcher1, typename Matcher2, typename Matcher3, 932 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 933 typename Matcher8, typename Matcher9, typename Matcher10> 934 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 935 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 936 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 937 internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, 938 internal::BothOfMatcher<Matcher9, Matcher10> > > > > > > > > 939 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 940 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { 941 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9, 942 m10)); 943 } 944 945 // AnyOf(m1, m2, ..., mk) matches any value that matches any of the given 946 // sub-matchers. AnyOf is called fully qualified to prevent ADL from firing. 947 948 template <typename Matcher1, typename Matcher2> 949 inline internal::EitherOfMatcher<Matcher1, Matcher2> 950 AnyOf(Matcher1 m1, Matcher2 m2) { 951 return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); 952 } 953 954 template <typename Matcher1, typename Matcher2, typename Matcher3> 955 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 956 Matcher3> > 957 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { 958 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3)); 959 } 960 961 template <typename Matcher1, typename Matcher2, typename Matcher3, 962 typename Matcher4> 963 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 964 internal::EitherOfMatcher<Matcher3, Matcher4> > > 965 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { 966 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4)); 967 } 968 969 template <typename Matcher1, typename Matcher2, typename Matcher3, 970 typename Matcher4, typename Matcher5> 971 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 972 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 973 Matcher5> > > > 974 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { 975 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5)); 976 } 977 978 template <typename Matcher1, typename Matcher2, typename Matcher3, 979 typename Matcher4, typename Matcher5, typename Matcher6> 980 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 981 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 982 internal::EitherOfMatcher<Matcher5, Matcher6> > > > > 983 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 984 Matcher6 m6) { 985 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6)); 986 } 987 988 template <typename Matcher1, typename Matcher2, typename Matcher3, 989 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> 990 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 991 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 992 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 993 Matcher7> > > > > > 994 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 995 Matcher6 m6, Matcher7 m7) { 996 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7)); 997 } 998 999 template <typename Matcher1, typename Matcher2, typename Matcher3, 1000 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 1001 typename Matcher8> 1002 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 1003 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 1004 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 1005 internal::EitherOfMatcher<Matcher7, Matcher8> > > > > > > 1006 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 1007 Matcher6 m6, Matcher7 m7, Matcher8 m8) { 1008 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8)); 1009 } 1010 1011 template <typename Matcher1, typename Matcher2, typename Matcher3, 1012 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 1013 typename Matcher8, typename Matcher9> 1014 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 1015 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 1016 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 1017 internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, 1018 Matcher9> > > > > > > > 1019 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 1020 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { 1021 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9)); 1022 } 1023 1024 template <typename Matcher1, typename Matcher2, typename Matcher3, 1025 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 1026 typename Matcher8, typename Matcher9, typename Matcher10> 1027 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 1028 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 1029 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 1030 internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, 1031 internal::EitherOfMatcher<Matcher9, Matcher10> > > > > > > > > 1032 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 1033 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { 1034 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9, 1035 m10)); 1036 } 1037 1038 } // namespace testing 1039 1040 1041 // The MATCHER* family of macros can be used in a namespace scope to 1042 // define custom matchers easily. 1043 // 1044 // Basic Usage 1045 // =========== 1046 // 1047 // The syntax 1048 // 1049 // MATCHER(name, description_string) { statements; } 1050 // 1051 // defines a matcher with the given name that executes the statements, 1052 // which must return a bool to indicate if the match succeeds. Inside 1053 // the statements, you can refer to the value being matched by 'arg', 1054 // and refer to its type by 'arg_type'. 1055 // 1056 // The description string documents what the matcher does, and is used 1057 // to generate the failure message when the match fails. Since a 1058 // MATCHER() is usually defined in a header file shared by multiple 1059 // C++ source files, we require the description to be a C-string 1060 // literal to avoid possible side effects. It can be empty, in which 1061 // case we'll use the sequence of words in the matcher name as the 1062 // description. 1063 // 1064 // For example: 1065 // 1066 // MATCHER(IsEven, "") { return (arg % 2) == 0; } 1067 // 1068 // allows you to write 1069 // 1070 // // Expects mock_foo.Bar(n) to be called where n is even. 1071 // EXPECT_CALL(mock_foo, Bar(IsEven())); 1072 // 1073 // or, 1074 // 1075 // // Verifies that the value of some_expression is even. 1076 // EXPECT_THAT(some_expression, IsEven()); 1077 // 1078 // If the above assertion fails, it will print something like: 1079 // 1080 // Value of: some_expression 1081 // Expected: is even 1082 // Actual: 7 1083 // 1084 // where the description "is even" is automatically calculated from the 1085 // matcher name IsEven. 1086 // 1087 // Argument Type 1088 // ============= 1089 // 1090 // Note that the type of the value being matched (arg_type) is 1091 // determined by the context in which you use the matcher and is 1092 // supplied to you by the compiler, so you don't need to worry about 1093 // declaring it (nor can you). This allows the matcher to be 1094 // polymorphic. For example, IsEven() can be used to match any type 1095 // where the value of "(arg % 2) == 0" can be implicitly converted to 1096 // a bool. In the "Bar(IsEven())" example above, if method Bar() 1097 // takes an int, 'arg_type' will be int; if it takes an unsigned long, 1098 // 'arg_type' will be unsigned long; and so on. 1099 // 1100 // Parameterizing Matchers 1101 // ======================= 1102 // 1103 // Sometimes you'll want to parameterize the matcher. For that you 1104 // can use another macro: 1105 // 1106 // MATCHER_P(name, param_name, description_string) { statements; } 1107 // 1108 // For example: 1109 // 1110 // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } 1111 // 1112 // will allow you to write: 1113 // 1114 // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); 1115 // 1116 // which may lead to this message (assuming n is 10): 1117 // 1118 // Value of: Blah("a") 1119 // Expected: has absolute value 10 1120 // Actual: -9 1121 // 1122 // Note that both the matcher description and its parameter are 1123 // printed, making the message human-friendly. 1124 // 1125 // In the matcher definition body, you can write 'foo_type' to 1126 // reference the type of a parameter named 'foo'. For example, in the 1127 // body of MATCHER_P(HasAbsoluteValue, value) above, you can write 1128 // 'value_type' to refer to the type of 'value'. 1129 // 1130 // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to 1131 // support multi-parameter matchers. 1132 // 1133 // Describing Parameterized Matchers 1134 // ================================= 1135 // 1136 // The last argument to MATCHER*() is a string-typed expression. The 1137 // expression can reference all of the matcher's parameters and a 1138 // special bool-typed variable named 'negation'. When 'negation' is 1139 // false, the expression should evaluate to the matcher's description; 1140 // otherwise it should evaluate to the description of the negation of 1141 // the matcher. For example, 1142 // 1143 // using testing::PrintToString; 1144 // 1145 // MATCHER_P2(InClosedRange, low, hi, 1146 // string(negation ? "is not" : "is") + " in range [" + 1147 // PrintToString(low) + ", " + PrintToString(hi) + "]") { 1148 // return low <= arg && arg <= hi; 1149 // } 1150 // ... 1151 // EXPECT_THAT(3, InClosedRange(4, 6)); 1152 // EXPECT_THAT(3, Not(InClosedRange(2, 4))); 1153 // 1154 // would generate two failures that contain the text: 1155 // 1156 // Expected: is in range [4, 6] 1157 // ... 1158 // Expected: is not in range [2, 4] 1159 // 1160 // If you specify "" as the description, the failure message will 1161 // contain the sequence of words in the matcher name followed by the 1162 // parameter values printed as a tuple. For example, 1163 // 1164 // MATCHER_P2(InClosedRange, low, hi, "") { ... } 1165 // ... 1166 // EXPECT_THAT(3, InClosedRange(4, 6)); 1167 // EXPECT_THAT(3, Not(InClosedRange(2, 4))); 1168 // 1169 // would generate two failures that contain the text: 1170 // 1171 // Expected: in closed range (4, 6) 1172 // ... 1173 // Expected: not (in closed range (2, 4)) 1174 // 1175 // Types of Matcher Parameters 1176 // =========================== 1177 // 1178 // For the purpose of typing, you can view 1179 // 1180 // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } 1181 // 1182 // as shorthand for 1183 // 1184 // template <typename p1_type, ..., typename pk_type> 1185 // FooMatcherPk<p1_type, ..., pk_type> 1186 // Foo(p1_type p1, ..., pk_type pk) { ... } 1187 // 1188 // When you write Foo(v1, ..., vk), the compiler infers the types of 1189 // the parameters v1, ..., and vk for you. If you are not happy with 1190 // the result of the type inference, you can specify the types by 1191 // explicitly instantiating the template, as in Foo<long, bool>(5, 1192 // false). As said earlier, you don't get to (or need to) specify 1193 // 'arg_type' as that's determined by the context in which the matcher 1194 // is used. You can assign the result of expression Foo(p1, ..., pk) 1195 // to a variable of type FooMatcherPk<p1_type, ..., pk_type>. This 1196 // can be useful when composing matchers. 1197 // 1198 // While you can instantiate a matcher template with reference types, 1199 // passing the parameters by pointer usually makes your code more 1200 // readable. If, however, you still want to pass a parameter by 1201 // reference, be aware that in the failure message generated by the 1202 // matcher you will see the value of the referenced object but not its 1203 // address. 1204 // 1205 // Explaining Match Results 1206 // ======================== 1207 // 1208 // Sometimes the matcher description alone isn't enough to explain why 1209 // the match has failed or succeeded. For example, when expecting a 1210 // long string, it can be very helpful to also print the diff between 1211 // the expected string and the actual one. To achieve that, you can 1212 // optionally stream additional information to a special variable 1213 // named result_listener, whose type is a pointer to class 1214 // MatchResultListener: 1215 // 1216 // MATCHER_P(EqualsLongString, str, "") { 1217 // if (arg == str) return true; 1218 // 1219 // *result_listener << "the difference: " 1220 /// << DiffStrings(str, arg); 1221 // return false; 1222 // } 1223 // 1224 // Overloading Matchers 1225 // ==================== 1226 // 1227 // You can overload matchers with different numbers of parameters: 1228 // 1229 // MATCHER_P(Blah, a, description_string1) { ... } 1230 // MATCHER_P2(Blah, a, b, description_string2) { ... } 1231 // 1232 // Caveats 1233 // ======= 1234 // 1235 // When defining a new matcher, you should also consider implementing 1236 // MatcherInterface or using MakePolymorphicMatcher(). These 1237 // approaches require more work than the MATCHER* macros, but also 1238 // give you more control on the types of the value being matched and 1239 // the matcher parameters, which may leads to better compiler error 1240 // messages when the matcher is used wrong. They also allow 1241 // overloading matchers based on parameter types (as opposed to just 1242 // based on the number of parameters). 1243 // 1244 // MATCHER*() can only be used in a namespace scope. The reason is 1245 // that C++ doesn't yet allow function-local types to be used to 1246 // instantiate templates. The up-coming C++0x standard will fix this. 1247 // Once that's done, we'll consider supporting using MATCHER*() inside 1248 // a function. 1249 // 1250 // More Information 1251 // ================ 1252 // 1253 // To learn more about using these macros, please search for 'MATCHER' 1254 // on http://code.google.com/p/googlemock/wiki/CookBook. 1255 1256 #define MATCHER(name, description)\ 1257 class name##Matcher {\ 1258 public:\ 1259 template <typename arg_type>\ 1260 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1261 public:\ 1262 gmock_Impl()\ 1263 {}\ 1264 virtual bool MatchAndExplain(\ 1265 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1266 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1267 *gmock_os << FormatDescription(false);\ 1268 }\ 1269 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1270 *gmock_os << FormatDescription(true);\ 1271 }\ 1272 private:\ 1273 ::testing::internal::string FormatDescription(bool negation) const {\ 1274 const ::testing::internal::string gmock_description = (description);\ 1275 if (!gmock_description.empty())\ 1276 return gmock_description;\ 1277 return ::testing::internal::FormatMatcherDescription(\ 1278 negation, #name,\ 1279 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1280 ::std::tr1::tuple<>()));\ 1281 }\ 1282 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1283 };\ 1284 template <typename arg_type>\ 1285 operator ::testing::Matcher<arg_type>() const {\ 1286 return ::testing::Matcher<arg_type>(\ 1287 new gmock_Impl<arg_type>());\ 1288 }\ 1289 name##Matcher() {\ 1290 }\ 1291 private:\ 1292 GTEST_DISALLOW_ASSIGN_(name##Matcher);\ 1293 };\ 1294 inline name##Matcher name() {\ 1295 return name##Matcher();\ 1296 }\ 1297 template <typename arg_type>\ 1298 bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\ 1299 arg_type arg,\ 1300 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1301 const 1302 1303 #define MATCHER_P(name, p0, description)\ 1304 template <typename p0##_type>\ 1305 class name##MatcherP {\ 1306 public:\ 1307 template <typename arg_type>\ 1308 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1309 public:\ 1310 explicit gmock_Impl(p0##_type gmock_p0)\ 1311 : p0(gmock_p0) {}\ 1312 virtual bool MatchAndExplain(\ 1313 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1314 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1315 *gmock_os << FormatDescription(false);\ 1316 }\ 1317 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1318 *gmock_os << FormatDescription(true);\ 1319 }\ 1320 p0##_type p0;\ 1321 private:\ 1322 ::testing::internal::string FormatDescription(bool negation) const {\ 1323 const ::testing::internal::string gmock_description = (description);\ 1324 if (!gmock_description.empty())\ 1325 return gmock_description;\ 1326 return ::testing::internal::FormatMatcherDescription(\ 1327 negation, #name,\ 1328 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1329 ::std::tr1::tuple<p0##_type>(p0)));\ 1330 }\ 1331 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1332 };\ 1333 template <typename arg_type>\ 1334 operator ::testing::Matcher<arg_type>() const {\ 1335 return ::testing::Matcher<arg_type>(\ 1336 new gmock_Impl<arg_type>(p0));\ 1337 }\ 1338 name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\ 1339 }\ 1340 p0##_type p0;\ 1341 private:\ 1342 GTEST_DISALLOW_ASSIGN_(name##MatcherP);\ 1343 };\ 1344 template <typename p0##_type>\ 1345 inline name##MatcherP<p0##_type> name(p0##_type p0) {\ 1346 return name##MatcherP<p0##_type>(p0);\ 1347 }\ 1348 template <typename p0##_type>\ 1349 template <typename arg_type>\ 1350 bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1351 arg_type arg,\ 1352 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1353 const 1354 1355 #define MATCHER_P2(name, p0, p1, description)\ 1356 template <typename p0##_type, typename p1##_type>\ 1357 class name##MatcherP2 {\ 1358 public:\ 1359 template <typename arg_type>\ 1360 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1361 public:\ 1362 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\ 1363 : p0(gmock_p0), p1(gmock_p1) {}\ 1364 virtual bool MatchAndExplain(\ 1365 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1366 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1367 *gmock_os << FormatDescription(false);\ 1368 }\ 1369 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1370 *gmock_os << FormatDescription(true);\ 1371 }\ 1372 p0##_type p0;\ 1373 p1##_type p1;\ 1374 private:\ 1375 ::testing::internal::string FormatDescription(bool negation) const {\ 1376 const ::testing::internal::string gmock_description = (description);\ 1377 if (!gmock_description.empty())\ 1378 return gmock_description;\ 1379 return ::testing::internal::FormatMatcherDescription(\ 1380 negation, #name,\ 1381 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1382 ::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\ 1383 }\ 1384 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1385 };\ 1386 template <typename arg_type>\ 1387 operator ::testing::Matcher<arg_type>() const {\ 1388 return ::testing::Matcher<arg_type>(\ 1389 new gmock_Impl<arg_type>(p0, p1));\ 1390 }\ 1391 name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 1392 p1(gmock_p1) {\ 1393 }\ 1394 p0##_type p0;\ 1395 p1##_type p1;\ 1396 private:\ 1397 GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\ 1398 };\ 1399 template <typename p0##_type, typename p1##_type>\ 1400 inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \ 1401 p1##_type p1) {\ 1402 return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\ 1403 }\ 1404 template <typename p0##_type, typename p1##_type>\ 1405 template <typename arg_type>\ 1406 bool name##MatcherP2<p0##_type, \ 1407 p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1408 arg_type arg,\ 1409 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1410 const 1411 1412 #define MATCHER_P3(name, p0, p1, p2, description)\ 1413 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1414 class name##MatcherP3 {\ 1415 public:\ 1416 template <typename arg_type>\ 1417 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1418 public:\ 1419 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\ 1420 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 1421 virtual bool MatchAndExplain(\ 1422 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1423 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1424 *gmock_os << FormatDescription(false);\ 1425 }\ 1426 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1427 *gmock_os << FormatDescription(true);\ 1428 }\ 1429 p0##_type p0;\ 1430 p1##_type p1;\ 1431 p2##_type p2;\ 1432 private:\ 1433 ::testing::internal::string FormatDescription(bool negation) const {\ 1434 const ::testing::internal::string gmock_description = (description);\ 1435 if (!gmock_description.empty())\ 1436 return gmock_description;\ 1437 return ::testing::internal::FormatMatcherDescription(\ 1438 negation, #name,\ 1439 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1440 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \ 1441 p2)));\ 1442 }\ 1443 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1444 };\ 1445 template <typename arg_type>\ 1446 operator ::testing::Matcher<arg_type>() const {\ 1447 return ::testing::Matcher<arg_type>(\ 1448 new gmock_Impl<arg_type>(p0, p1, p2));\ 1449 }\ 1450 name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ 1451 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\ 1452 }\ 1453 p0##_type p0;\ 1454 p1##_type p1;\ 1455 p2##_type p2;\ 1456 private:\ 1457 GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\ 1458 };\ 1459 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1460 inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ 1461 p1##_type p1, p2##_type p2) {\ 1462 return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\ 1463 }\ 1464 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1465 template <typename arg_type>\ 1466 bool name##MatcherP3<p0##_type, p1##_type, \ 1467 p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1468 arg_type arg,\ 1469 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1470 const 1471 1472 #define MATCHER_P4(name, p0, p1, p2, p3, description)\ 1473 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1474 typename p3##_type>\ 1475 class name##MatcherP4 {\ 1476 public:\ 1477 template <typename arg_type>\ 1478 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1479 public:\ 1480 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1481 p3##_type gmock_p3)\ 1482 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\ 1483 virtual bool MatchAndExplain(\ 1484 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1485 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1486 *gmock_os << FormatDescription(false);\ 1487 }\ 1488 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1489 *gmock_os << FormatDescription(true);\ 1490 }\ 1491 p0##_type p0;\ 1492 p1##_type p1;\ 1493 p2##_type p2;\ 1494 p3##_type p3;\ 1495 private:\ 1496 ::testing::internal::string FormatDescription(bool negation) const {\ 1497 const ::testing::internal::string gmock_description = (description);\ 1498 if (!gmock_description.empty())\ 1499 return gmock_description;\ 1500 return ::testing::internal::FormatMatcherDescription(\ 1501 negation, #name,\ 1502 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1503 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \ 1504 p3##_type>(p0, p1, p2, p3)));\ 1505 }\ 1506 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1507 };\ 1508 template <typename arg_type>\ 1509 operator ::testing::Matcher<arg_type>() const {\ 1510 return ::testing::Matcher<arg_type>(\ 1511 new gmock_Impl<arg_type>(p0, p1, p2, p3));\ 1512 }\ 1513 name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ 1514 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ 1515 p2(gmock_p2), p3(gmock_p3) {\ 1516 }\ 1517 p0##_type p0;\ 1518 p1##_type p1;\ 1519 p2##_type p2;\ 1520 p3##_type p3;\ 1521 private:\ 1522 GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\ 1523 };\ 1524 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1525 typename p3##_type>\ 1526 inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \ 1527 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 1528 p3##_type p3) {\ 1529 return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \ 1530 p1, p2, p3);\ 1531 }\ 1532 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1533 typename p3##_type>\ 1534 template <typename arg_type>\ 1535 bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \ 1536 p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1537 arg_type arg,\ 1538 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1539 const 1540 1541 #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ 1542 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1543 typename p3##_type, typename p4##_type>\ 1544 class name##MatcherP5 {\ 1545 public:\ 1546 template <typename arg_type>\ 1547 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1548 public:\ 1549 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1550 p3##_type gmock_p3, p4##_type gmock_p4)\ 1551 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1552 p4(gmock_p4) {}\ 1553 virtual bool MatchAndExplain(\ 1554 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1555 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1556 *gmock_os << FormatDescription(false);\ 1557 }\ 1558 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1559 *gmock_os << FormatDescription(true);\ 1560 }\ 1561 p0##_type p0;\ 1562 p1##_type p1;\ 1563 p2##_type p2;\ 1564 p3##_type p3;\ 1565 p4##_type p4;\ 1566 private:\ 1567 ::testing::internal::string FormatDescription(bool negation) const {\ 1568 const ::testing::internal::string gmock_description = (description);\ 1569 if (!gmock_description.empty())\ 1570 return gmock_description;\ 1571 return ::testing::internal::FormatMatcherDescription(\ 1572 negation, #name,\ 1573 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1574 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1575 p4##_type>(p0, p1, p2, p3, p4)));\ 1576 }\ 1577 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1578 };\ 1579 template <typename arg_type>\ 1580 operator ::testing::Matcher<arg_type>() const {\ 1581 return ::testing::Matcher<arg_type>(\ 1582 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\ 1583 }\ 1584 name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ 1585 p2##_type gmock_p2, p3##_type gmock_p3, \ 1586 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1587 p3(gmock_p3), p4(gmock_p4) {\ 1588 }\ 1589 p0##_type p0;\ 1590 p1##_type p1;\ 1591 p2##_type p2;\ 1592 p3##_type p3;\ 1593 p4##_type p4;\ 1594 private:\ 1595 GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\ 1596 };\ 1597 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1598 typename p3##_type, typename p4##_type>\ 1599 inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1600 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1601 p4##_type p4) {\ 1602 return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1603 p4##_type>(p0, p1, p2, p3, p4);\ 1604 }\ 1605 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1606 typename p3##_type, typename p4##_type>\ 1607 template <typename arg_type>\ 1608 bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1609 p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1610 arg_type arg,\ 1611 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1612 const 1613 1614 #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ 1615 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1616 typename p3##_type, typename p4##_type, typename p5##_type>\ 1617 class name##MatcherP6 {\ 1618 public:\ 1619 template <typename arg_type>\ 1620 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1621 public:\ 1622 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1623 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\ 1624 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1625 p4(gmock_p4), p5(gmock_p5) {}\ 1626 virtual bool MatchAndExplain(\ 1627 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1628 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1629 *gmock_os << FormatDescription(false);\ 1630 }\ 1631 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1632 *gmock_os << FormatDescription(true);\ 1633 }\ 1634 p0##_type p0;\ 1635 p1##_type p1;\ 1636 p2##_type p2;\ 1637 p3##_type p3;\ 1638 p4##_type p4;\ 1639 p5##_type p5;\ 1640 private:\ 1641 ::testing::internal::string FormatDescription(bool negation) const {\ 1642 const ::testing::internal::string gmock_description = (description);\ 1643 if (!gmock_description.empty())\ 1644 return gmock_description;\ 1645 return ::testing::internal::FormatMatcherDescription(\ 1646 negation, #name,\ 1647 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1648 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1649 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\ 1650 }\ 1651 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1652 };\ 1653 template <typename arg_type>\ 1654 operator ::testing::Matcher<arg_type>() const {\ 1655 return ::testing::Matcher<arg_type>(\ 1656 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\ 1657 }\ 1658 name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ 1659 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1660 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1661 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\ 1662 }\ 1663 p0##_type p0;\ 1664 p1##_type p1;\ 1665 p2##_type p2;\ 1666 p3##_type p3;\ 1667 p4##_type p4;\ 1668 p5##_type p5;\ 1669 private:\ 1670 GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\ 1671 };\ 1672 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1673 typename p3##_type, typename p4##_type, typename p5##_type>\ 1674 inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 1675 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 1676 p3##_type p3, p4##_type p4, p5##_type p5) {\ 1677 return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 1678 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\ 1679 }\ 1680 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1681 typename p3##_type, typename p4##_type, typename p5##_type>\ 1682 template <typename arg_type>\ 1683 bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1684 p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1685 arg_type arg,\ 1686 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1687 const 1688 1689 #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ 1690 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1691 typename p3##_type, typename p4##_type, typename p5##_type, \ 1692 typename p6##_type>\ 1693 class name##MatcherP7 {\ 1694 public:\ 1695 template <typename arg_type>\ 1696 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1697 public:\ 1698 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1699 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1700 p6##_type gmock_p6)\ 1701 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1702 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ 1703 virtual bool MatchAndExplain(\ 1704 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1705 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1706 *gmock_os << FormatDescription(false);\ 1707 }\ 1708 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1709 *gmock_os << FormatDescription(true);\ 1710 }\ 1711 p0##_type p0;\ 1712 p1##_type p1;\ 1713 p2##_type p2;\ 1714 p3##_type p3;\ 1715 p4##_type p4;\ 1716 p5##_type p5;\ 1717 p6##_type p6;\ 1718 private:\ 1719 ::testing::internal::string FormatDescription(bool negation) const {\ 1720 const ::testing::internal::string gmock_description = (description);\ 1721 if (!gmock_description.empty())\ 1722 return gmock_description;\ 1723 return ::testing::internal::FormatMatcherDescription(\ 1724 negation, #name,\ 1725 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1726 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1727 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \ 1728 p6)));\ 1729 }\ 1730 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1731 };\ 1732 template <typename arg_type>\ 1733 operator ::testing::Matcher<arg_type>() const {\ 1734 return ::testing::Matcher<arg_type>(\ 1735 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\ 1736 }\ 1737 name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ 1738 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1739 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ 1740 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ 1741 p6(gmock_p6) {\ 1742 }\ 1743 p0##_type p0;\ 1744 p1##_type p1;\ 1745 p2##_type p2;\ 1746 p3##_type p3;\ 1747 p4##_type p4;\ 1748 p5##_type p5;\ 1749 p6##_type p6;\ 1750 private:\ 1751 GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\ 1752 };\ 1753 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1754 typename p3##_type, typename p4##_type, typename p5##_type, \ 1755 typename p6##_type>\ 1756 inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 1757 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \ 1758 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 1759 p6##_type p6) {\ 1760 return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 1761 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\ 1762 }\ 1763 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1764 typename p3##_type, typename p4##_type, typename p5##_type, \ 1765 typename p6##_type>\ 1766 template <typename arg_type>\ 1767 bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1768 p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1769 arg_type arg,\ 1770 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1771 const 1772 1773 #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ 1774 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1775 typename p3##_type, typename p4##_type, typename p5##_type, \ 1776 typename p6##_type, typename p7##_type>\ 1777 class name##MatcherP8 {\ 1778 public:\ 1779 template <typename arg_type>\ 1780 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1781 public:\ 1782 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1783 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1784 p6##_type gmock_p6, p7##_type gmock_p7)\ 1785 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1786 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ 1787 virtual bool MatchAndExplain(\ 1788 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1789 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1790 *gmock_os << FormatDescription(false);\ 1791 }\ 1792 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1793 *gmock_os << FormatDescription(true);\ 1794 }\ 1795 p0##_type p0;\ 1796 p1##_type p1;\ 1797 p2##_type p2;\ 1798 p3##_type p3;\ 1799 p4##_type p4;\ 1800 p5##_type p5;\ 1801 p6##_type p6;\ 1802 p7##_type p7;\ 1803 private:\ 1804 ::testing::internal::string FormatDescription(bool negation) const {\ 1805 const ::testing::internal::string gmock_description = (description);\ 1806 if (!gmock_description.empty())\ 1807 return gmock_description;\ 1808 return ::testing::internal::FormatMatcherDescription(\ 1809 negation, #name,\ 1810 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1811 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1812 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \ 1813 p3, p4, p5, p6, p7)));\ 1814 }\ 1815 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1816 };\ 1817 template <typename arg_type>\ 1818 operator ::testing::Matcher<arg_type>() const {\ 1819 return ::testing::Matcher<arg_type>(\ 1820 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\ 1821 }\ 1822 name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ 1823 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1824 p5##_type gmock_p5, p6##_type gmock_p6, \ 1825 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1826 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 1827 p7(gmock_p7) {\ 1828 }\ 1829 p0##_type p0;\ 1830 p1##_type p1;\ 1831 p2##_type p2;\ 1832 p3##_type p3;\ 1833 p4##_type p4;\ 1834 p5##_type p5;\ 1835 p6##_type p6;\ 1836 p7##_type p7;\ 1837 private:\ 1838 GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\ 1839 };\ 1840 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1841 typename p3##_type, typename p4##_type, typename p5##_type, \ 1842 typename p6##_type, typename p7##_type>\ 1843 inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 1844 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \ 1845 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 1846 p6##_type p6, p7##_type p7) {\ 1847 return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 1848 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \ 1849 p6, p7);\ 1850 }\ 1851 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1852 typename p3##_type, typename p4##_type, typename p5##_type, \ 1853 typename p6##_type, typename p7##_type>\ 1854 template <typename arg_type>\ 1855 bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1856 p5##_type, p6##_type, \ 1857 p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1858 arg_type arg,\ 1859 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1860 const 1861 1862 #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ 1863 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1864 typename p3##_type, typename p4##_type, typename p5##_type, \ 1865 typename p6##_type, typename p7##_type, typename p8##_type>\ 1866 class name##MatcherP9 {\ 1867 public:\ 1868 template <typename arg_type>\ 1869 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1870 public:\ 1871 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1872 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1873 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\ 1874 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1875 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 1876 p8(gmock_p8) {}\ 1877 virtual bool MatchAndExplain(\ 1878 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1879 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1880 *gmock_os << FormatDescription(false);\ 1881 }\ 1882 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1883 *gmock_os << FormatDescription(true);\ 1884 }\ 1885 p0##_type p0;\ 1886 p1##_type p1;\ 1887 p2##_type p2;\ 1888 p3##_type p3;\ 1889 p4##_type p4;\ 1890 p5##_type p5;\ 1891 p6##_type p6;\ 1892 p7##_type p7;\ 1893 p8##_type p8;\ 1894 private:\ 1895 ::testing::internal::string FormatDescription(bool negation) const {\ 1896 const ::testing::internal::string gmock_description = (description);\ 1897 if (!gmock_description.empty())\ 1898 return gmock_description;\ 1899 return ::testing::internal::FormatMatcherDescription(\ 1900 negation, #name,\ 1901 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1902 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1903 p4##_type, p5##_type, p6##_type, p7##_type, \ 1904 p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ 1905 }\ 1906 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1907 };\ 1908 template <typename arg_type>\ 1909 operator ::testing::Matcher<arg_type>() const {\ 1910 return ::testing::Matcher<arg_type>(\ 1911 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ 1912 }\ 1913 name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ 1914 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1915 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 1916 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1917 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 1918 p8(gmock_p8) {\ 1919 }\ 1920 p0##_type p0;\ 1921 p1##_type p1;\ 1922 p2##_type p2;\ 1923 p3##_type p3;\ 1924 p4##_type p4;\ 1925 p5##_type p5;\ 1926 p6##_type p6;\ 1927 p7##_type p7;\ 1928 p8##_type p8;\ 1929 private:\ 1930 GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\ 1931 };\ 1932 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1933 typename p3##_type, typename p4##_type, typename p5##_type, \ 1934 typename p6##_type, typename p7##_type, typename p8##_type>\ 1935 inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 1936 p4##_type, p5##_type, p6##_type, p7##_type, \ 1937 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1938 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ 1939 p8##_type p8) {\ 1940 return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 1941 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \ 1942 p3, p4, p5, p6, p7, p8);\ 1943 }\ 1944 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1945 typename p3##_type, typename p4##_type, typename p5##_type, \ 1946 typename p6##_type, typename p7##_type, typename p8##_type>\ 1947 template <typename arg_type>\ 1948 bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1949 p5##_type, p6##_type, p7##_type, \ 1950 p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1951 arg_type arg,\ 1952 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1953 const 1954 1955 #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ 1956 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1957 typename p3##_type, typename p4##_type, typename p5##_type, \ 1958 typename p6##_type, typename p7##_type, typename p8##_type, \ 1959 typename p9##_type>\ 1960 class name##MatcherP10 {\ 1961 public:\ 1962 template <typename arg_type>\ 1963 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1964 public:\ 1965 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1966 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1967 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 1968 p9##_type gmock_p9)\ 1969 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1970 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 1971 p8(gmock_p8), p9(gmock_p9) {}\ 1972 virtual bool MatchAndExplain(\ 1973 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1974 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1975 *gmock_os << FormatDescription(false);\ 1976 }\ 1977 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1978 *gmock_os << FormatDescription(true);\ 1979 }\ 1980 p0##_type p0;\ 1981 p1##_type p1;\ 1982 p2##_type p2;\ 1983 p3##_type p3;\ 1984 p4##_type p4;\ 1985 p5##_type p5;\ 1986 p6##_type p6;\ 1987 p7##_type p7;\ 1988 p8##_type p8;\ 1989 p9##_type p9;\ 1990 private:\ 1991 ::testing::internal::string FormatDescription(bool negation) const {\ 1992 const ::testing::internal::string gmock_description = (description);\ 1993 if (!gmock_description.empty())\ 1994 return gmock_description;\ 1995 return ::testing::internal::FormatMatcherDescription(\ 1996 negation, #name,\ 1997 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1998 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1999 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2000 p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ 2001 }\ 2002 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 2003 };\ 2004 template <typename arg_type>\ 2005 operator ::testing::Matcher<arg_type>() const {\ 2006 return ::testing::Matcher<arg_type>(\ 2007 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ 2008 }\ 2009 name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ 2010 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 2011 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 2012 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ 2013 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 2014 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\ 2015 }\ 2016 p0##_type p0;\ 2017 p1##_type p1;\ 2018 p2##_type p2;\ 2019 p3##_type p3;\ 2020 p4##_type p4;\ 2021 p5##_type p5;\ 2022 p6##_type p6;\ 2023 p7##_type p7;\ 2024 p8##_type p8;\ 2025 p9##_type p9;\ 2026 private:\ 2027 GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\ 2028 };\ 2029 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2030 typename p3##_type, typename p4##_type, typename p5##_type, \ 2031 typename p6##_type, typename p7##_type, typename p8##_type, \ 2032 typename p9##_type>\ 2033 inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2034 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2035 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 2036 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 2037 p9##_type p9) {\ 2038 return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2039 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \ 2040 p1, p2, p3, p4, p5, p6, p7, p8, p9);\ 2041 }\ 2042 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2043 typename p3##_type, typename p4##_type, typename p5##_type, \ 2044 typename p6##_type, typename p7##_type, typename p8##_type, \ 2045 typename p9##_type>\ 2046 template <typename arg_type>\ 2047 bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2048 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2049 p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 2050 arg_type arg,\ 2051 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 2052 const 2053 2054 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 2055