1 // Copyright 2007, Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above 11 // copyright notice, this list of conditions and the following disclaimer 12 // in the documentation and/or other materials provided with the 13 // distribution. 14 // * Neither the name of Google Inc. nor the names of its 15 // contributors may be used to endorse or promote products derived from 16 // this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // 30 // Author: wan@google.com (Zhanyong Wan) 31 32 // Google Mock - a framework for writing C++ mock classes. 33 // 34 // This is the main header file a user should include. 35 36 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_ 37 #define GMOCK_INCLUDE_GMOCK_GMOCK_H_ 38 39 // This file implements the following syntax: 40 // 41 // ON_CALL(mock_object.Method(...)) 42 // .With(...) ? 43 // .WillByDefault(...); 44 // 45 // where With() is optional and WillByDefault() must appear exactly 46 // once. 47 // 48 // EXPECT_CALL(mock_object.Method(...)) 49 // .With(...) ? 50 // .Times(...) ? 51 // .InSequence(...) * 52 // .WillOnce(...) * 53 // .WillRepeatedly(...) ? 54 // .RetiresOnSaturation() ? ; 55 // 56 // where all clauses are optional and WillOnce() can be repeated. 57 58 // Copyright 2007, Google Inc. 59 // All rights reserved. 60 // 61 // Redistribution and use in source and binary forms, with or without 62 // modification, are permitted provided that the following conditions are 63 // met: 64 // 65 // * Redistributions of source code must retain the above copyright 66 // notice, this list of conditions and the following disclaimer. 67 // * Redistributions in binary form must reproduce the above 68 // copyright notice, this list of conditions and the following disclaimer 69 // in the documentation and/or other materials provided with the 70 // distribution. 71 // * Neither the name of Google Inc. nor the names of its 72 // contributors may be used to endorse or promote products derived from 73 // this software without specific prior written permission. 74 // 75 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 76 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 77 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 78 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 79 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 80 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 81 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 82 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 83 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 84 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 85 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 86 // 87 // Author: wan@google.com (Zhanyong Wan) 88 89 // Google Mock - a framework for writing C++ mock classes. 90 // 91 // This file implements some commonly used actions. 92 93 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ 94 #define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ 95 96 #include <algorithm> 97 #include <string> 98 99 #ifndef _WIN32_WCE 100 # include <errno.h> 101 #endif 102 103 // Copyright 2007, Google Inc. 104 // All rights reserved. 105 // 106 // Redistribution and use in source and binary forms, with or without 107 // modification, are permitted provided that the following conditions are 108 // met: 109 // 110 // * Redistributions of source code must retain the above copyright 111 // notice, this list of conditions and the following disclaimer. 112 // * Redistributions in binary form must reproduce the above 113 // copyright notice, this list of conditions and the following disclaimer 114 // in the documentation and/or other materials provided with the 115 // distribution. 116 // * Neither the name of Google Inc. nor the names of its 117 // contributors may be used to endorse or promote products derived from 118 // this software without specific prior written permission. 119 // 120 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 121 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 122 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 123 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 124 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 125 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 126 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 127 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 128 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 129 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 130 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 131 // 132 // Author: wan@google.com (Zhanyong Wan) 133 134 // Google Mock - a framework for writing C++ mock classes. 135 // 136 // This file defines some utilities useful for implementing Google 137 // Mock. They are subject to change without notice, so please DO NOT 138 // USE THEM IN USER CODE. 139 140 #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ 141 #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ 142 143 #include <stdio.h> 144 #include <ostream> // NOLINT 145 #include <string> 146 147 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!! 148 149 // Copyright 2007, Google Inc. 150 // All rights reserved. 151 // 152 // Redistribution and use in source and binary forms, with or without 153 // modification, are permitted provided that the following conditions are 154 // met: 155 // 156 // * Redistributions of source code must retain the above copyright 157 // notice, this list of conditions and the following disclaimer. 158 // * Redistributions in binary form must reproduce the above 159 // copyright notice, this list of conditions and the following disclaimer 160 // in the documentation and/or other materials provided with the 161 // distribution. 162 // * Neither the name of Google Inc. nor the names of its 163 // contributors may be used to endorse or promote products derived from 164 // this software without specific prior written permission. 165 // 166 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 167 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 168 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 169 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 170 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 171 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 172 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 173 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 174 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 175 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 176 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 177 // 178 // Author: wan@google.com (Zhanyong Wan) 179 180 // Google Mock - a framework for writing C++ mock classes. 181 // 182 // This file contains template meta-programming utility classes needed 183 // for implementing Google Mock. 184 185 #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ 186 #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ 187 188 // Copyright 2008, Google Inc. 189 // All rights reserved. 190 // 191 // Redistribution and use in source and binary forms, with or without 192 // modification, are permitted provided that the following conditions are 193 // met: 194 // 195 // * Redistributions of source code must retain the above copyright 196 // notice, this list of conditions and the following disclaimer. 197 // * Redistributions in binary form must reproduce the above 198 // copyright notice, this list of conditions and the following disclaimer 199 // in the documentation and/or other materials provided with the 200 // distribution. 201 // * Neither the name of Google Inc. nor the names of its 202 // contributors may be used to endorse or promote products derived from 203 // this software without specific prior written permission. 204 // 205 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 206 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 208 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 210 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 211 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 212 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 213 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 214 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 215 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 216 // 217 // Author: vadimb@google.com (Vadim Berman) 218 // 219 // Low-level types and utilities for porting Google Mock to various 220 // platforms. They are subject to change without notice. DO NOT USE 221 // THEM IN USER CODE. 222 223 #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ 224 #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ 225 226 #include <assert.h> 227 #include <stdlib.h> 228 #include <iostream> 229 230 // Most of the types needed for porting Google Mock are also required 231 // for Google Test and are defined in gtest-port.h. 232 #include "gtest/gtest.h" 233 234 // To avoid conditional compilation everywhere, we make it 235 // gmock-port.h's responsibility to #include the header implementing 236 // tr1/tuple. gmock-port.h does this via gtest-port.h, which is 237 // guaranteed to pull in the tuple header. 238 239 // For MS Visual C++, check the compiler version. At least VS 2003 is 240 // required to compile Google Mock. 241 #if defined(_MSC_VER) && _MSC_VER < 1310 242 # error "At least Visual C++ 2003 (7.1) is required to compile Google Mock." 243 #endif 244 245 // Macro for referencing flags. This is public as we want the user to 246 // use this syntax to reference Google Mock flags. 247 #define GMOCK_FLAG(name) FLAGS_gmock_##name 248 249 // Macros for declaring flags. 250 #define GMOCK_DECLARE_bool_(name) extern bool GMOCK_FLAG(name) 251 #define GMOCK_DECLARE_int32_(name) \ 252 extern ::testing::internal::Int32 GMOCK_FLAG(name) 253 #define GMOCK_DECLARE_string_(name) \ 254 extern ::testing::internal::String GMOCK_FLAG(name) 255 256 // Macros for defining flags. 257 #define GMOCK_DEFINE_bool_(name, default_val, doc) \ 258 bool GMOCK_FLAG(name) = (default_val) 259 #define GMOCK_DEFINE_int32_(name, default_val, doc) \ 260 ::testing::internal::Int32 GMOCK_FLAG(name) = (default_val) 261 #define GMOCK_DEFINE_string_(name, default_val, doc) \ 262 ::testing::internal::String GMOCK_FLAG(name) = (default_val) 263 264 #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ 265 266 namespace testing { 267 268 template <typename T> 269 class Matcher; 270 271 namespace internal { 272 273 // An IgnoredValue object can be implicitly constructed from ANY value. 274 // This is used in implementing the IgnoreResult(a) action. 275 class IgnoredValue { 276 public: 277 // This constructor template allows any value to be implicitly 278 // converted to IgnoredValue. The object has no data member and 279 // doesn't try to remember anything about the argument. We 280 // deliberately omit the 'explicit' keyword in order to allow the 281 // conversion to be implicit. 282 template <typename T> IgnoredValue(const T &)283 IgnoredValue(const T&) {} 284 }; 285 286 // MatcherTuple<T>::type is a tuple type where each field is a Matcher 287 // for the corresponding field in tuple type T. 288 template <typename Tuple> 289 struct MatcherTuple; 290 291 template <> 292 struct MatcherTuple< ::std::tr1::tuple<> > { 293 typedef ::std::tr1::tuple< > type; 294 }; 295 296 template <typename A1> 297 struct MatcherTuple< ::std::tr1::tuple<A1> > { 298 typedef ::std::tr1::tuple<Matcher<A1> > type; 299 }; 300 301 template <typename A1, typename A2> 302 struct MatcherTuple< ::std::tr1::tuple<A1, A2> > { 303 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2> > type; 304 }; 305 306 template <typename A1, typename A2, typename A3> 307 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3> > { 308 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type; 309 }; 310 311 template <typename A1, typename A2, typename A3, typename A4> 312 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4> > { 313 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, 314 Matcher<A4> > type; 315 }; 316 317 template <typename A1, typename A2, typename A3, typename A4, typename A5> 318 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5> > { 319 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, 320 Matcher<A5> > type; 321 }; 322 323 template <typename A1, typename A2, typename A3, typename A4, typename A5, 324 typename A6> 325 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> > { 326 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, 327 Matcher<A5>, Matcher<A6> > type; 328 }; 329 330 template <typename A1, typename A2, typename A3, typename A4, typename A5, 331 typename A6, typename A7> 332 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> > { 333 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, 334 Matcher<A5>, Matcher<A6>, Matcher<A7> > type; 335 }; 336 337 template <typename A1, typename A2, typename A3, typename A4, typename A5, 338 typename A6, typename A7, typename A8> 339 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > { 340 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, 341 Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> > type; 342 }; 343 344 template <typename A1, typename A2, typename A3, typename A4, typename A5, 345 typename A6, typename A7, typename A8, typename A9> 346 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > { 347 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, 348 Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9> > type; 349 }; 350 351 template <typename A1, typename A2, typename A3, typename A4, typename A5, 352 typename A6, typename A7, typename A8, typename A9, typename A10> 353 struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, 354 A10> > { 355 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, 356 Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9>, 357 Matcher<A10> > type; 358 }; 359 360 // Template struct Function<F>, where F must be a function type, contains 361 // the following typedefs: 362 // 363 // Result: the function's return type. 364 // ArgumentN: the type of the N-th argument, where N starts with 1. 365 // ArgumentTuple: the tuple type consisting of all parameters of F. 366 // ArgumentMatcherTuple: the tuple type consisting of Matchers for all 367 // parameters of F. 368 // MakeResultVoid: the function type obtained by substituting void 369 // for the return type of F. 370 // MakeResultIgnoredValue: 371 // the function type obtained by substituting Something 372 // for the return type of F. 373 template <typename F> 374 struct Function; 375 376 template <typename R> 377 struct Function<R()> { 378 typedef R Result; 379 typedef ::std::tr1::tuple<> ArgumentTuple; 380 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 381 typedef void MakeResultVoid(); 382 typedef IgnoredValue MakeResultIgnoredValue(); 383 }; 384 385 template <typename R, typename A1> 386 struct Function<R(A1)> 387 : Function<R()> { 388 typedef A1 Argument1; 389 typedef ::std::tr1::tuple<A1> ArgumentTuple; 390 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 391 typedef void MakeResultVoid(A1); 392 typedef IgnoredValue MakeResultIgnoredValue(A1); 393 }; 394 395 template <typename R, typename A1, typename A2> 396 struct Function<R(A1, A2)> 397 : Function<R(A1)> { 398 typedef A2 Argument2; 399 typedef ::std::tr1::tuple<A1, A2> ArgumentTuple; 400 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 401 typedef void MakeResultVoid(A1, A2); 402 typedef IgnoredValue MakeResultIgnoredValue(A1, A2); 403 }; 404 405 template <typename R, typename A1, typename A2, typename A3> 406 struct Function<R(A1, A2, A3)> 407 : Function<R(A1, A2)> { 408 typedef A3 Argument3; 409 typedef ::std::tr1::tuple<A1, A2, A3> ArgumentTuple; 410 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 411 typedef void MakeResultVoid(A1, A2, A3); 412 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3); 413 }; 414 415 template <typename R, typename A1, typename A2, typename A3, typename A4> 416 struct Function<R(A1, A2, A3, A4)> 417 : Function<R(A1, A2, A3)> { 418 typedef A4 Argument4; 419 typedef ::std::tr1::tuple<A1, A2, A3, A4> ArgumentTuple; 420 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 421 typedef void MakeResultVoid(A1, A2, A3, A4); 422 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4); 423 }; 424 425 template <typename R, typename A1, typename A2, typename A3, typename A4, 426 typename A5> 427 struct Function<R(A1, A2, A3, A4, A5)> 428 : Function<R(A1, A2, A3, A4)> { 429 typedef A5 Argument5; 430 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5> ArgumentTuple; 431 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 432 typedef void MakeResultVoid(A1, A2, A3, A4, A5); 433 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5); 434 }; 435 436 template <typename R, typename A1, typename A2, typename A3, typename A4, 437 typename A5, typename A6> 438 struct Function<R(A1, A2, A3, A4, A5, A6)> 439 : Function<R(A1, A2, A3, A4, A5)> { 440 typedef A6 Argument6; 441 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple; 442 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 443 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6); 444 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6); 445 }; 446 447 template <typename R, typename A1, typename A2, typename A3, typename A4, 448 typename A5, typename A6, typename A7> 449 struct Function<R(A1, A2, A3, A4, A5, A6, A7)> 450 : Function<R(A1, A2, A3, A4, A5, A6)> { 451 typedef A7 Argument7; 452 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple; 453 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 454 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7); 455 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7); 456 }; 457 458 template <typename R, typename A1, typename A2, typename A3, typename A4, 459 typename A5, typename A6, typename A7, typename A8> 460 struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> 461 : Function<R(A1, A2, A3, A4, A5, A6, A7)> { 462 typedef A8 Argument8; 463 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple; 464 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 465 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8); 466 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8); 467 }; 468 469 template <typename R, typename A1, typename A2, typename A3, typename A4, 470 typename A5, typename A6, typename A7, typename A8, typename A9> 471 struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> 472 : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> { 473 typedef A9 Argument9; 474 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple; 475 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 476 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9); 477 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, 478 A9); 479 }; 480 481 template <typename R, typename A1, typename A2, typename A3, typename A4, 482 typename A5, typename A6, typename A7, typename A8, typename A9, 483 typename A10> 484 struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> 485 : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> { 486 typedef A10 Argument10; 487 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, 488 A10> ArgumentTuple; 489 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; 490 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); 491 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, 492 A9, A10); 493 }; 494 495 } // namespace internal 496 497 } // namespace testing 498 499 #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ 500 501 namespace testing { 502 namespace internal { 503 504 // Converts an identifier name to a space-separated list of lower-case 505 // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is 506 // treated as one word. For example, both "FooBar123" and 507 // "foo_bar_123" are converted to "foo bar 123". 508 string ConvertIdentifierNameToWords(const char* id_name); 509 510 // PointeeOf<Pointer>::type is the type of a value pointed to by a 511 // Pointer, which can be either a smart pointer or a raw pointer. The 512 // following default implementation is for the case where Pointer is a 513 // smart pointer. 514 template <typename Pointer> 515 struct PointeeOf { 516 // Smart pointer classes define type element_type as the type of 517 // their pointees. 518 typedef typename Pointer::element_type type; 519 }; 520 // This specialization is for the raw pointer case. 521 template <typename T> 522 struct PointeeOf<T*> { typedef T type; }; // NOLINT 523 524 // GetRawPointer(p) returns the raw pointer underlying p when p is a 525 // smart pointer, or returns p itself when p is already a raw pointer. 526 // The following default implementation is for the smart pointer case. 527 template <typename Pointer> 528 inline typename Pointer::element_type* GetRawPointer(const Pointer& p) { 529 return p.get(); 530 } 531 // This overloaded version is for the raw pointer case. 532 template <typename Element> 533 inline Element* GetRawPointer(Element* p) { return p; } 534 535 // This comparator allows linked_ptr to be stored in sets. 536 template <typename T> 537 struct LinkedPtrLessThan { 538 bool operator()(const ::testing::internal::linked_ptr<T>& lhs, 539 const ::testing::internal::linked_ptr<T>& rhs) const { 540 return lhs.get() < rhs.get(); 541 } 542 }; 543 544 // Symbian compilation can be done with wchar_t being either a native 545 // type or a typedef. Using Google Mock with OpenC without wchar_t 546 // should require the definition of _STLP_NO_WCHAR_T. 547 // 548 // MSVC treats wchar_t as a native type usually, but treats it as the 549 // same as unsigned short when the compiler option /Zc:wchar_t- is 550 // specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t 551 // is a native type. 552 #if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \ 553 (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)) 554 // wchar_t is a typedef. 555 #else 556 # define GMOCK_WCHAR_T_IS_NATIVE_ 1 557 #endif 558 559 // signed wchar_t and unsigned wchar_t are NOT in the C++ standard. 560 // Using them is a bad practice and not portable. So DON'T use them. 561 // 562 // Still, Google Mock is designed to work even if the user uses signed 563 // wchar_t or unsigned wchar_t (obviously, assuming the compiler 564 // supports them). 565 // 566 // To gcc, 567 // wchar_t == signed wchar_t != unsigned wchar_t == unsigned int 568 #ifdef __GNUC__ 569 // signed/unsigned wchar_t are valid types. 570 # define GMOCK_HAS_SIGNED_WCHAR_T_ 1 571 #endif 572 573 // In what follows, we use the term "kind" to indicate whether a type 574 // is bool, an integer type (excluding bool), a floating-point type, 575 // or none of them. This categorization is useful for determining 576 // when a matcher argument type can be safely converted to another 577 // type in the implementation of SafeMatcherCast. 578 enum TypeKind { 579 kBool, kInteger, kFloatingPoint, kOther 580 }; 581 582 // KindOf<T>::value is the kind of type T. 583 template <typename T> struct KindOf { 584 enum { value = kOther }; // The default kind. 585 }; 586 587 // This macro declares that the kind of 'type' is 'kind'. 588 #define GMOCK_DECLARE_KIND_(type, kind) \ 589 template <> struct KindOf<type> { enum { value = kind }; } 590 591 GMOCK_DECLARE_KIND_(bool, kBool); 592 593 // All standard integer types. 594 GMOCK_DECLARE_KIND_(char, kInteger); 595 GMOCK_DECLARE_KIND_(signed char, kInteger); 596 GMOCK_DECLARE_KIND_(unsigned char, kInteger); 597 GMOCK_DECLARE_KIND_(short, kInteger); // NOLINT 598 GMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT 599 GMOCK_DECLARE_KIND_(int, kInteger); 600 GMOCK_DECLARE_KIND_(unsigned int, kInteger); 601 GMOCK_DECLARE_KIND_(long, kInteger); // NOLINT 602 GMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT 603 604 #if GMOCK_WCHAR_T_IS_NATIVE_ 605 GMOCK_DECLARE_KIND_(wchar_t, kInteger); 606 #endif 607 608 // Non-standard integer types. 609 GMOCK_DECLARE_KIND_(Int64, kInteger); 610 GMOCK_DECLARE_KIND_(UInt64, kInteger); 611 612 // All standard floating-point types. 613 GMOCK_DECLARE_KIND_(float, kFloatingPoint); 614 GMOCK_DECLARE_KIND_(double, kFloatingPoint); 615 GMOCK_DECLARE_KIND_(long double, kFloatingPoint); 616 617 #undef GMOCK_DECLARE_KIND_ 618 619 // Evaluates to the kind of 'type'. 620 #define GMOCK_KIND_OF_(type) \ 621 static_cast< ::testing::internal::TypeKind>( \ 622 ::testing::internal::KindOf<type>::value) 623 624 // Evaluates to true iff integer type T is signed. 625 #define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0) 626 627 // LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value 628 // is true iff arithmetic type From can be losslessly converted to 629 // arithmetic type To. 630 // 631 // It's the user's responsibility to ensure that both From and To are 632 // raw (i.e. has no CV modifier, is not a pointer, and is not a 633 // reference) built-in arithmetic types, kFromKind is the kind of 634 // From, and kToKind is the kind of To; the value is 635 // implementation-defined when the above pre-condition is violated. 636 template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To> 637 struct LosslessArithmeticConvertibleImpl : public false_type {}; 638 639 // Converting bool to bool is lossless. 640 template <> 641 struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool> 642 : public true_type {}; // NOLINT 643 644 // Converting bool to any integer type is lossless. 645 template <typename To> 646 struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To> 647 : public true_type {}; // NOLINT 648 649 // Converting bool to any floating-point type is lossless. 650 template <typename To> 651 struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To> 652 : public true_type {}; // NOLINT 653 654 // Converting an integer to bool is lossy. 655 template <typename From> 656 struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool> 657 : public false_type {}; // NOLINT 658 659 // Converting an integer to another non-bool integer is lossless iff 660 // the target type's range encloses the source type's range. 661 template <typename From, typename To> 662 struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To> 663 : public bool_constant< 664 // When converting from a smaller size to a larger size, we are 665 // fine as long as we are not converting from signed to unsigned. 666 ((sizeof(From) < sizeof(To)) && 667 (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) || 668 // When converting between the same size, the signedness must match. 669 ((sizeof(From) == sizeof(To)) && 670 (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {}; // NOLINT 671 672 #undef GMOCK_IS_SIGNED_ 673 674 // Converting an integer to a floating-point type may be lossy, since 675 // the format of a floating-point number is implementation-defined. 676 template <typename From, typename To> 677 struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To> 678 : public false_type {}; // NOLINT 679 680 // Converting a floating-point to bool is lossy. 681 template <typename From> 682 struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool> 683 : public false_type {}; // NOLINT 684 685 // Converting a floating-point to an integer is lossy. 686 template <typename From, typename To> 687 struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To> 688 : public false_type {}; // NOLINT 689 690 // Converting a floating-point to another floating-point is lossless 691 // iff the target type is at least as big as the source type. 692 template <typename From, typename To> 693 struct LosslessArithmeticConvertibleImpl< 694 kFloatingPoint, From, kFloatingPoint, To> 695 : public bool_constant<sizeof(From) <= sizeof(To)> {}; // NOLINT 696 697 // LosslessArithmeticConvertible<From, To>::value is true iff arithmetic 698 // type From can be losslessly converted to arithmetic type To. 699 // 700 // It's the user's responsibility to ensure that both From and To are 701 // raw (i.e. has no CV modifier, is not a pointer, and is not a 702 // reference) built-in arithmetic types; the value is 703 // implementation-defined when the above pre-condition is violated. 704 template <typename From, typename To> 705 struct LosslessArithmeticConvertible 706 : public LosslessArithmeticConvertibleImpl< 707 GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {}; // NOLINT 708 709 // This interface knows how to report a Google Mock failure (either 710 // non-fatal or fatal). 711 class FailureReporterInterface { 712 public: 713 // The type of a failure (either non-fatal or fatal). 714 enum FailureType { 715 NONFATAL, FATAL 716 }; 717 718 virtual ~FailureReporterInterface() {} 719 720 // Reports a failure that occurred at the given source file location. 721 virtual void ReportFailure(FailureType type, const char* file, int line, 722 const string& message) = 0; 723 }; 724 725 // Returns the failure reporter used by Google Mock. 726 FailureReporterInterface* GetFailureReporter(); 727 728 // Asserts that condition is true; aborts the process with the given 729 // message if condition is false. We cannot use LOG(FATAL) or CHECK() 730 // as Google Mock might be used to mock the log sink itself. We 731 // inline this function to prevent it from showing up in the stack 732 // trace. 733 inline void Assert(bool condition, const char* file, int line, 734 const string& msg) { 735 if (!condition) { 736 GetFailureReporter()->ReportFailure(FailureReporterInterface::FATAL, 737 file, line, msg); 738 } 739 } 740 inline void Assert(bool condition, const char* file, int line) { 741 Assert(condition, file, line, "Assertion failed."); 742 } 743 744 // Verifies that condition is true; generates a non-fatal failure if 745 // condition is false. 746 inline void Expect(bool condition, const char* file, int line, 747 const string& msg) { 748 if (!condition) { 749 GetFailureReporter()->ReportFailure(FailureReporterInterface::NONFATAL, 750 file, line, msg); 751 } 752 } 753 inline void Expect(bool condition, const char* file, int line) { 754 Expect(condition, file, line, "Expectation failed."); 755 } 756 757 // Severity level of a log. 758 enum LogSeverity { 759 INFO = 0, 760 WARNING = 1 761 }; 762 763 // Valid values for the --gmock_verbose flag. 764 765 // All logs (informational and warnings) are printed. 766 const char kInfoVerbosity[] = "info"; 767 // Only warnings are printed. 768 const char kWarningVerbosity[] = "warning"; 769 // No logs are printed. 770 const char kErrorVerbosity[] = "error"; 771 772 // Returns true iff a log with the given severity is visible according 773 // to the --gmock_verbose flag. 774 bool LogIsVisible(LogSeverity severity); 775 776 // Prints the given message to stdout iff 'severity' >= the level 777 // specified by the --gmock_verbose flag. If stack_frames_to_skip >= 778 // 0, also prints the stack trace excluding the top 779 // stack_frames_to_skip frames. In opt mode, any positive 780 // stack_frames_to_skip is treated as 0, since we don't know which 781 // function calls will be inlined by the compiler and need to be 782 // conservative. 783 void Log(LogSeverity severity, const string& message, int stack_frames_to_skip); 784 785 // TODO(wan@google.com): group all type utilities together. 786 787 // Type traits. 788 789 // is_reference<T>::value is non-zero iff T is a reference type. 790 template <typename T> struct is_reference : public false_type {}; 791 template <typename T> struct is_reference<T&> : public true_type {}; 792 793 // type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type. 794 template <typename T1, typename T2> struct type_equals : public false_type {}; 795 template <typename T> struct type_equals<T, T> : public true_type {}; 796 797 // remove_reference<T>::type removes the reference from type T, if any. 798 template <typename T> struct remove_reference { typedef T type; }; // NOLINT 799 template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT 800 801 // Invalid<T>() returns an invalid value of type T. This is useful 802 // when a value of type T is needed for compilation, but the statement 803 // will not really be executed (or we don't care if the statement 804 // crashes). 805 template <typename T> 806 inline T Invalid() { 807 return *static_cast<typename remove_reference<T>::type*>(NULL); 808 } 809 template <> 810 inline void Invalid<void>() {} 811 812 // Given a raw type (i.e. having no top-level reference or const 813 // modifier) RawContainer that's either an STL-style container or a 814 // native array, class StlContainerView<RawContainer> has the 815 // following members: 816 // 817 // - type is a type that provides an STL-style container view to 818 // (i.e. implements the STL container concept for) RawContainer; 819 // - const_reference is a type that provides a reference to a const 820 // RawContainer; 821 // - ConstReference(raw_container) returns a const reference to an STL-style 822 // container view to raw_container, which is a RawContainer. 823 // - Copy(raw_container) returns an STL-style container view of a 824 // copy of raw_container, which is a RawContainer. 825 // 826 // This generic version is used when RawContainer itself is already an 827 // STL-style container. 828 template <class RawContainer> 829 class StlContainerView { 830 public: 831 typedef RawContainer type; 832 typedef const type& const_reference; 833 834 static const_reference ConstReference(const RawContainer& container) { 835 // Ensures that RawContainer is not a const type. 836 testing::StaticAssertTypeEq<RawContainer, 837 GTEST_REMOVE_CONST_(RawContainer)>(); 838 return container; 839 } 840 static type Copy(const RawContainer& container) { return container; } 841 }; 842 843 // This specialization is used when RawContainer is a native array type. 844 template <typename Element, size_t N> 845 class StlContainerView<Element[N]> { 846 public: 847 typedef GTEST_REMOVE_CONST_(Element) RawElement; 848 typedef internal::NativeArray<RawElement> type; 849 // NativeArray<T> can represent a native array either by value or by 850 // reference (selected by a constructor argument), so 'const type' 851 // can be used to reference a const native array. We cannot 852 // 'typedef const type& const_reference' here, as that would mean 853 // ConstReference() has to return a reference to a local variable. 854 typedef const type const_reference; 855 856 static const_reference ConstReference(const Element (&array)[N]) { 857 // Ensures that Element is not a const type. 858 testing::StaticAssertTypeEq<Element, RawElement>(); 859 #if GTEST_OS_SYMBIAN 860 // The Nokia Symbian compiler confuses itself in template instantiation 861 // for this call without the cast to Element*: 862 // function call '[testing::internal::NativeArray<char *>].NativeArray( 863 // {lval} const char *[4], long, testing::internal::RelationToSource)' 864 // does not match 865 // 'testing::internal::NativeArray<char *>::NativeArray( 866 // char *const *, unsigned int, testing::internal::RelationToSource)' 867 // (instantiating: 'testing::internal::ContainsMatcherImpl 868 // <const char * (&)[4]>::Matches(const char * (&)[4]) const') 869 // (instantiating: 'testing::internal::StlContainerView<char *[4]>:: 870 // ConstReference(const char * (&)[4])') 871 // (and though the N parameter type is mismatched in the above explicit 872 // conversion of it doesn't help - only the conversion of the array). 873 return type(const_cast<Element*>(&array[0]), N, kReference); 874 #else 875 return type(array, N, kReference); 876 #endif // GTEST_OS_SYMBIAN 877 } 878 static type Copy(const Element (&array)[N]) { 879 #if GTEST_OS_SYMBIAN 880 return type(const_cast<Element*>(&array[0]), N, kCopy); 881 #else 882 return type(array, N, kCopy); 883 #endif // GTEST_OS_SYMBIAN 884 } 885 }; 886 887 // This specialization is used when RawContainer is a native array 888 // represented as a (pointer, size) tuple. 889 template <typename ElementPointer, typename Size> 890 class StlContainerView< ::std::tr1::tuple<ElementPointer, Size> > { 891 public: 892 typedef GTEST_REMOVE_CONST_( 893 typename internal::PointeeOf<ElementPointer>::type) RawElement; 894 typedef internal::NativeArray<RawElement> type; 895 typedef const type const_reference; 896 897 static const_reference ConstReference( 898 const ::std::tr1::tuple<ElementPointer, Size>& array) { 899 using ::std::tr1::get; 900 return type(get<0>(array), get<1>(array), kReference); 901 } 902 static type Copy(const ::std::tr1::tuple<ElementPointer, Size>& array) { 903 using ::std::tr1::get; 904 return type(get<0>(array), get<1>(array), kCopy); 905 } 906 }; 907 908 // The following specialization prevents the user from instantiating 909 // StlContainer with a reference type. 910 template <typename T> class StlContainerView<T&>; 911 912 } // namespace internal 913 } // namespace testing 914 915 #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ 916 917 namespace testing { 918 919 // To implement an action Foo, define: 920 // 1. a class FooAction that implements the ActionInterface interface, and 921 // 2. a factory function that creates an Action object from a 922 // const FooAction*. 923 // 924 // The two-level delegation design follows that of Matcher, providing 925 // consistency for extension developers. It also eases ownership 926 // management as Action objects can now be copied like plain values. 927 928 namespace internal { 929 930 template <typename F1, typename F2> 931 class ActionAdaptor; 932 933 // BuiltInDefaultValue<T>::Get() returns the "built-in" default 934 // value for type T, which is NULL when T is a pointer type, 0 when T 935 // is a numeric type, false when T is bool, or "" when T is string or 936 // std::string. For any other type T, this value is undefined and the 937 // function will abort the process. 938 template <typename T> 939 class BuiltInDefaultValue { 940 public: 941 // This function returns true iff type T has a built-in default value. 942 static bool Exists() { return false; } 943 static T Get() { 944 Assert(false, __FILE__, __LINE__, 945 "Default action undefined for the function return type."); 946 return internal::Invalid<T>(); 947 // The above statement will never be reached, but is required in 948 // order for this function to compile. 949 } 950 }; 951 952 // This partial specialization says that we use the same built-in 953 // default value for T and const T. 954 template <typename T> 955 class BuiltInDefaultValue<const T> { 956 public: 957 static bool Exists() { return BuiltInDefaultValue<T>::Exists(); } 958 static T Get() { return BuiltInDefaultValue<T>::Get(); } 959 }; 960 961 // This partial specialization defines the default values for pointer 962 // types. 963 template <typename T> 964 class BuiltInDefaultValue<T*> { 965 public: 966 static bool Exists() { return true; } 967 static T* Get() { return NULL; } 968 }; 969 970 // The following specializations define the default values for 971 // specific types we care about. 972 #define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ 973 template <> \ 974 class BuiltInDefaultValue<type> { \ 975 public: \ 976 static bool Exists() { return true; } \ 977 static type Get() { return value; } \ 978 } 979 980 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT 981 #if GTEST_HAS_GLOBAL_STRING 982 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, ""); 983 #endif // GTEST_HAS_GLOBAL_STRING 984 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); 985 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); 986 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); 987 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); 988 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); 989 990 // There's no need for a default action for signed wchar_t, as that 991 // type is the same as wchar_t for gcc, and invalid for MSVC. 992 // 993 // There's also no need for a default action for unsigned wchar_t, as 994 // that type is the same as unsigned int for gcc, and invalid for 995 // MSVC. 996 #if GMOCK_WCHAR_T_IS_NATIVE_ 997 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT 998 #endif 999 1000 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT 1001 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT 1002 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); 1003 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); 1004 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT 1005 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT 1006 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0); 1007 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0); 1008 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); 1009 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); 1010 1011 #undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ 1012 1013 } // namespace internal 1014 1015 // When an unexpected function call is encountered, Google Mock will 1016 // let it return a default value if the user has specified one for its 1017 // return type, or if the return type has a built-in default value; 1018 // otherwise Google Mock won't know what value to return and will have 1019 // to abort the process. 1020 // 1021 // The DefaultValue<T> class allows a user to specify the 1022 // default value for a type T that is both copyable and publicly 1023 // destructible (i.e. anything that can be used as a function return 1024 // type). The usage is: 1025 // 1026 // // Sets the default value for type T to be foo. 1027 // DefaultValue<T>::Set(foo); 1028 template <typename T> 1029 class DefaultValue { 1030 public: 1031 // Sets the default value for type T; requires T to be 1032 // copy-constructable and have a public destructor. 1033 static void Set(T x) { 1034 delete value_; 1035 value_ = new T(x); 1036 } 1037 1038 // Unsets the default value for type T. 1039 static void Clear() { 1040 delete value_; 1041 value_ = NULL; 1042 } 1043 1044 // Returns true iff the user has set the default value for type T. 1045 static bool IsSet() { return value_ != NULL; } 1046 1047 // Returns true if T has a default return value set by the user or there 1048 // exists a built-in default value. 1049 static bool Exists() { 1050 return IsSet() || internal::BuiltInDefaultValue<T>::Exists(); 1051 } 1052 1053 // Returns the default value for type T if the user has set one; 1054 // otherwise returns the built-in default value if there is one; 1055 // otherwise aborts the process. 1056 static T Get() { 1057 return value_ == NULL ? 1058 internal::BuiltInDefaultValue<T>::Get() : *value_; 1059 } 1060 private: 1061 static const T* value_; 1062 }; 1063 1064 // This partial specialization allows a user to set default values for 1065 // reference types. 1066 template <typename T> 1067 class DefaultValue<T&> { 1068 public: 1069 // Sets the default value for type T&. 1070 static void Set(T& x) { // NOLINT 1071 address_ = &x; 1072 } 1073 1074 // Unsets the default value for type T&. 1075 static void Clear() { 1076 address_ = NULL; 1077 } 1078 1079 // Returns true iff the user has set the default value for type T&. 1080 static bool IsSet() { return address_ != NULL; } 1081 1082 // Returns true if T has a default return value set by the user or there 1083 // exists a built-in default value. 1084 static bool Exists() { 1085 return IsSet() || internal::BuiltInDefaultValue<T&>::Exists(); 1086 } 1087 1088 // Returns the default value for type T& if the user has set one; 1089 // otherwise returns the built-in default value if there is one; 1090 // otherwise aborts the process. 1091 static T& Get() { 1092 return address_ == NULL ? 1093 internal::BuiltInDefaultValue<T&>::Get() : *address_; 1094 } 1095 private: 1096 static T* address_; 1097 }; 1098 1099 // This specialization allows DefaultValue<void>::Get() to 1100 // compile. 1101 template <> 1102 class DefaultValue<void> { 1103 public: 1104 static bool Exists() { return true; } 1105 static void Get() {} 1106 }; 1107 1108 // Points to the user-set default value for type T. 1109 template <typename T> 1110 const T* DefaultValue<T>::value_ = NULL; 1111 1112 // Points to the user-set default value for type T&. 1113 template <typename T> 1114 T* DefaultValue<T&>::address_ = NULL; 1115 1116 // Implement this interface to define an action for function type F. 1117 template <typename F> 1118 class ActionInterface { 1119 public: 1120 typedef typename internal::Function<F>::Result Result; 1121 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 1122 1123 ActionInterface() {} 1124 virtual ~ActionInterface() {} 1125 1126 // Performs the action. This method is not const, as in general an 1127 // action can have side effects and be stateful. For example, a 1128 // get-the-next-element-from-the-collection action will need to 1129 // remember the current element. 1130 virtual Result Perform(const ArgumentTuple& args) = 0; 1131 1132 private: 1133 GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface); 1134 }; 1135 1136 // An Action<F> is a copyable and IMMUTABLE (except by assignment) 1137 // object that represents an action to be taken when a mock function 1138 // of type F is called. The implementation of Action<T> is just a 1139 // linked_ptr to const ActionInterface<T>, so copying is fairly cheap. 1140 // Don't inherit from Action! 1141 // 1142 // You can view an object implementing ActionInterface<F> as a 1143 // concrete action (including its current state), and an Action<F> 1144 // object as a handle to it. 1145 template <typename F> 1146 class Action { 1147 public: 1148 typedef typename internal::Function<F>::Result Result; 1149 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 1150 1151 // Constructs a null Action. Needed for storing Action objects in 1152 // STL containers. 1153 Action() : impl_(NULL) {} 1154 1155 // Constructs an Action from its implementation. A NULL impl is 1156 // used to represent the "do-default" action. 1157 explicit Action(ActionInterface<F>* impl) : impl_(impl) {} 1158 1159 // Copy constructor. 1160 Action(const Action& action) : impl_(action.impl_) {} 1161 1162 // This constructor allows us to turn an Action<Func> object into an 1163 // Action<F>, as long as F's arguments can be implicitly converted 1164 // to Func's and Func's return type can be implicitly converted to 1165 // F's. 1166 template <typename Func> 1167 explicit Action(const Action<Func>& action); 1168 1169 // Returns true iff this is the DoDefault() action. 1170 bool IsDoDefault() const { return impl_.get() == NULL; } 1171 1172 // Performs the action. Note that this method is const even though 1173 // the corresponding method in ActionInterface is not. The reason 1174 // is that a const Action<F> means that it cannot be re-bound to 1175 // another concrete action, not that the concrete action it binds to 1176 // cannot change state. (Think of the difference between a const 1177 // pointer and a pointer to const.) 1178 Result Perform(const ArgumentTuple& args) const { 1179 internal::Assert( 1180 !IsDoDefault(), __FILE__, __LINE__, 1181 "You are using DoDefault() inside a composite action like " 1182 "DoAll() or WithArgs(). This is not supported for technical " 1183 "reasons. Please instead spell out the default action, or " 1184 "assign the default action to an Action variable and use " 1185 "the variable in various places."); 1186 return impl_->Perform(args); 1187 } 1188 1189 private: 1190 template <typename F1, typename F2> 1191 friend class internal::ActionAdaptor; 1192 1193 internal::linked_ptr<ActionInterface<F> > impl_; 1194 }; 1195 1196 // The PolymorphicAction class template makes it easy to implement a 1197 // polymorphic action (i.e. an action that can be used in mock 1198 // functions of than one type, e.g. Return()). 1199 // 1200 // To define a polymorphic action, a user first provides a COPYABLE 1201 // implementation class that has a Perform() method template: 1202 // 1203 // class FooAction { 1204 // public: 1205 // template <typename Result, typename ArgumentTuple> 1206 // Result Perform(const ArgumentTuple& args) const { 1207 // // Processes the arguments and returns a result, using 1208 // // tr1::get<N>(args) to get the N-th (0-based) argument in the tuple. 1209 // } 1210 // ... 1211 // }; 1212 // 1213 // Then the user creates the polymorphic action using 1214 // MakePolymorphicAction(object) where object has type FooAction. See 1215 // the definition of Return(void) and SetArgumentPointee<N>(value) for 1216 // complete examples. 1217 template <typename Impl> 1218 class PolymorphicAction { 1219 public: 1220 explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} 1221 1222 template <typename F> 1223 operator Action<F>() const { 1224 return Action<F>(new MonomorphicImpl<F>(impl_)); 1225 } 1226 1227 private: 1228 template <typename F> 1229 class MonomorphicImpl : public ActionInterface<F> { 1230 public: 1231 typedef typename internal::Function<F>::Result Result; 1232 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 1233 1234 explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} 1235 1236 virtual Result Perform(const ArgumentTuple& args) { 1237 return impl_.template Perform<Result>(args); 1238 } 1239 1240 private: 1241 Impl impl_; 1242 1243 GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); 1244 }; 1245 1246 Impl impl_; 1247 1248 GTEST_DISALLOW_ASSIGN_(PolymorphicAction); 1249 }; 1250 1251 // Creates an Action from its implementation and returns it. The 1252 // created Action object owns the implementation. 1253 template <typename F> 1254 Action<F> MakeAction(ActionInterface<F>* impl) { 1255 return Action<F>(impl); 1256 } 1257 1258 // Creates a polymorphic action from its implementation. This is 1259 // easier to use than the PolymorphicAction<Impl> constructor as it 1260 // doesn't require you to explicitly write the template argument, e.g. 1261 // 1262 // MakePolymorphicAction(foo); 1263 // vs 1264 // PolymorphicAction<TypeOfFoo>(foo); 1265 template <typename Impl> 1266 inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) { 1267 return PolymorphicAction<Impl>(impl); 1268 } 1269 1270 namespace internal { 1271 1272 // Allows an Action<F2> object to pose as an Action<F1>, as long as F2 1273 // and F1 are compatible. 1274 template <typename F1, typename F2> 1275 class ActionAdaptor : public ActionInterface<F1> { 1276 public: 1277 typedef typename internal::Function<F1>::Result Result; 1278 typedef typename internal::Function<F1>::ArgumentTuple ArgumentTuple; 1279 1280 explicit ActionAdaptor(const Action<F2>& from) : impl_(from.impl_) {} 1281 1282 virtual Result Perform(const ArgumentTuple& args) { 1283 return impl_->Perform(args); 1284 } 1285 1286 private: 1287 const internal::linked_ptr<ActionInterface<F2> > impl_; 1288 1289 GTEST_DISALLOW_ASSIGN_(ActionAdaptor); 1290 }; 1291 1292 // Implements the polymorphic Return(x) action, which can be used in 1293 // any function that returns the type of x, regardless of the argument 1294 // types. 1295 // 1296 // Note: The value passed into Return must be converted into 1297 // Function<F>::Result when this action is cast to Action<F> rather than 1298 // when that action is performed. This is important in scenarios like 1299 // 1300 // MOCK_METHOD1(Method, T(U)); 1301 // ... 1302 // { 1303 // Foo foo; 1304 // X x(&foo); 1305 // EXPECT_CALL(mock, Method(_)).WillOnce(Return(x)); 1306 // } 1307 // 1308 // In the example above the variable x holds reference to foo which leaves 1309 // scope and gets destroyed. If copying X just copies a reference to foo, 1310 // that copy will be left with a hanging reference. If conversion to T 1311 // makes a copy of foo, the above code is safe. To support that scenario, we 1312 // need to make sure that the type conversion happens inside the EXPECT_CALL 1313 // statement, and conversion of the result of Return to Action<T(U)> is a 1314 // good place for that. 1315 // 1316 template <typename R> 1317 class ReturnAction { 1318 public: 1319 // Constructs a ReturnAction object from the value to be returned. 1320 // 'value' is passed by value instead of by const reference in order 1321 // to allow Return("string literal") to compile. 1322 explicit ReturnAction(R value) : value_(value) {} 1323 1324 // This template type conversion operator allows Return(x) to be 1325 // used in ANY function that returns x's type. 1326 template <typename F> 1327 operator Action<F>() const { 1328 // Assert statement belongs here because this is the best place to verify 1329 // conditions on F. It produces the clearest error messages 1330 // in most compilers. 1331 // Impl really belongs in this scope as a local class but can't 1332 // because MSVC produces duplicate symbols in different translation units 1333 // in this case. Until MS fixes that bug we put Impl into the class scope 1334 // and put the typedef both here (for use in assert statement) and 1335 // in the Impl class. But both definitions must be the same. 1336 typedef typename Function<F>::Result Result; 1337 GTEST_COMPILE_ASSERT_( 1338 !internal::is_reference<Result>::value, 1339 use_ReturnRef_instead_of_Return_to_return_a_reference); 1340 return Action<F>(new Impl<F>(value_)); 1341 } 1342 1343 private: 1344 // Implements the Return(x) action for a particular function type F. 1345 template <typename F> 1346 class Impl : public ActionInterface<F> { 1347 public: 1348 typedef typename Function<F>::Result Result; 1349 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 1350 1351 // The implicit cast is necessary when Result has more than one 1352 // single-argument constructor (e.g. Result is std::vector<int>) and R 1353 // has a type conversion operator template. In that case, value_(value) 1354 // won't compile as the compiler doesn't known which constructor of 1355 // Result to call. ImplicitCast_ forces the compiler to convert R to 1356 // Result without considering explicit constructors, thus resolving the 1357 // ambiguity. value_ is then initialized using its copy constructor. 1358 explicit Impl(R value) 1359 : value_(::testing::internal::ImplicitCast_<Result>(value)) {} 1360 1361 virtual Result Perform(const ArgumentTuple&) { return value_; } 1362 1363 private: 1364 GTEST_COMPILE_ASSERT_(!internal::is_reference<Result>::value, 1365 Result_cannot_be_a_reference_type); 1366 Result value_; 1367 1368 GTEST_DISALLOW_ASSIGN_(Impl); 1369 }; 1370 1371 R value_; 1372 1373 GTEST_DISALLOW_ASSIGN_(ReturnAction); 1374 }; 1375 1376 // Implements the ReturnNull() action. 1377 class ReturnNullAction { 1378 public: 1379 // Allows ReturnNull() to be used in any pointer-returning function. 1380 template <typename Result, typename ArgumentTuple> 1381 static Result Perform(const ArgumentTuple&) { 1382 GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value, 1383 ReturnNull_can_be_used_to_return_a_pointer_only); 1384 return NULL; 1385 } 1386 }; 1387 1388 // Implements the Return() action. 1389 class ReturnVoidAction { 1390 public: 1391 // Allows Return() to be used in any void-returning function. 1392 template <typename Result, typename ArgumentTuple> 1393 static void Perform(const ArgumentTuple&) { 1394 CompileAssertTypesEqual<void, Result>(); 1395 } 1396 }; 1397 1398 // Implements the polymorphic ReturnRef(x) action, which can be used 1399 // in any function that returns a reference to the type of x, 1400 // regardless of the argument types. 1401 template <typename T> 1402 class ReturnRefAction { 1403 public: 1404 // Constructs a ReturnRefAction object from the reference to be returned. 1405 explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT 1406 1407 // This template type conversion operator allows ReturnRef(x) to be 1408 // used in ANY function that returns a reference to x's type. 1409 template <typename F> 1410 operator Action<F>() const { 1411 typedef typename Function<F>::Result Result; 1412 // Asserts that the function return type is a reference. This 1413 // catches the user error of using ReturnRef(x) when Return(x) 1414 // should be used, and generates some helpful error message. 1415 GTEST_COMPILE_ASSERT_(internal::is_reference<Result>::value, 1416 use_Return_instead_of_ReturnRef_to_return_a_value); 1417 return Action<F>(new Impl<F>(ref_)); 1418 } 1419 1420 private: 1421 // Implements the ReturnRef(x) action for a particular function type F. 1422 template <typename F> 1423 class Impl : public ActionInterface<F> { 1424 public: 1425 typedef typename Function<F>::Result Result; 1426 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 1427 1428 explicit Impl(T& ref) : ref_(ref) {} // NOLINT 1429 1430 virtual Result Perform(const ArgumentTuple&) { 1431 return ref_; 1432 } 1433 1434 private: 1435 T& ref_; 1436 1437 GTEST_DISALLOW_ASSIGN_(Impl); 1438 }; 1439 1440 T& ref_; 1441 1442 GTEST_DISALLOW_ASSIGN_(ReturnRefAction); 1443 }; 1444 1445 // Implements the polymorphic ReturnRefOfCopy(x) action, which can be 1446 // used in any function that returns a reference to the type of x, 1447 // regardless of the argument types. 1448 template <typename T> 1449 class ReturnRefOfCopyAction { 1450 public: 1451 // Constructs a ReturnRefOfCopyAction object from the reference to 1452 // be returned. 1453 explicit ReturnRefOfCopyAction(const T& value) : value_(value) {} // NOLINT 1454 1455 // This template type conversion operator allows ReturnRefOfCopy(x) to be 1456 // used in ANY function that returns a reference to x's type. 1457 template <typename F> 1458 operator Action<F>() const { 1459 typedef typename Function<F>::Result Result; 1460 // Asserts that the function return type is a reference. This 1461 // catches the user error of using ReturnRefOfCopy(x) when Return(x) 1462 // should be used, and generates some helpful error message. 1463 GTEST_COMPILE_ASSERT_( 1464 internal::is_reference<Result>::value, 1465 use_Return_instead_of_ReturnRefOfCopy_to_return_a_value); 1466 return Action<F>(new Impl<F>(value_)); 1467 } 1468 1469 private: 1470 // Implements the ReturnRefOfCopy(x) action for a particular function type F. 1471 template <typename F> 1472 class Impl : public ActionInterface<F> { 1473 public: 1474 typedef typename Function<F>::Result Result; 1475 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 1476 1477 explicit Impl(const T& value) : value_(value) {} // NOLINT 1478 1479 virtual Result Perform(const ArgumentTuple&) { 1480 return value_; 1481 } 1482 1483 private: 1484 T value_; 1485 1486 GTEST_DISALLOW_ASSIGN_(Impl); 1487 }; 1488 1489 const T value_; 1490 1491 GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction); 1492 }; 1493 1494 // Implements the polymorphic DoDefault() action. 1495 class DoDefaultAction { 1496 public: 1497 // This template type conversion operator allows DoDefault() to be 1498 // used in any function. 1499 template <typename F> 1500 operator Action<F>() const { return Action<F>(NULL); } 1501 }; 1502 1503 // Implements the Assign action to set a given pointer referent to a 1504 // particular value. 1505 template <typename T1, typename T2> 1506 class AssignAction { 1507 public: 1508 AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} 1509 1510 template <typename Result, typename ArgumentTuple> 1511 void Perform(const ArgumentTuple& /* args */) const { 1512 *ptr_ = value_; 1513 } 1514 1515 private: 1516 T1* const ptr_; 1517 const T2 value_; 1518 1519 GTEST_DISALLOW_ASSIGN_(AssignAction); 1520 }; 1521 1522 #if !GTEST_OS_WINDOWS_MOBILE 1523 1524 // Implements the SetErrnoAndReturn action to simulate return from 1525 // various system calls and libc functions. 1526 template <typename T> 1527 class SetErrnoAndReturnAction { 1528 public: 1529 SetErrnoAndReturnAction(int errno_value, T result) 1530 : errno_(errno_value), 1531 result_(result) {} 1532 template <typename Result, typename ArgumentTuple> 1533 Result Perform(const ArgumentTuple& /* args */) const { 1534 errno = errno_; 1535 return result_; 1536 } 1537 1538 private: 1539 const int errno_; 1540 const T result_; 1541 1542 GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction); 1543 }; 1544 1545 #endif // !GTEST_OS_WINDOWS_MOBILE 1546 1547 // Implements the SetArgumentPointee<N>(x) action for any function 1548 // whose N-th argument (0-based) is a pointer to x's type. The 1549 // template parameter kIsProto is true iff type A is ProtocolMessage, 1550 // proto2::Message, or a sub-class of those. 1551 template <size_t N, typename A, bool kIsProto> 1552 class SetArgumentPointeeAction { 1553 public: 1554 // Constructs an action that sets the variable pointed to by the 1555 // N-th function argument to 'value'. 1556 explicit SetArgumentPointeeAction(const A& value) : value_(value) {} 1557 1558 template <typename Result, typename ArgumentTuple> 1559 void Perform(const ArgumentTuple& args) const { 1560 CompileAssertTypesEqual<void, Result>(); 1561 *::std::tr1::get<N>(args) = value_; 1562 } 1563 1564 private: 1565 const A value_; 1566 1567 GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); 1568 }; 1569 1570 template <size_t N, typename Proto> 1571 class SetArgumentPointeeAction<N, Proto, true> { 1572 public: 1573 // Constructs an action that sets the variable pointed to by the 1574 // N-th function argument to 'proto'. Both ProtocolMessage and 1575 // proto2::Message have the CopyFrom() method, so the same 1576 // implementation works for both. 1577 explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) { 1578 proto_->CopyFrom(proto); 1579 } 1580 1581 template <typename Result, typename ArgumentTuple> 1582 void Perform(const ArgumentTuple& args) const { 1583 CompileAssertTypesEqual<void, Result>(); 1584 ::std::tr1::get<N>(args)->CopyFrom(*proto_); 1585 } 1586 1587 private: 1588 const internal::linked_ptr<Proto> proto_; 1589 1590 GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); 1591 }; 1592 1593 // Implements the InvokeWithoutArgs(f) action. The template argument 1594 // FunctionImpl is the implementation type of f, which can be either a 1595 // function pointer or a functor. InvokeWithoutArgs(f) can be used as an 1596 // Action<F> as long as f's type is compatible with F (i.e. f can be 1597 // assigned to a tr1::function<F>). 1598 template <typename FunctionImpl> 1599 class InvokeWithoutArgsAction { 1600 public: 1601 // The c'tor makes a copy of function_impl (either a function 1602 // pointer or a functor). 1603 explicit InvokeWithoutArgsAction(FunctionImpl function_impl) 1604 : function_impl_(function_impl) {} 1605 1606 // Allows InvokeWithoutArgs(f) to be used as any action whose type is 1607 // compatible with f. 1608 template <typename Result, typename ArgumentTuple> 1609 Result Perform(const ArgumentTuple&) { return function_impl_(); } 1610 1611 private: 1612 FunctionImpl function_impl_; 1613 1614 GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction); 1615 }; 1616 1617 // Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. 1618 template <class Class, typename MethodPtr> 1619 class InvokeMethodWithoutArgsAction { 1620 public: 1621 InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr) 1622 : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {} 1623 1624 template <typename Result, typename ArgumentTuple> 1625 Result Perform(const ArgumentTuple&) const { 1626 return (obj_ptr_->*method_ptr_)(); 1627 } 1628 1629 private: 1630 Class* const obj_ptr_; 1631 const MethodPtr method_ptr_; 1632 1633 GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction); 1634 }; 1635 1636 // Implements the IgnoreResult(action) action. 1637 template <typename A> 1638 class IgnoreResultAction { 1639 public: 1640 explicit IgnoreResultAction(const A& action) : action_(action) {} 1641 1642 template <typename F> 1643 operator Action<F>() const { 1644 // Assert statement belongs here because this is the best place to verify 1645 // conditions on F. It produces the clearest error messages 1646 // in most compilers. 1647 // Impl really belongs in this scope as a local class but can't 1648 // because MSVC produces duplicate symbols in different translation units 1649 // in this case. Until MS fixes that bug we put Impl into the class scope 1650 // and put the typedef both here (for use in assert statement) and 1651 // in the Impl class. But both definitions must be the same. 1652 typedef typename internal::Function<F>::Result Result; 1653 1654 // Asserts at compile time that F returns void. 1655 CompileAssertTypesEqual<void, Result>(); 1656 1657 return Action<F>(new Impl<F>(action_)); 1658 } 1659 1660 private: 1661 template <typename F> 1662 class Impl : public ActionInterface<F> { 1663 public: 1664 typedef typename internal::Function<F>::Result Result; 1665 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 1666 1667 explicit Impl(const A& action) : action_(action) {} 1668 1669 virtual void Perform(const ArgumentTuple& args) { 1670 // Performs the action and ignores its result. 1671 action_.Perform(args); 1672 } 1673 1674 private: 1675 // Type OriginalFunction is the same as F except that its return 1676 // type is IgnoredValue. 1677 typedef typename internal::Function<F>::MakeResultIgnoredValue 1678 OriginalFunction; 1679 1680 const Action<OriginalFunction> action_; 1681 1682 GTEST_DISALLOW_ASSIGN_(Impl); 1683 }; 1684 1685 const A action_; 1686 1687 GTEST_DISALLOW_ASSIGN_(IgnoreResultAction); 1688 }; 1689 1690 // A ReferenceWrapper<T> object represents a reference to type T, 1691 // which can be either const or not. It can be explicitly converted 1692 // from, and implicitly converted to, a T&. Unlike a reference, 1693 // ReferenceWrapper<T> can be copied and can survive template type 1694 // inference. This is used to support by-reference arguments in the 1695 // InvokeArgument<N>(...) action. The idea was from "reference 1696 // wrappers" in tr1, which we don't have in our source tree yet. 1697 template <typename T> 1698 class ReferenceWrapper { 1699 public: 1700 // Constructs a ReferenceWrapper<T> object from a T&. 1701 explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {} // NOLINT 1702 1703 // Allows a ReferenceWrapper<T> object to be implicitly converted to 1704 // a T&. 1705 operator T&() const { return *pointer_; } 1706 private: 1707 T* pointer_; 1708 }; 1709 1710 // Allows the expression ByRef(x) to be printed as a reference to x. 1711 template <typename T> 1712 void PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) { 1713 T& value = ref; 1714 UniversalPrinter<T&>::Print(value, os); 1715 } 1716 1717 // Does two actions sequentially. Used for implementing the DoAll(a1, 1718 // a2, ...) action. 1719 template <typename Action1, typename Action2> 1720 class DoBothAction { 1721 public: 1722 DoBothAction(Action1 action1, Action2 action2) 1723 : action1_(action1), action2_(action2) {} 1724 1725 // This template type conversion operator allows DoAll(a1, ..., a_n) 1726 // to be used in ANY function of compatible type. 1727 template <typename F> 1728 operator Action<F>() const { 1729 return Action<F>(new Impl<F>(action1_, action2_)); 1730 } 1731 1732 private: 1733 // Implements the DoAll(...) action for a particular function type F. 1734 template <typename F> 1735 class Impl : public ActionInterface<F> { 1736 public: 1737 typedef typename Function<F>::Result Result; 1738 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 1739 typedef typename Function<F>::MakeResultVoid VoidResult; 1740 1741 Impl(const Action<VoidResult>& action1, const Action<F>& action2) 1742 : action1_(action1), action2_(action2) {} 1743 1744 virtual Result Perform(const ArgumentTuple& args) { 1745 action1_.Perform(args); 1746 return action2_.Perform(args); 1747 } 1748 1749 private: 1750 const Action<VoidResult> action1_; 1751 const Action<F> action2_; 1752 1753 GTEST_DISALLOW_ASSIGN_(Impl); 1754 }; 1755 1756 Action1 action1_; 1757 Action2 action2_; 1758 1759 GTEST_DISALLOW_ASSIGN_(DoBothAction); 1760 }; 1761 1762 } // namespace internal 1763 1764 // An Unused object can be implicitly constructed from ANY value. 1765 // This is handy when defining actions that ignore some or all of the 1766 // mock function arguments. For example, given 1767 // 1768 // MOCK_METHOD3(Foo, double(const string& label, double x, double y)); 1769 // MOCK_METHOD3(Bar, double(int index, double x, double y)); 1770 // 1771 // instead of 1772 // 1773 // double DistanceToOriginWithLabel(const string& label, double x, double y) { 1774 // return sqrt(x*x + y*y); 1775 // } 1776 // double DistanceToOriginWithIndex(int index, double x, double y) { 1777 // return sqrt(x*x + y*y); 1778 // } 1779 // ... 1780 // EXEPCT_CALL(mock, Foo("abc", _, _)) 1781 // .WillOnce(Invoke(DistanceToOriginWithLabel)); 1782 // EXEPCT_CALL(mock, Bar(5, _, _)) 1783 // .WillOnce(Invoke(DistanceToOriginWithIndex)); 1784 // 1785 // you could write 1786 // 1787 // // We can declare any uninteresting argument as Unused. 1788 // double DistanceToOrigin(Unused, double x, double y) { 1789 // return sqrt(x*x + y*y); 1790 // } 1791 // ... 1792 // EXEPCT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); 1793 // EXEPCT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); 1794 typedef internal::IgnoredValue Unused; 1795 1796 // This constructor allows us to turn an Action<From> object into an 1797 // Action<To>, as long as To's arguments can be implicitly converted 1798 // to From's and From's return type cann be implicitly converted to 1799 // To's. 1800 template <typename To> 1801 template <typename From> 1802 Action<To>::Action(const Action<From>& from) 1803 : impl_(new internal::ActionAdaptor<To, From>(from)) {} 1804 1805 // Creates an action that returns 'value'. 'value' is passed by value 1806 // instead of const reference - otherwise Return("string literal") 1807 // will trigger a compiler error about using array as initializer. 1808 template <typename R> 1809 internal::ReturnAction<R> Return(R value) { 1810 return internal::ReturnAction<R>(value); 1811 } 1812 1813 // Creates an action that returns NULL. 1814 inline PolymorphicAction<internal::ReturnNullAction> ReturnNull() { 1815 return MakePolymorphicAction(internal::ReturnNullAction()); 1816 } 1817 1818 // Creates an action that returns from a void function. 1819 inline PolymorphicAction<internal::ReturnVoidAction> Return() { 1820 return MakePolymorphicAction(internal::ReturnVoidAction()); 1821 } 1822 1823 // Creates an action that returns the reference to a variable. 1824 template <typename R> 1825 inline internal::ReturnRefAction<R> ReturnRef(R& x) { // NOLINT 1826 return internal::ReturnRefAction<R>(x); 1827 } 1828 1829 // Creates an action that returns the reference to a copy of the 1830 // argument. The copy is created when the action is constructed and 1831 // lives as long as the action. 1832 template <typename R> 1833 inline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) { 1834 return internal::ReturnRefOfCopyAction<R>(x); 1835 } 1836 1837 // Creates an action that does the default action for the give mock function. 1838 inline internal::DoDefaultAction DoDefault() { 1839 return internal::DoDefaultAction(); 1840 } 1841 1842 // Creates an action that sets the variable pointed by the N-th 1843 // (0-based) function argument to 'value'. 1844 template <size_t N, typename T> 1845 PolymorphicAction< 1846 internal::SetArgumentPointeeAction< 1847 N, T, internal::IsAProtocolMessage<T>::value> > 1848 SetArgPointee(const T& x) { 1849 return MakePolymorphicAction(internal::SetArgumentPointeeAction< 1850 N, T, internal::IsAProtocolMessage<T>::value>(x)); 1851 } 1852 1853 #if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN) 1854 // This overload allows SetArgPointee() to accept a string literal. 1855 // GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish 1856 // this overload from the templated version and emit a compile error. 1857 template <size_t N> 1858 PolymorphicAction< 1859 internal::SetArgumentPointeeAction<N, const char*, false> > 1860 SetArgPointee(const char* p) { 1861 return MakePolymorphicAction(internal::SetArgumentPointeeAction< 1862 N, const char*, false>(p)); 1863 } 1864 1865 template <size_t N> 1866 PolymorphicAction< 1867 internal::SetArgumentPointeeAction<N, const wchar_t*, false> > 1868 SetArgPointee(const wchar_t* p) { 1869 return MakePolymorphicAction(internal::SetArgumentPointeeAction< 1870 N, const wchar_t*, false>(p)); 1871 } 1872 #endif 1873 1874 // The following version is DEPRECATED. 1875 template <size_t N, typename T> 1876 PolymorphicAction< 1877 internal::SetArgumentPointeeAction< 1878 N, T, internal::IsAProtocolMessage<T>::value> > 1879 SetArgumentPointee(const T& x) { 1880 return MakePolymorphicAction(internal::SetArgumentPointeeAction< 1881 N, T, internal::IsAProtocolMessage<T>::value>(x)); 1882 } 1883 1884 // Creates an action that sets a pointer referent to a given value. 1885 template <typename T1, typename T2> 1886 PolymorphicAction<internal::AssignAction<T1, T2> > Assign(T1* ptr, T2 val) { 1887 return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val)); 1888 } 1889 1890 #if !GTEST_OS_WINDOWS_MOBILE 1891 1892 // Creates an action that sets errno and returns the appropriate error. 1893 template <typename T> 1894 PolymorphicAction<internal::SetErrnoAndReturnAction<T> > 1895 SetErrnoAndReturn(int errval, T result) { 1896 return MakePolymorphicAction( 1897 internal::SetErrnoAndReturnAction<T>(errval, result)); 1898 } 1899 1900 #endif // !GTEST_OS_WINDOWS_MOBILE 1901 1902 // Various overloads for InvokeWithoutArgs(). 1903 1904 // Creates an action that invokes 'function_impl' with no argument. 1905 template <typename FunctionImpl> 1906 PolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> > 1907 InvokeWithoutArgs(FunctionImpl function_impl) { 1908 return MakePolymorphicAction( 1909 internal::InvokeWithoutArgsAction<FunctionImpl>(function_impl)); 1910 } 1911 1912 // Creates an action that invokes the given method on the given object 1913 // with no argument. 1914 template <class Class, typename MethodPtr> 1915 PolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> > 1916 InvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) { 1917 return MakePolymorphicAction( 1918 internal::InvokeMethodWithoutArgsAction<Class, MethodPtr>( 1919 obj_ptr, method_ptr)); 1920 } 1921 1922 // Creates an action that performs an_action and throws away its 1923 // result. In other words, it changes the return type of an_action to 1924 // void. an_action MUST NOT return void, or the code won't compile. 1925 template <typename A> 1926 inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) { 1927 return internal::IgnoreResultAction<A>(an_action); 1928 } 1929 1930 // Creates a reference wrapper for the given L-value. If necessary, 1931 // you can explicitly specify the type of the reference. For example, 1932 // suppose 'derived' is an object of type Derived, ByRef(derived) 1933 // would wrap a Derived&. If you want to wrap a const Base& instead, 1934 // where Base is a base class of Derived, just write: 1935 // 1936 // ByRef<const Base>(derived) 1937 template <typename T> 1938 inline internal::ReferenceWrapper<T> ByRef(T& l_value) { // NOLINT 1939 return internal::ReferenceWrapper<T>(l_value); 1940 } 1941 1942 } // namespace testing 1943 1944 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ 1945 // Copyright 2007, Google Inc. 1946 // All rights reserved. 1947 // 1948 // Redistribution and use in source and binary forms, with or without 1949 // modification, are permitted provided that the following conditions are 1950 // met: 1951 // 1952 // * Redistributions of source code must retain the above copyright 1953 // notice, this list of conditions and the following disclaimer. 1954 // * Redistributions in binary form must reproduce the above 1955 // copyright notice, this list of conditions and the following disclaimer 1956 // in the documentation and/or other materials provided with the 1957 // distribution. 1958 // * Neither the name of Google Inc. nor the names of its 1959 // contributors may be used to endorse or promote products derived from 1960 // this software without specific prior written permission. 1961 // 1962 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1963 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1964 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1965 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1966 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1967 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1968 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1969 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1970 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1971 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1972 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1973 // 1974 // Author: wan@google.com (Zhanyong Wan) 1975 1976 // Google Mock - a framework for writing C++ mock classes. 1977 // 1978 // This file implements some commonly used cardinalities. More 1979 // cardinalities can be defined by the user implementing the 1980 // CardinalityInterface interface if necessary. 1981 1982 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ 1983 #define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ 1984 1985 #include <limits.h> 1986 #include <ostream> // NOLINT 1987 1988 namespace testing { 1989 1990 // To implement a cardinality Foo, define: 1991 // 1. a class FooCardinality that implements the 1992 // CardinalityInterface interface, and 1993 // 2. a factory function that creates a Cardinality object from a 1994 // const FooCardinality*. 1995 // 1996 // The two-level delegation design follows that of Matcher, providing 1997 // consistency for extension developers. It also eases ownership 1998 // management as Cardinality objects can now be copied like plain values. 1999 2000 // The implementation of a cardinality. 2001 class CardinalityInterface { 2002 public: 2003 virtual ~CardinalityInterface() {} 2004 2005 // Conservative estimate on the lower/upper bound of the number of 2006 // calls allowed. 2007 virtual int ConservativeLowerBound() const { return 0; } 2008 virtual int ConservativeUpperBound() const { return INT_MAX; } 2009 2010 // Returns true iff call_count calls will satisfy this cardinality. 2011 virtual bool IsSatisfiedByCallCount(int call_count) const = 0; 2012 2013 // Returns true iff call_count calls will saturate this cardinality. 2014 virtual bool IsSaturatedByCallCount(int call_count) const = 0; 2015 2016 // Describes self to an ostream. 2017 virtual void DescribeTo(::std::ostream* os) const = 0; 2018 }; 2019 2020 // A Cardinality is a copyable and IMMUTABLE (except by assignment) 2021 // object that specifies how many times a mock function is expected to 2022 // be called. The implementation of Cardinality is just a linked_ptr 2023 // to const CardinalityInterface, so copying is fairly cheap. 2024 // Don't inherit from Cardinality! 2025 class Cardinality { 2026 public: 2027 // Constructs a null cardinality. Needed for storing Cardinality 2028 // objects in STL containers. 2029 Cardinality() {} 2030 2031 // Constructs a Cardinality from its implementation. 2032 explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} 2033 2034 // Conservative estimate on the lower/upper bound of the number of 2035 // calls allowed. 2036 int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } 2037 int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } 2038 2039 // Returns true iff call_count calls will satisfy this cardinality. 2040 bool IsSatisfiedByCallCount(int call_count) const { 2041 return impl_->IsSatisfiedByCallCount(call_count); 2042 } 2043 2044 // Returns true iff call_count calls will saturate this cardinality. 2045 bool IsSaturatedByCallCount(int call_count) const { 2046 return impl_->IsSaturatedByCallCount(call_count); 2047 } 2048 2049 // Returns true iff call_count calls will over-saturate this 2050 // cardinality, i.e. exceed the maximum number of allowed calls. 2051 bool IsOverSaturatedByCallCount(int call_count) const { 2052 return impl_->IsSaturatedByCallCount(call_count) && 2053 !impl_->IsSatisfiedByCallCount(call_count); 2054 } 2055 2056 // Describes self to an ostream 2057 void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 2058 2059 // Describes the given actual call count to an ostream. 2060 static void DescribeActualCallCountTo(int actual_call_count, 2061 ::std::ostream* os); 2062 private: 2063 internal::linked_ptr<const CardinalityInterface> impl_; 2064 }; 2065 2066 // Creates a cardinality that allows at least n calls. 2067 Cardinality AtLeast(int n); 2068 2069 // Creates a cardinality that allows at most n calls. 2070 Cardinality AtMost(int n); 2071 2072 // Creates a cardinality that allows any number of calls. 2073 Cardinality AnyNumber(); 2074 2075 // Creates a cardinality that allows between min and max calls. 2076 Cardinality Between(int min, int max); 2077 2078 // Creates a cardinality that allows exactly n calls. 2079 Cardinality Exactly(int n); 2080 2081 // Creates a cardinality from its implementation. 2082 inline Cardinality MakeCardinality(const CardinalityInterface* c) { 2083 return Cardinality(c); 2084 } 2085 2086 } // namespace testing 2087 2088 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ 2089 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!! 2090 2091 // Copyright 2007, Google Inc. 2092 // All rights reserved. 2093 // 2094 // Redistribution and use in source and binary forms, with or without 2095 // modification, are permitted provided that the following conditions are 2096 // met: 2097 // 2098 // * Redistributions of source code must retain the above copyright 2099 // notice, this list of conditions and the following disclaimer. 2100 // * Redistributions in binary form must reproduce the above 2101 // copyright notice, this list of conditions and the following disclaimer 2102 // in the documentation and/or other materials provided with the 2103 // distribution. 2104 // * Neither the name of Google Inc. nor the names of its 2105 // contributors may be used to endorse or promote products derived from 2106 // this software without specific prior written permission. 2107 // 2108 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2109 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2110 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2111 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2112 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2114 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2115 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2116 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2117 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2118 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2119 // 2120 // Author: wan@google.com (Zhanyong Wan) 2121 2122 // Google Mock - a framework for writing C++ mock classes. 2123 // 2124 // This file implements some commonly used variadic actions. 2125 2126 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 2127 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 2128 2129 2130 namespace testing { 2131 namespace internal { 2132 2133 // InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary 2134 // function or method with the unpacked values, where F is a function 2135 // type that takes N arguments. 2136 template <typename Result, typename ArgumentTuple> 2137 class InvokeHelper; 2138 2139 template <typename R> 2140 class InvokeHelper<R, ::std::tr1::tuple<> > { 2141 public: 2142 template <typename Function> 2143 static R Invoke(Function function, const ::std::tr1::tuple<>&) { 2144 return function(); 2145 } 2146 2147 template <class Class, typename MethodPtr> 2148 static R InvokeMethod(Class* obj_ptr, 2149 MethodPtr method_ptr, 2150 const ::std::tr1::tuple<>&) { 2151 return (obj_ptr->*method_ptr)(); 2152 } 2153 }; 2154 2155 template <typename R, typename A1> 2156 class InvokeHelper<R, ::std::tr1::tuple<A1> > { 2157 public: 2158 template <typename Function> 2159 static R Invoke(Function function, const ::std::tr1::tuple<A1>& args) { 2160 using ::std::tr1::get; 2161 return function(get<0>(args)); 2162 } 2163 2164 template <class Class, typename MethodPtr> 2165 static R InvokeMethod(Class* obj_ptr, 2166 MethodPtr method_ptr, 2167 const ::std::tr1::tuple<A1>& args) { 2168 using ::std::tr1::get; 2169 return (obj_ptr->*method_ptr)(get<0>(args)); 2170 } 2171 }; 2172 2173 template <typename R, typename A1, typename A2> 2174 class InvokeHelper<R, ::std::tr1::tuple<A1, A2> > { 2175 public: 2176 template <typename Function> 2177 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2>& args) { 2178 using ::std::tr1::get; 2179 return function(get<0>(args), get<1>(args)); 2180 } 2181 2182 template <class Class, typename MethodPtr> 2183 static R InvokeMethod(Class* obj_ptr, 2184 MethodPtr method_ptr, 2185 const ::std::tr1::tuple<A1, A2>& args) { 2186 using ::std::tr1::get; 2187 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args)); 2188 } 2189 }; 2190 2191 template <typename R, typename A1, typename A2, typename A3> 2192 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3> > { 2193 public: 2194 template <typename Function> 2195 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, 2196 A3>& args) { 2197 using ::std::tr1::get; 2198 return function(get<0>(args), get<1>(args), get<2>(args)); 2199 } 2200 2201 template <class Class, typename MethodPtr> 2202 static R InvokeMethod(Class* obj_ptr, 2203 MethodPtr method_ptr, 2204 const ::std::tr1::tuple<A1, A2, A3>& args) { 2205 using ::std::tr1::get; 2206 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args)); 2207 } 2208 }; 2209 2210 template <typename R, typename A1, typename A2, typename A3, typename A4> 2211 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4> > { 2212 public: 2213 template <typename Function> 2214 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, 2215 A4>& args) { 2216 using ::std::tr1::get; 2217 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args)); 2218 } 2219 2220 template <class Class, typename MethodPtr> 2221 static R InvokeMethod(Class* obj_ptr, 2222 MethodPtr method_ptr, 2223 const ::std::tr1::tuple<A1, A2, A3, A4>& args) { 2224 using ::std::tr1::get; 2225 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2226 get<3>(args)); 2227 } 2228 }; 2229 2230 template <typename R, typename A1, typename A2, typename A3, typename A4, 2231 typename A5> 2232 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5> > { 2233 public: 2234 template <typename Function> 2235 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4, 2236 A5>& args) { 2237 using ::std::tr1::get; 2238 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2239 get<4>(args)); 2240 } 2241 2242 template <class Class, typename MethodPtr> 2243 static R InvokeMethod(Class* obj_ptr, 2244 MethodPtr method_ptr, 2245 const ::std::tr1::tuple<A1, A2, A3, A4, A5>& args) { 2246 using ::std::tr1::get; 2247 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2248 get<3>(args), get<4>(args)); 2249 } 2250 }; 2251 2252 template <typename R, typename A1, typename A2, typename A3, typename A4, 2253 typename A5, typename A6> 2254 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> > { 2255 public: 2256 template <typename Function> 2257 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4, 2258 A5, A6>& args) { 2259 using ::std::tr1::get; 2260 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2261 get<4>(args), get<5>(args)); 2262 } 2263 2264 template <class Class, typename MethodPtr> 2265 static R InvokeMethod(Class* obj_ptr, 2266 MethodPtr method_ptr, 2267 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6>& args) { 2268 using ::std::tr1::get; 2269 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2270 get<3>(args), get<4>(args), get<5>(args)); 2271 } 2272 }; 2273 2274 template <typename R, typename A1, typename A2, typename A3, typename A4, 2275 typename A5, typename A6, typename A7> 2276 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> > { 2277 public: 2278 template <typename Function> 2279 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4, 2280 A5, A6, A7>& args) { 2281 using ::std::tr1::get; 2282 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2283 get<4>(args), get<5>(args), get<6>(args)); 2284 } 2285 2286 template <class Class, typename MethodPtr> 2287 static R InvokeMethod(Class* obj_ptr, 2288 MethodPtr method_ptr, 2289 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, 2290 A7>& args) { 2291 using ::std::tr1::get; 2292 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2293 get<3>(args), get<4>(args), get<5>(args), get<6>(args)); 2294 } 2295 }; 2296 2297 template <typename R, typename A1, typename A2, typename A3, typename A4, 2298 typename A5, typename A6, typename A7, typename A8> 2299 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > { 2300 public: 2301 template <typename Function> 2302 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4, 2303 A5, A6, A7, A8>& args) { 2304 using ::std::tr1::get; 2305 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2306 get<4>(args), get<5>(args), get<6>(args), get<7>(args)); 2307 } 2308 2309 template <class Class, typename MethodPtr> 2310 static R InvokeMethod(Class* obj_ptr, 2311 MethodPtr method_ptr, 2312 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, 2313 A8>& args) { 2314 using ::std::tr1::get; 2315 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2316 get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args)); 2317 } 2318 }; 2319 2320 template <typename R, typename A1, typename A2, typename A3, typename A4, 2321 typename A5, typename A6, typename A7, typename A8, typename A9> 2322 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > { 2323 public: 2324 template <typename Function> 2325 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4, 2326 A5, A6, A7, A8, A9>& args) { 2327 using ::std::tr1::get; 2328 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2329 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args)); 2330 } 2331 2332 template <class Class, typename MethodPtr> 2333 static R InvokeMethod(Class* obj_ptr, 2334 MethodPtr method_ptr, 2335 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, 2336 A9>& args) { 2337 using ::std::tr1::get; 2338 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2339 get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), 2340 get<8>(args)); 2341 } 2342 }; 2343 2344 template <typename R, typename A1, typename A2, typename A3, typename A4, 2345 typename A5, typename A6, typename A7, typename A8, typename A9, 2346 typename A10> 2347 class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, 2348 A10> > { 2349 public: 2350 template <typename Function> 2351 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4, 2352 A5, A6, A7, A8, A9, A10>& args) { 2353 using ::std::tr1::get; 2354 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2355 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), 2356 get<9>(args)); 2357 } 2358 2359 template <class Class, typename MethodPtr> 2360 static R InvokeMethod(Class* obj_ptr, 2361 MethodPtr method_ptr, 2362 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, 2363 A9, A10>& args) { 2364 using ::std::tr1::get; 2365 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args), 2366 get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args), 2367 get<8>(args), get<9>(args)); 2368 } 2369 }; 2370 2371 // CallableHelper has static methods for invoking "callables", 2372 // i.e. function pointers and functors. It uses overloading to 2373 // provide a uniform interface for invoking different kinds of 2374 // callables. In particular, you can use: 2375 // 2376 // CallableHelper<R>::Call(callable, a1, a2, ..., an) 2377 // 2378 // to invoke an n-ary callable, where R is its return type. If an 2379 // argument, say a2, needs to be passed by reference, you should write 2380 // ByRef(a2) instead of a2 in the above expression. 2381 template <typename R> 2382 class CallableHelper { 2383 public: 2384 // Calls a nullary callable. 2385 template <typename Function> 2386 static R Call(Function function) { return function(); } 2387 2388 // Calls a unary callable. 2389 2390 // We deliberately pass a1 by value instead of const reference here 2391 // in case it is a C-string literal. If we had declared the 2392 // parameter as 'const A1& a1' and write Call(function, "Hi"), the 2393 // compiler would've thought A1 is 'char[3]', which causes trouble 2394 // when you need to copy a value of type A1. By declaring the 2395 // parameter as 'A1 a1', the compiler will correctly infer that A1 2396 // is 'const char*' when it sees Call(function, "Hi"). 2397 // 2398 // Since this function is defined inline, the compiler can get rid 2399 // of the copying of the arguments. Therefore the performance won't 2400 // be hurt. 2401 template <typename Function, typename A1> 2402 static R Call(Function function, A1 a1) { return function(a1); } 2403 2404 // Calls a binary callable. 2405 template <typename Function, typename A1, typename A2> 2406 static R Call(Function function, A1 a1, A2 a2) { 2407 return function(a1, a2); 2408 } 2409 2410 // Calls a ternary callable. 2411 template <typename Function, typename A1, typename A2, typename A3> 2412 static R Call(Function function, A1 a1, A2 a2, A3 a3) { 2413 return function(a1, a2, a3); 2414 } 2415 2416 // Calls a 4-ary callable. 2417 template <typename Function, typename A1, typename A2, typename A3, 2418 typename A4> 2419 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4) { 2420 return function(a1, a2, a3, a4); 2421 } 2422 2423 // Calls a 5-ary callable. 2424 template <typename Function, typename A1, typename A2, typename A3, 2425 typename A4, typename A5> 2426 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { 2427 return function(a1, a2, a3, a4, a5); 2428 } 2429 2430 // Calls a 6-ary callable. 2431 template <typename Function, typename A1, typename A2, typename A3, 2432 typename A4, typename A5, typename A6> 2433 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { 2434 return function(a1, a2, a3, a4, a5, a6); 2435 } 2436 2437 // Calls a 7-ary callable. 2438 template <typename Function, typename A1, typename A2, typename A3, 2439 typename A4, typename A5, typename A6, typename A7> 2440 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2441 A7 a7) { 2442 return function(a1, a2, a3, a4, a5, a6, a7); 2443 } 2444 2445 // Calls a 8-ary callable. 2446 template <typename Function, typename A1, typename A2, typename A3, 2447 typename A4, typename A5, typename A6, typename A7, typename A8> 2448 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2449 A7 a7, A8 a8) { 2450 return function(a1, a2, a3, a4, a5, a6, a7, a8); 2451 } 2452 2453 // Calls a 9-ary callable. 2454 template <typename Function, typename A1, typename A2, typename A3, 2455 typename A4, typename A5, typename A6, typename A7, typename A8, 2456 typename A9> 2457 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2458 A7 a7, A8 a8, A9 a9) { 2459 return function(a1, a2, a3, a4, a5, a6, a7, a8, a9); 2460 } 2461 2462 // Calls a 10-ary callable. 2463 template <typename Function, typename A1, typename A2, typename A3, 2464 typename A4, typename A5, typename A6, typename A7, typename A8, 2465 typename A9, typename A10> 2466 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, 2467 A7 a7, A8 a8, A9 a9, A10 a10) { 2468 return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); 2469 } 2470 2471 }; // class CallableHelper 2472 2473 // An INTERNAL macro for extracting the type of a tuple field. It's 2474 // subject to change without notice - DO NOT USE IN USER CODE! 2475 #define GMOCK_FIELD_(Tuple, N) \ 2476 typename ::std::tr1::tuple_element<N, Tuple>::type 2477 2478 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the 2479 // type of an n-ary function whose i-th (1-based) argument type is the 2480 // k{i}-th (0-based) field of ArgumentTuple, which must be a tuple 2481 // type, and whose return type is Result. For example, 2482 // SelectArgs<int, ::std::tr1::tuple<bool, char, double, long>, 0, 3>::type 2483 // is int(bool, long). 2484 // 2485 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args) 2486 // returns the selected fields (k1, k2, ..., k_n) of args as a tuple. 2487 // For example, 2488 // SelectArgs<int, ::std::tr1::tuple<bool, char, double>, 2, 0>::Select( 2489 // ::std::tr1::make_tuple(true, 'a', 2.5)) 2490 // returns ::std::tr1::tuple (2.5, true). 2491 // 2492 // The numbers in list k1, k2, ..., k_n must be >= 0, where n can be 2493 // in the range [0, 10]. Duplicates are allowed and they don't have 2494 // to be in an ascending or descending order. 2495 2496 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2497 int k4, int k5, int k6, int k7, int k8, int k9, int k10> 2498 class SelectArgs { 2499 public: 2500 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2501 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2502 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 2503 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), 2504 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9), 2505 GMOCK_FIELD_(ArgumentTuple, k10)); 2506 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2507 static SelectedArgs Select(const ArgumentTuple& args) { 2508 using ::std::tr1::get; 2509 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2510 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args), 2511 get<k8>(args), get<k9>(args), get<k10>(args)); 2512 } 2513 }; 2514 2515 template <typename Result, typename ArgumentTuple> 2516 class SelectArgs<Result, ArgumentTuple, 2517 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 2518 public: 2519 typedef Result type(); 2520 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2521 static SelectedArgs Select(const ArgumentTuple& /* args */) { 2522 using ::std::tr1::get; 2523 return SelectedArgs(); 2524 } 2525 }; 2526 2527 template <typename Result, typename ArgumentTuple, int k1> 2528 class SelectArgs<Result, ArgumentTuple, 2529 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 2530 public: 2531 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1)); 2532 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2533 static SelectedArgs Select(const ArgumentTuple& args) { 2534 using ::std::tr1::get; 2535 return SelectedArgs(get<k1>(args)); 2536 } 2537 }; 2538 2539 template <typename Result, typename ArgumentTuple, int k1, int k2> 2540 class SelectArgs<Result, ArgumentTuple, 2541 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> { 2542 public: 2543 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2544 GMOCK_FIELD_(ArgumentTuple, k2)); 2545 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2546 static SelectedArgs Select(const ArgumentTuple& args) { 2547 using ::std::tr1::get; 2548 return SelectedArgs(get<k1>(args), get<k2>(args)); 2549 } 2550 }; 2551 2552 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3> 2553 class SelectArgs<Result, ArgumentTuple, 2554 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> { 2555 public: 2556 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2557 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3)); 2558 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2559 static SelectedArgs Select(const ArgumentTuple& args) { 2560 using ::std::tr1::get; 2561 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args)); 2562 } 2563 }; 2564 2565 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2566 int k4> 2567 class SelectArgs<Result, ArgumentTuple, 2568 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> { 2569 public: 2570 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2571 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2572 GMOCK_FIELD_(ArgumentTuple, k4)); 2573 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2574 static SelectedArgs Select(const ArgumentTuple& args) { 2575 using ::std::tr1::get; 2576 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2577 get<k4>(args)); 2578 } 2579 }; 2580 2581 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2582 int k4, int k5> 2583 class SelectArgs<Result, ArgumentTuple, 2584 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> { 2585 public: 2586 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2587 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2588 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5)); 2589 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2590 static SelectedArgs Select(const ArgumentTuple& args) { 2591 using ::std::tr1::get; 2592 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2593 get<k4>(args), get<k5>(args)); 2594 } 2595 }; 2596 2597 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2598 int k4, int k5, int k6> 2599 class SelectArgs<Result, ArgumentTuple, 2600 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> { 2601 public: 2602 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2603 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2604 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 2605 GMOCK_FIELD_(ArgumentTuple, k6)); 2606 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2607 static SelectedArgs Select(const ArgumentTuple& args) { 2608 using ::std::tr1::get; 2609 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2610 get<k4>(args), get<k5>(args), get<k6>(args)); 2611 } 2612 }; 2613 2614 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2615 int k4, int k5, int k6, int k7> 2616 class SelectArgs<Result, ArgumentTuple, 2617 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> { 2618 public: 2619 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2620 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2621 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 2622 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7)); 2623 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2624 static SelectedArgs Select(const ArgumentTuple& args) { 2625 using ::std::tr1::get; 2626 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2627 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args)); 2628 } 2629 }; 2630 2631 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2632 int k4, int k5, int k6, int k7, int k8> 2633 class SelectArgs<Result, ArgumentTuple, 2634 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> { 2635 public: 2636 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2637 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2638 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 2639 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), 2640 GMOCK_FIELD_(ArgumentTuple, k8)); 2641 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2642 static SelectedArgs Select(const ArgumentTuple& args) { 2643 using ::std::tr1::get; 2644 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2645 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args), 2646 get<k8>(args)); 2647 } 2648 }; 2649 2650 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3, 2651 int k4, int k5, int k6, int k7, int k8, int k9> 2652 class SelectArgs<Result, ArgumentTuple, 2653 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> { 2654 public: 2655 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1), 2656 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3), 2657 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5), 2658 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7), 2659 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9)); 2660 typedef typename Function<type>::ArgumentTuple SelectedArgs; 2661 static SelectedArgs Select(const ArgumentTuple& args) { 2662 using ::std::tr1::get; 2663 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args), 2664 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args), 2665 get<k8>(args), get<k9>(args)); 2666 } 2667 }; 2668 2669 #undef GMOCK_FIELD_ 2670 2671 // Implements the WithArgs action. 2672 template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1, 2673 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 2674 int k9 = -1, int k10 = -1> 2675 class WithArgsAction { 2676 public: 2677 explicit WithArgsAction(const InnerAction& action) : action_(action) {} 2678 2679 template <typename F> 2680 operator Action<F>() const { return MakeAction(new Impl<F>(action_)); } 2681 2682 private: 2683 template <typename F> 2684 class Impl : public ActionInterface<F> { 2685 public: 2686 typedef typename Function<F>::Result Result; 2687 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 2688 2689 explicit Impl(const InnerAction& action) : action_(action) {} 2690 2691 virtual Result Perform(const ArgumentTuple& args) { 2692 return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4, 2693 k5, k6, k7, k8, k9, k10>::Select(args)); 2694 } 2695 2696 private: 2697 typedef typename SelectArgs<Result, ArgumentTuple, 2698 k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType; 2699 2700 Action<InnerFunctionType> action_; 2701 }; 2702 2703 const InnerAction action_; 2704 2705 GTEST_DISALLOW_ASSIGN_(WithArgsAction); 2706 }; 2707 2708 // A macro from the ACTION* family (defined later in this file) 2709 // defines an action that can be used in a mock function. Typically, 2710 // these actions only care about a subset of the arguments of the mock 2711 // function. For example, if such an action only uses the second 2712 // argument, it can be used in any mock function that takes >= 2 2713 // arguments where the type of the second argument is compatible. 2714 // 2715 // Therefore, the action implementation must be prepared to take more 2716 // arguments than it needs. The ExcessiveArg type is used to 2717 // represent those excessive arguments. In order to keep the compiler 2718 // error messages tractable, we define it in the testing namespace 2719 // instead of testing::internal. However, this is an INTERNAL TYPE 2720 // and subject to change without notice, so a user MUST NOT USE THIS 2721 // TYPE DIRECTLY. 2722 struct ExcessiveArg {}; 2723 2724 // A helper class needed for implementing the ACTION* macros. 2725 template <typename Result, class Impl> 2726 class ActionHelper { 2727 public: 2728 static Result Perform(Impl* impl, const ::std::tr1::tuple<>& args) { 2729 using ::std::tr1::get; 2730 return impl->template gmock_PerformImpl<>(args, ExcessiveArg(), 2731 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2732 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2733 ExcessiveArg()); 2734 } 2735 2736 template <typename A0> 2737 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0>& args) { 2738 using ::std::tr1::get; 2739 return impl->template gmock_PerformImpl<A0>(args, get<0>(args), 2740 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2741 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2742 ExcessiveArg()); 2743 } 2744 2745 template <typename A0, typename A1> 2746 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1>& args) { 2747 using ::std::tr1::get; 2748 return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args), 2749 get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2750 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2751 ExcessiveArg()); 2752 } 2753 2754 template <typename A0, typename A1, typename A2> 2755 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2>& args) { 2756 using ::std::tr1::get; 2757 return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args), 2758 get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(), 2759 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2760 ExcessiveArg()); 2761 } 2762 2763 template <typename A0, typename A1, typename A2, typename A3> 2764 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, 2765 A3>& args) { 2766 using ::std::tr1::get; 2767 return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args), 2768 get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(), 2769 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2770 ExcessiveArg()); 2771 } 2772 2773 template <typename A0, typename A1, typename A2, typename A3, typename A4> 2774 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, 2775 A4>& args) { 2776 using ::std::tr1::get; 2777 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args, 2778 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), 2779 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2780 ExcessiveArg()); 2781 } 2782 2783 template <typename A0, typename A1, typename A2, typename A3, typename A4, 2784 typename A5> 2785 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4, 2786 A5>& args) { 2787 using ::std::tr1::get; 2788 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args, 2789 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), 2790 get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), 2791 ExcessiveArg()); 2792 } 2793 2794 template <typename A0, typename A1, typename A2, typename A3, typename A4, 2795 typename A5, typename A6> 2796 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4, 2797 A5, A6>& args) { 2798 using ::std::tr1::get; 2799 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args, 2800 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args), 2801 get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(), 2802 ExcessiveArg()); 2803 } 2804 2805 template <typename A0, typename A1, typename A2, typename A3, typename A4, 2806 typename A5, typename A6, typename A7> 2807 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4, 2808 A5, A6, A7>& args) { 2809 using ::std::tr1::get; 2810 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, 2811 A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2812 get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(), 2813 ExcessiveArg()); 2814 } 2815 2816 template <typename A0, typename A1, typename A2, typename A3, typename A4, 2817 typename A5, typename A6, typename A7, typename A8> 2818 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4, 2819 A5, A6, A7, A8>& args) { 2820 using ::std::tr1::get; 2821 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, 2822 A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2823 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), 2824 ExcessiveArg()); 2825 } 2826 2827 template <typename A0, typename A1, typename A2, typename A3, typename A4, 2828 typename A5, typename A6, typename A7, typename A8, typename A9> 2829 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4, 2830 A5, A6, A7, A8, A9>& args) { 2831 using ::std::tr1::get; 2832 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8, 2833 A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args), 2834 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args), 2835 get<9>(args)); 2836 } 2837 }; 2838 2839 } // namespace internal 2840 2841 // Various overloads for Invoke(). 2842 2843 // WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes 2844 // the selected arguments of the mock function to an_action and 2845 // performs it. It serves as an adaptor between actions with 2846 // different argument lists. C++ doesn't support default arguments for 2847 // function templates, so we have to overload it. 2848 template <int k1, typename InnerAction> 2849 inline internal::WithArgsAction<InnerAction, k1> 2850 WithArgs(const InnerAction& action) { 2851 return internal::WithArgsAction<InnerAction, k1>(action); 2852 } 2853 2854 template <int k1, int k2, typename InnerAction> 2855 inline internal::WithArgsAction<InnerAction, k1, k2> 2856 WithArgs(const InnerAction& action) { 2857 return internal::WithArgsAction<InnerAction, k1, k2>(action); 2858 } 2859 2860 template <int k1, int k2, int k3, typename InnerAction> 2861 inline internal::WithArgsAction<InnerAction, k1, k2, k3> 2862 WithArgs(const InnerAction& action) { 2863 return internal::WithArgsAction<InnerAction, k1, k2, k3>(action); 2864 } 2865 2866 template <int k1, int k2, int k3, int k4, typename InnerAction> 2867 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4> 2868 WithArgs(const InnerAction& action) { 2869 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action); 2870 } 2871 2872 template <int k1, int k2, int k3, int k4, int k5, typename InnerAction> 2873 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5> 2874 WithArgs(const InnerAction& action) { 2875 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action); 2876 } 2877 2878 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction> 2879 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6> 2880 WithArgs(const InnerAction& action) { 2881 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action); 2882 } 2883 2884 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, 2885 typename InnerAction> 2886 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7> 2887 WithArgs(const InnerAction& action) { 2888 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, 2889 k7>(action); 2890 } 2891 2892 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 2893 typename InnerAction> 2894 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8> 2895 WithArgs(const InnerAction& action) { 2896 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, 2897 k8>(action); 2898 } 2899 2900 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 2901 int k9, typename InnerAction> 2902 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9> 2903 WithArgs(const InnerAction& action) { 2904 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, 2905 k9>(action); 2906 } 2907 2908 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 2909 int k9, int k10, typename InnerAction> 2910 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, 2911 k9, k10> 2912 WithArgs(const InnerAction& action) { 2913 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, 2914 k9, k10>(action); 2915 } 2916 2917 // Creates an action that does actions a1, a2, ..., sequentially in 2918 // each invocation. 2919 template <typename Action1, typename Action2> 2920 inline internal::DoBothAction<Action1, Action2> 2921 DoAll(Action1 a1, Action2 a2) { 2922 return internal::DoBothAction<Action1, Action2>(a1, a2); 2923 } 2924 2925 template <typename Action1, typename Action2, typename Action3> 2926 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2927 Action3> > 2928 DoAll(Action1 a1, Action2 a2, Action3 a3) { 2929 return DoAll(a1, DoAll(a2, a3)); 2930 } 2931 2932 template <typename Action1, typename Action2, typename Action3, 2933 typename Action4> 2934 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2935 internal::DoBothAction<Action3, Action4> > > 2936 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) { 2937 return DoAll(a1, DoAll(a2, a3, a4)); 2938 } 2939 2940 template <typename Action1, typename Action2, typename Action3, 2941 typename Action4, typename Action5> 2942 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2943 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 2944 Action5> > > > 2945 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) { 2946 return DoAll(a1, DoAll(a2, a3, a4, a5)); 2947 } 2948 2949 template <typename Action1, typename Action2, typename Action3, 2950 typename Action4, typename Action5, typename Action6> 2951 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2952 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 2953 internal::DoBothAction<Action5, Action6> > > > > 2954 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) { 2955 return DoAll(a1, DoAll(a2, a3, a4, a5, a6)); 2956 } 2957 2958 template <typename Action1, typename Action2, typename Action3, 2959 typename Action4, typename Action5, typename Action6, typename Action7> 2960 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2961 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 2962 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 2963 Action7> > > > > > 2964 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 2965 Action7 a7) { 2966 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7)); 2967 } 2968 2969 template <typename Action1, typename Action2, typename Action3, 2970 typename Action4, typename Action5, typename Action6, typename Action7, 2971 typename Action8> 2972 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2973 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 2974 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 2975 internal::DoBothAction<Action7, Action8> > > > > > > 2976 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 2977 Action7 a7, Action8 a8) { 2978 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8)); 2979 } 2980 2981 template <typename Action1, typename Action2, typename Action3, 2982 typename Action4, typename Action5, typename Action6, typename Action7, 2983 typename Action8, typename Action9> 2984 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2985 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 2986 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 2987 internal::DoBothAction<Action7, internal::DoBothAction<Action8, 2988 Action9> > > > > > > > 2989 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 2990 Action7 a7, Action8 a8, Action9 a9) { 2991 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9)); 2992 } 2993 2994 template <typename Action1, typename Action2, typename Action3, 2995 typename Action4, typename Action5, typename Action6, typename Action7, 2996 typename Action8, typename Action9, typename Action10> 2997 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, 2998 internal::DoBothAction<Action3, internal::DoBothAction<Action4, 2999 internal::DoBothAction<Action5, internal::DoBothAction<Action6, 3000 internal::DoBothAction<Action7, internal::DoBothAction<Action8, 3001 internal::DoBothAction<Action9, Action10> > > > > > > > > 3002 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, 3003 Action7 a7, Action8 a8, Action9 a9, Action10 a10) { 3004 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10)); 3005 } 3006 3007 } // namespace testing 3008 3009 // The ACTION* family of macros can be used in a namespace scope to 3010 // define custom actions easily. The syntax: 3011 // 3012 // ACTION(name) { statements; } 3013 // 3014 // will define an action with the given name that executes the 3015 // statements. The value returned by the statements will be used as 3016 // the return value of the action. Inside the statements, you can 3017 // refer to the K-th (0-based) argument of the mock function by 3018 // 'argK', and refer to its type by 'argK_type'. For example: 3019 // 3020 // ACTION(IncrementArg1) { 3021 // arg1_type temp = arg1; 3022 // return ++(*temp); 3023 // } 3024 // 3025 // allows you to write 3026 // 3027 // ...WillOnce(IncrementArg1()); 3028 // 3029 // You can also refer to the entire argument tuple and its type by 3030 // 'args' and 'args_type', and refer to the mock function type and its 3031 // return type by 'function_type' and 'return_type'. 3032 // 3033 // Note that you don't need to specify the types of the mock function 3034 // arguments. However rest assured that your code is still type-safe: 3035 // you'll get a compiler error if *arg1 doesn't support the ++ 3036 // operator, or if the type of ++(*arg1) isn't compatible with the 3037 // mock function's return type, for example. 3038 // 3039 // Sometimes you'll want to parameterize the action. For that you can use 3040 // another macro: 3041 // 3042 // ACTION_P(name, param_name) { statements; } 3043 // 3044 // For example: 3045 // 3046 // ACTION_P(Add, n) { return arg0 + n; } 3047 // 3048 // will allow you to write: 3049 // 3050 // ...WillOnce(Add(5)); 3051 // 3052 // Note that you don't need to provide the type of the parameter 3053 // either. If you need to reference the type of a parameter named 3054 // 'foo', you can write 'foo_type'. For example, in the body of 3055 // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type 3056 // of 'n'. 3057 // 3058 // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support 3059 // multi-parameter actions. 3060 // 3061 // For the purpose of typing, you can view 3062 // 3063 // ACTION_Pk(Foo, p1, ..., pk) { ... } 3064 // 3065 // as shorthand for 3066 // 3067 // template <typename p1_type, ..., typename pk_type> 3068 // FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... } 3069 // 3070 // In particular, you can provide the template type arguments 3071 // explicitly when invoking Foo(), as in Foo<long, bool>(5, false); 3072 // although usually you can rely on the compiler to infer the types 3073 // for you automatically. You can assign the result of expression 3074 // Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ..., 3075 // pk_type>. This can be useful when composing actions. 3076 // 3077 // You can also overload actions with different numbers of parameters: 3078 // 3079 // ACTION_P(Plus, a) { ... } 3080 // ACTION_P2(Plus, a, b) { ... } 3081 // 3082 // While it's tempting to always use the ACTION* macros when defining 3083 // a new action, you should also consider implementing ActionInterface 3084 // or using MakePolymorphicAction() instead, especially if you need to 3085 // use the action a lot. While these approaches require more work, 3086 // they give you more control on the types of the mock function 3087 // arguments and the action parameters, which in general leads to 3088 // better compiler error messages that pay off in the long run. They 3089 // also allow overloading actions based on parameter types (as opposed 3090 // to just based on the number of parameters). 3091 // 3092 // CAVEAT: 3093 // 3094 // ACTION*() can only be used in a namespace scope. The reason is 3095 // that C++ doesn't yet allow function-local types to be used to 3096 // instantiate templates. The up-coming C++0x standard will fix this. 3097 // Once that's done, we'll consider supporting using ACTION*() inside 3098 // a function. 3099 // 3100 // MORE INFORMATION: 3101 // 3102 // To learn more about using these macros, please search for 'ACTION' 3103 // on http://code.google.com/p/googlemock/wiki/CookBook. 3104 3105 // An internal macro needed for implementing ACTION*(). 3106 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\ 3107 const args_type& args GTEST_ATTRIBUTE_UNUSED_,\ 3108 arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_,\ 3109 arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_,\ 3110 arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_,\ 3111 arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_,\ 3112 arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_,\ 3113 arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_,\ 3114 arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_,\ 3115 arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_,\ 3116 arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_,\ 3117 arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_ 3118 3119 // Sometimes you want to give an action explicit template parameters 3120 // that cannot be inferred from its value parameters. ACTION() and 3121 // ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that 3122 // and can be viewed as an extension to ACTION() and ACTION_P*(). 3123 // 3124 // The syntax: 3125 // 3126 // ACTION_TEMPLATE(ActionName, 3127 // HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m), 3128 // AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; } 3129 // 3130 // defines an action template that takes m explicit template 3131 // parameters and n value parameters. name_i is the name of the i-th 3132 // template parameter, and kind_i specifies whether it's a typename, 3133 // an integral constant, or a template. p_i is the name of the i-th 3134 // value parameter. 3135 // 3136 // Example: 3137 // 3138 // // DuplicateArg<k, T>(output) converts the k-th argument of the mock 3139 // // function to type T and copies it to *output. 3140 // ACTION_TEMPLATE(DuplicateArg, 3141 // HAS_2_TEMPLATE_PARAMS(int, k, typename, T), 3142 // AND_1_VALUE_PARAMS(output)) { 3143 // *output = T(std::tr1::get<k>(args)); 3144 // } 3145 // ... 3146 // int n; 3147 // EXPECT_CALL(mock, Foo(_, _)) 3148 // .WillOnce(DuplicateArg<1, unsigned char>(&n)); 3149 // 3150 // To create an instance of an action template, write: 3151 // 3152 // ActionName<t1, ..., t_m>(v1, ..., v_n) 3153 // 3154 // where the ts are the template arguments and the vs are the value 3155 // arguments. The value argument types are inferred by the compiler. 3156 // If you want to explicitly specify the value argument types, you can 3157 // provide additional template arguments: 3158 // 3159 // ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n) 3160 // 3161 // where u_i is the desired type of v_i. 3162 // 3163 // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the 3164 // number of value parameters, but not on the number of template 3165 // parameters. Without the restriction, the meaning of the following 3166 // is unclear: 3167 // 3168 // OverloadedAction<int, bool>(x); 3169 // 3170 // Are we using a single-template-parameter action where 'bool' refers 3171 // to the type of x, or are we using a two-template-parameter action 3172 // where the compiler is asked to infer the type of x? 3173 // 3174 // Implementation notes: 3175 // 3176 // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and 3177 // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for 3178 // implementing ACTION_TEMPLATE. The main trick we use is to create 3179 // new macro invocations when expanding a macro. For example, we have 3180 // 3181 // #define ACTION_TEMPLATE(name, template_params, value_params) 3182 // ... GMOCK_INTERNAL_DECL_##template_params ... 3183 // 3184 // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...) 3185 // to expand to 3186 // 3187 // ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ... 3188 // 3189 // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the 3190 // preprocessor will continue to expand it to 3191 // 3192 // ... typename T ... 3193 // 3194 // This technique conforms to the C++ standard and is portable. It 3195 // allows us to implement action templates using O(N) code, where N is 3196 // the maximum number of template/value parameters supported. Without 3197 // using it, we'd have to devote O(N^2) amount of code to implement all 3198 // combinations of m and n. 3199 3200 // Declares the template parameters. 3201 #define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0 3202 #define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ 3203 name1) kind0 name0, kind1 name1 3204 #define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3205 kind2, name2) kind0 name0, kind1 name1, kind2 name2 3206 #define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3207 kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \ 3208 kind3 name3 3209 #define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3210 kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \ 3211 kind2 name2, kind3 name3, kind4 name4 3212 #define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3213 kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \ 3214 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5 3215 #define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3216 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 3217 name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \ 3218 kind5 name5, kind6 name6 3219 #define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3220 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 3221 kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \ 3222 kind4 name4, kind5 name5, kind6 name6, kind7 name7 3223 #define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3224 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 3225 kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \ 3226 kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \ 3227 kind8 name8 3228 #define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ 3229 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 3230 name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \ 3231 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \ 3232 kind6 name6, kind7 name7, kind8 name8, kind9 name9 3233 3234 // Lists the template parameters. 3235 #define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0 3236 #define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \ 3237 name1) name0, name1 3238 #define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3239 kind2, name2) name0, name1, name2 3240 #define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3241 kind2, name2, kind3, name3) name0, name1, name2, name3 3242 #define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3243 kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \ 3244 name4 3245 #define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3246 kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \ 3247 name2, name3, name4, name5 3248 #define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3249 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 3250 name6) name0, name1, name2, name3, name4, name5, name6 3251 #define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3252 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 3253 kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7 3254 #define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \ 3255 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \ 3256 kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \ 3257 name6, name7, name8 3258 #define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \ 3259 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \ 3260 name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \ 3261 name3, name4, name5, name6, name7, name8, name9 3262 3263 // Declares the types of value parameters. 3264 #define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS() 3265 #define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type 3266 #define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \ 3267 typename p0##_type, typename p1##_type 3268 #define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \ 3269 typename p0##_type, typename p1##_type, typename p2##_type 3270 #define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ 3271 typename p0##_type, typename p1##_type, typename p2##_type, \ 3272 typename p3##_type 3273 #define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ 3274 typename p0##_type, typename p1##_type, typename p2##_type, \ 3275 typename p3##_type, typename p4##_type 3276 #define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ 3277 typename p0##_type, typename p1##_type, typename p2##_type, \ 3278 typename p3##_type, typename p4##_type, typename p5##_type 3279 #define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3280 p6) , typename p0##_type, typename p1##_type, typename p2##_type, \ 3281 typename p3##_type, typename p4##_type, typename p5##_type, \ 3282 typename p6##_type 3283 #define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3284 p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \ 3285 typename p3##_type, typename p4##_type, typename p5##_type, \ 3286 typename p6##_type, typename p7##_type 3287 #define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3288 p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \ 3289 typename p3##_type, typename p4##_type, typename p5##_type, \ 3290 typename p6##_type, typename p7##_type, typename p8##_type 3291 #define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3292 p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \ 3293 typename p2##_type, typename p3##_type, typename p4##_type, \ 3294 typename p5##_type, typename p6##_type, typename p7##_type, \ 3295 typename p8##_type, typename p9##_type 3296 3297 // Initializes the value parameters. 3298 #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\ 3299 () 3300 #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\ 3301 (p0##_type gmock_p0) : p0(gmock_p0) 3302 #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\ 3303 (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1) 3304 #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\ 3305 (p0##_type gmock_p0, p1##_type gmock_p1, \ 3306 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) 3307 #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\ 3308 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3309 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3310 p3(gmock_p3) 3311 #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\ 3312 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3313 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \ 3314 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) 3315 #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\ 3316 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3317 p3##_type gmock_p3, p4##_type gmock_p4, \ 3318 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3319 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) 3320 #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\ 3321 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3322 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 3323 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3324 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) 3325 #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\ 3326 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3327 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 3328 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \ 3329 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 3330 p7(gmock_p7) 3331 #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3332 p7, p8)\ 3333 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3334 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 3335 p6##_type gmock_p6, p7##_type gmock_p7, \ 3336 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3337 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 3338 p8(gmock_p8) 3339 #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3340 p7, p8, p9)\ 3341 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3342 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 3343 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 3344 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3345 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 3346 p8(gmock_p8), p9(gmock_p9) 3347 3348 // Declares the fields for storing the value parameters. 3349 #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() 3350 #define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0; 3351 #define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \ 3352 p1##_type p1; 3353 #define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \ 3354 p1##_type p1; p2##_type p2; 3355 #define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \ 3356 p1##_type p1; p2##_type p2; p3##_type p3; 3357 #define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ 3358 p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; 3359 #define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ 3360 p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ 3361 p5##_type p5; 3362 #define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3363 p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ 3364 p5##_type p5; p6##_type p6; 3365 #define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3366 p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \ 3367 p5##_type p5; p6##_type p6; p7##_type p7; 3368 #define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3369 p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ 3370 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; 3371 #define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3372 p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \ 3373 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \ 3374 p9##_type p9; 3375 3376 // Lists the value parameters. 3377 #define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS() 3378 #define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0 3379 #define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1 3380 #define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2 3381 #define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3 3382 #define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \ 3383 p2, p3, p4 3384 #define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \ 3385 p1, p2, p3, p4, p5 3386 #define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3387 p6) p0, p1, p2, p3, p4, p5, p6 3388 #define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3389 p7) p0, p1, p2, p3, p4, p5, p6, p7 3390 #define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3391 p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8 3392 #define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3393 p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 3394 3395 // Lists the value parameter types. 3396 #define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS() 3397 #define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type 3398 #define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \ 3399 p1##_type 3400 #define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \ 3401 p1##_type, p2##_type 3402 #define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \ 3403 p0##_type, p1##_type, p2##_type, p3##_type 3404 #define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \ 3405 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type 3406 #define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \ 3407 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type 3408 #define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3409 p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \ 3410 p6##_type 3411 #define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3412 p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 3413 p5##_type, p6##_type, p7##_type 3414 #define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3415 p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 3416 p5##_type, p6##_type, p7##_type, p8##_type 3417 #define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3418 p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 3419 p5##_type, p6##_type, p7##_type, p8##_type, p9##_type 3420 3421 // Declares the value parameters. 3422 #define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS() 3423 #define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0 3424 #define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \ 3425 p1##_type p1 3426 #define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \ 3427 p1##_type p1, p2##_type p2 3428 #define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \ 3429 p1##_type p1, p2##_type p2, p3##_type p3 3430 #define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \ 3431 p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4 3432 #define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \ 3433 p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 3434 p5##_type p5 3435 #define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \ 3436 p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 3437 p5##_type p5, p6##_type p6 3438 #define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3439 p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \ 3440 p5##_type p5, p6##_type p6, p7##_type p7 3441 #define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3442 p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 3443 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8 3444 #define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3445 p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 3446 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 3447 p9##_type p9 3448 3449 // The suffix of the class template implementing the action template. 3450 #define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS() 3451 #define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P 3452 #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2 3453 #define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3 3454 #define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4 3455 #define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5 3456 #define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6 3457 #define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7 3458 #define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3459 p7) P8 3460 #define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3461 p7, p8) P9 3462 #define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \ 3463 p7, p8, p9) P10 3464 3465 // The name of the class template implementing the action template. 3466 #define GMOCK_ACTION_CLASS_(name, value_params)\ 3467 GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) 3468 3469 #define ACTION_TEMPLATE(name, template_params, value_params)\ 3470 template <GMOCK_INTERNAL_DECL_##template_params\ 3471 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 3472 class GMOCK_ACTION_CLASS_(name, value_params) {\ 3473 public:\ 3474 GMOCK_ACTION_CLASS_(name, value_params)\ 3475 GMOCK_INTERNAL_INIT_##value_params {}\ 3476 template <typename F>\ 3477 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3478 public:\ 3479 typedef F function_type;\ 3480 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3481 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3482 args_type;\ 3483 explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ 3484 virtual return_type Perform(const args_type& args) {\ 3485 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3486 Perform(this, args);\ 3487 }\ 3488 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3489 typename arg3_type, typename arg4_type, typename arg5_type, \ 3490 typename arg6_type, typename arg7_type, typename arg8_type, \ 3491 typename arg9_type>\ 3492 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3493 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3494 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3495 arg9_type arg9) const;\ 3496 GMOCK_INTERNAL_DEFN_##value_params\ 3497 private:\ 3498 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3499 };\ 3500 template <typename F> operator ::testing::Action<F>() const {\ 3501 return ::testing::Action<F>(\ 3502 new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\ 3503 }\ 3504 GMOCK_INTERNAL_DEFN_##value_params\ 3505 private:\ 3506 GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\ 3507 };\ 3508 template <GMOCK_INTERNAL_DECL_##template_params\ 3509 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 3510 inline GMOCK_ACTION_CLASS_(name, value_params)<\ 3511 GMOCK_INTERNAL_LIST_##template_params\ 3512 GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ 3513 GMOCK_INTERNAL_DECL_##value_params) {\ 3514 return GMOCK_ACTION_CLASS_(name, value_params)<\ 3515 GMOCK_INTERNAL_LIST_##template_params\ 3516 GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ 3517 GMOCK_INTERNAL_LIST_##value_params);\ 3518 }\ 3519 template <GMOCK_INTERNAL_DECL_##template_params\ 3520 GMOCK_INTERNAL_DECL_TYPE_##value_params>\ 3521 template <typename F>\ 3522 template <typename arg0_type, typename arg1_type, typename arg2_type,\ 3523 typename arg3_type, typename arg4_type, typename arg5_type,\ 3524 typename arg6_type, typename arg7_type, typename arg8_type,\ 3525 typename arg9_type>\ 3526 typename ::testing::internal::Function<F>::Result\ 3527 GMOCK_ACTION_CLASS_(name, value_params)<\ 3528 GMOCK_INTERNAL_LIST_##template_params\ 3529 GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\ 3530 gmock_PerformImpl(\ 3531 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3532 3533 #define ACTION(name)\ 3534 class name##Action {\ 3535 public:\ 3536 name##Action() {}\ 3537 template <typename F>\ 3538 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3539 public:\ 3540 typedef F function_type;\ 3541 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3542 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3543 args_type;\ 3544 gmock_Impl() {}\ 3545 virtual return_type Perform(const args_type& args) {\ 3546 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3547 Perform(this, args);\ 3548 }\ 3549 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3550 typename arg3_type, typename arg4_type, typename arg5_type, \ 3551 typename arg6_type, typename arg7_type, typename arg8_type, \ 3552 typename arg9_type>\ 3553 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3554 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3555 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3556 arg9_type arg9) const;\ 3557 private:\ 3558 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3559 };\ 3560 template <typename F> operator ::testing::Action<F>() const {\ 3561 return ::testing::Action<F>(new gmock_Impl<F>());\ 3562 }\ 3563 private:\ 3564 GTEST_DISALLOW_ASSIGN_(name##Action);\ 3565 };\ 3566 inline name##Action name() {\ 3567 return name##Action();\ 3568 }\ 3569 template <typename F>\ 3570 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3571 typename arg3_type, typename arg4_type, typename arg5_type, \ 3572 typename arg6_type, typename arg7_type, typename arg8_type, \ 3573 typename arg9_type>\ 3574 typename ::testing::internal::Function<F>::Result\ 3575 name##Action::gmock_Impl<F>::gmock_PerformImpl(\ 3576 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3577 3578 #define ACTION_P(name, p0)\ 3579 template <typename p0##_type>\ 3580 class name##ActionP {\ 3581 public:\ 3582 name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\ 3583 template <typename F>\ 3584 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3585 public:\ 3586 typedef F function_type;\ 3587 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3588 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3589 args_type;\ 3590 explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\ 3591 virtual return_type Perform(const args_type& args) {\ 3592 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3593 Perform(this, args);\ 3594 }\ 3595 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3596 typename arg3_type, typename arg4_type, typename arg5_type, \ 3597 typename arg6_type, typename arg7_type, typename arg8_type, \ 3598 typename arg9_type>\ 3599 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3600 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3601 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3602 arg9_type arg9) const;\ 3603 p0##_type p0;\ 3604 private:\ 3605 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3606 };\ 3607 template <typename F> operator ::testing::Action<F>() const {\ 3608 return ::testing::Action<F>(new gmock_Impl<F>(p0));\ 3609 }\ 3610 p0##_type p0;\ 3611 private:\ 3612 GTEST_DISALLOW_ASSIGN_(name##ActionP);\ 3613 };\ 3614 template <typename p0##_type>\ 3615 inline name##ActionP<p0##_type> name(p0##_type p0) {\ 3616 return name##ActionP<p0##_type>(p0);\ 3617 }\ 3618 template <typename p0##_type>\ 3619 template <typename F>\ 3620 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3621 typename arg3_type, typename arg4_type, typename arg5_type, \ 3622 typename arg6_type, typename arg7_type, typename arg8_type, \ 3623 typename arg9_type>\ 3624 typename ::testing::internal::Function<F>::Result\ 3625 name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 3626 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3627 3628 #define ACTION_P2(name, p0, p1)\ 3629 template <typename p0##_type, typename p1##_type>\ 3630 class name##ActionP2 {\ 3631 public:\ 3632 name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 3633 p1(gmock_p1) {}\ 3634 template <typename F>\ 3635 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3636 public:\ 3637 typedef F function_type;\ 3638 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3639 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3640 args_type;\ 3641 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 3642 p1(gmock_p1) {}\ 3643 virtual return_type Perform(const args_type& args) {\ 3644 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3645 Perform(this, args);\ 3646 }\ 3647 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3648 typename arg3_type, typename arg4_type, typename arg5_type, \ 3649 typename arg6_type, typename arg7_type, typename arg8_type, \ 3650 typename arg9_type>\ 3651 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3652 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3653 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3654 arg9_type arg9) const;\ 3655 p0##_type p0;\ 3656 p1##_type p1;\ 3657 private:\ 3658 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3659 };\ 3660 template <typename F> operator ::testing::Action<F>() const {\ 3661 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\ 3662 }\ 3663 p0##_type p0;\ 3664 p1##_type p1;\ 3665 private:\ 3666 GTEST_DISALLOW_ASSIGN_(name##ActionP2);\ 3667 };\ 3668 template <typename p0##_type, typename p1##_type>\ 3669 inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \ 3670 p1##_type p1) {\ 3671 return name##ActionP2<p0##_type, p1##_type>(p0, p1);\ 3672 }\ 3673 template <typename p0##_type, typename p1##_type>\ 3674 template <typename F>\ 3675 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3676 typename arg3_type, typename arg4_type, typename arg5_type, \ 3677 typename arg6_type, typename arg7_type, typename arg8_type, \ 3678 typename arg9_type>\ 3679 typename ::testing::internal::Function<F>::Result\ 3680 name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 3681 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3682 3683 #define ACTION_P3(name, p0, p1, p2)\ 3684 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 3685 class name##ActionP3 {\ 3686 public:\ 3687 name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \ 3688 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 3689 template <typename F>\ 3690 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3691 public:\ 3692 typedef F function_type;\ 3693 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3694 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3695 args_type;\ 3696 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ 3697 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 3698 virtual return_type Perform(const args_type& args) {\ 3699 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3700 Perform(this, args);\ 3701 }\ 3702 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3703 typename arg3_type, typename arg4_type, typename arg5_type, \ 3704 typename arg6_type, typename arg7_type, typename arg8_type, \ 3705 typename arg9_type>\ 3706 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3707 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3708 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3709 arg9_type arg9) const;\ 3710 p0##_type p0;\ 3711 p1##_type p1;\ 3712 p2##_type p2;\ 3713 private:\ 3714 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3715 };\ 3716 template <typename F> operator ::testing::Action<F>() const {\ 3717 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\ 3718 }\ 3719 p0##_type p0;\ 3720 p1##_type p1;\ 3721 p2##_type p2;\ 3722 private:\ 3723 GTEST_DISALLOW_ASSIGN_(name##ActionP3);\ 3724 };\ 3725 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 3726 inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ 3727 p1##_type p1, p2##_type p2) {\ 3728 return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\ 3729 }\ 3730 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 3731 template <typename F>\ 3732 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3733 typename arg3_type, typename arg4_type, typename arg5_type, \ 3734 typename arg6_type, typename arg7_type, typename arg8_type, \ 3735 typename arg9_type>\ 3736 typename ::testing::internal::Function<F>::Result\ 3737 name##ActionP3<p0##_type, p1##_type, \ 3738 p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 3739 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3740 3741 #define ACTION_P4(name, p0, p1, p2, p3)\ 3742 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3743 typename p3##_type>\ 3744 class name##ActionP4 {\ 3745 public:\ 3746 name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \ 3747 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ 3748 p2(gmock_p2), p3(gmock_p3) {}\ 3749 template <typename F>\ 3750 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3751 public:\ 3752 typedef F function_type;\ 3753 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3754 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3755 args_type;\ 3756 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3757 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3758 p3(gmock_p3) {}\ 3759 virtual return_type Perform(const args_type& args) {\ 3760 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3761 Perform(this, args);\ 3762 }\ 3763 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3764 typename arg3_type, typename arg4_type, typename arg5_type, \ 3765 typename arg6_type, typename arg7_type, typename arg8_type, \ 3766 typename arg9_type>\ 3767 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3768 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3769 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3770 arg9_type arg9) const;\ 3771 p0##_type p0;\ 3772 p1##_type p1;\ 3773 p2##_type p2;\ 3774 p3##_type p3;\ 3775 private:\ 3776 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3777 };\ 3778 template <typename F> operator ::testing::Action<F>() const {\ 3779 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\ 3780 }\ 3781 p0##_type p0;\ 3782 p1##_type p1;\ 3783 p2##_type p2;\ 3784 p3##_type p3;\ 3785 private:\ 3786 GTEST_DISALLOW_ASSIGN_(name##ActionP4);\ 3787 };\ 3788 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3789 typename p3##_type>\ 3790 inline name##ActionP4<p0##_type, p1##_type, p2##_type, \ 3791 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 3792 p3##_type p3) {\ 3793 return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \ 3794 p2, p3);\ 3795 }\ 3796 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3797 typename p3##_type>\ 3798 template <typename F>\ 3799 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3800 typename arg3_type, typename arg4_type, typename arg5_type, \ 3801 typename arg6_type, typename arg7_type, typename arg8_type, \ 3802 typename arg9_type>\ 3803 typename ::testing::internal::Function<F>::Result\ 3804 name##ActionP4<p0##_type, p1##_type, p2##_type, \ 3805 p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 3806 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3807 3808 #define ACTION_P5(name, p0, p1, p2, p3, p4)\ 3809 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3810 typename p3##_type, typename p4##_type>\ 3811 class name##ActionP5 {\ 3812 public:\ 3813 name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \ 3814 p2##_type gmock_p2, p3##_type gmock_p3, \ 3815 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3816 p3(gmock_p3), p4(gmock_p4) {}\ 3817 template <typename F>\ 3818 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3819 public:\ 3820 typedef F function_type;\ 3821 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3822 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3823 args_type;\ 3824 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3825 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \ 3826 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\ 3827 virtual return_type Perform(const args_type& args) {\ 3828 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3829 Perform(this, args);\ 3830 }\ 3831 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3832 typename arg3_type, typename arg4_type, typename arg5_type, \ 3833 typename arg6_type, typename arg7_type, typename arg8_type, \ 3834 typename arg9_type>\ 3835 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3836 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3837 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3838 arg9_type arg9) const;\ 3839 p0##_type p0;\ 3840 p1##_type p1;\ 3841 p2##_type p2;\ 3842 p3##_type p3;\ 3843 p4##_type p4;\ 3844 private:\ 3845 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3846 };\ 3847 template <typename F> operator ::testing::Action<F>() const {\ 3848 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\ 3849 }\ 3850 p0##_type p0;\ 3851 p1##_type p1;\ 3852 p2##_type p2;\ 3853 p3##_type p3;\ 3854 p4##_type p4;\ 3855 private:\ 3856 GTEST_DISALLOW_ASSIGN_(name##ActionP5);\ 3857 };\ 3858 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3859 typename p3##_type, typename p4##_type>\ 3860 inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 3861 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 3862 p4##_type p4) {\ 3863 return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 3864 p4##_type>(p0, p1, p2, p3, p4);\ 3865 }\ 3866 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3867 typename p3##_type, typename p4##_type>\ 3868 template <typename F>\ 3869 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3870 typename arg3_type, typename arg4_type, typename arg5_type, \ 3871 typename arg6_type, typename arg7_type, typename arg8_type, \ 3872 typename arg9_type>\ 3873 typename ::testing::internal::Function<F>::Result\ 3874 name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 3875 p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 3876 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3877 3878 #define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\ 3879 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3880 typename p3##_type, typename p4##_type, typename p5##_type>\ 3881 class name##ActionP6 {\ 3882 public:\ 3883 name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \ 3884 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 3885 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3886 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ 3887 template <typename F>\ 3888 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3889 public:\ 3890 typedef F function_type;\ 3891 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3892 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3893 args_type;\ 3894 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3895 p3##_type gmock_p3, p4##_type gmock_p4, \ 3896 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3897 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ 3898 virtual return_type Perform(const args_type& args) {\ 3899 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3900 Perform(this, args);\ 3901 }\ 3902 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3903 typename arg3_type, typename arg4_type, typename arg5_type, \ 3904 typename arg6_type, typename arg7_type, typename arg8_type, \ 3905 typename arg9_type>\ 3906 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3907 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3908 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3909 arg9_type arg9) const;\ 3910 p0##_type p0;\ 3911 p1##_type p1;\ 3912 p2##_type p2;\ 3913 p3##_type p3;\ 3914 p4##_type p4;\ 3915 p5##_type p5;\ 3916 private:\ 3917 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3918 };\ 3919 template <typename F> operator ::testing::Action<F>() const {\ 3920 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\ 3921 }\ 3922 p0##_type p0;\ 3923 p1##_type p1;\ 3924 p2##_type p2;\ 3925 p3##_type p3;\ 3926 p4##_type p4;\ 3927 p5##_type p5;\ 3928 private:\ 3929 GTEST_DISALLOW_ASSIGN_(name##ActionP6);\ 3930 };\ 3931 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3932 typename p3##_type, typename p4##_type, typename p5##_type>\ 3933 inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 3934 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 3935 p3##_type p3, p4##_type p4, p5##_type p5) {\ 3936 return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 3937 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\ 3938 }\ 3939 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3940 typename p3##_type, typename p4##_type, typename p5##_type>\ 3941 template <typename F>\ 3942 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3943 typename arg3_type, typename arg4_type, typename arg5_type, \ 3944 typename arg6_type, typename arg7_type, typename arg8_type, \ 3945 typename arg9_type>\ 3946 typename ::testing::internal::Function<F>::Result\ 3947 name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 3948 p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 3949 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 3950 3951 #define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\ 3952 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 3953 typename p3##_type, typename p4##_type, typename p5##_type, \ 3954 typename p6##_type>\ 3955 class name##ActionP7 {\ 3956 public:\ 3957 name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \ 3958 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 3959 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ 3960 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ 3961 p6(gmock_p6) {}\ 3962 template <typename F>\ 3963 class gmock_Impl : public ::testing::ActionInterface<F> {\ 3964 public:\ 3965 typedef F function_type;\ 3966 typedef typename ::testing::internal::Function<F>::Result return_type;\ 3967 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 3968 args_type;\ 3969 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 3970 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 3971 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 3972 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ 3973 virtual return_type Perform(const args_type& args) {\ 3974 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 3975 Perform(this, args);\ 3976 }\ 3977 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 3978 typename arg3_type, typename arg4_type, typename arg5_type, \ 3979 typename arg6_type, typename arg7_type, typename arg8_type, \ 3980 typename arg9_type>\ 3981 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 3982 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 3983 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 3984 arg9_type arg9) const;\ 3985 p0##_type p0;\ 3986 p1##_type p1;\ 3987 p2##_type p2;\ 3988 p3##_type p3;\ 3989 p4##_type p4;\ 3990 p5##_type p5;\ 3991 p6##_type p6;\ 3992 private:\ 3993 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 3994 };\ 3995 template <typename F> operator ::testing::Action<F>() const {\ 3996 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 3997 p6));\ 3998 }\ 3999 p0##_type p0;\ 4000 p1##_type p1;\ 4001 p2##_type p2;\ 4002 p3##_type p3;\ 4003 p4##_type p4;\ 4004 p5##_type p5;\ 4005 p6##_type p6;\ 4006 private:\ 4007 GTEST_DISALLOW_ASSIGN_(name##ActionP7);\ 4008 };\ 4009 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4010 typename p3##_type, typename p4##_type, typename p5##_type, \ 4011 typename p6##_type>\ 4012 inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 4013 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \ 4014 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 4015 p6##_type p6) {\ 4016 return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 4017 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\ 4018 }\ 4019 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4020 typename p3##_type, typename p4##_type, typename p5##_type, \ 4021 typename p6##_type>\ 4022 template <typename F>\ 4023 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4024 typename arg3_type, typename arg4_type, typename arg5_type, \ 4025 typename arg6_type, typename arg7_type, typename arg8_type, \ 4026 typename arg9_type>\ 4027 typename ::testing::internal::Function<F>::Result\ 4028 name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 4029 p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 4030 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 4031 4032 #define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\ 4033 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4034 typename p3##_type, typename p4##_type, typename p5##_type, \ 4035 typename p6##_type, typename p7##_type>\ 4036 class name##ActionP8 {\ 4037 public:\ 4038 name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \ 4039 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 4040 p5##_type gmock_p5, p6##_type gmock_p6, \ 4041 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 4042 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 4043 p7(gmock_p7) {}\ 4044 template <typename F>\ 4045 class gmock_Impl : public ::testing::ActionInterface<F> {\ 4046 public:\ 4047 typedef F function_type;\ 4048 typedef typename ::testing::internal::Function<F>::Result return_type;\ 4049 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 4050 args_type;\ 4051 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 4052 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 4053 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \ 4054 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \ 4055 p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ 4056 virtual return_type Perform(const args_type& args) {\ 4057 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 4058 Perform(this, args);\ 4059 }\ 4060 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4061 typename arg3_type, typename arg4_type, typename arg5_type, \ 4062 typename arg6_type, typename arg7_type, typename arg8_type, \ 4063 typename arg9_type>\ 4064 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 4065 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 4066 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 4067 arg9_type arg9) const;\ 4068 p0##_type p0;\ 4069 p1##_type p1;\ 4070 p2##_type p2;\ 4071 p3##_type p3;\ 4072 p4##_type p4;\ 4073 p5##_type p5;\ 4074 p6##_type p6;\ 4075 p7##_type p7;\ 4076 private:\ 4077 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 4078 };\ 4079 template <typename F> operator ::testing::Action<F>() const {\ 4080 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 4081 p6, p7));\ 4082 }\ 4083 p0##_type p0;\ 4084 p1##_type p1;\ 4085 p2##_type p2;\ 4086 p3##_type p3;\ 4087 p4##_type p4;\ 4088 p5##_type p5;\ 4089 p6##_type p6;\ 4090 p7##_type p7;\ 4091 private:\ 4092 GTEST_DISALLOW_ASSIGN_(name##ActionP8);\ 4093 };\ 4094 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4095 typename p3##_type, typename p4##_type, typename p5##_type, \ 4096 typename p6##_type, typename p7##_type>\ 4097 inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 4098 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \ 4099 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 4100 p6##_type p6, p7##_type p7) {\ 4101 return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 4102 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \ 4103 p6, p7);\ 4104 }\ 4105 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4106 typename p3##_type, typename p4##_type, typename p5##_type, \ 4107 typename p6##_type, typename p7##_type>\ 4108 template <typename F>\ 4109 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4110 typename arg3_type, typename arg4_type, typename arg5_type, \ 4111 typename arg6_type, typename arg7_type, typename arg8_type, \ 4112 typename arg9_type>\ 4113 typename ::testing::internal::Function<F>::Result\ 4114 name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 4115 p5##_type, p6##_type, \ 4116 p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 4117 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 4118 4119 #define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\ 4120 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4121 typename p3##_type, typename p4##_type, typename p5##_type, \ 4122 typename p6##_type, typename p7##_type, typename p8##_type>\ 4123 class name##ActionP9 {\ 4124 public:\ 4125 name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \ 4126 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 4127 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 4128 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 4129 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 4130 p8(gmock_p8) {}\ 4131 template <typename F>\ 4132 class gmock_Impl : public ::testing::ActionInterface<F> {\ 4133 public:\ 4134 typedef F function_type;\ 4135 typedef typename ::testing::internal::Function<F>::Result return_type;\ 4136 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 4137 args_type;\ 4138 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 4139 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 4140 p6##_type gmock_p6, p7##_type gmock_p7, \ 4141 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 4142 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 4143 p7(gmock_p7), p8(gmock_p8) {}\ 4144 virtual return_type Perform(const args_type& args) {\ 4145 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 4146 Perform(this, args);\ 4147 }\ 4148 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4149 typename arg3_type, typename arg4_type, typename arg5_type, \ 4150 typename arg6_type, typename arg7_type, typename arg8_type, \ 4151 typename arg9_type>\ 4152 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 4153 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 4154 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 4155 arg9_type arg9) const;\ 4156 p0##_type p0;\ 4157 p1##_type p1;\ 4158 p2##_type p2;\ 4159 p3##_type p3;\ 4160 p4##_type p4;\ 4161 p5##_type p5;\ 4162 p6##_type p6;\ 4163 p7##_type p7;\ 4164 p8##_type p8;\ 4165 private:\ 4166 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 4167 };\ 4168 template <typename F> operator ::testing::Action<F>() const {\ 4169 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 4170 p6, p7, p8));\ 4171 }\ 4172 p0##_type p0;\ 4173 p1##_type p1;\ 4174 p2##_type p2;\ 4175 p3##_type p3;\ 4176 p4##_type p4;\ 4177 p5##_type p5;\ 4178 p6##_type p6;\ 4179 p7##_type p7;\ 4180 p8##_type p8;\ 4181 private:\ 4182 GTEST_DISALLOW_ASSIGN_(name##ActionP9);\ 4183 };\ 4184 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4185 typename p3##_type, typename p4##_type, typename p5##_type, \ 4186 typename p6##_type, typename p7##_type, typename p8##_type>\ 4187 inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 4188 p4##_type, p5##_type, p6##_type, p7##_type, \ 4189 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 4190 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ 4191 p8##_type p8) {\ 4192 return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 4193 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \ 4194 p3, p4, p5, p6, p7, p8);\ 4195 }\ 4196 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4197 typename p3##_type, typename p4##_type, typename p5##_type, \ 4198 typename p6##_type, typename p7##_type, typename p8##_type>\ 4199 template <typename F>\ 4200 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4201 typename arg3_type, typename arg4_type, typename arg5_type, \ 4202 typename arg6_type, typename arg7_type, typename arg8_type, \ 4203 typename arg9_type>\ 4204 typename ::testing::internal::Function<F>::Result\ 4205 name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 4206 p5##_type, p6##_type, p7##_type, \ 4207 p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 4208 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 4209 4210 #define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\ 4211 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4212 typename p3##_type, typename p4##_type, typename p5##_type, \ 4213 typename p6##_type, typename p7##_type, typename p8##_type, \ 4214 typename p9##_type>\ 4215 class name##ActionP10 {\ 4216 public:\ 4217 name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \ 4218 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 4219 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 4220 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ 4221 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 4222 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ 4223 template <typename F>\ 4224 class gmock_Impl : public ::testing::ActionInterface<F> {\ 4225 public:\ 4226 typedef F function_type;\ 4227 typedef typename ::testing::internal::Function<F>::Result return_type;\ 4228 typedef typename ::testing::internal::Function<F>::ArgumentTuple\ 4229 args_type;\ 4230 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 4231 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 4232 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 4233 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 4234 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 4235 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ 4236 virtual return_type Perform(const args_type& args) {\ 4237 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ 4238 Perform(this, args);\ 4239 }\ 4240 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4241 typename arg3_type, typename arg4_type, typename arg5_type, \ 4242 typename arg6_type, typename arg7_type, typename arg8_type, \ 4243 typename arg9_type>\ 4244 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \ 4245 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \ 4246 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \ 4247 arg9_type arg9) const;\ 4248 p0##_type p0;\ 4249 p1##_type p1;\ 4250 p2##_type p2;\ 4251 p3##_type p3;\ 4252 p4##_type p4;\ 4253 p5##_type p5;\ 4254 p6##_type p6;\ 4255 p7##_type p7;\ 4256 p8##_type p8;\ 4257 p9##_type p9;\ 4258 private:\ 4259 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 4260 };\ 4261 template <typename F> operator ::testing::Action<F>() const {\ 4262 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \ 4263 p6, p7, p8, p9));\ 4264 }\ 4265 p0##_type p0;\ 4266 p1##_type p1;\ 4267 p2##_type p2;\ 4268 p3##_type p3;\ 4269 p4##_type p4;\ 4270 p5##_type p5;\ 4271 p6##_type p6;\ 4272 p7##_type p7;\ 4273 p8##_type p8;\ 4274 p9##_type p9;\ 4275 private:\ 4276 GTEST_DISALLOW_ASSIGN_(name##ActionP10);\ 4277 };\ 4278 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4279 typename p3##_type, typename p4##_type, typename p5##_type, \ 4280 typename p6##_type, typename p7##_type, typename p8##_type, \ 4281 typename p9##_type>\ 4282 inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 4283 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 4284 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 4285 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 4286 p9##_type p9) {\ 4287 return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 4288 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \ 4289 p1, p2, p3, p4, p5, p6, p7, p8, p9);\ 4290 }\ 4291 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 4292 typename p3##_type, typename p4##_type, typename p5##_type, \ 4293 typename p6##_type, typename p7##_type, typename p8##_type, \ 4294 typename p9##_type>\ 4295 template <typename F>\ 4296 template <typename arg0_type, typename arg1_type, typename arg2_type, \ 4297 typename arg3_type, typename arg4_type, typename arg5_type, \ 4298 typename arg6_type, typename arg7_type, typename arg8_type, \ 4299 typename arg9_type>\ 4300 typename ::testing::internal::Function<F>::Result\ 4301 name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 4302 p5##_type, p6##_type, p7##_type, p8##_type, \ 4303 p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\ 4304 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const 4305 4306 // TODO(wan@google.com): move the following to a different .h file 4307 // such that we don't have to run 'pump' every time the code is 4308 // updated. 4309 namespace testing { 4310 4311 // The ACTION*() macros trigger warning C4100 (unreferenced formal 4312 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 4313 // the macro definition, as the warnings are generated when the macro 4314 // is expanded and macro expansion cannot contain #pragma. Therefore 4315 // we suppress them here. 4316 #ifdef _MSC_VER 4317 # pragma warning(push) 4318 # pragma warning(disable:4100) 4319 #endif 4320 4321 // Various overloads for InvokeArgument<N>(). 4322 // 4323 // The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th 4324 // (0-based) argument, which must be a k-ary callable, of the mock 4325 // function, with arguments a1, a2, ..., a_k. 4326 // 4327 // Notes: 4328 // 4329 // 1. The arguments are passed by value by default. If you need to 4330 // pass an argument by reference, wrap it inside ByRef(). For 4331 // example, 4332 // 4333 // InvokeArgument<1>(5, string("Hello"), ByRef(foo)) 4334 // 4335 // passes 5 and string("Hello") by value, and passes foo by 4336 // reference. 4337 // 4338 // 2. If the callable takes an argument by reference but ByRef() is 4339 // not used, it will receive the reference to a copy of the value, 4340 // instead of the original value. For example, when the 0-th 4341 // argument of the mock function takes a const string&, the action 4342 // 4343 // InvokeArgument<0>(string("Hello")) 4344 // 4345 // makes a copy of the temporary string("Hello") object and passes a 4346 // reference of the copy, instead of the original temporary object, 4347 // to the callable. This makes it easy for a user to define an 4348 // InvokeArgument action from temporary values and have it performed 4349 // later. 4350 4351 ACTION_TEMPLATE(InvokeArgument, 4352 HAS_1_TEMPLATE_PARAMS(int, k), 4353 AND_0_VALUE_PARAMS()) { 4354 return internal::CallableHelper<return_type>::Call( 4355 ::std::tr1::get<k>(args)); 4356 } 4357 4358 ACTION_TEMPLATE(InvokeArgument, 4359 HAS_1_TEMPLATE_PARAMS(int, k), 4360 AND_1_VALUE_PARAMS(p0)) { 4361 return internal::CallableHelper<return_type>::Call( 4362 ::std::tr1::get<k>(args), p0); 4363 } 4364 4365 ACTION_TEMPLATE(InvokeArgument, 4366 HAS_1_TEMPLATE_PARAMS(int, k), 4367 AND_2_VALUE_PARAMS(p0, p1)) { 4368 return internal::CallableHelper<return_type>::Call( 4369 ::std::tr1::get<k>(args), p0, p1); 4370 } 4371 4372 ACTION_TEMPLATE(InvokeArgument, 4373 HAS_1_TEMPLATE_PARAMS(int, k), 4374 AND_3_VALUE_PARAMS(p0, p1, p2)) { 4375 return internal::CallableHelper<return_type>::Call( 4376 ::std::tr1::get<k>(args), p0, p1, p2); 4377 } 4378 4379 ACTION_TEMPLATE(InvokeArgument, 4380 HAS_1_TEMPLATE_PARAMS(int, k), 4381 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { 4382 return internal::CallableHelper<return_type>::Call( 4383 ::std::tr1::get<k>(args), p0, p1, p2, p3); 4384 } 4385 4386 ACTION_TEMPLATE(InvokeArgument, 4387 HAS_1_TEMPLATE_PARAMS(int, k), 4388 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { 4389 return internal::CallableHelper<return_type>::Call( 4390 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4); 4391 } 4392 4393 ACTION_TEMPLATE(InvokeArgument, 4394 HAS_1_TEMPLATE_PARAMS(int, k), 4395 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { 4396 return internal::CallableHelper<return_type>::Call( 4397 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5); 4398 } 4399 4400 ACTION_TEMPLATE(InvokeArgument, 4401 HAS_1_TEMPLATE_PARAMS(int, k), 4402 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { 4403 return internal::CallableHelper<return_type>::Call( 4404 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6); 4405 } 4406 4407 ACTION_TEMPLATE(InvokeArgument, 4408 HAS_1_TEMPLATE_PARAMS(int, k), 4409 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { 4410 return internal::CallableHelper<return_type>::Call( 4411 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7); 4412 } 4413 4414 ACTION_TEMPLATE(InvokeArgument, 4415 HAS_1_TEMPLATE_PARAMS(int, k), 4416 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { 4417 return internal::CallableHelper<return_type>::Call( 4418 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8); 4419 } 4420 4421 ACTION_TEMPLATE(InvokeArgument, 4422 HAS_1_TEMPLATE_PARAMS(int, k), 4423 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { 4424 return internal::CallableHelper<return_type>::Call( 4425 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); 4426 } 4427 4428 // Various overloads for ReturnNew<T>(). 4429 // 4430 // The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new 4431 // instance of type T, constructed on the heap with constructor arguments 4432 // a1, a2, ..., and a_k. The caller assumes ownership of the returned value. 4433 ACTION_TEMPLATE(ReturnNew, 4434 HAS_1_TEMPLATE_PARAMS(typename, T), 4435 AND_0_VALUE_PARAMS()) { 4436 return new T(); 4437 } 4438 4439 ACTION_TEMPLATE(ReturnNew, 4440 HAS_1_TEMPLATE_PARAMS(typename, T), 4441 AND_1_VALUE_PARAMS(p0)) { 4442 return new T(p0); 4443 } 4444 4445 ACTION_TEMPLATE(ReturnNew, 4446 HAS_1_TEMPLATE_PARAMS(typename, T), 4447 AND_2_VALUE_PARAMS(p0, p1)) { 4448 return new T(p0, p1); 4449 } 4450 4451 ACTION_TEMPLATE(ReturnNew, 4452 HAS_1_TEMPLATE_PARAMS(typename, T), 4453 AND_3_VALUE_PARAMS(p0, p1, p2)) { 4454 return new T(p0, p1, p2); 4455 } 4456 4457 ACTION_TEMPLATE(ReturnNew, 4458 HAS_1_TEMPLATE_PARAMS(typename, T), 4459 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) { 4460 return new T(p0, p1, p2, p3); 4461 } 4462 4463 ACTION_TEMPLATE(ReturnNew, 4464 HAS_1_TEMPLATE_PARAMS(typename, T), 4465 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) { 4466 return new T(p0, p1, p2, p3, p4); 4467 } 4468 4469 ACTION_TEMPLATE(ReturnNew, 4470 HAS_1_TEMPLATE_PARAMS(typename, T), 4471 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) { 4472 return new T(p0, p1, p2, p3, p4, p5); 4473 } 4474 4475 ACTION_TEMPLATE(ReturnNew, 4476 HAS_1_TEMPLATE_PARAMS(typename, T), 4477 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) { 4478 return new T(p0, p1, p2, p3, p4, p5, p6); 4479 } 4480 4481 ACTION_TEMPLATE(ReturnNew, 4482 HAS_1_TEMPLATE_PARAMS(typename, T), 4483 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) { 4484 return new T(p0, p1, p2, p3, p4, p5, p6, p7); 4485 } 4486 4487 ACTION_TEMPLATE(ReturnNew, 4488 HAS_1_TEMPLATE_PARAMS(typename, T), 4489 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) { 4490 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8); 4491 } 4492 4493 ACTION_TEMPLATE(ReturnNew, 4494 HAS_1_TEMPLATE_PARAMS(typename, T), 4495 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) { 4496 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); 4497 } 4498 4499 #ifdef _MSC_VER 4500 # pragma warning(pop) 4501 #endif 4502 4503 } // namespace testing 4504 4505 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ 4506 // This file was GENERATED by command: 4507 // pump.py gmock-generated-function-mockers.h.pump 4508 // DO NOT EDIT BY HAND!!! 4509 4510 // Copyright 2007, Google Inc. 4511 // All rights reserved. 4512 // 4513 // Redistribution and use in source and binary forms, with or without 4514 // modification, are permitted provided that the following conditions are 4515 // met: 4516 // 4517 // * Redistributions of source code must retain the above copyright 4518 // notice, this list of conditions and the following disclaimer. 4519 // * Redistributions in binary form must reproduce the above 4520 // copyright notice, this list of conditions and the following disclaimer 4521 // in the documentation and/or other materials provided with the 4522 // distribution. 4523 // * Neither the name of Google Inc. nor the names of its 4524 // contributors may be used to endorse or promote products derived from 4525 // this software without specific prior written permission. 4526 // 4527 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4528 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4529 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4530 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4531 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4532 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 4533 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 4534 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 4535 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 4536 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 4537 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4538 // 4539 // Author: wan@google.com (Zhanyong Wan) 4540 4541 // Google Mock - a framework for writing C++ mock classes. 4542 // 4543 // This file implements function mockers of various arities. 4544 4545 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ 4546 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ 4547 4548 // Copyright 2007, Google Inc. 4549 // All rights reserved. 4550 // 4551 // Redistribution and use in source and binary forms, with or without 4552 // modification, are permitted provided that the following conditions are 4553 // met: 4554 // 4555 // * Redistributions of source code must retain the above copyright 4556 // notice, this list of conditions and the following disclaimer. 4557 // * Redistributions in binary form must reproduce the above 4558 // copyright notice, this list of conditions and the following disclaimer 4559 // in the documentation and/or other materials provided with the 4560 // distribution. 4561 // * Neither the name of Google Inc. nor the names of its 4562 // contributors may be used to endorse or promote products derived from 4563 // this software without specific prior written permission. 4564 // 4565 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4566 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4567 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4568 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4569 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4570 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 4571 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 4572 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 4573 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 4574 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 4575 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4576 // 4577 // Author: wan@google.com (Zhanyong Wan) 4578 4579 // Google Mock - a framework for writing C++ mock classes. 4580 // 4581 // This file implements the ON_CALL() and EXPECT_CALL() macros. 4582 // 4583 // A user can use the ON_CALL() macro to specify the default action of 4584 // a mock method. The syntax is: 4585 // 4586 // ON_CALL(mock_object, Method(argument-matchers)) 4587 // .With(multi-argument-matcher) 4588 // .WillByDefault(action); 4589 // 4590 // where the .With() clause is optional. 4591 // 4592 // A user can use the EXPECT_CALL() macro to specify an expectation on 4593 // a mock method. The syntax is: 4594 // 4595 // EXPECT_CALL(mock_object, Method(argument-matchers)) 4596 // .With(multi-argument-matchers) 4597 // .Times(cardinality) 4598 // .InSequence(sequences) 4599 // .After(expectations) 4600 // .WillOnce(action) 4601 // .WillRepeatedly(action) 4602 // .RetiresOnSaturation(); 4603 // 4604 // where all clauses are optional, and .InSequence()/.After()/ 4605 // .WillOnce() can appear any number of times. 4606 4607 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ 4608 #define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ 4609 4610 #include <map> 4611 #include <set> 4612 #include <sstream> 4613 #include <string> 4614 #include <vector> 4615 4616 // Copyright 2007, Google Inc. 4617 // All rights reserved. 4618 // 4619 // Redistribution and use in source and binary forms, with or without 4620 // modification, are permitted provided that the following conditions are 4621 // met: 4622 // 4623 // * Redistributions of source code must retain the above copyright 4624 // notice, this list of conditions and the following disclaimer. 4625 // * Redistributions in binary form must reproduce the above 4626 // copyright notice, this list of conditions and the following disclaimer 4627 // in the documentation and/or other materials provided with the 4628 // distribution. 4629 // * Neither the name of Google Inc. nor the names of its 4630 // contributors may be used to endorse or promote products derived from 4631 // this software without specific prior written permission. 4632 // 4633 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4634 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4635 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4636 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4637 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4638 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 4639 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 4640 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 4641 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 4642 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 4643 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4644 // 4645 // Author: wan@google.com (Zhanyong Wan) 4646 4647 // Google Mock - a framework for writing C++ mock classes. 4648 // 4649 // This file implements some commonly used argument matchers. More 4650 // matchers can be defined by the user implementing the 4651 // MatcherInterface<T> interface if necessary. 4652 4653 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 4654 #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 4655 4656 #include <algorithm> 4657 #include <limits> 4658 #include <ostream> // NOLINT 4659 #include <sstream> 4660 #include <string> 4661 #include <utility> 4662 #include <vector> 4663 4664 4665 namespace testing { 4666 4667 // To implement a matcher Foo for type T, define: 4668 // 1. a class FooMatcherImpl that implements the 4669 // MatcherInterface<T> interface, and 4670 // 2. a factory function that creates a Matcher<T> object from a 4671 // FooMatcherImpl*. 4672 // 4673 // The two-level delegation design makes it possible to allow a user 4674 // to write "v" instead of "Eq(v)" where a Matcher is expected, which 4675 // is impossible if we pass matchers by pointers. It also eases 4676 // ownership management as Matcher objects can now be copied like 4677 // plain values. 4678 4679 // MatchResultListener is an abstract class. Its << operator can be 4680 // used by a matcher to explain why a value matches or doesn't match. 4681 // 4682 // TODO(wan@google.com): add method 4683 // bool InterestedInWhy(bool result) const; 4684 // to indicate whether the listener is interested in why the match 4685 // result is 'result'. 4686 class MatchResultListener { 4687 public: 4688 // Creates a listener object with the given underlying ostream. The 4689 // listener does not own the ostream. 4690 explicit MatchResultListener(::std::ostream* os) : stream_(os) {} 4691 virtual ~MatchResultListener() = 0; // Makes this class abstract. 4692 4693 // Streams x to the underlying ostream; does nothing if the ostream 4694 // is NULL. 4695 template <typename T> 4696 MatchResultListener& operator<<(const T& x) { 4697 if (stream_ != NULL) 4698 *stream_ << x; 4699 return *this; 4700 } 4701 4702 // Returns the underlying ostream. 4703 ::std::ostream* stream() { return stream_; } 4704 4705 // Returns true iff the listener is interested in an explanation of 4706 // the match result. A matcher's MatchAndExplain() method can use 4707 // this information to avoid generating the explanation when no one 4708 // intends to hear it. 4709 bool IsInterested() const { return stream_ != NULL; } 4710 4711 private: 4712 ::std::ostream* const stream_; 4713 4714 GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); 4715 }; 4716 4717 inline MatchResultListener::~MatchResultListener() { 4718 } 4719 4720 // The implementation of a matcher. 4721 template <typename T> 4722 class MatcherInterface { 4723 public: 4724 virtual ~MatcherInterface() {} 4725 4726 // Returns true iff the matcher matches x; also explains the match 4727 // result to 'listener', in the form of a non-restrictive relative 4728 // clause ("which ...", "whose ...", etc) that describes x. For 4729 // example, the MatchAndExplain() method of the Pointee(...) matcher 4730 // should generate an explanation like "which points to ...". 4731 // 4732 // You should override this method when defining a new matcher. 4733 // 4734 // It's the responsibility of the caller (Google Mock) to guarantee 4735 // that 'listener' is not NULL. This helps to simplify a matcher's 4736 // implementation when it doesn't care about the performance, as it 4737 // can talk to 'listener' without checking its validity first. 4738 // However, in order to implement dummy listeners efficiently, 4739 // listener->stream() may be NULL. 4740 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; 4741 4742 // Describes this matcher to an ostream. The function should print 4743 // a verb phrase that describes the property a value matching this 4744 // matcher should have. The subject of the verb phrase is the value 4745 // being matched. For example, the DescribeTo() method of the Gt(7) 4746 // matcher prints "is greater than 7". 4747 virtual void DescribeTo(::std::ostream* os) const = 0; 4748 4749 // Describes the negation of this matcher to an ostream. For 4750 // example, if the description of this matcher is "is greater than 4751 // 7", the negated description could be "is not greater than 7". 4752 // You are not required to override this when implementing 4753 // MatcherInterface, but it is highly advised so that your matcher 4754 // can produce good error messages. 4755 virtual void DescribeNegationTo(::std::ostream* os) const { 4756 *os << "not ("; 4757 DescribeTo(os); 4758 *os << ")"; 4759 } 4760 }; 4761 4762 namespace internal { 4763 4764 // A match result listener that ignores the explanation. 4765 class DummyMatchResultListener : public MatchResultListener { 4766 public: 4767 DummyMatchResultListener() : MatchResultListener(NULL) {} 4768 4769 private: 4770 GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); 4771 }; 4772 4773 // A match result listener that forwards the explanation to a given 4774 // ostream. The difference between this and MatchResultListener is 4775 // that the former is concrete. 4776 class StreamMatchResultListener : public MatchResultListener { 4777 public: 4778 explicit StreamMatchResultListener(::std::ostream* os) 4779 : MatchResultListener(os) {} 4780 4781 private: 4782 GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); 4783 }; 4784 4785 // A match result listener that stores the explanation in a string. 4786 class StringMatchResultListener : public MatchResultListener { 4787 public: 4788 StringMatchResultListener() : MatchResultListener(&ss_) {} 4789 4790 // Returns the explanation heard so far. 4791 internal::string str() const { return ss_.str(); } 4792 4793 private: 4794 ::std::stringstream ss_; 4795 4796 GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); 4797 }; 4798 4799 // An internal class for implementing Matcher<T>, which will derive 4800 // from it. We put functionalities common to all Matcher<T> 4801 // specializations here to avoid code duplication. 4802 template <typename T> 4803 class MatcherBase { 4804 public: 4805 // Returns true iff the matcher matches x; also explains the match 4806 // result to 'listener'. 4807 bool MatchAndExplain(T x, MatchResultListener* listener) const { 4808 return impl_->MatchAndExplain(x, listener); 4809 } 4810 4811 // Returns true iff this matcher matches x. 4812 bool Matches(T x) const { 4813 DummyMatchResultListener dummy; 4814 return MatchAndExplain(x, &dummy); 4815 } 4816 4817 // Describes this matcher to an ostream. 4818 void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 4819 4820 // Describes the negation of this matcher to an ostream. 4821 void DescribeNegationTo(::std::ostream* os) const { 4822 impl_->DescribeNegationTo(os); 4823 } 4824 4825 // Explains why x matches, or doesn't match, the matcher. 4826 void ExplainMatchResultTo(T x, ::std::ostream* os) const { 4827 StreamMatchResultListener listener(os); 4828 MatchAndExplain(x, &listener); 4829 } 4830 4831 protected: 4832 MatcherBase() {} 4833 4834 // Constructs a matcher from its implementation. 4835 explicit MatcherBase(const MatcherInterface<T>* impl) 4836 : impl_(impl) {} 4837 4838 virtual ~MatcherBase() {} 4839 4840 private: 4841 // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar 4842 // interfaces. The former dynamically allocates a chunk of memory 4843 // to hold the reference count, while the latter tracks all 4844 // references using a circular linked list without allocating 4845 // memory. It has been observed that linked_ptr performs better in 4846 // typical scenarios. However, shared_ptr can out-perform 4847 // linked_ptr when there are many more uses of the copy constructor 4848 // than the default constructor. 4849 // 4850 // If performance becomes a problem, we should see if using 4851 // shared_ptr helps. 4852 ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_; 4853 }; 4854 4855 } // namespace internal 4856 4857 // A Matcher<T> is a copyable and IMMUTABLE (except by assignment) 4858 // object that can check whether a value of type T matches. The 4859 // implementation of Matcher<T> is just a linked_ptr to const 4860 // MatcherInterface<T>, so copying is fairly cheap. Don't inherit 4861 // from Matcher! 4862 template <typename T> 4863 class Matcher : public internal::MatcherBase<T> { 4864 public: 4865 // Constructs a null matcher. Needed for storing Matcher objects in STL 4866 // containers. A default-constructed matcher is not yet initialized. You 4867 // cannot use it until a valid value has been assigned to it. 4868 Matcher() {} 4869 4870 // Constructs a matcher from its implementation. 4871 explicit Matcher(const MatcherInterface<T>* impl) 4872 : internal::MatcherBase<T>(impl) {} 4873 4874 // Implicit constructor here allows people to write 4875 // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes 4876 Matcher(T value); // NOLINT 4877 }; 4878 4879 // The following two specializations allow the user to write str 4880 // instead of Eq(str) and "foo" instead of Eq("foo") when a string 4881 // matcher is expected. 4882 template <> 4883 class Matcher<const internal::string&> 4884 : public internal::MatcherBase<const internal::string&> { 4885 public: 4886 Matcher() {} 4887 4888 explicit Matcher(const MatcherInterface<const internal::string&>* impl) 4889 : internal::MatcherBase<const internal::string&>(impl) {} 4890 4891 // Allows the user to write str instead of Eq(str) sometimes, where 4892 // str is a string object. 4893 Matcher(const internal::string& s); // NOLINT 4894 4895 // Allows the user to write "foo" instead of Eq("foo") sometimes. 4896 Matcher(const char* s); // NOLINT 4897 }; 4898 4899 template <> 4900 class Matcher<internal::string> 4901 : public internal::MatcherBase<internal::string> { 4902 public: 4903 Matcher() {} 4904 4905 explicit Matcher(const MatcherInterface<internal::string>* impl) 4906 : internal::MatcherBase<internal::string>(impl) {} 4907 4908 // Allows the user to write str instead of Eq(str) sometimes, where 4909 // str is a string object. 4910 Matcher(const internal::string& s); // NOLINT 4911 4912 // Allows the user to write "foo" instead of Eq("foo") sometimes. 4913 Matcher(const char* s); // NOLINT 4914 }; 4915 4916 // The PolymorphicMatcher class template makes it easy to implement a 4917 // polymorphic matcher (i.e. a matcher that can match values of more 4918 // than one type, e.g. Eq(n) and NotNull()). 4919 // 4920 // To define a polymorphic matcher, a user should provide an Impl 4921 // class that has a DescribeTo() method and a DescribeNegationTo() 4922 // method, and define a member function (or member function template) 4923 // 4924 // bool MatchAndExplain(const Value& value, 4925 // MatchResultListener* listener) const; 4926 // 4927 // See the definition of NotNull() for a complete example. 4928 template <class Impl> 4929 class PolymorphicMatcher { 4930 public: 4931 explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} 4932 4933 // Returns a mutable reference to the underlying matcher 4934 // implementation object. 4935 Impl& mutable_impl() { return impl_; } 4936 4937 // Returns an immutable reference to the underlying matcher 4938 // implementation object. 4939 const Impl& impl() const { return impl_; } 4940 4941 template <typename T> 4942 operator Matcher<T>() const { 4943 return Matcher<T>(new MonomorphicImpl<T>(impl_)); 4944 } 4945 4946 private: 4947 template <typename T> 4948 class MonomorphicImpl : public MatcherInterface<T> { 4949 public: 4950 explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} 4951 4952 virtual void DescribeTo(::std::ostream* os) const { 4953 impl_.DescribeTo(os); 4954 } 4955 4956 virtual void DescribeNegationTo(::std::ostream* os) const { 4957 impl_.DescribeNegationTo(os); 4958 } 4959 4960 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 4961 return impl_.MatchAndExplain(x, listener); 4962 } 4963 4964 private: 4965 const Impl impl_; 4966 4967 GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); 4968 }; 4969 4970 Impl impl_; 4971 4972 GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher); 4973 }; 4974 4975 // Creates a matcher from its implementation. This is easier to use 4976 // than the Matcher<T> constructor as it doesn't require you to 4977 // explicitly write the template argument, e.g. 4978 // 4979 // MakeMatcher(foo); 4980 // vs 4981 // Matcher<const string&>(foo); 4982 template <typename T> 4983 inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) { 4984 return Matcher<T>(impl); 4985 }; 4986 4987 // Creates a polymorphic matcher from its implementation. This is 4988 // easier to use than the PolymorphicMatcher<Impl> constructor as it 4989 // doesn't require you to explicitly write the template argument, e.g. 4990 // 4991 // MakePolymorphicMatcher(foo); 4992 // vs 4993 // PolymorphicMatcher<TypeOfFoo>(foo); 4994 template <class Impl> 4995 inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) { 4996 return PolymorphicMatcher<Impl>(impl); 4997 } 4998 4999 // In order to be safe and clear, casting between different matcher 5000 // types is done explicitly via MatcherCast<T>(m), which takes a 5001 // matcher m and returns a Matcher<T>. It compiles only when T can be 5002 // statically converted to the argument type of m. 5003 template <typename T, typename M> 5004 Matcher<T> MatcherCast(M m); 5005 5006 // Implements SafeMatcherCast(). 5007 // 5008 // We use an intermediate class to do the actual safe casting as Nokia's 5009 // Symbian compiler cannot decide between 5010 // template <T, M> ... (M) and 5011 // template <T, U> ... (const Matcher<U>&) 5012 // for function templates but can for member function templates. 5013 template <typename T> 5014 class SafeMatcherCastImpl { 5015 public: 5016 // This overload handles polymorphic matchers only since monomorphic 5017 // matchers are handled by the next one. 5018 template <typename M> 5019 static inline Matcher<T> Cast(M polymorphic_matcher) { 5020 return Matcher<T>(polymorphic_matcher); 5021 } 5022 5023 // This overload handles monomorphic matchers. 5024 // 5025 // In general, if type T can be implicitly converted to type U, we can 5026 // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is 5027 // contravariant): just keep a copy of the original Matcher<U>, convert the 5028 // argument from type T to U, and then pass it to the underlying Matcher<U>. 5029 // The only exception is when U is a reference and T is not, as the 5030 // underlying Matcher<U> may be interested in the argument's address, which 5031 // is not preserved in the conversion from T to U. 5032 template <typename U> 5033 static inline Matcher<T> Cast(const Matcher<U>& matcher) { 5034 // Enforce that T can be implicitly converted to U. 5035 GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value), 5036 T_must_be_implicitly_convertible_to_U); 5037 // Enforce that we are not converting a non-reference type T to a reference 5038 // type U. 5039 GTEST_COMPILE_ASSERT_( 5040 internal::is_reference<T>::value || !internal::is_reference<U>::value, 5041 cannot_convert_non_referentce_arg_to_reference); 5042 // In case both T and U are arithmetic types, enforce that the 5043 // conversion is not lossy. 5044 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT; 5045 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU; 5046 const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; 5047 const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; 5048 GTEST_COMPILE_ASSERT_( 5049 kTIsOther || kUIsOther || 5050 (internal::LosslessArithmeticConvertible<RawT, RawU>::value), 5051 conversion_of_arithmetic_types_must_be_lossless); 5052 return MatcherCast<T>(matcher); 5053 } 5054 }; 5055 5056 template <typename T, typename M> 5057 inline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) { 5058 return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher); 5059 } 5060 5061 // A<T>() returns a matcher that matches any value of type T. 5062 template <typename T> 5063 Matcher<T> A(); 5064 5065 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION 5066 // and MUST NOT BE USED IN USER CODE!!! 5067 namespace internal { 5068 5069 // If the explanation is not empty, prints it to the ostream. 5070 inline void PrintIfNotEmpty(const internal::string& explanation, 5071 std::ostream* os) { 5072 if (explanation != "" && os != NULL) { 5073 *os << ", " << explanation; 5074 } 5075 } 5076 5077 // Returns true if the given type name is easy to read by a human. 5078 // This is used to decide whether printing the type of a value might 5079 // be helpful. 5080 inline bool IsReadableTypeName(const string& type_name) { 5081 // We consider a type name readable if it's short or doesn't contain 5082 // a template or function type. 5083 return (type_name.length() <= 20 || 5084 type_name.find_first_of("<(") == string::npos); 5085 } 5086 5087 // Matches the value against the given matcher, prints the value and explains 5088 // the match result to the listener. Returns the match result. 5089 // 'listener' must not be NULL. 5090 // Value cannot be passed by const reference, because some matchers take a 5091 // non-const argument. 5092 template <typename Value, typename T> 5093 bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher, 5094 MatchResultListener* listener) { 5095 if (!listener->IsInterested()) { 5096 // If the listener is not interested, we do not need to construct the 5097 // inner explanation. 5098 return matcher.Matches(value); 5099 } 5100 5101 StringMatchResultListener inner_listener; 5102 const bool match = matcher.MatchAndExplain(value, &inner_listener); 5103 5104 UniversalPrint(value, listener->stream()); 5105 #if GTEST_HAS_RTTI 5106 const string& type_name = GetTypeName<Value>(); 5107 if (IsReadableTypeName(type_name)) 5108 *listener->stream() << " (of type " << type_name << ")"; 5109 #endif 5110 PrintIfNotEmpty(inner_listener.str(), listener->stream()); 5111 5112 return match; 5113 } 5114 5115 // An internal helper class for doing compile-time loop on a tuple's 5116 // fields. 5117 template <size_t N> 5118 class TuplePrefix { 5119 public: 5120 // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true 5121 // iff the first N fields of matcher_tuple matches the first N 5122 // fields of value_tuple, respectively. 5123 template <typename MatcherTuple, typename ValueTuple> 5124 static bool Matches(const MatcherTuple& matcher_tuple, 5125 const ValueTuple& value_tuple) { 5126 using ::std::tr1::get; 5127 return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) 5128 && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple)); 5129 } 5130 5131 // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os) 5132 // describes failures in matching the first N fields of matchers 5133 // against the first N fields of values. If there is no failure, 5134 // nothing will be streamed to os. 5135 template <typename MatcherTuple, typename ValueTuple> 5136 static void ExplainMatchFailuresTo(const MatcherTuple& matchers, 5137 const ValueTuple& values, 5138 ::std::ostream* os) { 5139 using ::std::tr1::tuple_element; 5140 using ::std::tr1::get; 5141 5142 // First, describes failures in the first N - 1 fields. 5143 TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os); 5144 5145 // Then describes the failure (if any) in the (N - 1)-th (0-based) 5146 // field. 5147 typename tuple_element<N - 1, MatcherTuple>::type matcher = 5148 get<N - 1>(matchers); 5149 typedef typename tuple_element<N - 1, ValueTuple>::type Value; 5150 Value value = get<N - 1>(values); 5151 StringMatchResultListener listener; 5152 if (!matcher.MatchAndExplain(value, &listener)) { 5153 // TODO(wan): include in the message the name of the parameter 5154 // as used in MOCK_METHOD*() when possible. 5155 *os << " Expected arg #" << N - 1 << ": "; 5156 get<N - 1>(matchers).DescribeTo(os); 5157 *os << "\n Actual: "; 5158 // We remove the reference in type Value to prevent the 5159 // universal printer from printing the address of value, which 5160 // isn't interesting to the user most of the time. The 5161 // matcher's MatchAndExplain() method handles the case when 5162 // the address is interesting. 5163 internal::UniversalPrint(value, os); 5164 PrintIfNotEmpty(listener.str(), os); 5165 *os << "\n"; 5166 } 5167 } 5168 }; 5169 5170 // The base case. 5171 template <> 5172 class TuplePrefix<0> { 5173 public: 5174 template <typename MatcherTuple, typename ValueTuple> 5175 static bool Matches(const MatcherTuple& /* matcher_tuple */, 5176 const ValueTuple& /* value_tuple */) { 5177 return true; 5178 } 5179 5180 template <typename MatcherTuple, typename ValueTuple> 5181 static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, 5182 const ValueTuple& /* values */, 5183 ::std::ostream* /* os */) {} 5184 }; 5185 5186 // TupleMatches(matcher_tuple, value_tuple) returns true iff all 5187 // matchers in matcher_tuple match the corresponding fields in 5188 // value_tuple. It is a compiler error if matcher_tuple and 5189 // value_tuple have different number of fields or incompatible field 5190 // types. 5191 template <typename MatcherTuple, typename ValueTuple> 5192 bool TupleMatches(const MatcherTuple& matcher_tuple, 5193 const ValueTuple& value_tuple) { 5194 using ::std::tr1::tuple_size; 5195 // Makes sure that matcher_tuple and value_tuple have the same 5196 // number of fields. 5197 GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value == 5198 tuple_size<ValueTuple>::value, 5199 matcher_and_value_have_different_numbers_of_fields); 5200 return TuplePrefix<tuple_size<ValueTuple>::value>:: 5201 Matches(matcher_tuple, value_tuple); 5202 } 5203 5204 // Describes failures in matching matchers against values. If there 5205 // is no failure, nothing will be streamed to os. 5206 template <typename MatcherTuple, typename ValueTuple> 5207 void ExplainMatchFailureTupleTo(const MatcherTuple& matchers, 5208 const ValueTuple& values, 5209 ::std::ostream* os) { 5210 using ::std::tr1::tuple_size; 5211 TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo( 5212 matchers, values, os); 5213 } 5214 5215 // The MatcherCastImpl class template is a helper for implementing 5216 // MatcherCast(). We need this helper in order to partially 5217 // specialize the implementation of MatcherCast() (C++ allows 5218 // class/struct templates to be partially specialized, but not 5219 // function templates.). 5220 5221 // This general version is used when MatcherCast()'s argument is a 5222 // polymorphic matcher (i.e. something that can be converted to a 5223 // Matcher but is not one yet; for example, Eq(value)). 5224 template <typename T, typename M> 5225 class MatcherCastImpl { 5226 public: 5227 static Matcher<T> Cast(M polymorphic_matcher) { 5228 return Matcher<T>(polymorphic_matcher); 5229 } 5230 }; 5231 5232 // This more specialized version is used when MatcherCast()'s argument 5233 // is already a Matcher. This only compiles when type T can be 5234 // statically converted to type U. 5235 template <typename T, typename U> 5236 class MatcherCastImpl<T, Matcher<U> > { 5237 public: 5238 static Matcher<T> Cast(const Matcher<U>& source_matcher) { 5239 return Matcher<T>(new Impl(source_matcher)); 5240 } 5241 5242 private: 5243 class Impl : public MatcherInterface<T> { 5244 public: 5245 explicit Impl(const Matcher<U>& source_matcher) 5246 : source_matcher_(source_matcher) {} 5247 5248 // We delegate the matching logic to the source matcher. 5249 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 5250 return source_matcher_.MatchAndExplain(static_cast<U>(x), listener); 5251 } 5252 5253 virtual void DescribeTo(::std::ostream* os) const { 5254 source_matcher_.DescribeTo(os); 5255 } 5256 5257 virtual void DescribeNegationTo(::std::ostream* os) const { 5258 source_matcher_.DescribeNegationTo(os); 5259 } 5260 5261 private: 5262 const Matcher<U> source_matcher_; 5263 5264 GTEST_DISALLOW_ASSIGN_(Impl); 5265 }; 5266 }; 5267 5268 // This even more specialized version is used for efficiently casting 5269 // a matcher to its own type. 5270 template <typename T> 5271 class MatcherCastImpl<T, Matcher<T> > { 5272 public: 5273 static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } 5274 }; 5275 5276 // Implements A<T>(). 5277 template <typename T> 5278 class AnyMatcherImpl : public MatcherInterface<T> { 5279 public: 5280 virtual bool MatchAndExplain( 5281 T /* x */, MatchResultListener* /* listener */) const { return true; } 5282 virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } 5283 virtual void DescribeNegationTo(::std::ostream* os) const { 5284 // This is mostly for completeness' safe, as it's not very useful 5285 // to write Not(A<bool>()). However we cannot completely rule out 5286 // such a possibility, and it doesn't hurt to be prepared. 5287 *os << "never matches"; 5288 } 5289 }; 5290 5291 // Implements _, a matcher that matches any value of any 5292 // type. This is a polymorphic matcher, so we need a template type 5293 // conversion operator to make it appearing as a Matcher<T> for any 5294 // type T. 5295 class AnythingMatcher { 5296 public: 5297 template <typename T> 5298 operator Matcher<T>() const { return A<T>(); } 5299 }; 5300 5301 // Implements a matcher that compares a given value with a 5302 // pre-supplied value using one of the ==, <=, <, etc, operators. The 5303 // two values being compared don't have to have the same type. 5304 // 5305 // The matcher defined here is polymorphic (for example, Eq(5) can be 5306 // used to match an int, a short, a double, etc). Therefore we use 5307 // a template type conversion operator in the implementation. 5308 // 5309 // We define this as a macro in order to eliminate duplicated source 5310 // code. 5311 // 5312 // The following template definition assumes that the Rhs parameter is 5313 // a "bare" type (i.e. neither 'const T' nor 'T&'). 5314 #define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \ 5315 name, op, relation, negated_relation) \ 5316 template <typename Rhs> class name##Matcher { \ 5317 public: \ 5318 explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ 5319 template <typename Lhs> \ 5320 operator Matcher<Lhs>() const { \ 5321 return MakeMatcher(new Impl<Lhs>(rhs_)); \ 5322 } \ 5323 private: \ 5324 template <typename Lhs> \ 5325 class Impl : public MatcherInterface<Lhs> { \ 5326 public: \ 5327 explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ 5328 virtual bool MatchAndExplain(\ 5329 Lhs lhs, MatchResultListener* /* listener */) const { \ 5330 return lhs op rhs_; \ 5331 } \ 5332 virtual void DescribeTo(::std::ostream* os) const { \ 5333 *os << relation " "; \ 5334 UniversalPrint(rhs_, os); \ 5335 } \ 5336 virtual void DescribeNegationTo(::std::ostream* os) const { \ 5337 *os << negated_relation " "; \ 5338 UniversalPrint(rhs_, os); \ 5339 } \ 5340 private: \ 5341 Rhs rhs_; \ 5342 GTEST_DISALLOW_ASSIGN_(Impl); \ 5343 }; \ 5344 Rhs rhs_; \ 5345 GTEST_DISALLOW_ASSIGN_(name##Matcher); \ 5346 } 5347 5348 // Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v) 5349 // respectively. 5350 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to"); 5351 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >="); 5352 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >"); 5353 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <="); 5354 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <"); 5355 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to"); 5356 5357 #undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ 5358 5359 // Implements the polymorphic IsNull() matcher, which matches any raw or smart 5360 // pointer that is NULL. 5361 class IsNullMatcher { 5362 public: 5363 template <typename Pointer> 5364 bool MatchAndExplain(const Pointer& p, 5365 MatchResultListener* /* listener */) const { 5366 return GetRawPointer(p) == NULL; 5367 } 5368 5369 void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } 5370 void DescribeNegationTo(::std::ostream* os) const { 5371 *os << "isn't NULL"; 5372 } 5373 }; 5374 5375 // Implements the polymorphic NotNull() matcher, which matches any raw or smart 5376 // pointer that is not NULL. 5377 class NotNullMatcher { 5378 public: 5379 template <typename Pointer> 5380 bool MatchAndExplain(const Pointer& p, 5381 MatchResultListener* /* listener */) const { 5382 return GetRawPointer(p) != NULL; 5383 } 5384 5385 void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } 5386 void DescribeNegationTo(::std::ostream* os) const { 5387 *os << "is NULL"; 5388 } 5389 }; 5390 5391 // Ref(variable) matches any argument that is a reference to 5392 // 'variable'. This matcher is polymorphic as it can match any 5393 // super type of the type of 'variable'. 5394 // 5395 // The RefMatcher template class implements Ref(variable). It can 5396 // only be instantiated with a reference type. This prevents a user 5397 // from mistakenly using Ref(x) to match a non-reference function 5398 // argument. For example, the following will righteously cause a 5399 // compiler error: 5400 // 5401 // int n; 5402 // Matcher<int> m1 = Ref(n); // This won't compile. 5403 // Matcher<int&> m2 = Ref(n); // This will compile. 5404 template <typename T> 5405 class RefMatcher; 5406 5407 template <typename T> 5408 class RefMatcher<T&> { 5409 // Google Mock is a generic framework and thus needs to support 5410 // mocking any function types, including those that take non-const 5411 // reference arguments. Therefore the template parameter T (and 5412 // Super below) can be instantiated to either a const type or a 5413 // non-const type. 5414 public: 5415 // RefMatcher() takes a T& instead of const T&, as we want the 5416 // compiler to catch using Ref(const_value) as a matcher for a 5417 // non-const reference. 5418 explicit RefMatcher(T& x) : object_(x) {} // NOLINT 5419 5420 template <typename Super> 5421 operator Matcher<Super&>() const { 5422 // By passing object_ (type T&) to Impl(), which expects a Super&, 5423 // we make sure that Super is a super type of T. In particular, 5424 // this catches using Ref(const_value) as a matcher for a 5425 // non-const reference, as you cannot implicitly convert a const 5426 // reference to a non-const reference. 5427 return MakeMatcher(new Impl<Super>(object_)); 5428 } 5429 5430 private: 5431 template <typename Super> 5432 class Impl : public MatcherInterface<Super&> { 5433 public: 5434 explicit Impl(Super& x) : object_(x) {} // NOLINT 5435 5436 // MatchAndExplain() takes a Super& (as opposed to const Super&) 5437 // in order to match the interface MatcherInterface<Super&>. 5438 virtual bool MatchAndExplain( 5439 Super& x, MatchResultListener* listener) const { 5440 *listener << "which is located @" << static_cast<const void*>(&x); 5441 return &x == &object_; 5442 } 5443 5444 virtual void DescribeTo(::std::ostream* os) const { 5445 *os << "references the variable "; 5446 UniversalPrinter<Super&>::Print(object_, os); 5447 } 5448 5449 virtual void DescribeNegationTo(::std::ostream* os) const { 5450 *os << "does not reference the variable "; 5451 UniversalPrinter<Super&>::Print(object_, os); 5452 } 5453 5454 private: 5455 const Super& object_; 5456 5457 GTEST_DISALLOW_ASSIGN_(Impl); 5458 }; 5459 5460 T& object_; 5461 5462 GTEST_DISALLOW_ASSIGN_(RefMatcher); 5463 }; 5464 5465 // Polymorphic helper functions for narrow and wide string matchers. 5466 inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { 5467 return String::CaseInsensitiveCStringEquals(lhs, rhs); 5468 } 5469 5470 inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, 5471 const wchar_t* rhs) { 5472 return String::CaseInsensitiveWideCStringEquals(lhs, rhs); 5473 } 5474 5475 // String comparison for narrow or wide strings that can have embedded NUL 5476 // characters. 5477 template <typename StringType> 5478 bool CaseInsensitiveStringEquals(const StringType& s1, 5479 const StringType& s2) { 5480 // Are the heads equal? 5481 if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { 5482 return false; 5483 } 5484 5485 // Skip the equal heads. 5486 const typename StringType::value_type nul = 0; 5487 const size_t i1 = s1.find(nul), i2 = s2.find(nul); 5488 5489 // Are we at the end of either s1 or s2? 5490 if (i1 == StringType::npos || i2 == StringType::npos) { 5491 return i1 == i2; 5492 } 5493 5494 // Are the tails equal? 5495 return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); 5496 } 5497 5498 // String matchers. 5499 5500 // Implements equality-based string matchers like StrEq, StrCaseNe, and etc. 5501 template <typename StringType> 5502 class StrEqualityMatcher { 5503 public: 5504 typedef typename StringType::const_pointer ConstCharPointer; 5505 5506 StrEqualityMatcher(const StringType& str, bool expect_eq, 5507 bool case_sensitive) 5508 : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} 5509 5510 // When expect_eq_ is true, returns true iff s is equal to string_; 5511 // otherwise returns true iff s is not equal to string_. 5512 bool MatchAndExplain(ConstCharPointer s, 5513 MatchResultListener* listener) const { 5514 if (s == NULL) { 5515 return !expect_eq_; 5516 } 5517 return MatchAndExplain(StringType(s), listener); 5518 } 5519 5520 bool MatchAndExplain(const StringType& s, 5521 MatchResultListener* /* listener */) const { 5522 const bool eq = case_sensitive_ ? s == string_ : 5523 CaseInsensitiveStringEquals(s, string_); 5524 return expect_eq_ == eq; 5525 } 5526 5527 void DescribeTo(::std::ostream* os) const { 5528 DescribeToHelper(expect_eq_, os); 5529 } 5530 5531 void DescribeNegationTo(::std::ostream* os) const { 5532 DescribeToHelper(!expect_eq_, os); 5533 } 5534 5535 private: 5536 void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { 5537 *os << (expect_eq ? "is " : "isn't "); 5538 *os << "equal to "; 5539 if (!case_sensitive_) { 5540 *os << "(ignoring case) "; 5541 } 5542 UniversalPrint(string_, os); 5543 } 5544 5545 const StringType string_; 5546 const bool expect_eq_; 5547 const bool case_sensitive_; 5548 5549 GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); 5550 }; 5551 5552 // Implements the polymorphic HasSubstr(substring) matcher, which 5553 // can be used as a Matcher<T> as long as T can be converted to a 5554 // string. 5555 template <typename StringType> 5556 class HasSubstrMatcher { 5557 public: 5558 typedef typename StringType::const_pointer ConstCharPointer; 5559 5560 explicit HasSubstrMatcher(const StringType& substring) 5561 : substring_(substring) {} 5562 5563 // These overloaded methods allow HasSubstr(substring) to be used as a 5564 // Matcher<T> as long as T can be converted to string. Returns true 5565 // iff s contains substring_ as a substring. 5566 bool MatchAndExplain(ConstCharPointer s, 5567 MatchResultListener* listener) const { 5568 return s != NULL && MatchAndExplain(StringType(s), listener); 5569 } 5570 5571 bool MatchAndExplain(const StringType& s, 5572 MatchResultListener* /* listener */) const { 5573 return s.find(substring_) != StringType::npos; 5574 } 5575 5576 // Describes what this matcher matches. 5577 void DescribeTo(::std::ostream* os) const { 5578 *os << "has substring "; 5579 UniversalPrint(substring_, os); 5580 } 5581 5582 void DescribeNegationTo(::std::ostream* os) const { 5583 *os << "has no substring "; 5584 UniversalPrint(substring_, os); 5585 } 5586 5587 private: 5588 const StringType substring_; 5589 5590 GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); 5591 }; 5592 5593 // Implements the polymorphic StartsWith(substring) matcher, which 5594 // can be used as a Matcher<T> as long as T can be converted to a 5595 // string. 5596 template <typename StringType> 5597 class StartsWithMatcher { 5598 public: 5599 typedef typename StringType::const_pointer ConstCharPointer; 5600 5601 explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { 5602 } 5603 5604 // These overloaded methods allow StartsWith(prefix) to be used as a 5605 // Matcher<T> as long as T can be converted to string. Returns true 5606 // iff s starts with prefix_. 5607 bool MatchAndExplain(ConstCharPointer s, 5608 MatchResultListener* listener) const { 5609 return s != NULL && MatchAndExplain(StringType(s), listener); 5610 } 5611 5612 bool MatchAndExplain(const StringType& s, 5613 MatchResultListener* /* listener */) const { 5614 return s.length() >= prefix_.length() && 5615 s.substr(0, prefix_.length()) == prefix_; 5616 } 5617 5618 void DescribeTo(::std::ostream* os) const { 5619 *os << "starts with "; 5620 UniversalPrint(prefix_, os); 5621 } 5622 5623 void DescribeNegationTo(::std::ostream* os) const { 5624 *os << "doesn't start with "; 5625 UniversalPrint(prefix_, os); 5626 } 5627 5628 private: 5629 const StringType prefix_; 5630 5631 GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); 5632 }; 5633 5634 // Implements the polymorphic EndsWith(substring) matcher, which 5635 // can be used as a Matcher<T> as long as T can be converted to a 5636 // string. 5637 template <typename StringType> 5638 class EndsWithMatcher { 5639 public: 5640 typedef typename StringType::const_pointer ConstCharPointer; 5641 5642 explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} 5643 5644 // These overloaded methods allow EndsWith(suffix) to be used as a 5645 // Matcher<T> as long as T can be converted to string. Returns true 5646 // iff s ends with suffix_. 5647 bool MatchAndExplain(ConstCharPointer s, 5648 MatchResultListener* listener) const { 5649 return s != NULL && MatchAndExplain(StringType(s), listener); 5650 } 5651 5652 bool MatchAndExplain(const StringType& s, 5653 MatchResultListener* /* listener */) const { 5654 return s.length() >= suffix_.length() && 5655 s.substr(s.length() - suffix_.length()) == suffix_; 5656 } 5657 5658 void DescribeTo(::std::ostream* os) const { 5659 *os << "ends with "; 5660 UniversalPrint(suffix_, os); 5661 } 5662 5663 void DescribeNegationTo(::std::ostream* os) const { 5664 *os << "doesn't end with "; 5665 UniversalPrint(suffix_, os); 5666 } 5667 5668 private: 5669 const StringType suffix_; 5670 5671 GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); 5672 }; 5673 5674 // Implements polymorphic matchers MatchesRegex(regex) and 5675 // ContainsRegex(regex), which can be used as a Matcher<T> as long as 5676 // T can be converted to a string. 5677 class MatchesRegexMatcher { 5678 public: 5679 MatchesRegexMatcher(const RE* regex, bool full_match) 5680 : regex_(regex), full_match_(full_match) {} 5681 5682 // These overloaded methods allow MatchesRegex(regex) to be used as 5683 // a Matcher<T> as long as T can be converted to string. Returns 5684 // true iff s matches regular expression regex. When full_match_ is 5685 // true, a full match is done; otherwise a partial match is done. 5686 bool MatchAndExplain(const char* s, 5687 MatchResultListener* listener) const { 5688 return s != NULL && MatchAndExplain(internal::string(s), listener); 5689 } 5690 5691 bool MatchAndExplain(const internal::string& s, 5692 MatchResultListener* /* listener */) const { 5693 return full_match_ ? RE::FullMatch(s, *regex_) : 5694 RE::PartialMatch(s, *regex_); 5695 } 5696 5697 void DescribeTo(::std::ostream* os) const { 5698 *os << (full_match_ ? "matches" : "contains") 5699 << " regular expression "; 5700 UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 5701 } 5702 5703 void DescribeNegationTo(::std::ostream* os) const { 5704 *os << "doesn't " << (full_match_ ? "match" : "contain") 5705 << " regular expression "; 5706 UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 5707 } 5708 5709 private: 5710 const internal::linked_ptr<const RE> regex_; 5711 const bool full_match_; 5712 5713 GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); 5714 }; 5715 5716 // Implements a matcher that compares the two fields of a 2-tuple 5717 // using one of the ==, <=, <, etc, operators. The two fields being 5718 // compared don't have to have the same type. 5719 // 5720 // The matcher defined here is polymorphic (for example, Eq() can be 5721 // used to match a tuple<int, short>, a tuple<const long&, double>, 5722 // etc). Therefore we use a template type conversion operator in the 5723 // implementation. 5724 // 5725 // We define this as a macro in order to eliminate duplicated source 5726 // code. 5727 #define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op, relation) \ 5728 class name##2Matcher { \ 5729 public: \ 5730 template <typename T1, typename T2> \ 5731 operator Matcher< ::std::tr1::tuple<T1, T2> >() const { \ 5732 return MakeMatcher(new Impl< ::std::tr1::tuple<T1, T2> >); \ 5733 } \ 5734 template <typename T1, typename T2> \ 5735 operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \ 5736 return MakeMatcher(new Impl<const ::std::tr1::tuple<T1, T2>&>); \ 5737 } \ 5738 private: \ 5739 template <typename Tuple> \ 5740 class Impl : public MatcherInterface<Tuple> { \ 5741 public: \ 5742 virtual bool MatchAndExplain( \ 5743 Tuple args, \ 5744 MatchResultListener* /* listener */) const { \ 5745 return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ 5746 } \ 5747 virtual void DescribeTo(::std::ostream* os) const { \ 5748 *os << "are " relation; \ 5749 } \ 5750 virtual void DescribeNegationTo(::std::ostream* os) const { \ 5751 *os << "aren't " relation; \ 5752 } \ 5753 }; \ 5754 } 5755 5756 // Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively. 5757 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==, "an equal pair"); 5758 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 5759 Ge, >=, "a pair where the first >= the second"); 5760 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 5761 Gt, >, "a pair where the first > the second"); 5762 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 5763 Le, <=, "a pair where the first <= the second"); 5764 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 5765 Lt, <, "a pair where the first < the second"); 5766 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=, "an unequal pair"); 5767 5768 #undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_ 5769 5770 // Implements the Not(...) matcher for a particular argument type T. 5771 // We do not nest it inside the NotMatcher class template, as that 5772 // will prevent different instantiations of NotMatcher from sharing 5773 // the same NotMatcherImpl<T> class. 5774 template <typename T> 5775 class NotMatcherImpl : public MatcherInterface<T> { 5776 public: 5777 explicit NotMatcherImpl(const Matcher<T>& matcher) 5778 : matcher_(matcher) {} 5779 5780 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 5781 return !matcher_.MatchAndExplain(x, listener); 5782 } 5783 5784 virtual void DescribeTo(::std::ostream* os) const { 5785 matcher_.DescribeNegationTo(os); 5786 } 5787 5788 virtual void DescribeNegationTo(::std::ostream* os) const { 5789 matcher_.DescribeTo(os); 5790 } 5791 5792 private: 5793 const Matcher<T> matcher_; 5794 5795 GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); 5796 }; 5797 5798 // Implements the Not(m) matcher, which matches a value that doesn't 5799 // match matcher m. 5800 template <typename InnerMatcher> 5801 class NotMatcher { 5802 public: 5803 explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} 5804 5805 // This template type conversion operator allows Not(m) to be used 5806 // to match any type m can match. 5807 template <typename T> 5808 operator Matcher<T>() const { 5809 return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_))); 5810 } 5811 5812 private: 5813 InnerMatcher matcher_; 5814 5815 GTEST_DISALLOW_ASSIGN_(NotMatcher); 5816 }; 5817 5818 // Implements the AllOf(m1, m2) matcher for a particular argument type 5819 // T. We do not nest it inside the BothOfMatcher class template, as 5820 // that will prevent different instantiations of BothOfMatcher from 5821 // sharing the same BothOfMatcherImpl<T> class. 5822 template <typename T> 5823 class BothOfMatcherImpl : public MatcherInterface<T> { 5824 public: 5825 BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 5826 : matcher1_(matcher1), matcher2_(matcher2) {} 5827 5828 virtual void DescribeTo(::std::ostream* os) const { 5829 *os << "("; 5830 matcher1_.DescribeTo(os); 5831 *os << ") and ("; 5832 matcher2_.DescribeTo(os); 5833 *os << ")"; 5834 } 5835 5836 virtual void DescribeNegationTo(::std::ostream* os) const { 5837 *os << "("; 5838 matcher1_.DescribeNegationTo(os); 5839 *os << ") or ("; 5840 matcher2_.DescribeNegationTo(os); 5841 *os << ")"; 5842 } 5843 5844 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 5845 // If either matcher1_ or matcher2_ doesn't match x, we only need 5846 // to explain why one of them fails. 5847 StringMatchResultListener listener1; 5848 if (!matcher1_.MatchAndExplain(x, &listener1)) { 5849 *listener << listener1.str(); 5850 return false; 5851 } 5852 5853 StringMatchResultListener listener2; 5854 if (!matcher2_.MatchAndExplain(x, &listener2)) { 5855 *listener << listener2.str(); 5856 return false; 5857 } 5858 5859 // Otherwise we need to explain why *both* of them match. 5860 const internal::string s1 = listener1.str(); 5861 const internal::string s2 = listener2.str(); 5862 5863 if (s1 == "") { 5864 *listener << s2; 5865 } else { 5866 *listener << s1; 5867 if (s2 != "") { 5868 *listener << ", and " << s2; 5869 } 5870 } 5871 return true; 5872 } 5873 5874 private: 5875 const Matcher<T> matcher1_; 5876 const Matcher<T> matcher2_; 5877 5878 GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); 5879 }; 5880 5881 // Used for implementing the AllOf(m_1, ..., m_n) matcher, which 5882 // matches a value that matches all of the matchers m_1, ..., and m_n. 5883 template <typename Matcher1, typename Matcher2> 5884 class BothOfMatcher { 5885 public: 5886 BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 5887 : matcher1_(matcher1), matcher2_(matcher2) {} 5888 5889 // This template type conversion operator allows a 5890 // BothOfMatcher<Matcher1, Matcher2> object to match any type that 5891 // both Matcher1 and Matcher2 can match. 5892 template <typename T> 5893 operator Matcher<T>() const { 5894 return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_), 5895 SafeMatcherCast<T>(matcher2_))); 5896 } 5897 5898 private: 5899 Matcher1 matcher1_; 5900 Matcher2 matcher2_; 5901 5902 GTEST_DISALLOW_ASSIGN_(BothOfMatcher); 5903 }; 5904 5905 // Implements the AnyOf(m1, m2) matcher for a particular argument type 5906 // T. We do not nest it inside the AnyOfMatcher class template, as 5907 // that will prevent different instantiations of AnyOfMatcher from 5908 // sharing the same EitherOfMatcherImpl<T> class. 5909 template <typename T> 5910 class EitherOfMatcherImpl : public MatcherInterface<T> { 5911 public: 5912 EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 5913 : matcher1_(matcher1), matcher2_(matcher2) {} 5914 5915 virtual void DescribeTo(::std::ostream* os) const { 5916 *os << "("; 5917 matcher1_.DescribeTo(os); 5918 *os << ") or ("; 5919 matcher2_.DescribeTo(os); 5920 *os << ")"; 5921 } 5922 5923 virtual void DescribeNegationTo(::std::ostream* os) const { 5924 *os << "("; 5925 matcher1_.DescribeNegationTo(os); 5926 *os << ") and ("; 5927 matcher2_.DescribeNegationTo(os); 5928 *os << ")"; 5929 } 5930 5931 virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 5932 // If either matcher1_ or matcher2_ matches x, we just need to 5933 // explain why *one* of them matches. 5934 StringMatchResultListener listener1; 5935 if (matcher1_.MatchAndExplain(x, &listener1)) { 5936 *listener << listener1.str(); 5937 return true; 5938 } 5939 5940 StringMatchResultListener listener2; 5941 if (matcher2_.MatchAndExplain(x, &listener2)) { 5942 *listener << listener2.str(); 5943 return true; 5944 } 5945 5946 // Otherwise we need to explain why *both* of them fail. 5947 const internal::string s1 = listener1.str(); 5948 const internal::string s2 = listener2.str(); 5949 5950 if (s1 == "") { 5951 *listener << s2; 5952 } else { 5953 *listener << s1; 5954 if (s2 != "") { 5955 *listener << ", and " << s2; 5956 } 5957 } 5958 return false; 5959 } 5960 5961 private: 5962 const Matcher<T> matcher1_; 5963 const Matcher<T> matcher2_; 5964 5965 GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); 5966 }; 5967 5968 // Used for implementing the AnyOf(m_1, ..., m_n) matcher, which 5969 // matches a value that matches at least one of the matchers m_1, ..., 5970 // and m_n. 5971 template <typename Matcher1, typename Matcher2> 5972 class EitherOfMatcher { 5973 public: 5974 EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 5975 : matcher1_(matcher1), matcher2_(matcher2) {} 5976 5977 // This template type conversion operator allows a 5978 // EitherOfMatcher<Matcher1, Matcher2> object to match any type that 5979 // both Matcher1 and Matcher2 can match. 5980 template <typename T> 5981 operator Matcher<T>() const { 5982 return Matcher<T>(new EitherOfMatcherImpl<T>( 5983 SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_))); 5984 } 5985 5986 private: 5987 Matcher1 matcher1_; 5988 Matcher2 matcher2_; 5989 5990 GTEST_DISALLOW_ASSIGN_(EitherOfMatcher); 5991 }; 5992 5993 // Used for implementing Truly(pred), which turns a predicate into a 5994 // matcher. 5995 template <typename Predicate> 5996 class TrulyMatcher { 5997 public: 5998 explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} 5999 6000 // This method template allows Truly(pred) to be used as a matcher 6001 // for type T where T is the argument type of predicate 'pred'. The 6002 // argument is passed by reference as the predicate may be 6003 // interested in the address of the argument. 6004 template <typename T> 6005 bool MatchAndExplain(T& x, // NOLINT 6006 MatchResultListener* /* listener */) const { 6007 // Without the if-statement, MSVC sometimes warns about converting 6008 // a value to bool (warning 4800). 6009 // 6010 // We cannot write 'return !!predicate_(x);' as that doesn't work 6011 // when predicate_(x) returns a class convertible to bool but 6012 // having no operator!(). 6013 if (predicate_(x)) 6014 return true; 6015 return false; 6016 } 6017 6018 void DescribeTo(::std::ostream* os) const { 6019 *os << "satisfies the given predicate"; 6020 } 6021 6022 void DescribeNegationTo(::std::ostream* os) const { 6023 *os << "doesn't satisfy the given predicate"; 6024 } 6025 6026 private: 6027 Predicate predicate_; 6028 6029 GTEST_DISALLOW_ASSIGN_(TrulyMatcher); 6030 }; 6031 6032 // Used for implementing Matches(matcher), which turns a matcher into 6033 // a predicate. 6034 template <typename M> 6035 class MatcherAsPredicate { 6036 public: 6037 explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {} 6038 6039 // This template operator() allows Matches(m) to be used as a 6040 // predicate on type T where m is a matcher on type T. 6041 // 6042 // The argument x is passed by reference instead of by value, as 6043 // some matcher may be interested in its address (e.g. as in 6044 // Matches(Ref(n))(x)). 6045 template <typename T> 6046 bool operator()(const T& x) const { 6047 // We let matcher_ commit to a particular type here instead of 6048 // when the MatcherAsPredicate object was constructed. This 6049 // allows us to write Matches(m) where m is a polymorphic matcher 6050 // (e.g. Eq(5)). 6051 // 6052 // If we write Matcher<T>(matcher_).Matches(x) here, it won't 6053 // compile when matcher_ has type Matcher<const T&>; if we write 6054 // Matcher<const T&>(matcher_).Matches(x) here, it won't compile 6055 // when matcher_ has type Matcher<T>; if we just write 6056 // matcher_.Matches(x), it won't compile when matcher_ is 6057 // polymorphic, e.g. Eq(5). 6058 // 6059 // MatcherCast<const T&>() is necessary for making the code work 6060 // in all of the above situations. 6061 return MatcherCast<const T&>(matcher_).Matches(x); 6062 } 6063 6064 private: 6065 M matcher_; 6066 6067 GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate); 6068 }; 6069 6070 // For implementing ASSERT_THAT() and EXPECT_THAT(). The template 6071 // argument M must be a type that can be converted to a matcher. 6072 template <typename M> 6073 class PredicateFormatterFromMatcher { 6074 public: 6075 explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {} 6076 6077 // This template () operator allows a PredicateFormatterFromMatcher 6078 // object to act as a predicate-formatter suitable for using with 6079 // Google Test's EXPECT_PRED_FORMAT1() macro. 6080 template <typename T> 6081 AssertionResult operator()(const char* value_text, const T& x) const { 6082 // We convert matcher_ to a Matcher<const T&> *now* instead of 6083 // when the PredicateFormatterFromMatcher object was constructed, 6084 // as matcher_ may be polymorphic (e.g. NotNull()) and we won't 6085 // know which type to instantiate it to until we actually see the 6086 // type of x here. 6087 // 6088 // We write MatcherCast<const T&>(matcher_) instead of 6089 // Matcher<const T&>(matcher_), as the latter won't compile when 6090 // matcher_ has type Matcher<T> (e.g. An<int>()). 6091 const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_); 6092 StringMatchResultListener listener; 6093 if (MatchPrintAndExplain(x, matcher, &listener)) 6094 return AssertionSuccess(); 6095 6096 ::std::stringstream ss; 6097 ss << "Value of: " << value_text << "\n" 6098 << "Expected: "; 6099 matcher.DescribeTo(&ss); 6100 ss << "\n Actual: " << listener.str(); 6101 return AssertionFailure() << ss.str(); 6102 } 6103 6104 private: 6105 const M matcher_; 6106 6107 GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); 6108 }; 6109 6110 // A helper function for converting a matcher to a predicate-formatter 6111 // without the user needing to explicitly write the type. This is 6112 // used for implementing ASSERT_THAT() and EXPECT_THAT(). 6113 template <typename M> 6114 inline PredicateFormatterFromMatcher<M> 6115 MakePredicateFormatterFromMatcher(const M& matcher) { 6116 return PredicateFormatterFromMatcher<M>(matcher); 6117 } 6118 6119 // Implements the polymorphic floating point equality matcher, which 6120 // matches two float values using ULP-based approximation. The 6121 // template is meant to be instantiated with FloatType being either 6122 // float or double. 6123 template <typename FloatType> 6124 class FloatingEqMatcher { 6125 public: 6126 // Constructor for FloatingEqMatcher. 6127 // The matcher's input will be compared with rhs. The matcher treats two 6128 // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards, 6129 // equality comparisons between NANs will always return false. 6130 FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : 6131 rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 6132 6133 // Implements floating point equality matcher as a Matcher<T>. 6134 template <typename T> 6135 class Impl : public MatcherInterface<T> { 6136 public: 6137 Impl(FloatType rhs, bool nan_eq_nan) : 6138 rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 6139 6140 virtual bool MatchAndExplain(T value, 6141 MatchResultListener* /* listener */) const { 6142 const FloatingPoint<FloatType> lhs(value), rhs(rhs_); 6143 6144 // Compares NaNs first, if nan_eq_nan_ is true. 6145 if (nan_eq_nan_ && lhs.is_nan()) { 6146 return rhs.is_nan(); 6147 } 6148 6149 return lhs.AlmostEquals(rhs); 6150 } 6151 6152 virtual void DescribeTo(::std::ostream* os) const { 6153 // os->precision() returns the previously set precision, which we 6154 // store to restore the ostream to its original configuration 6155 // after outputting. 6156 const ::std::streamsize old_precision = os->precision( 6157 ::std::numeric_limits<FloatType>::digits10 + 2); 6158 if (FloatingPoint<FloatType>(rhs_).is_nan()) { 6159 if (nan_eq_nan_) { 6160 *os << "is NaN"; 6161 } else { 6162 *os << "never matches"; 6163 } 6164 } else { 6165 *os << "is approximately " << rhs_; 6166 } 6167 os->precision(old_precision); 6168 } 6169 6170 virtual void DescribeNegationTo(::std::ostream* os) const { 6171 // As before, get original precision. 6172 const ::std::streamsize old_precision = os->precision( 6173 ::std::numeric_limits<FloatType>::digits10 + 2); 6174 if (FloatingPoint<FloatType>(rhs_).is_nan()) { 6175 if (nan_eq_nan_) { 6176 *os << "isn't NaN"; 6177 } else { 6178 *os << "is anything"; 6179 } 6180 } else { 6181 *os << "isn't approximately " << rhs_; 6182 } 6183 // Restore original precision. 6184 os->precision(old_precision); 6185 } 6186 6187 private: 6188 const FloatType rhs_; 6189 const bool nan_eq_nan_; 6190 6191 GTEST_DISALLOW_ASSIGN_(Impl); 6192 }; 6193 6194 // The following 3 type conversion operators allow FloatEq(rhs) and 6195 // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a 6196 // Matcher<const float&>, or a Matcher<float&>, but nothing else. 6197 // (While Google's C++ coding style doesn't allow arguments passed 6198 // by non-const reference, we may see them in code not conforming to 6199 // the style. Therefore Google Mock needs to support them.) 6200 operator Matcher<FloatType>() const { 6201 return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_)); 6202 } 6203 6204 operator Matcher<const FloatType&>() const { 6205 return MakeMatcher(new Impl<const FloatType&>(rhs_, nan_eq_nan_)); 6206 } 6207 6208 operator Matcher<FloatType&>() const { 6209 return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_)); 6210 } 6211 private: 6212 const FloatType rhs_; 6213 const bool nan_eq_nan_; 6214 6215 GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher); 6216 }; 6217 6218 // Implements the Pointee(m) matcher for matching a pointer whose 6219 // pointee matches matcher m. The pointer can be either raw or smart. 6220 template <typename InnerMatcher> 6221 class PointeeMatcher { 6222 public: 6223 explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {} 6224 6225 // This type conversion operator template allows Pointee(m) to be 6226 // used as a matcher for any pointer type whose pointee type is 6227 // compatible with the inner matcher, where type Pointer can be 6228 // either a raw pointer or a smart pointer. 6229 // 6230 // The reason we do this instead of relying on 6231 // MakePolymorphicMatcher() is that the latter is not flexible 6232 // enough for implementing the DescribeTo() method of Pointee(). 6233 template <typename Pointer> 6234 operator Matcher<Pointer>() const { 6235 return MakeMatcher(new Impl<Pointer>(matcher_)); 6236 } 6237 6238 private: 6239 // The monomorphic implementation that works for a particular pointer type. 6240 template <typename Pointer> 6241 class Impl : public MatcherInterface<Pointer> { 6242 public: 6243 typedef typename PointeeOf<GTEST_REMOVE_CONST_( // NOLINT 6244 GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee; 6245 6246 explicit Impl(const InnerMatcher& matcher) 6247 : matcher_(MatcherCast<const Pointee&>(matcher)) {} 6248 6249 virtual void DescribeTo(::std::ostream* os) const { 6250 *os << "points to a value that "; 6251 matcher_.DescribeTo(os); 6252 } 6253 6254 virtual void DescribeNegationTo(::std::ostream* os) const { 6255 *os << "does not point to a value that "; 6256 matcher_.DescribeTo(os); 6257 } 6258 6259 virtual bool MatchAndExplain(Pointer pointer, 6260 MatchResultListener* listener) const { 6261 if (GetRawPointer(pointer) == NULL) 6262 return false; 6263 6264 *listener << "which points to "; 6265 return MatchPrintAndExplain(*pointer, matcher_, listener); 6266 } 6267 6268 private: 6269 const Matcher<const Pointee&> matcher_; 6270 6271 GTEST_DISALLOW_ASSIGN_(Impl); 6272 }; 6273 6274 const InnerMatcher matcher_; 6275 6276 GTEST_DISALLOW_ASSIGN_(PointeeMatcher); 6277 }; 6278 6279 // Implements the Field() matcher for matching a field (i.e. member 6280 // variable) of an object. 6281 template <typename Class, typename FieldType> 6282 class FieldMatcher { 6283 public: 6284 FieldMatcher(FieldType Class::*field, 6285 const Matcher<const FieldType&>& matcher) 6286 : field_(field), matcher_(matcher) {} 6287 6288 void DescribeTo(::std::ostream* os) const { 6289 *os << "is an object whose given field "; 6290 matcher_.DescribeTo(os); 6291 } 6292 6293 void DescribeNegationTo(::std::ostream* os) const { 6294 *os << "is an object whose given field "; 6295 matcher_.DescribeNegationTo(os); 6296 } 6297 6298 template <typename T> 6299 bool MatchAndExplain(const T& value, MatchResultListener* listener) const { 6300 return MatchAndExplainImpl( 6301 typename ::testing::internal:: 6302 is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 6303 value, listener); 6304 } 6305 6306 private: 6307 // The first argument of MatchAndExplainImpl() is needed to help 6308 // Symbian's C++ compiler choose which overload to use. Its type is 6309 // true_type iff the Field() matcher is used to match a pointer. 6310 bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 6311 MatchResultListener* listener) const { 6312 *listener << "whose given field is "; 6313 return MatchPrintAndExplain(obj.*field_, matcher_, listener); 6314 } 6315 6316 bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 6317 MatchResultListener* listener) const { 6318 if (p == NULL) 6319 return false; 6320 6321 *listener << "which points to an object "; 6322 // Since *p has a field, it must be a class/struct/union type and 6323 // thus cannot be a pointer. Therefore we pass false_type() as 6324 // the first argument. 6325 return MatchAndExplainImpl(false_type(), *p, listener); 6326 } 6327 6328 const FieldType Class::*field_; 6329 const Matcher<const FieldType&> matcher_; 6330 6331 GTEST_DISALLOW_ASSIGN_(FieldMatcher); 6332 }; 6333 6334 // Implements the Property() matcher for matching a property 6335 // (i.e. return value of a getter method) of an object. 6336 template <typename Class, typename PropertyType> 6337 class PropertyMatcher { 6338 public: 6339 // The property may have a reference type, so 'const PropertyType&' 6340 // may cause double references and fail to compile. That's why we 6341 // need GTEST_REFERENCE_TO_CONST, which works regardless of 6342 // PropertyType being a reference or not. 6343 typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; 6344 6345 PropertyMatcher(PropertyType (Class::*property)() const, 6346 const Matcher<RefToConstProperty>& matcher) 6347 : property_(property), matcher_(matcher) {} 6348 6349 void DescribeTo(::std::ostream* os) const { 6350 *os << "is an object whose given property "; 6351 matcher_.DescribeTo(os); 6352 } 6353 6354 void DescribeNegationTo(::std::ostream* os) const { 6355 *os << "is an object whose given property "; 6356 matcher_.DescribeNegationTo(os); 6357 } 6358 6359 template <typename T> 6360 bool MatchAndExplain(const T&value, MatchResultListener* listener) const { 6361 return MatchAndExplainImpl( 6362 typename ::testing::internal:: 6363 is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 6364 value, listener); 6365 } 6366 6367 private: 6368 // The first argument of MatchAndExplainImpl() is needed to help 6369 // Symbian's C++ compiler choose which overload to use. Its type is 6370 // true_type iff the Property() matcher is used to match a pointer. 6371 bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 6372 MatchResultListener* listener) const { 6373 *listener << "whose given property is "; 6374 // Cannot pass the return value (for example, int) to MatchPrintAndExplain, 6375 // which takes a non-const reference as argument. 6376 RefToConstProperty result = (obj.*property_)(); 6377 return MatchPrintAndExplain(result, matcher_, listener); 6378 } 6379 6380 bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 6381 MatchResultListener* listener) const { 6382 if (p == NULL) 6383 return false; 6384 6385 *listener << "which points to an object "; 6386 // Since *p has a property method, it must be a class/struct/union 6387 // type and thus cannot be a pointer. Therefore we pass 6388 // false_type() as the first argument. 6389 return MatchAndExplainImpl(false_type(), *p, listener); 6390 } 6391 6392 PropertyType (Class::*property_)() const; 6393 const Matcher<RefToConstProperty> matcher_; 6394 6395 GTEST_DISALLOW_ASSIGN_(PropertyMatcher); 6396 }; 6397 6398 // Type traits specifying various features of different functors for ResultOf. 6399 // The default template specifies features for functor objects. 6400 // Functor classes have to typedef argument_type and result_type 6401 // to be compatible with ResultOf. 6402 template <typename Functor> 6403 struct CallableTraits { 6404 typedef typename Functor::result_type ResultType; 6405 typedef Functor StorageType; 6406 6407 static void CheckIsValid(Functor /* functor */) {} 6408 template <typename T> 6409 static ResultType Invoke(Functor f, T arg) { return f(arg); } 6410 }; 6411 6412 // Specialization for function pointers. 6413 template <typename ArgType, typename ResType> 6414 struct CallableTraits<ResType(*)(ArgType)> { 6415 typedef ResType ResultType; 6416 typedef ResType(*StorageType)(ArgType); 6417 6418 static void CheckIsValid(ResType(*f)(ArgType)) { 6419 GTEST_CHECK_(f != NULL) 6420 << "NULL function pointer is passed into ResultOf()."; 6421 } 6422 template <typename T> 6423 static ResType Invoke(ResType(*f)(ArgType), T arg) { 6424 return (*f)(arg); 6425 } 6426 }; 6427 6428 // Implements the ResultOf() matcher for matching a return value of a 6429 // unary function of an object. 6430 template <typename Callable> 6431 class ResultOfMatcher { 6432 public: 6433 typedef typename CallableTraits<Callable>::ResultType ResultType; 6434 6435 ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher) 6436 : callable_(callable), matcher_(matcher) { 6437 CallableTraits<Callable>::CheckIsValid(callable_); 6438 } 6439 6440 template <typename T> 6441 operator Matcher<T>() const { 6442 return Matcher<T>(new Impl<T>(callable_, matcher_)); 6443 } 6444 6445 private: 6446 typedef typename CallableTraits<Callable>::StorageType CallableStorageType; 6447 6448 template <typename T> 6449 class Impl : public MatcherInterface<T> { 6450 public: 6451 Impl(CallableStorageType callable, const Matcher<ResultType>& matcher) 6452 : callable_(callable), matcher_(matcher) {} 6453 6454 virtual void DescribeTo(::std::ostream* os) const { 6455 *os << "is mapped by the given callable to a value that "; 6456 matcher_.DescribeTo(os); 6457 } 6458 6459 virtual void DescribeNegationTo(::std::ostream* os) const { 6460 *os << "is mapped by the given callable to a value that "; 6461 matcher_.DescribeNegationTo(os); 6462 } 6463 6464 virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const { 6465 *listener << "which is mapped by the given callable to "; 6466 // Cannot pass the return value (for example, int) to 6467 // MatchPrintAndExplain, which takes a non-const reference as argument. 6468 ResultType result = 6469 CallableTraits<Callable>::template Invoke<T>(callable_, obj); 6470 return MatchPrintAndExplain(result, matcher_, listener); 6471 } 6472 6473 private: 6474 // Functors often define operator() as non-const method even though 6475 // they are actualy stateless. But we need to use them even when 6476 // 'this' is a const pointer. It's the user's responsibility not to 6477 // use stateful callables with ResultOf(), which does't guarantee 6478 // how many times the callable will be invoked. 6479 mutable CallableStorageType callable_; 6480 const Matcher<ResultType> matcher_; 6481 6482 GTEST_DISALLOW_ASSIGN_(Impl); 6483 }; // class Impl 6484 6485 const CallableStorageType callable_; 6486 const Matcher<ResultType> matcher_; 6487 6488 GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); 6489 }; 6490 6491 // Implements an equality matcher for any STL-style container whose elements 6492 // support ==. This matcher is like Eq(), but its failure explanations provide 6493 // more detailed information that is useful when the container is used as a set. 6494 // The failure message reports elements that are in one of the operands but not 6495 // the other. The failure messages do not report duplicate or out-of-order 6496 // elements in the containers (which don't properly matter to sets, but can 6497 // occur if the containers are vectors or lists, for example). 6498 // 6499 // Uses the container's const_iterator, value_type, operator ==, 6500 // begin(), and end(). 6501 template <typename Container> 6502 class ContainerEqMatcher { 6503 public: 6504 typedef internal::StlContainerView<Container> View; 6505 typedef typename View::type StlContainer; 6506 typedef typename View::const_reference StlContainerReference; 6507 6508 // We make a copy of rhs in case the elements in it are modified 6509 // after this matcher is created. 6510 explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { 6511 // Makes sure the user doesn't instantiate this class template 6512 // with a const or reference type. 6513 (void)testing::StaticAssertTypeEq<Container, 6514 GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>(); 6515 } 6516 6517 void DescribeTo(::std::ostream* os) const { 6518 *os << "equals "; 6519 UniversalPrint(rhs_, os); 6520 } 6521 void DescribeNegationTo(::std::ostream* os) const { 6522 *os << "does not equal "; 6523 UniversalPrint(rhs_, os); 6524 } 6525 6526 template <typename LhsContainer> 6527 bool MatchAndExplain(const LhsContainer& lhs, 6528 MatchResultListener* listener) const { 6529 // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug 6530 // that causes LhsContainer to be a const type sometimes. 6531 typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)> 6532 LhsView; 6533 typedef typename LhsView::type LhsStlContainer; 6534 StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 6535 if (lhs_stl_container == rhs_) 6536 return true; 6537 6538 ::std::ostream* const os = listener->stream(); 6539 if (os != NULL) { 6540 // Something is different. Check for extra values first. 6541 bool printed_header = false; 6542 for (typename LhsStlContainer::const_iterator it = 6543 lhs_stl_container.begin(); 6544 it != lhs_stl_container.end(); ++it) { 6545 if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == 6546 rhs_.end()) { 6547 if (printed_header) { 6548 *os << ", "; 6549 } else { 6550 *os << "which has these unexpected elements: "; 6551 printed_header = true; 6552 } 6553 UniversalPrint(*it, os); 6554 } 6555 } 6556 6557 // Now check for missing values. 6558 bool printed_header2 = false; 6559 for (typename StlContainer::const_iterator it = rhs_.begin(); 6560 it != rhs_.end(); ++it) { 6561 if (internal::ArrayAwareFind( 6562 lhs_stl_container.begin(), lhs_stl_container.end(), *it) == 6563 lhs_stl_container.end()) { 6564 if (printed_header2) { 6565 *os << ", "; 6566 } else { 6567 *os << (printed_header ? ",\nand" : "which") 6568 << " doesn't have these expected elements: "; 6569 printed_header2 = true; 6570 } 6571 UniversalPrint(*it, os); 6572 } 6573 } 6574 } 6575 6576 return false; 6577 } 6578 6579 private: 6580 const StlContainer rhs_; 6581 6582 GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); 6583 }; 6584 6585 // Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher 6586 // must be able to be safely cast to Matcher<tuple<const T1&, const 6587 // T2&> >, where T1 and T2 are the types of elements in the LHS 6588 // container and the RHS container respectively. 6589 template <typename TupleMatcher, typename RhsContainer> 6590 class PointwiseMatcher { 6591 public: 6592 typedef internal::StlContainerView<RhsContainer> RhsView; 6593 typedef typename RhsView::type RhsStlContainer; 6594 typedef typename RhsStlContainer::value_type RhsValue; 6595 6596 // Like ContainerEq, we make a copy of rhs in case the elements in 6597 // it are modified after this matcher is created. 6598 PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs) 6599 : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) { 6600 // Makes sure the user doesn't instantiate this class template 6601 // with a const or reference type. 6602 (void)testing::StaticAssertTypeEq<RhsContainer, 6603 GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>(); 6604 } 6605 6606 template <typename LhsContainer> 6607 operator Matcher<LhsContainer>() const { 6608 return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_)); 6609 } 6610 6611 template <typename LhsContainer> 6612 class Impl : public MatcherInterface<LhsContainer> { 6613 public: 6614 typedef internal::StlContainerView< 6615 GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView; 6616 typedef typename LhsView::type LhsStlContainer; 6617 typedef typename LhsView::const_reference LhsStlContainerReference; 6618 typedef typename LhsStlContainer::value_type LhsValue; 6619 // We pass the LHS value and the RHS value to the inner matcher by 6620 // reference, as they may be expensive to copy. We must use tuple 6621 // instead of pair here, as a pair cannot hold references (C++ 98, 6622 // 20.2.2 [lib.pairs]). 6623 typedef std::tr1::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg; 6624 6625 Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs) 6626 // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher. 6627 : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)), 6628 rhs_(rhs) {} 6629 6630 virtual void DescribeTo(::std::ostream* os) const { 6631 *os << "contains " << rhs_.size() 6632 << " values, where each value and its corresponding value in "; 6633 UniversalPrinter<RhsStlContainer>::Print(rhs_, os); 6634 *os << " "; 6635 mono_tuple_matcher_.DescribeTo(os); 6636 } 6637 virtual void DescribeNegationTo(::std::ostream* os) const { 6638 *os << "doesn't contain exactly " << rhs_.size() 6639 << " values, or contains a value x at some index i" 6640 << " where x and the i-th value of "; 6641 UniversalPrint(rhs_, os); 6642 *os << " "; 6643 mono_tuple_matcher_.DescribeNegationTo(os); 6644 } 6645 6646 virtual bool MatchAndExplain(LhsContainer lhs, 6647 MatchResultListener* listener) const { 6648 LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 6649 const size_t actual_size = lhs_stl_container.size(); 6650 if (actual_size != rhs_.size()) { 6651 *listener << "which contains " << actual_size << " values"; 6652 return false; 6653 } 6654 6655 typename LhsStlContainer::const_iterator left = lhs_stl_container.begin(); 6656 typename RhsStlContainer::const_iterator right = rhs_.begin(); 6657 for (size_t i = 0; i != actual_size; ++i, ++left, ++right) { 6658 const InnerMatcherArg value_pair(*left, *right); 6659 6660 if (listener->IsInterested()) { 6661 StringMatchResultListener inner_listener; 6662 if (!mono_tuple_matcher_.MatchAndExplain( 6663 value_pair, &inner_listener)) { 6664 *listener << "where the value pair ("; 6665 UniversalPrint(*left, listener->stream()); 6666 *listener << ", "; 6667 UniversalPrint(*right, listener->stream()); 6668 *listener << ") at index #" << i << " don't match"; 6669 PrintIfNotEmpty(inner_listener.str(), listener->stream()); 6670 return false; 6671 } 6672 } else { 6673 if (!mono_tuple_matcher_.Matches(value_pair)) 6674 return false; 6675 } 6676 } 6677 6678 return true; 6679 } 6680 6681 private: 6682 const Matcher<InnerMatcherArg> mono_tuple_matcher_; 6683 const RhsStlContainer rhs_; 6684 6685 GTEST_DISALLOW_ASSIGN_(Impl); 6686 }; 6687 6688 private: 6689 const TupleMatcher tuple_matcher_; 6690 const RhsStlContainer rhs_; 6691 6692 GTEST_DISALLOW_ASSIGN_(PointwiseMatcher); 6693 }; 6694 6695 // Holds the logic common to ContainsMatcherImpl and EachMatcherImpl. 6696 template <typename Container> 6697 class QuantifierMatcherImpl : public MatcherInterface<Container> { 6698 public: 6699 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 6700 typedef StlContainerView<RawContainer> View; 6701 typedef typename View::type StlContainer; 6702 typedef typename View::const_reference StlContainerReference; 6703 typedef typename StlContainer::value_type Element; 6704 6705 template <typename InnerMatcher> 6706 explicit QuantifierMatcherImpl(InnerMatcher inner_matcher) 6707 : inner_matcher_( 6708 testing::SafeMatcherCast<const Element&>(inner_matcher)) {} 6709 6710 // Checks whether: 6711 // * All elements in the container match, if all_elements_should_match. 6712 // * Any element in the container matches, if !all_elements_should_match. 6713 bool MatchAndExplainImpl(bool all_elements_should_match, 6714 Container container, 6715 MatchResultListener* listener) const { 6716 StlContainerReference stl_container = View::ConstReference(container); 6717 size_t i = 0; 6718 for (typename StlContainer::const_iterator it = stl_container.begin(); 6719 it != stl_container.end(); ++it, ++i) { 6720 StringMatchResultListener inner_listener; 6721 const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener); 6722 6723 if (matches != all_elements_should_match) { 6724 *listener << "whose element #" << i 6725 << (matches ? " matches" : " doesn't match"); 6726 PrintIfNotEmpty(inner_listener.str(), listener->stream()); 6727 return !all_elements_should_match; 6728 } 6729 } 6730 return all_elements_should_match; 6731 } 6732 6733 protected: 6734 const Matcher<const Element&> inner_matcher_; 6735 6736 GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl); 6737 }; 6738 6739 // Implements Contains(element_matcher) for the given argument type Container. 6740 // Symmetric to EachMatcherImpl. 6741 template <typename Container> 6742 class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> { 6743 public: 6744 template <typename InnerMatcher> 6745 explicit ContainsMatcherImpl(InnerMatcher inner_matcher) 6746 : QuantifierMatcherImpl<Container>(inner_matcher) {} 6747 6748 // Describes what this matcher does. 6749 virtual void DescribeTo(::std::ostream* os) const { 6750 *os << "contains at least one element that "; 6751 this->inner_matcher_.DescribeTo(os); 6752 } 6753 6754 virtual void DescribeNegationTo(::std::ostream* os) const { 6755 *os << "doesn't contain any element that "; 6756 this->inner_matcher_.DescribeTo(os); 6757 } 6758 6759 virtual bool MatchAndExplain(Container container, 6760 MatchResultListener* listener) const { 6761 return this->MatchAndExplainImpl(false, container, listener); 6762 } 6763 6764 private: 6765 GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); 6766 }; 6767 6768 // Implements Each(element_matcher) for the given argument type Container. 6769 // Symmetric to ContainsMatcherImpl. 6770 template <typename Container> 6771 class EachMatcherImpl : public QuantifierMatcherImpl<Container> { 6772 public: 6773 template <typename InnerMatcher> 6774 explicit EachMatcherImpl(InnerMatcher inner_matcher) 6775 : QuantifierMatcherImpl<Container>(inner_matcher) {} 6776 6777 // Describes what this matcher does. 6778 virtual void DescribeTo(::std::ostream* os) const { 6779 *os << "only contains elements that "; 6780 this->inner_matcher_.DescribeTo(os); 6781 } 6782 6783 virtual void DescribeNegationTo(::std::ostream* os) const { 6784 *os << "contains some element that "; 6785 this->inner_matcher_.DescribeNegationTo(os); 6786 } 6787 6788 virtual bool MatchAndExplain(Container container, 6789 MatchResultListener* listener) const { 6790 return this->MatchAndExplainImpl(true, container, listener); 6791 } 6792 6793 private: 6794 GTEST_DISALLOW_ASSIGN_(EachMatcherImpl); 6795 }; 6796 6797 // Implements polymorphic Contains(element_matcher). 6798 template <typename M> 6799 class ContainsMatcher { 6800 public: 6801 explicit ContainsMatcher(M m) : inner_matcher_(m) {} 6802 6803 template <typename Container> 6804 operator Matcher<Container>() const { 6805 return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_)); 6806 } 6807 6808 private: 6809 const M inner_matcher_; 6810 6811 GTEST_DISALLOW_ASSIGN_(ContainsMatcher); 6812 }; 6813 6814 // Implements polymorphic Each(element_matcher). 6815 template <typename M> 6816 class EachMatcher { 6817 public: 6818 explicit EachMatcher(M m) : inner_matcher_(m) {} 6819 6820 template <typename Container> 6821 operator Matcher<Container>() const { 6822 return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_)); 6823 } 6824 6825 private: 6826 const M inner_matcher_; 6827 6828 GTEST_DISALLOW_ASSIGN_(EachMatcher); 6829 }; 6830 6831 // Implements Key(inner_matcher) for the given argument pair type. 6832 // Key(inner_matcher) matches an std::pair whose 'first' field matches 6833 // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 6834 // std::map that contains at least one element whose key is >= 5. 6835 template <typename PairType> 6836 class KeyMatcherImpl : public MatcherInterface<PairType> { 6837 public: 6838 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType; 6839 typedef typename RawPairType::first_type KeyType; 6840 6841 template <typename InnerMatcher> 6842 explicit KeyMatcherImpl(InnerMatcher inner_matcher) 6843 : inner_matcher_( 6844 testing::SafeMatcherCast<const KeyType&>(inner_matcher)) { 6845 } 6846 6847 // Returns true iff 'key_value.first' (the key) matches the inner matcher. 6848 virtual bool MatchAndExplain(PairType key_value, 6849 MatchResultListener* listener) const { 6850 StringMatchResultListener inner_listener; 6851 const bool match = inner_matcher_.MatchAndExplain(key_value.first, 6852 &inner_listener); 6853 const internal::string explanation = inner_listener.str(); 6854 if (explanation != "") { 6855 *listener << "whose first field is a value " << explanation; 6856 } 6857 return match; 6858 } 6859 6860 // Describes what this matcher does. 6861 virtual void DescribeTo(::std::ostream* os) const { 6862 *os << "has a key that "; 6863 inner_matcher_.DescribeTo(os); 6864 } 6865 6866 // Describes what the negation of this matcher does. 6867 virtual void DescribeNegationTo(::std::ostream* os) const { 6868 *os << "doesn't have a key that "; 6869 inner_matcher_.DescribeTo(os); 6870 } 6871 6872 private: 6873 const Matcher<const KeyType&> inner_matcher_; 6874 6875 GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); 6876 }; 6877 6878 // Implements polymorphic Key(matcher_for_key). 6879 template <typename M> 6880 class KeyMatcher { 6881 public: 6882 explicit KeyMatcher(M m) : matcher_for_key_(m) {} 6883 6884 template <typename PairType> 6885 operator Matcher<PairType>() const { 6886 return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_)); 6887 } 6888 6889 private: 6890 const M matcher_for_key_; 6891 6892 GTEST_DISALLOW_ASSIGN_(KeyMatcher); 6893 }; 6894 6895 // Implements Pair(first_matcher, second_matcher) for the given argument pair 6896 // type with its two matchers. See Pair() function below. 6897 template <typename PairType> 6898 class PairMatcherImpl : public MatcherInterface<PairType> { 6899 public: 6900 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType; 6901 typedef typename RawPairType::first_type FirstType; 6902 typedef typename RawPairType::second_type SecondType; 6903 6904 template <typename FirstMatcher, typename SecondMatcher> 6905 PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) 6906 : first_matcher_( 6907 testing::SafeMatcherCast<const FirstType&>(first_matcher)), 6908 second_matcher_( 6909 testing::SafeMatcherCast<const SecondType&>(second_matcher)) { 6910 } 6911 6912 // Describes what this matcher does. 6913 virtual void DescribeTo(::std::ostream* os) const { 6914 *os << "has a first field that "; 6915 first_matcher_.DescribeTo(os); 6916 *os << ", and has a second field that "; 6917 second_matcher_.DescribeTo(os); 6918 } 6919 6920 // Describes what the negation of this matcher does. 6921 virtual void DescribeNegationTo(::std::ostream* os) const { 6922 *os << "has a first field that "; 6923 first_matcher_.DescribeNegationTo(os); 6924 *os << ", or has a second field that "; 6925 second_matcher_.DescribeNegationTo(os); 6926 } 6927 6928 // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' 6929 // matches second_matcher. 6930 virtual bool MatchAndExplain(PairType a_pair, 6931 MatchResultListener* listener) const { 6932 if (!listener->IsInterested()) { 6933 // If the listener is not interested, we don't need to construct the 6934 // explanation. 6935 return first_matcher_.Matches(a_pair.first) && 6936 second_matcher_.Matches(a_pair.second); 6937 } 6938 StringMatchResultListener first_inner_listener; 6939 if (!first_matcher_.MatchAndExplain(a_pair.first, 6940 &first_inner_listener)) { 6941 *listener << "whose first field does not match"; 6942 PrintIfNotEmpty(first_inner_listener.str(), listener->stream()); 6943 return false; 6944 } 6945 StringMatchResultListener second_inner_listener; 6946 if (!second_matcher_.MatchAndExplain(a_pair.second, 6947 &second_inner_listener)) { 6948 *listener << "whose second field does not match"; 6949 PrintIfNotEmpty(second_inner_listener.str(), listener->stream()); 6950 return false; 6951 } 6952 ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(), 6953 listener); 6954 return true; 6955 } 6956 6957 private: 6958 void ExplainSuccess(const internal::string& first_explanation, 6959 const internal::string& second_explanation, 6960 MatchResultListener* listener) const { 6961 *listener << "whose both fields match"; 6962 if (first_explanation != "") { 6963 *listener << ", where the first field is a value " << first_explanation; 6964 } 6965 if (second_explanation != "") { 6966 *listener << ", "; 6967 if (first_explanation != "") { 6968 *listener << "and "; 6969 } else { 6970 *listener << "where "; 6971 } 6972 *listener << "the second field is a value " << second_explanation; 6973 } 6974 } 6975 6976 const Matcher<const FirstType&> first_matcher_; 6977 const Matcher<const SecondType&> second_matcher_; 6978 6979 GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); 6980 }; 6981 6982 // Implements polymorphic Pair(first_matcher, second_matcher). 6983 template <typename FirstMatcher, typename SecondMatcher> 6984 class PairMatcher { 6985 public: 6986 PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher) 6987 : first_matcher_(first_matcher), second_matcher_(second_matcher) {} 6988 6989 template <typename PairType> 6990 operator Matcher<PairType> () const { 6991 return MakeMatcher( 6992 new PairMatcherImpl<PairType>( 6993 first_matcher_, second_matcher_)); 6994 } 6995 6996 private: 6997 const FirstMatcher first_matcher_; 6998 const SecondMatcher second_matcher_; 6999 7000 GTEST_DISALLOW_ASSIGN_(PairMatcher); 7001 }; 7002 7003 // Implements ElementsAre() and ElementsAreArray(). 7004 template <typename Container> 7005 class ElementsAreMatcherImpl : public MatcherInterface<Container> { 7006 public: 7007 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 7008 typedef internal::StlContainerView<RawContainer> View; 7009 typedef typename View::type StlContainer; 7010 typedef typename View::const_reference StlContainerReference; 7011 typedef typename StlContainer::value_type Element; 7012 7013 // Constructs the matcher from a sequence of element values or 7014 // element matchers. 7015 template <typename InputIter> 7016 ElementsAreMatcherImpl(InputIter first, size_t a_count) { 7017 matchers_.reserve(a_count); 7018 InputIter it = first; 7019 for (size_t i = 0; i != a_count; ++i, ++it) { 7020 matchers_.push_back(MatcherCast<const Element&>(*it)); 7021 } 7022 } 7023 7024 // Describes what this matcher does. 7025 virtual void DescribeTo(::std::ostream* os) const { 7026 if (count() == 0) { 7027 *os << "is empty"; 7028 } else if (count() == 1) { 7029 *os << "has 1 element that "; 7030 matchers_[0].DescribeTo(os); 7031 } else { 7032 *os << "has " << Elements(count()) << " where\n"; 7033 for (size_t i = 0; i != count(); ++i) { 7034 *os << "element #" << i << " "; 7035 matchers_[i].DescribeTo(os); 7036 if (i + 1 < count()) { 7037 *os << ",\n"; 7038 } 7039 } 7040 } 7041 } 7042 7043 // Describes what the negation of this matcher does. 7044 virtual void DescribeNegationTo(::std::ostream* os) const { 7045 if (count() == 0) { 7046 *os << "isn't empty"; 7047 return; 7048 } 7049 7050 *os << "doesn't have " << Elements(count()) << ", or\n"; 7051 for (size_t i = 0; i != count(); ++i) { 7052 *os << "element #" << i << " "; 7053 matchers_[i].DescribeNegationTo(os); 7054 if (i + 1 < count()) { 7055 *os << ", or\n"; 7056 } 7057 } 7058 } 7059 7060 virtual bool MatchAndExplain(Container container, 7061 MatchResultListener* listener) const { 7062 StlContainerReference stl_container = View::ConstReference(container); 7063 const size_t actual_count = stl_container.size(); 7064 if (actual_count != count()) { 7065 // The element count doesn't match. If the container is empty, 7066 // there's no need to explain anything as Google Mock already 7067 // prints the empty container. Otherwise we just need to show 7068 // how many elements there actually are. 7069 if (actual_count != 0) { 7070 *listener << "which has " << Elements(actual_count); 7071 } 7072 return false; 7073 } 7074 7075 typename StlContainer::const_iterator it = stl_container.begin(); 7076 // explanations[i] is the explanation of the element at index i. 7077 std::vector<internal::string> explanations(count()); 7078 for (size_t i = 0; i != count(); ++it, ++i) { 7079 StringMatchResultListener s; 7080 if (matchers_[i].MatchAndExplain(*it, &s)) { 7081 explanations[i] = s.str(); 7082 } else { 7083 // The container has the right size but the i-th element 7084 // doesn't match its expectation. 7085 *listener << "whose element #" << i << " doesn't match"; 7086 PrintIfNotEmpty(s.str(), listener->stream()); 7087 return false; 7088 } 7089 } 7090 7091 // Every element matches its expectation. We need to explain why 7092 // (the obvious ones can be skipped). 7093 bool reason_printed = false; 7094 for (size_t i = 0; i != count(); ++i) { 7095 const internal::string& s = explanations[i]; 7096 if (!s.empty()) { 7097 if (reason_printed) { 7098 *listener << ",\nand "; 7099 } 7100 *listener << "whose element #" << i << " matches, " << s; 7101 reason_printed = true; 7102 } 7103 } 7104 7105 return true; 7106 } 7107 7108 private: 7109 static Message Elements(size_t count) { 7110 return Message() << count << (count == 1 ? " element" : " elements"); 7111 } 7112 7113 size_t count() const { return matchers_.size(); } 7114 std::vector<Matcher<const Element&> > matchers_; 7115 7116 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl); 7117 }; 7118 7119 // Implements ElementsAre() of 0 arguments. 7120 class ElementsAreMatcher0 { 7121 public: 7122 ElementsAreMatcher0() {} 7123 7124 template <typename Container> 7125 operator Matcher<Container>() const { 7126 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 7127 typedef typename internal::StlContainerView<RawContainer>::type::value_type 7128 Element; 7129 7130 const Matcher<const Element&>* const matchers = NULL; 7131 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 0)); 7132 } 7133 }; 7134 7135 // Implements ElementsAreArray(). 7136 template <typename T> 7137 class ElementsAreArrayMatcher { 7138 public: 7139 ElementsAreArrayMatcher(const T* first, size_t count) : 7140 first_(first), count_(count) {} 7141 7142 template <typename Container> 7143 operator Matcher<Container>() const { 7144 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 7145 typedef typename internal::StlContainerView<RawContainer>::type::value_type 7146 Element; 7147 7148 return MakeMatcher(new ElementsAreMatcherImpl<Container>(first_, count_)); 7149 } 7150 7151 private: 7152 const T* const first_; 7153 const size_t count_; 7154 7155 GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher); 7156 }; 7157 7158 // Returns the description for a matcher defined using the MATCHER*() 7159 // macro where the user-supplied description string is "", if 7160 // 'negation' is false; otherwise returns the description of the 7161 // negation of the matcher. 'param_values' contains a list of strings 7162 // that are the print-out of the matcher's parameters. 7163 string FormatMatcherDescription(bool negation, const char* matcher_name, 7164 const Strings& param_values); 7165 7166 } // namespace internal 7167 7168 // Implements MatcherCast(). 7169 template <typename T, typename M> 7170 inline Matcher<T> MatcherCast(M matcher) { 7171 return internal::MatcherCastImpl<T, M>::Cast(matcher); 7172 } 7173 7174 // _ is a matcher that matches anything of any type. 7175 // 7176 // This definition is fine as: 7177 // 7178 // 1. The C++ standard permits using the name _ in a namespace that 7179 // is not the global namespace or ::std. 7180 // 2. The AnythingMatcher class has no data member or constructor, 7181 // so it's OK to create global variables of this type. 7182 // 3. c-style has approved of using _ in this case. 7183 const internal::AnythingMatcher _ = {}; 7184 // Creates a matcher that matches any value of the given type T. 7185 template <typename T> 7186 inline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); } 7187 7188 // Creates a matcher that matches any value of the given type T. 7189 template <typename T> 7190 inline Matcher<T> An() { return A<T>(); } 7191 7192 // Creates a polymorphic matcher that matches anything equal to x. 7193 // Note: if the parameter of Eq() were declared as const T&, Eq("foo") 7194 // wouldn't compile. 7195 template <typename T> 7196 inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); } 7197 7198 // Constructs a Matcher<T> from a 'value' of type T. The constructed 7199 // matcher matches any value that's equal to 'value'. 7200 template <typename T> 7201 Matcher<T>::Matcher(T value) { *this = Eq(value); } 7202 7203 // Creates a monomorphic matcher that matches anything with type Lhs 7204 // and equal to rhs. A user may need to use this instead of Eq(...) 7205 // in order to resolve an overloading ambiguity. 7206 // 7207 // TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x)) 7208 // or Matcher<T>(x), but more readable than the latter. 7209 // 7210 // We could define similar monomorphic matchers for other comparison 7211 // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do 7212 // it yet as those are used much less than Eq() in practice. A user 7213 // can always write Matcher<T>(Lt(5)) to be explicit about the type, 7214 // for example. 7215 template <typename Lhs, typename Rhs> 7216 inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); } 7217 7218 // Creates a polymorphic matcher that matches anything >= x. 7219 template <typename Rhs> 7220 inline internal::GeMatcher<Rhs> Ge(Rhs x) { 7221 return internal::GeMatcher<Rhs>(x); 7222 } 7223 7224 // Creates a polymorphic matcher that matches anything > x. 7225 template <typename Rhs> 7226 inline internal::GtMatcher<Rhs> Gt(Rhs x) { 7227 return internal::GtMatcher<Rhs>(x); 7228 } 7229 7230 // Creates a polymorphic matcher that matches anything <= x. 7231 template <typename Rhs> 7232 inline internal::LeMatcher<Rhs> Le(Rhs x) { 7233 return internal::LeMatcher<Rhs>(x); 7234 } 7235 7236 // Creates a polymorphic matcher that matches anything < x. 7237 template <typename Rhs> 7238 inline internal::LtMatcher<Rhs> Lt(Rhs x) { 7239 return internal::LtMatcher<Rhs>(x); 7240 } 7241 7242 // Creates a polymorphic matcher that matches anything != x. 7243 template <typename Rhs> 7244 inline internal::NeMatcher<Rhs> Ne(Rhs x) { 7245 return internal::NeMatcher<Rhs>(x); 7246 } 7247 7248 // Creates a polymorphic matcher that matches any NULL pointer. 7249 inline PolymorphicMatcher<internal::IsNullMatcher > IsNull() { 7250 return MakePolymorphicMatcher(internal::IsNullMatcher()); 7251 } 7252 7253 // Creates a polymorphic matcher that matches any non-NULL pointer. 7254 // This is convenient as Not(NULL) doesn't compile (the compiler 7255 // thinks that that expression is comparing a pointer with an integer). 7256 inline PolymorphicMatcher<internal::NotNullMatcher > NotNull() { 7257 return MakePolymorphicMatcher(internal::NotNullMatcher()); 7258 } 7259 7260 // Creates a polymorphic matcher that matches any argument that 7261 // references variable x. 7262 template <typename T> 7263 inline internal::RefMatcher<T&> Ref(T& x) { // NOLINT 7264 return internal::RefMatcher<T&>(x); 7265 } 7266 7267 // Creates a matcher that matches any double argument approximately 7268 // equal to rhs, where two NANs are considered unequal. 7269 inline internal::FloatingEqMatcher<double> DoubleEq(double rhs) { 7270 return internal::FloatingEqMatcher<double>(rhs, false); 7271 } 7272 7273 // Creates a matcher that matches any double argument approximately 7274 // equal to rhs, including NaN values when rhs is NaN. 7275 inline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) { 7276 return internal::FloatingEqMatcher<double>(rhs, true); 7277 } 7278 7279 // Creates a matcher that matches any float argument approximately 7280 // equal to rhs, where two NANs are considered unequal. 7281 inline internal::FloatingEqMatcher<float> FloatEq(float rhs) { 7282 return internal::FloatingEqMatcher<float>(rhs, false); 7283 } 7284 7285 // Creates a matcher that matches any double argument approximately 7286 // equal to rhs, including NaN values when rhs is NaN. 7287 inline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) { 7288 return internal::FloatingEqMatcher<float>(rhs, true); 7289 } 7290 7291 // Creates a matcher that matches a pointer (raw or smart) that points 7292 // to a value that matches inner_matcher. 7293 template <typename InnerMatcher> 7294 inline internal::PointeeMatcher<InnerMatcher> Pointee( 7295 const InnerMatcher& inner_matcher) { 7296 return internal::PointeeMatcher<InnerMatcher>(inner_matcher); 7297 } 7298 7299 // Creates a matcher that matches an object whose given field matches 7300 // 'matcher'. For example, 7301 // Field(&Foo::number, Ge(5)) 7302 // matches a Foo object x iff x.number >= 5. 7303 template <typename Class, typename FieldType, typename FieldMatcher> 7304 inline PolymorphicMatcher< 7305 internal::FieldMatcher<Class, FieldType> > Field( 7306 FieldType Class::*field, const FieldMatcher& matcher) { 7307 return MakePolymorphicMatcher( 7308 internal::FieldMatcher<Class, FieldType>( 7309 field, MatcherCast<const FieldType&>(matcher))); 7310 // The call to MatcherCast() is required for supporting inner 7311 // matchers of compatible types. For example, it allows 7312 // Field(&Foo::bar, m) 7313 // to compile where bar is an int32 and m is a matcher for int64. 7314 } 7315 7316 // Creates a matcher that matches an object whose given property 7317 // matches 'matcher'. For example, 7318 // Property(&Foo::str, StartsWith("hi")) 7319 // matches a Foo object x iff x.str() starts with "hi". 7320 template <typename Class, typename PropertyType, typename PropertyMatcher> 7321 inline PolymorphicMatcher< 7322 internal::PropertyMatcher<Class, PropertyType> > Property( 7323 PropertyType (Class::*property)() const, const PropertyMatcher& matcher) { 7324 return MakePolymorphicMatcher( 7325 internal::PropertyMatcher<Class, PropertyType>( 7326 property, 7327 MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); 7328 // The call to MatcherCast() is required for supporting inner 7329 // matchers of compatible types. For example, it allows 7330 // Property(&Foo::bar, m) 7331 // to compile where bar() returns an int32 and m is a matcher for int64. 7332 } 7333 7334 // Creates a matcher that matches an object iff the result of applying 7335 // a callable to x matches 'matcher'. 7336 // For example, 7337 // ResultOf(f, StartsWith("hi")) 7338 // matches a Foo object x iff f(x) starts with "hi". 7339 // callable parameter can be a function, function pointer, or a functor. 7340 // Callable has to satisfy the following conditions: 7341 // * It is required to keep no state affecting the results of 7342 // the calls on it and make no assumptions about how many calls 7343 // will be made. Any state it keeps must be protected from the 7344 // concurrent access. 7345 // * If it is a function object, it has to define type result_type. 7346 // We recommend deriving your functor classes from std::unary_function. 7347 template <typename Callable, typename ResultOfMatcher> 7348 internal::ResultOfMatcher<Callable> ResultOf( 7349 Callable callable, const ResultOfMatcher& matcher) { 7350 return internal::ResultOfMatcher<Callable>( 7351 callable, 7352 MatcherCast<typename internal::CallableTraits<Callable>::ResultType>( 7353 matcher)); 7354 // The call to MatcherCast() is required for supporting inner 7355 // matchers of compatible types. For example, it allows 7356 // ResultOf(Function, m) 7357 // to compile where Function() returns an int32 and m is a matcher for int64. 7358 } 7359 7360 // String matchers. 7361 7362 // Matches a string equal to str. 7363 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 7364 StrEq(const internal::string& str) { 7365 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 7366 str, true, true)); 7367 } 7368 7369 // Matches a string not equal to str. 7370 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 7371 StrNe(const internal::string& str) { 7372 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 7373 str, false, true)); 7374 } 7375 7376 // Matches a string equal to str, ignoring case. 7377 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 7378 StrCaseEq(const internal::string& str) { 7379 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 7380 str, true, false)); 7381 } 7382 7383 // Matches a string not equal to str, ignoring case. 7384 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 7385 StrCaseNe(const internal::string& str) { 7386 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 7387 str, false, false)); 7388 } 7389 7390 // Creates a matcher that matches any string, std::string, or C string 7391 // that contains the given substring. 7392 inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> > 7393 HasSubstr(const internal::string& substring) { 7394 return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>( 7395 substring)); 7396 } 7397 7398 // Matches a string that starts with 'prefix' (case-sensitive). 7399 inline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> > 7400 StartsWith(const internal::string& prefix) { 7401 return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>( 7402 prefix)); 7403 } 7404 7405 // Matches a string that ends with 'suffix' (case-sensitive). 7406 inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> > 7407 EndsWith(const internal::string& suffix) { 7408 return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>( 7409 suffix)); 7410 } 7411 7412 // Matches a string that fully matches regular expression 'regex'. 7413 // The matcher takes ownership of 'regex'. 7414 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 7415 const internal::RE* regex) { 7416 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); 7417 } 7418 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 7419 const internal::string& regex) { 7420 return MatchesRegex(new internal::RE(regex)); 7421 } 7422 7423 // Matches a string that contains regular expression 'regex'. 7424 // The matcher takes ownership of 'regex'. 7425 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 7426 const internal::RE* regex) { 7427 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); 7428 } 7429 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 7430 const internal::string& regex) { 7431 return ContainsRegex(new internal::RE(regex)); 7432 } 7433 7434 #if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 7435 // Wide string matchers. 7436 7437 // Matches a string equal to str. 7438 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 7439 StrEq(const internal::wstring& str) { 7440 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 7441 str, true, true)); 7442 } 7443 7444 // Matches a string not equal to str. 7445 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 7446 StrNe(const internal::wstring& str) { 7447 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 7448 str, false, true)); 7449 } 7450 7451 // Matches a string equal to str, ignoring case. 7452 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 7453 StrCaseEq(const internal::wstring& str) { 7454 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 7455 str, true, false)); 7456 } 7457 7458 // Matches a string not equal to str, ignoring case. 7459 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 7460 StrCaseNe(const internal::wstring& str) { 7461 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 7462 str, false, false)); 7463 } 7464 7465 // Creates a matcher that matches any wstring, std::wstring, or C wide string 7466 // that contains the given substring. 7467 inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> > 7468 HasSubstr(const internal::wstring& substring) { 7469 return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>( 7470 substring)); 7471 } 7472 7473 // Matches a string that starts with 'prefix' (case-sensitive). 7474 inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> > 7475 StartsWith(const internal::wstring& prefix) { 7476 return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>( 7477 prefix)); 7478 } 7479 7480 // Matches a string that ends with 'suffix' (case-sensitive). 7481 inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> > 7482 EndsWith(const internal::wstring& suffix) { 7483 return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>( 7484 suffix)); 7485 } 7486 7487 #endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 7488 7489 // Creates a polymorphic matcher that matches a 2-tuple where the 7490 // first field == the second field. 7491 inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); } 7492 7493 // Creates a polymorphic matcher that matches a 2-tuple where the 7494 // first field >= the second field. 7495 inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); } 7496 7497 // Creates a polymorphic matcher that matches a 2-tuple where the 7498 // first field > the second field. 7499 inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); } 7500 7501 // Creates a polymorphic matcher that matches a 2-tuple where the 7502 // first field <= the second field. 7503 inline internal::Le2Matcher Le() { return internal::Le2Matcher(); } 7504 7505 // Creates a polymorphic matcher that matches a 2-tuple where the 7506 // first field < the second field. 7507 inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); } 7508 7509 // Creates a polymorphic matcher that matches a 2-tuple where the 7510 // first field != the second field. 7511 inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); } 7512 7513 // Creates a matcher that matches any value of type T that m doesn't 7514 // match. 7515 template <typename InnerMatcher> 7516 inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) { 7517 return internal::NotMatcher<InnerMatcher>(m); 7518 } 7519 7520 // Returns a matcher that matches anything that satisfies the given 7521 // predicate. The predicate can be any unary function or functor 7522 // whose return type can be implicitly converted to bool. 7523 template <typename Predicate> 7524 inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> > 7525 Truly(Predicate pred) { 7526 return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred)); 7527 } 7528 7529 // Returns a matcher that matches an equal container. 7530 // This matcher behaves like Eq(), but in the event of mismatch lists the 7531 // values that are included in one container but not the other. (Duplicate 7532 // values and order differences are not explained.) 7533 template <typename Container> 7534 inline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT 7535 GTEST_REMOVE_CONST_(Container)> > 7536 ContainerEq(const Container& rhs) { 7537 // This following line is for working around a bug in MSVC 8.0, 7538 // which causes Container to be a const type sometimes. 7539 typedef GTEST_REMOVE_CONST_(Container) RawContainer; 7540 return MakePolymorphicMatcher( 7541 internal::ContainerEqMatcher<RawContainer>(rhs)); 7542 } 7543 7544 // Matches an STL-style container or a native array that contains the 7545 // same number of elements as in rhs, where its i-th element and rhs's 7546 // i-th element (as a pair) satisfy the given pair matcher, for all i. 7547 // TupleMatcher must be able to be safely cast to Matcher<tuple<const 7548 // T1&, const T2&> >, where T1 and T2 are the types of elements in the 7549 // LHS container and the RHS container respectively. 7550 template <typename TupleMatcher, typename Container> 7551 inline internal::PointwiseMatcher<TupleMatcher, 7552 GTEST_REMOVE_CONST_(Container)> 7553 Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) { 7554 // This following line is for working around a bug in MSVC 8.0, 7555 // which causes Container to be a const type sometimes. 7556 typedef GTEST_REMOVE_CONST_(Container) RawContainer; 7557 return internal::PointwiseMatcher<TupleMatcher, RawContainer>( 7558 tuple_matcher, rhs); 7559 } 7560 7561 // Matches an STL-style container or a native array that contains at 7562 // least one element matching the given value or matcher. 7563 // 7564 // Examples: 7565 // ::std::set<int> page_ids; 7566 // page_ids.insert(3); 7567 // page_ids.insert(1); 7568 // EXPECT_THAT(page_ids, Contains(1)); 7569 // EXPECT_THAT(page_ids, Contains(Gt(2))); 7570 // EXPECT_THAT(page_ids, Not(Contains(4))); 7571 // 7572 // ::std::map<int, size_t> page_lengths; 7573 // page_lengths[1] = 100; 7574 // EXPECT_THAT(page_lengths, 7575 // Contains(::std::pair<const int, size_t>(1, 100))); 7576 // 7577 // const char* user_ids[] = { "joe", "mike", "tom" }; 7578 // EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom")))); 7579 template <typename M> 7580 inline internal::ContainsMatcher<M> Contains(M matcher) { 7581 return internal::ContainsMatcher<M>(matcher); 7582 } 7583 7584 // Matches an STL-style container or a native array that contains only 7585 // elements matching the given value or matcher. 7586 // 7587 // Each(m) is semantically equivalent to Not(Contains(Not(m))). Only 7588 // the messages are different. 7589 // 7590 // Examples: 7591 // ::std::set<int> page_ids; 7592 // // Each(m) matches an empty container, regardless of what m is. 7593 // EXPECT_THAT(page_ids, Each(Eq(1))); 7594 // EXPECT_THAT(page_ids, Each(Eq(77))); 7595 // 7596 // page_ids.insert(3); 7597 // EXPECT_THAT(page_ids, Each(Gt(0))); 7598 // EXPECT_THAT(page_ids, Not(Each(Gt(4)))); 7599 // page_ids.insert(1); 7600 // EXPECT_THAT(page_ids, Not(Each(Lt(2)))); 7601 // 7602 // ::std::map<int, size_t> page_lengths; 7603 // page_lengths[1] = 100; 7604 // page_lengths[2] = 200; 7605 // page_lengths[3] = 300; 7606 // EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100)))); 7607 // EXPECT_THAT(page_lengths, Each(Key(Le(3)))); 7608 // 7609 // const char* user_ids[] = { "joe", "mike", "tom" }; 7610 // EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom"))))); 7611 template <typename M> 7612 inline internal::EachMatcher<M> Each(M matcher) { 7613 return internal::EachMatcher<M>(matcher); 7614 } 7615 7616 // Key(inner_matcher) matches an std::pair whose 'first' field matches 7617 // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 7618 // std::map that contains at least one element whose key is >= 5. 7619 template <typename M> 7620 inline internal::KeyMatcher<M> Key(M inner_matcher) { 7621 return internal::KeyMatcher<M>(inner_matcher); 7622 } 7623 7624 // Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field 7625 // matches first_matcher and whose 'second' field matches second_matcher. For 7626 // example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used 7627 // to match a std::map<int, string> that contains exactly one element whose key 7628 // is >= 5 and whose value equals "foo". 7629 template <typename FirstMatcher, typename SecondMatcher> 7630 inline internal::PairMatcher<FirstMatcher, SecondMatcher> 7631 Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) { 7632 return internal::PairMatcher<FirstMatcher, SecondMatcher>( 7633 first_matcher, second_matcher); 7634 } 7635 7636 // Returns a predicate that is satisfied by anything that matches the 7637 // given matcher. 7638 template <typename M> 7639 inline internal::MatcherAsPredicate<M> Matches(M matcher) { 7640 return internal::MatcherAsPredicate<M>(matcher); 7641 } 7642 7643 // Returns true iff the value matches the matcher. 7644 template <typename T, typename M> 7645 inline bool Value(const T& value, M matcher) { 7646 return testing::Matches(matcher)(value); 7647 } 7648 7649 // Matches the value against the given matcher and explains the match 7650 // result to listener. 7651 template <typename T, typename M> 7652 inline bool ExplainMatchResult( 7653 M matcher, const T& value, MatchResultListener* listener) { 7654 return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener); 7655 } 7656 7657 // AllArgs(m) is a synonym of m. This is useful in 7658 // 7659 // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); 7660 // 7661 // which is easier to read than 7662 // 7663 // EXPECT_CALL(foo, Bar(_, _)).With(Eq()); 7664 template <typename InnerMatcher> 7665 inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } 7666 7667 // These macros allow using matchers to check values in Google Test 7668 // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) 7669 // succeed iff the value matches the matcher. If the assertion fails, 7670 // the value and the description of the matcher will be printed. 7671 #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ 7672 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 7673 #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ 7674 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 7675 7676 } // namespace testing 7677 7678 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 7679 7680 namespace testing { 7681 7682 // An abstract handle of an expectation. 7683 class Expectation; 7684 7685 // A set of expectation handles. 7686 class ExpectationSet; 7687 7688 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION 7689 // and MUST NOT BE USED IN USER CODE!!! 7690 namespace internal { 7691 7692 // Implements a mock function. 7693 template <typename F> class FunctionMocker; 7694 7695 // Base class for expectations. 7696 class ExpectationBase; 7697 7698 // Implements an expectation. 7699 template <typename F> class TypedExpectation; 7700 7701 // Helper class for testing the Expectation class template. 7702 class ExpectationTester; 7703 7704 // Base class for function mockers. 7705 template <typename F> class FunctionMockerBase; 7706 7707 // Protects the mock object registry (in class Mock), all function 7708 // mockers, and all expectations. 7709 // 7710 // The reason we don't use more fine-grained protection is: when a 7711 // mock function Foo() is called, it needs to consult its expectations 7712 // to see which one should be picked. If another thread is allowed to 7713 // call a mock function (either Foo() or a different one) at the same 7714 // time, it could affect the "retired" attributes of Foo()'s 7715 // expectations when InSequence() is used, and thus affect which 7716 // expectation gets picked. Therefore, we sequence all mock function 7717 // calls to ensure the integrity of the mock objects' states. 7718 GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex); 7719 7720 // Untyped base class for ActionResultHolder<R>. 7721 class UntypedActionResultHolderBase; 7722 7723 // Abstract base class of FunctionMockerBase. This is the 7724 // type-agnostic part of the function mocker interface. Its pure 7725 // virtual methods are implemented by FunctionMockerBase. 7726 class UntypedFunctionMockerBase { 7727 public: 7728 UntypedFunctionMockerBase(); 7729 virtual ~UntypedFunctionMockerBase(); 7730 7731 // Verifies that all expectations on this mock function have been 7732 // satisfied. Reports one or more Google Test non-fatal failures 7733 // and returns false if not. 7734 // L >= g_gmock_mutex 7735 bool VerifyAndClearExpectationsLocked(); 7736 7737 // Clears the ON_CALL()s set on this mock function. 7738 // L >= g_gmock_mutex 7739 virtual void ClearDefaultActionsLocked() = 0; 7740 7741 // In all of the following Untyped* functions, it's the caller's 7742 // responsibility to guarantee the correctness of the arguments' 7743 // types. 7744 7745 // Performs the default action with the given arguments and returns 7746 // the action's result. The call description string will be used in 7747 // the error message to describe the call in the case the default 7748 // action fails. 7749 // L = * 7750 virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction( 7751 const void* untyped_args, 7752 const string& call_description) const = 0; 7753 7754 // Performs the given action with the given arguments and returns 7755 // the action's result. 7756 // L = * 7757 virtual UntypedActionResultHolderBase* UntypedPerformAction( 7758 const void* untyped_action, 7759 const void* untyped_args) const = 0; 7760 7761 // Writes a message that the call is uninteresting (i.e. neither 7762 // explicitly expected nor explicitly unexpected) to the given 7763 // ostream. 7764 // L < g_gmock_mutex 7765 virtual void UntypedDescribeUninterestingCall(const void* untyped_args, 7766 ::std::ostream* os) const = 0; 7767 7768 // Returns the expectation that matches the given function arguments 7769 // (or NULL is there's no match); when a match is found, 7770 // untyped_action is set to point to the action that should be 7771 // performed (or NULL if the action is "do default"), and 7772 // is_excessive is modified to indicate whether the call exceeds the 7773 // expected number. 7774 // L < g_gmock_mutex 7775 virtual const ExpectationBase* UntypedFindMatchingExpectation( 7776 const void* untyped_args, 7777 const void** untyped_action, bool* is_excessive, 7778 ::std::ostream* what, ::std::ostream* why) = 0; 7779 7780 // Prints the given function arguments to the ostream. 7781 virtual void UntypedPrintArgs(const void* untyped_args, 7782 ::std::ostream* os) const = 0; 7783 7784 // Sets the mock object this mock method belongs to, and registers 7785 // this information in the global mock registry. Will be called 7786 // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock 7787 // method. 7788 // TODO(wan@google.com): rename to SetAndRegisterOwner(). 7789 // L < g_gmock_mutex 7790 void RegisterOwner(const void* mock_obj); 7791 7792 // Sets the mock object this mock method belongs to, and sets the 7793 // name of the mock function. Will be called upon each invocation 7794 // of this mock function. 7795 // L < g_gmock_mutex 7796 void SetOwnerAndName(const void* mock_obj, const char* name); 7797 7798 // Returns the mock object this mock method belongs to. Must be 7799 // called after RegisterOwner() or SetOwnerAndName() has been 7800 // called. 7801 // L < g_gmock_mutex 7802 const void* MockObject() const; 7803 7804 // Returns the name of this mock method. Must be called after 7805 // SetOwnerAndName() has been called. 7806 // L < g_gmock_mutex 7807 const char* Name() const; 7808 7809 // Returns the result of invoking this mock function with the given 7810 // arguments. This function can be safely called from multiple 7811 // threads concurrently. The caller is responsible for deleting the 7812 // result. 7813 // L < g_gmock_mutex 7814 const UntypedActionResultHolderBase* UntypedInvokeWith( 7815 const void* untyped_args); 7816 7817 protected: 7818 typedef std::vector<const void*> UntypedOnCallSpecs; 7819 7820 typedef std::vector<internal::linked_ptr<ExpectationBase> > 7821 UntypedExpectations; 7822 7823 // Returns an Expectation object that references and co-owns exp, 7824 // which must be an expectation on this mock function. 7825 Expectation GetHandleOf(ExpectationBase* exp); 7826 7827 // Address of the mock object this mock method belongs to. Only 7828 // valid after this mock method has been called or 7829 // ON_CALL/EXPECT_CALL has been invoked on it. 7830 const void* mock_obj_; // Protected by g_gmock_mutex. 7831 7832 // Name of the function being mocked. Only valid after this mock 7833 // method has been called. 7834 const char* name_; // Protected by g_gmock_mutex. 7835 7836 // All default action specs for this function mocker. 7837 UntypedOnCallSpecs untyped_on_call_specs_; 7838 7839 // All expectations for this function mocker. 7840 UntypedExpectations untyped_expectations_; 7841 }; // class UntypedFunctionMockerBase 7842 7843 // Untyped base class for OnCallSpec<F>. 7844 class UntypedOnCallSpecBase { 7845 public: 7846 // The arguments are the location of the ON_CALL() statement. 7847 UntypedOnCallSpecBase(const char* a_file, int a_line) 7848 : file_(a_file), line_(a_line), last_clause_(kNone) {} 7849 7850 // Where in the source file was the default action spec defined? 7851 const char* file() const { return file_; } 7852 int line() const { return line_; } 7853 7854 protected: 7855 // Gives each clause in the ON_CALL() statement a name. 7856 enum Clause { 7857 // Do not change the order of the enum members! The run-time 7858 // syntax checking relies on it. 7859 kNone, 7860 kWith, 7861 kWillByDefault 7862 }; 7863 7864 // Asserts that the ON_CALL() statement has a certain property. 7865 void AssertSpecProperty(bool property, const string& failure_message) const { 7866 Assert(property, file_, line_, failure_message); 7867 } 7868 7869 // Expects that the ON_CALL() statement has a certain property. 7870 void ExpectSpecProperty(bool property, const string& failure_message) const { 7871 Expect(property, file_, line_, failure_message); 7872 } 7873 7874 const char* file_; 7875 int line_; 7876 7877 // The last clause in the ON_CALL() statement as seen so far. 7878 // Initially kNone and changes as the statement is parsed. 7879 Clause last_clause_; 7880 }; // class UntypedOnCallSpecBase 7881 7882 // This template class implements an ON_CALL spec. 7883 template <typename F> 7884 class OnCallSpec : public UntypedOnCallSpecBase { 7885 public: 7886 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 7887 typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple; 7888 7889 // Constructs an OnCallSpec object from the information inside 7890 // the parenthesis of an ON_CALL() statement. 7891 OnCallSpec(const char* a_file, int a_line, 7892 const ArgumentMatcherTuple& matchers) 7893 : UntypedOnCallSpecBase(a_file, a_line), 7894 matchers_(matchers), 7895 // By default, extra_matcher_ should match anything. However, 7896 // we cannot initialize it with _ as that triggers a compiler 7897 // bug in Symbian's C++ compiler (cannot decide between two 7898 // overloaded constructors of Matcher<const ArgumentTuple&>). 7899 extra_matcher_(A<const ArgumentTuple&>()) { 7900 } 7901 7902 // Implements the .With() clause. 7903 OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) { 7904 // Makes sure this is called at most once. 7905 ExpectSpecProperty(last_clause_ < kWith, 7906 ".With() cannot appear " 7907 "more than once in an ON_CALL()."); 7908 last_clause_ = kWith; 7909 7910 extra_matcher_ = m; 7911 return *this; 7912 } 7913 7914 // Implements the .WillByDefault() clause. 7915 OnCallSpec& WillByDefault(const Action<F>& action) { 7916 ExpectSpecProperty(last_clause_ < kWillByDefault, 7917 ".WillByDefault() must appear " 7918 "exactly once in an ON_CALL()."); 7919 last_clause_ = kWillByDefault; 7920 7921 ExpectSpecProperty(!action.IsDoDefault(), 7922 "DoDefault() cannot be used in ON_CALL()."); 7923 action_ = action; 7924 return *this; 7925 } 7926 7927 // Returns true iff the given arguments match the matchers. 7928 bool Matches(const ArgumentTuple& args) const { 7929 return TupleMatches(matchers_, args) && extra_matcher_.Matches(args); 7930 } 7931 7932 // Returns the action specified by the user. 7933 const Action<F>& GetAction() const { 7934 AssertSpecProperty(last_clause_ == kWillByDefault, 7935 ".WillByDefault() must appear exactly " 7936 "once in an ON_CALL()."); 7937 return action_; 7938 } 7939 7940 private: 7941 // The information in statement 7942 // 7943 // ON_CALL(mock_object, Method(matchers)) 7944 // .With(multi-argument-matcher) 7945 // .WillByDefault(action); 7946 // 7947 // is recorded in the data members like this: 7948 // 7949 // source file that contains the statement => file_ 7950 // line number of the statement => line_ 7951 // matchers => matchers_ 7952 // multi-argument-matcher => extra_matcher_ 7953 // action => action_ 7954 ArgumentMatcherTuple matchers_; 7955 Matcher<const ArgumentTuple&> extra_matcher_; 7956 Action<F> action_; 7957 }; // class OnCallSpec 7958 7959 // Possible reactions on uninteresting calls. TODO(wan@google.com): 7960 // rename the enum values to the kFoo style. 7961 enum CallReaction { 7962 ALLOW, 7963 WARN, 7964 FAIL 7965 }; 7966 7967 } // namespace internal 7968 7969 // Utilities for manipulating mock objects. 7970 class Mock { 7971 public: 7972 // The following public methods can be called concurrently. 7973 7974 // Tells Google Mock to ignore mock_obj when checking for leaked 7975 // mock objects. 7976 static void AllowLeak(const void* mock_obj); 7977 7978 // Verifies and clears all expectations on the given mock object. 7979 // If the expectations aren't satisfied, generates one or more 7980 // Google Test non-fatal failures and returns false. 7981 static bool VerifyAndClearExpectations(void* mock_obj); 7982 7983 // Verifies all expectations on the given mock object and clears its 7984 // default actions and expectations. Returns true iff the 7985 // verification was successful. 7986 static bool VerifyAndClear(void* mock_obj); 7987 private: 7988 friend class internal::UntypedFunctionMockerBase; 7989 7990 // Needed for a function mocker to register itself (so that we know 7991 // how to clear a mock object). 7992 template <typename F> 7993 friend class internal::FunctionMockerBase; 7994 7995 template <typename M> 7996 friend class NiceMock; 7997 7998 template <typename M> 7999 friend class StrictMock; 8000 8001 // Tells Google Mock to allow uninteresting calls on the given mock 8002 // object. 8003 // L < g_gmock_mutex 8004 static void AllowUninterestingCalls(const void* mock_obj); 8005 8006 // Tells Google Mock to warn the user about uninteresting calls on 8007 // the given mock object. 8008 // L < g_gmock_mutex 8009 static void WarnUninterestingCalls(const void* mock_obj); 8010 8011 // Tells Google Mock to fail uninteresting calls on the given mock 8012 // object. 8013 // L < g_gmock_mutex 8014 static void FailUninterestingCalls(const void* mock_obj); 8015 8016 // Tells Google Mock the given mock object is being destroyed and 8017 // its entry in the call-reaction table should be removed. 8018 // L < g_gmock_mutex 8019 static void UnregisterCallReaction(const void* mock_obj); 8020 8021 // Returns the reaction Google Mock will have on uninteresting calls 8022 // made on the given mock object. 8023 // L < g_gmock_mutex 8024 static internal::CallReaction GetReactionOnUninterestingCalls( 8025 const void* mock_obj); 8026 8027 // Verifies that all expectations on the given mock object have been 8028 // satisfied. Reports one or more Google Test non-fatal failures 8029 // and returns false if not. 8030 // L >= g_gmock_mutex 8031 static bool VerifyAndClearExpectationsLocked(void* mock_obj); 8032 8033 // Clears all ON_CALL()s set on the given mock object. 8034 // L >= g_gmock_mutex 8035 static void ClearDefaultActionsLocked(void* mock_obj); 8036 8037 // Registers a mock object and a mock method it owns. 8038 // L < g_gmock_mutex 8039 static void Register(const void* mock_obj, 8040 internal::UntypedFunctionMockerBase* mocker); 8041 8042 // Tells Google Mock where in the source code mock_obj is used in an 8043 // ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this 8044 // information helps the user identify which object it is. 8045 // L < g_gmock_mutex 8046 static void RegisterUseByOnCallOrExpectCall( 8047 const void* mock_obj, const char* file, int line); 8048 8049 // Unregisters a mock method; removes the owning mock object from 8050 // the registry when the last mock method associated with it has 8051 // been unregistered. This is called only in the destructor of 8052 // FunctionMockerBase. 8053 // L >= g_gmock_mutex 8054 static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker); 8055 }; // class Mock 8056 8057 // An abstract handle of an expectation. Useful in the .After() 8058 // clause of EXPECT_CALL() for setting the (partial) order of 8059 // expectations. The syntax: 8060 // 8061 // Expectation e1 = EXPECT_CALL(...)...; 8062 // EXPECT_CALL(...).After(e1)...; 8063 // 8064 // sets two expectations where the latter can only be matched after 8065 // the former has been satisfied. 8066 // 8067 // Notes: 8068 // - This class is copyable and has value semantics. 8069 // - Constness is shallow: a const Expectation object itself cannot 8070 // be modified, but the mutable methods of the ExpectationBase 8071 // object it references can be called via expectation_base(). 8072 // - The constructors and destructor are defined out-of-line because 8073 // the Symbian WINSCW compiler wants to otherwise instantiate them 8074 // when it sees this class definition, at which point it doesn't have 8075 // ExpectationBase available yet, leading to incorrect destruction 8076 // in the linked_ptr (or compilation errors if using a checking 8077 // linked_ptr). 8078 class Expectation { 8079 public: 8080 // Constructs a null object that doesn't reference any expectation. 8081 Expectation(); 8082 8083 ~Expectation(); 8084 8085 // This single-argument ctor must not be explicit, in order to support the 8086 // Expectation e = EXPECT_CALL(...); 8087 // syntax. 8088 // 8089 // A TypedExpectation object stores its pre-requisites as 8090 // Expectation objects, and needs to call the non-const Retire() 8091 // method on the ExpectationBase objects they reference. Therefore 8092 // Expectation must receive a *non-const* reference to the 8093 // ExpectationBase object. 8094 Expectation(internal::ExpectationBase& exp); // NOLINT 8095 8096 // The compiler-generated copy ctor and operator= work exactly as 8097 // intended, so we don't need to define our own. 8098 8099 // Returns true iff rhs references the same expectation as this object does. 8100 bool operator==(const Expectation& rhs) const { 8101 return expectation_base_ == rhs.expectation_base_; 8102 } 8103 8104 bool operator!=(const Expectation& rhs) const { return !(*this == rhs); } 8105 8106 private: 8107 friend class ExpectationSet; 8108 friend class Sequence; 8109 friend class ::testing::internal::ExpectationBase; 8110 friend class ::testing::internal::UntypedFunctionMockerBase; 8111 8112 template <typename F> 8113 friend class ::testing::internal::FunctionMockerBase; 8114 8115 template <typename F> 8116 friend class ::testing::internal::TypedExpectation; 8117 8118 // This comparator is needed for putting Expectation objects into a set. 8119 class Less { 8120 public: 8121 bool operator()(const Expectation& lhs, const Expectation& rhs) const { 8122 return lhs.expectation_base_.get() < rhs.expectation_base_.get(); 8123 } 8124 }; 8125 8126 typedef ::std::set<Expectation, Less> Set; 8127 8128 Expectation( 8129 const internal::linked_ptr<internal::ExpectationBase>& expectation_base); 8130 8131 // Returns the expectation this object references. 8132 const internal::linked_ptr<internal::ExpectationBase>& 8133 expectation_base() const { 8134 return expectation_base_; 8135 } 8136 8137 // A linked_ptr that co-owns the expectation this handle references. 8138 internal::linked_ptr<internal::ExpectationBase> expectation_base_; 8139 }; 8140 8141 // A set of expectation handles. Useful in the .After() clause of 8142 // EXPECT_CALL() for setting the (partial) order of expectations. The 8143 // syntax: 8144 // 8145 // ExpectationSet es; 8146 // es += EXPECT_CALL(...)...; 8147 // es += EXPECT_CALL(...)...; 8148 // EXPECT_CALL(...).After(es)...; 8149 // 8150 // sets three expectations where the last one can only be matched 8151 // after the first two have both been satisfied. 8152 // 8153 // This class is copyable and has value semantics. 8154 class ExpectationSet { 8155 public: 8156 // A bidirectional iterator that can read a const element in the set. 8157 typedef Expectation::Set::const_iterator const_iterator; 8158 8159 // An object stored in the set. This is an alias of Expectation. 8160 typedef Expectation::Set::value_type value_type; 8161 8162 // Constructs an empty set. 8163 ExpectationSet() {} 8164 8165 // This single-argument ctor must not be explicit, in order to support the 8166 // ExpectationSet es = EXPECT_CALL(...); 8167 // syntax. 8168 ExpectationSet(internal::ExpectationBase& exp) { // NOLINT 8169 *this += Expectation(exp); 8170 } 8171 8172 // This single-argument ctor implements implicit conversion from 8173 // Expectation and thus must not be explicit. This allows either an 8174 // Expectation or an ExpectationSet to be used in .After(). 8175 ExpectationSet(const Expectation& e) { // NOLINT 8176 *this += e; 8177 } 8178 8179 // The compiler-generator ctor and operator= works exactly as 8180 // intended, so we don't need to define our own. 8181 8182 // Returns true iff rhs contains the same set of Expectation objects 8183 // as this does. 8184 bool operator==(const ExpectationSet& rhs) const { 8185 return expectations_ == rhs.expectations_; 8186 } 8187 8188 bool operator!=(const ExpectationSet& rhs) const { return !(*this == rhs); } 8189 8190 // Implements the syntax 8191 // expectation_set += EXPECT_CALL(...); 8192 ExpectationSet& operator+=(const Expectation& e) { 8193 expectations_.insert(e); 8194 return *this; 8195 } 8196 8197 int size() const { return static_cast<int>(expectations_.size()); } 8198 8199 const_iterator begin() const { return expectations_.begin(); } 8200 const_iterator end() const { return expectations_.end(); } 8201 8202 private: 8203 Expectation::Set expectations_; 8204 }; 8205 8206 8207 // Sequence objects are used by a user to specify the relative order 8208 // in which the expectations should match. They are copyable (we rely 8209 // on the compiler-defined copy constructor and assignment operator). 8210 class Sequence { 8211 public: 8212 // Constructs an empty sequence. 8213 Sequence() : last_expectation_(new Expectation) {} 8214 8215 // Adds an expectation to this sequence. The caller must ensure 8216 // that no other thread is accessing this Sequence object. 8217 void AddExpectation(const Expectation& expectation) const; 8218 8219 private: 8220 // The last expectation in this sequence. We use a linked_ptr here 8221 // because Sequence objects are copyable and we want the copies to 8222 // be aliases. The linked_ptr allows the copies to co-own and share 8223 // the same Expectation object. 8224 internal::linked_ptr<Expectation> last_expectation_; 8225 }; // class Sequence 8226 8227 // An object of this type causes all EXPECT_CALL() statements 8228 // encountered in its scope to be put in an anonymous sequence. The 8229 // work is done in the constructor and destructor. You should only 8230 // create an InSequence object on the stack. 8231 // 8232 // The sole purpose for this class is to support easy definition of 8233 // sequential expectations, e.g. 8234 // 8235 // { 8236 // InSequence dummy; // The name of the object doesn't matter. 8237 // 8238 // // The following expectations must match in the order they appear. 8239 // EXPECT_CALL(a, Bar())...; 8240 // EXPECT_CALL(a, Baz())...; 8241 // ... 8242 // EXPECT_CALL(b, Xyz())...; 8243 // } 8244 // 8245 // You can create InSequence objects in multiple threads, as long as 8246 // they are used to affect different mock objects. The idea is that 8247 // each thread can create and set up its own mocks as if it's the only 8248 // thread. However, for clarity of your tests we recommend you to set 8249 // up mocks in the main thread unless you have a good reason not to do 8250 // so. 8251 class InSequence { 8252 public: 8253 InSequence(); 8254 ~InSequence(); 8255 private: 8256 bool sequence_created_; 8257 8258 GTEST_DISALLOW_COPY_AND_ASSIGN_(InSequence); // NOLINT 8259 } GTEST_ATTRIBUTE_UNUSED_; 8260 8261 namespace internal { 8262 8263 // Points to the implicit sequence introduced by a living InSequence 8264 // object (if any) in the current thread or NULL. 8265 extern ThreadLocal<Sequence*> g_gmock_implicit_sequence; 8266 8267 // Base class for implementing expectations. 8268 // 8269 // There are two reasons for having a type-agnostic base class for 8270 // Expectation: 8271 // 8272 // 1. We need to store collections of expectations of different 8273 // types (e.g. all pre-requisites of a particular expectation, all 8274 // expectations in a sequence). Therefore these expectation objects 8275 // must share a common base class. 8276 // 8277 // 2. We can avoid binary code bloat by moving methods not depending 8278 // on the template argument of Expectation to the base class. 8279 // 8280 // This class is internal and mustn't be used by user code directly. 8281 class ExpectationBase { 8282 public: 8283 // source_text is the EXPECT_CALL(...) source that created this Expectation. 8284 ExpectationBase(const char* file, int line, const string& source_text); 8285 8286 virtual ~ExpectationBase(); 8287 8288 // Where in the source file was the expectation spec defined? 8289 const char* file() const { return file_; } 8290 int line() const { return line_; } 8291 const char* source_text() const { return source_text_.c_str(); } 8292 // Returns the cardinality specified in the expectation spec. 8293 const Cardinality& cardinality() const { return cardinality_; } 8294 8295 // Describes the source file location of this expectation. 8296 void DescribeLocationTo(::std::ostream* os) const { 8297 *os << FormatFileLocation(file(), line()) << " "; 8298 } 8299 8300 // Describes how many times a function call matching this 8301 // expectation has occurred. 8302 // L >= g_gmock_mutex 8303 void DescribeCallCountTo(::std::ostream* os) const; 8304 8305 // If this mock method has an extra matcher (i.e. .With(matcher)), 8306 // describes it to the ostream. 8307 virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0; 8308 8309 protected: 8310 friend class ::testing::Expectation; 8311 friend class UntypedFunctionMockerBase; 8312 8313 enum Clause { 8314 // Don't change the order of the enum members! 8315 kNone, 8316 kWith, 8317 kTimes, 8318 kInSequence, 8319 kAfter, 8320 kWillOnce, 8321 kWillRepeatedly, 8322 kRetiresOnSaturation 8323 }; 8324 8325 typedef std::vector<const void*> UntypedActions; 8326 8327 // Returns an Expectation object that references and co-owns this 8328 // expectation. 8329 virtual Expectation GetHandle() = 0; 8330 8331 // Asserts that the EXPECT_CALL() statement has the given property. 8332 void AssertSpecProperty(bool property, const string& failure_message) const { 8333 Assert(property, file_, line_, failure_message); 8334 } 8335 8336 // Expects that the EXPECT_CALL() statement has the given property. 8337 void ExpectSpecProperty(bool property, const string& failure_message) const { 8338 Expect(property, file_, line_, failure_message); 8339 } 8340 8341 // Explicitly specifies the cardinality of this expectation. Used 8342 // by the subclasses to implement the .Times() clause. 8343 void SpecifyCardinality(const Cardinality& cardinality); 8344 8345 // Returns true iff the user specified the cardinality explicitly 8346 // using a .Times(). 8347 bool cardinality_specified() const { return cardinality_specified_; } 8348 8349 // Sets the cardinality of this expectation spec. 8350 void set_cardinality(const Cardinality& a_cardinality) { 8351 cardinality_ = a_cardinality; 8352 } 8353 8354 // The following group of methods should only be called after the 8355 // EXPECT_CALL() statement, and only when g_gmock_mutex is held by 8356 // the current thread. 8357 8358 // Retires all pre-requisites of this expectation. 8359 // L >= g_gmock_mutex 8360 void RetireAllPreRequisites(); 8361 8362 // Returns true iff this expectation is retired. 8363 // L >= g_gmock_mutex 8364 bool is_retired() const { 8365 g_gmock_mutex.AssertHeld(); 8366 return retired_; 8367 } 8368 8369 // Retires this expectation. 8370 // L >= g_gmock_mutex 8371 void Retire() { 8372 g_gmock_mutex.AssertHeld(); 8373 retired_ = true; 8374 } 8375 8376 // Returns true iff this expectation is satisfied. 8377 // L >= g_gmock_mutex 8378 bool IsSatisfied() const { 8379 g_gmock_mutex.AssertHeld(); 8380 return cardinality().IsSatisfiedByCallCount(call_count_); 8381 } 8382 8383 // Returns true iff this expectation is saturated. 8384 // L >= g_gmock_mutex 8385 bool IsSaturated() const { 8386 g_gmock_mutex.AssertHeld(); 8387 return cardinality().IsSaturatedByCallCount(call_count_); 8388 } 8389 8390 // Returns true iff this expectation is over-saturated. 8391 // L >= g_gmock_mutex 8392 bool IsOverSaturated() const { 8393 g_gmock_mutex.AssertHeld(); 8394 return cardinality().IsOverSaturatedByCallCount(call_count_); 8395 } 8396 8397 // Returns true iff all pre-requisites of this expectation are satisfied. 8398 // L >= g_gmock_mutex 8399 bool AllPrerequisitesAreSatisfied() const; 8400 8401 // Adds unsatisfied pre-requisites of this expectation to 'result'. 8402 // L >= g_gmock_mutex 8403 void FindUnsatisfiedPrerequisites(ExpectationSet* result) const; 8404 8405 // Returns the number this expectation has been invoked. 8406 // L >= g_gmock_mutex 8407 int call_count() const { 8408 g_gmock_mutex.AssertHeld(); 8409 return call_count_; 8410 } 8411 8412 // Increments the number this expectation has been invoked. 8413 // L >= g_gmock_mutex 8414 void IncrementCallCount() { 8415 g_gmock_mutex.AssertHeld(); 8416 call_count_++; 8417 } 8418 8419 // Checks the action count (i.e. the number of WillOnce() and 8420 // WillRepeatedly() clauses) against the cardinality if this hasn't 8421 // been done before. Prints a warning if there are too many or too 8422 // few actions. 8423 // L < mutex_ 8424 void CheckActionCountIfNotDone() const; 8425 8426 friend class ::testing::Sequence; 8427 friend class ::testing::internal::ExpectationTester; 8428 8429 template <typename Function> 8430 friend class TypedExpectation; 8431 8432 // Implements the .Times() clause. 8433 void UntypedTimes(const Cardinality& a_cardinality); 8434 8435 // This group of fields are part of the spec and won't change after 8436 // an EXPECT_CALL() statement finishes. 8437 const char* file_; // The file that contains the expectation. 8438 int line_; // The line number of the expectation. 8439 const string source_text_; // The EXPECT_CALL(...) source text. 8440 // True iff the cardinality is specified explicitly. 8441 bool cardinality_specified_; 8442 Cardinality cardinality_; // The cardinality of the expectation. 8443 // The immediate pre-requisites (i.e. expectations that must be 8444 // satisfied before this expectation can be matched) of this 8445 // expectation. We use linked_ptr in the set because we want an 8446 // Expectation object to be co-owned by its FunctionMocker and its 8447 // successors. This allows multiple mock objects to be deleted at 8448 // different times. 8449 ExpectationSet immediate_prerequisites_; 8450 8451 // This group of fields are the current state of the expectation, 8452 // and can change as the mock function is called. 8453 int call_count_; // How many times this expectation has been invoked. 8454 bool retired_; // True iff this expectation has retired. 8455 UntypedActions untyped_actions_; 8456 bool extra_matcher_specified_; 8457 bool repeated_action_specified_; // True if a WillRepeatedly() was specified. 8458 bool retires_on_saturation_; 8459 Clause last_clause_; 8460 mutable bool action_count_checked_; // Under mutex_. 8461 mutable Mutex mutex_; // Protects action_count_checked_. 8462 8463 GTEST_DISALLOW_ASSIGN_(ExpectationBase); 8464 }; // class ExpectationBase 8465 8466 // Impements an expectation for the given function type. 8467 template <typename F> 8468 class TypedExpectation : public ExpectationBase { 8469 public: 8470 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 8471 typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple; 8472 typedef typename Function<F>::Result Result; 8473 8474 TypedExpectation(FunctionMockerBase<F>* owner, 8475 const char* a_file, int a_line, const string& a_source_text, 8476 const ArgumentMatcherTuple& m) 8477 : ExpectationBase(a_file, a_line, a_source_text), 8478 owner_(owner), 8479 matchers_(m), 8480 // By default, extra_matcher_ should match anything. However, 8481 // we cannot initialize it with _ as that triggers a compiler 8482 // bug in Symbian's C++ compiler (cannot decide between two 8483 // overloaded constructors of Matcher<const ArgumentTuple&>). 8484 extra_matcher_(A<const ArgumentTuple&>()), 8485 repeated_action_(DoDefault()) {} 8486 8487 virtual ~TypedExpectation() { 8488 // Check the validity of the action count if it hasn't been done 8489 // yet (for example, if the expectation was never used). 8490 CheckActionCountIfNotDone(); 8491 for (UntypedActions::const_iterator it = untyped_actions_.begin(); 8492 it != untyped_actions_.end(); ++it) { 8493 delete static_cast<const Action<F>*>(*it); 8494 } 8495 } 8496 8497 // Implements the .With() clause. 8498 TypedExpectation& With(const Matcher<const ArgumentTuple&>& m) { 8499 if (last_clause_ == kWith) { 8500 ExpectSpecProperty(false, 8501 ".With() cannot appear " 8502 "more than once in an EXPECT_CALL()."); 8503 } else { 8504 ExpectSpecProperty(last_clause_ < kWith, 8505 ".With() must be the first " 8506 "clause in an EXPECT_CALL()."); 8507 } 8508 last_clause_ = kWith; 8509 8510 extra_matcher_ = m; 8511 extra_matcher_specified_ = true; 8512 return *this; 8513 } 8514 8515 // Implements the .Times() clause. 8516 TypedExpectation& Times(const Cardinality& a_cardinality) { 8517 ExpectationBase::UntypedTimes(a_cardinality); 8518 return *this; 8519 } 8520 8521 // Implements the .Times() clause. 8522 TypedExpectation& Times(int n) { 8523 return Times(Exactly(n)); 8524 } 8525 8526 // Implements the .InSequence() clause. 8527 TypedExpectation& InSequence(const Sequence& s) { 8528 ExpectSpecProperty(last_clause_ <= kInSequence, 8529 ".InSequence() cannot appear after .After()," 8530 " .WillOnce(), .WillRepeatedly(), or " 8531 ".RetiresOnSaturation()."); 8532 last_clause_ = kInSequence; 8533 8534 s.AddExpectation(GetHandle()); 8535 return *this; 8536 } 8537 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2) { 8538 return InSequence(s1).InSequence(s2); 8539 } 8540 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2, 8541 const Sequence& s3) { 8542 return InSequence(s1, s2).InSequence(s3); 8543 } 8544 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2, 8545 const Sequence& s3, const Sequence& s4) { 8546 return InSequence(s1, s2, s3).InSequence(s4); 8547 } 8548 TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2, 8549 const Sequence& s3, const Sequence& s4, 8550 const Sequence& s5) { 8551 return InSequence(s1, s2, s3, s4).InSequence(s5); 8552 } 8553 8554 // Implements that .After() clause. 8555 TypedExpectation& After(const ExpectationSet& s) { 8556 ExpectSpecProperty(last_clause_ <= kAfter, 8557 ".After() cannot appear after .WillOnce()," 8558 " .WillRepeatedly(), or " 8559 ".RetiresOnSaturation()."); 8560 last_clause_ = kAfter; 8561 8562 for (ExpectationSet::const_iterator it = s.begin(); it != s.end(); ++it) { 8563 immediate_prerequisites_ += *it; 8564 } 8565 return *this; 8566 } 8567 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2) { 8568 return After(s1).After(s2); 8569 } 8570 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2, 8571 const ExpectationSet& s3) { 8572 return After(s1, s2).After(s3); 8573 } 8574 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2, 8575 const ExpectationSet& s3, const ExpectationSet& s4) { 8576 return After(s1, s2, s3).After(s4); 8577 } 8578 TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2, 8579 const ExpectationSet& s3, const ExpectationSet& s4, 8580 const ExpectationSet& s5) { 8581 return After(s1, s2, s3, s4).After(s5); 8582 } 8583 8584 // Implements the .WillOnce() clause. 8585 TypedExpectation& WillOnce(const Action<F>& action) { 8586 ExpectSpecProperty(last_clause_ <= kWillOnce, 8587 ".WillOnce() cannot appear after " 8588 ".WillRepeatedly() or .RetiresOnSaturation()."); 8589 last_clause_ = kWillOnce; 8590 8591 untyped_actions_.push_back(new Action<F>(action)); 8592 if (!cardinality_specified()) { 8593 set_cardinality(Exactly(static_cast<int>(untyped_actions_.size()))); 8594 } 8595 return *this; 8596 } 8597 8598 // Implements the .WillRepeatedly() clause. 8599 TypedExpectation& WillRepeatedly(const Action<F>& action) { 8600 if (last_clause_ == kWillRepeatedly) { 8601 ExpectSpecProperty(false, 8602 ".WillRepeatedly() cannot appear " 8603 "more than once in an EXPECT_CALL()."); 8604 } else { 8605 ExpectSpecProperty(last_clause_ < kWillRepeatedly, 8606 ".WillRepeatedly() cannot appear " 8607 "after .RetiresOnSaturation()."); 8608 } 8609 last_clause_ = kWillRepeatedly; 8610 repeated_action_specified_ = true; 8611 8612 repeated_action_ = action; 8613 if (!cardinality_specified()) { 8614 set_cardinality(AtLeast(static_cast<int>(untyped_actions_.size()))); 8615 } 8616 8617 // Now that no more action clauses can be specified, we check 8618 // whether their count makes sense. 8619 CheckActionCountIfNotDone(); 8620 return *this; 8621 } 8622 8623 // Implements the .RetiresOnSaturation() clause. 8624 TypedExpectation& RetiresOnSaturation() { 8625 ExpectSpecProperty(last_clause_ < kRetiresOnSaturation, 8626 ".RetiresOnSaturation() cannot appear " 8627 "more than once."); 8628 last_clause_ = kRetiresOnSaturation; 8629 retires_on_saturation_ = true; 8630 8631 // Now that no more action clauses can be specified, we check 8632 // whether their count makes sense. 8633 CheckActionCountIfNotDone(); 8634 return *this; 8635 } 8636 8637 // Returns the matchers for the arguments as specified inside the 8638 // EXPECT_CALL() macro. 8639 const ArgumentMatcherTuple& matchers() const { 8640 return matchers_; 8641 } 8642 8643 // Returns the matcher specified by the .With() clause. 8644 const Matcher<const ArgumentTuple&>& extra_matcher() const { 8645 return extra_matcher_; 8646 } 8647 8648 // Returns the action specified by the .WillRepeatedly() clause. 8649 const Action<F>& repeated_action() const { return repeated_action_; } 8650 8651 // If this mock method has an extra matcher (i.e. .With(matcher)), 8652 // describes it to the ostream. 8653 virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) { 8654 if (extra_matcher_specified_) { 8655 *os << " Expected args: "; 8656 extra_matcher_.DescribeTo(os); 8657 *os << "\n"; 8658 } 8659 } 8660 8661 private: 8662 template <typename Function> 8663 friend class FunctionMockerBase; 8664 8665 // Returns an Expectation object that references and co-owns this 8666 // expectation. 8667 virtual Expectation GetHandle() { 8668 return owner_->GetHandleOf(this); 8669 } 8670 8671 // The following methods will be called only after the EXPECT_CALL() 8672 // statement finishes and when the current thread holds 8673 // g_gmock_mutex. 8674 8675 // Returns true iff this expectation matches the given arguments. 8676 // L >= g_gmock_mutex 8677 bool Matches(const ArgumentTuple& args) const { 8678 g_gmock_mutex.AssertHeld(); 8679 return TupleMatches(matchers_, args) && extra_matcher_.Matches(args); 8680 } 8681 8682 // Returns true iff this expectation should handle the given arguments. 8683 // L >= g_gmock_mutex 8684 bool ShouldHandleArguments(const ArgumentTuple& args) const { 8685 g_gmock_mutex.AssertHeld(); 8686 8687 // In case the action count wasn't checked when the expectation 8688 // was defined (e.g. if this expectation has no WillRepeatedly() 8689 // or RetiresOnSaturation() clause), we check it when the 8690 // expectation is used for the first time. 8691 CheckActionCountIfNotDone(); 8692 return !is_retired() && AllPrerequisitesAreSatisfied() && Matches(args); 8693 } 8694 8695 // Describes the result of matching the arguments against this 8696 // expectation to the given ostream. 8697 // L >= g_gmock_mutex 8698 void ExplainMatchResultTo(const ArgumentTuple& args, 8699 ::std::ostream* os) const { 8700 g_gmock_mutex.AssertHeld(); 8701 8702 if (is_retired()) { 8703 *os << " Expected: the expectation is active\n" 8704 << " Actual: it is retired\n"; 8705 } else if (!Matches(args)) { 8706 if (!TupleMatches(matchers_, args)) { 8707 ExplainMatchFailureTupleTo(matchers_, args, os); 8708 } 8709 StringMatchResultListener listener; 8710 if (!extra_matcher_.MatchAndExplain(args, &listener)) { 8711 *os << " Expected args: "; 8712 extra_matcher_.DescribeTo(os); 8713 *os << "\n Actual: don't match"; 8714 8715 internal::PrintIfNotEmpty(listener.str(), os); 8716 *os << "\n"; 8717 } 8718 } else if (!AllPrerequisitesAreSatisfied()) { 8719 *os << " Expected: all pre-requisites are satisfied\n" 8720 << " Actual: the following immediate pre-requisites " 8721 << "are not satisfied:\n"; 8722 ExpectationSet unsatisfied_prereqs; 8723 FindUnsatisfiedPrerequisites(&unsatisfied_prereqs); 8724 int i = 0; 8725 for (ExpectationSet::const_iterator it = unsatisfied_prereqs.begin(); 8726 it != unsatisfied_prereqs.end(); ++it) { 8727 it->expectation_base()->DescribeLocationTo(os); 8728 *os << "pre-requisite #" << i++ << "\n"; 8729 } 8730 *os << " (end of pre-requisites)\n"; 8731 } else { 8732 // This line is here just for completeness' sake. It will never 8733 // be executed as currently the ExplainMatchResultTo() function 8734 // is called only when the mock function call does NOT match the 8735 // expectation. 8736 *os << "The call matches the expectation.\n"; 8737 } 8738 } 8739 8740 // Returns the action that should be taken for the current invocation. 8741 // L >= g_gmock_mutex 8742 const Action<F>& GetCurrentAction(const FunctionMockerBase<F>* mocker, 8743 const ArgumentTuple& args) const { 8744 g_gmock_mutex.AssertHeld(); 8745 const int count = call_count(); 8746 Assert(count >= 1, __FILE__, __LINE__, 8747 "call_count() is <= 0 when GetCurrentAction() is " 8748 "called - this should never happen."); 8749 8750 const int action_count = static_cast<int>(untyped_actions_.size()); 8751 if (action_count > 0 && !repeated_action_specified_ && 8752 count > action_count) { 8753 // If there is at least one WillOnce() and no WillRepeatedly(), 8754 // we warn the user when the WillOnce() clauses ran out. 8755 ::std::stringstream ss; 8756 DescribeLocationTo(&ss); 8757 ss << "Actions ran out in " << source_text() << "...\n" 8758 << "Called " << count << " times, but only " 8759 << action_count << " WillOnce()" 8760 << (action_count == 1 ? " is" : "s are") << " specified - "; 8761 mocker->DescribeDefaultActionTo(args, &ss); 8762 Log(WARNING, ss.str(), 1); 8763 } 8764 8765 return count <= action_count ? 8766 *static_cast<const Action<F>*>(untyped_actions_[count - 1]) : 8767 repeated_action(); 8768 } 8769 8770 // Given the arguments of a mock function call, if the call will 8771 // over-saturate this expectation, returns the default action; 8772 // otherwise, returns the next action in this expectation. Also 8773 // describes *what* happened to 'what', and explains *why* Google 8774 // Mock does it to 'why'. This method is not const as it calls 8775 // IncrementCallCount(). A return value of NULL means the default 8776 // action. 8777 // L >= g_gmock_mutex 8778 const Action<F>* GetActionForArguments(const FunctionMockerBase<F>* mocker, 8779 const ArgumentTuple& args, 8780 ::std::ostream* what, 8781 ::std::ostream* why) { 8782 g_gmock_mutex.AssertHeld(); 8783 if (IsSaturated()) { 8784 // We have an excessive call. 8785 IncrementCallCount(); 8786 *what << "Mock function called more times than expected - "; 8787 mocker->DescribeDefaultActionTo(args, what); 8788 DescribeCallCountTo(why); 8789 8790 // TODO(wan@google.com): allow the user to control whether 8791 // unexpected calls should fail immediately or continue using a 8792 // flag --gmock_unexpected_calls_are_fatal. 8793 return NULL; 8794 } 8795 8796 IncrementCallCount(); 8797 RetireAllPreRequisites(); 8798 8799 if (retires_on_saturation_ && IsSaturated()) { 8800 Retire(); 8801 } 8802 8803 // Must be done after IncrementCount()! 8804 *what << "Mock function call matches " << source_text() <<"...\n"; 8805 return &(GetCurrentAction(mocker, args)); 8806 } 8807 8808 // All the fields below won't change once the EXPECT_CALL() 8809 // statement finishes. 8810 FunctionMockerBase<F>* const owner_; 8811 ArgumentMatcherTuple matchers_; 8812 Matcher<const ArgumentTuple&> extra_matcher_; 8813 Action<F> repeated_action_; 8814 8815 GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation); 8816 }; // class TypedExpectation 8817 8818 // A MockSpec object is used by ON_CALL() or EXPECT_CALL() for 8819 // specifying the default behavior of, or expectation on, a mock 8820 // function. 8821 8822 // Note: class MockSpec really belongs to the ::testing namespace. 8823 // However if we define it in ::testing, MSVC will complain when 8824 // classes in ::testing::internal declare it as a friend class 8825 // template. To workaround this compiler bug, we define MockSpec in 8826 // ::testing::internal and import it into ::testing. 8827 8828 // Logs a message including file and line number information. 8829 void LogWithLocation(testing::internal::LogSeverity severity, 8830 const char* file, int line, 8831 const string& message); 8832 8833 template <typename F> 8834 class MockSpec { 8835 public: 8836 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 8837 typedef typename internal::Function<F>::ArgumentMatcherTuple 8838 ArgumentMatcherTuple; 8839 8840 // Constructs a MockSpec object, given the function mocker object 8841 // that the spec is associated with. 8842 explicit MockSpec(internal::FunctionMockerBase<F>* function_mocker) 8843 : function_mocker_(function_mocker) {} 8844 8845 // Adds a new default action spec to the function mocker and returns 8846 // the newly created spec. 8847 internal::OnCallSpec<F>& InternalDefaultActionSetAt( 8848 const char* file, int line, const char* obj, const char* call) { 8849 LogWithLocation(internal::INFO, file, line, 8850 string("ON_CALL(") + obj + ", " + call + ") invoked"); 8851 return function_mocker_->AddNewOnCallSpec(file, line, matchers_); 8852 } 8853 8854 // Adds a new expectation spec to the function mocker and returns 8855 // the newly created spec. 8856 internal::TypedExpectation<F>& InternalExpectedAt( 8857 const char* file, int line, const char* obj, const char* call) { 8858 const string source_text(string("EXPECT_CALL(") + obj + ", " + call + ")"); 8859 LogWithLocation(internal::INFO, file, line, source_text + " invoked"); 8860 return function_mocker_->AddNewExpectation( 8861 file, line, source_text, matchers_); 8862 } 8863 8864 private: 8865 template <typename Function> 8866 friend class internal::FunctionMocker; 8867 8868 void SetMatchers(const ArgumentMatcherTuple& matchers) { 8869 matchers_ = matchers; 8870 } 8871 8872 // The function mocker that owns this spec. 8873 internal::FunctionMockerBase<F>* const function_mocker_; 8874 // The argument matchers specified in the spec. 8875 ArgumentMatcherTuple matchers_; 8876 8877 GTEST_DISALLOW_ASSIGN_(MockSpec); 8878 }; // class MockSpec 8879 8880 // MSVC warns about using 'this' in base member initializer list, so 8881 // we need to temporarily disable the warning. We have to do it for 8882 // the entire class to suppress the warning, even though it's about 8883 // the constructor only. 8884 8885 #ifdef _MSC_VER 8886 # pragma warning(push) // Saves the current warning state. 8887 # pragma warning(disable:4355) // Temporarily disables warning 4355. 8888 #endif // _MSV_VER 8889 8890 // C++ treats the void type specially. For example, you cannot define 8891 // a void-typed variable or pass a void value to a function. 8892 // ActionResultHolder<T> holds a value of type T, where T must be a 8893 // copyable type or void (T doesn't need to be default-constructable). 8894 // It hides the syntactic difference between void and other types, and 8895 // is used to unify the code for invoking both void-returning and 8896 // non-void-returning mock functions. 8897 8898 // Untyped base class for ActionResultHolder<T>. 8899 class UntypedActionResultHolderBase { 8900 public: 8901 virtual ~UntypedActionResultHolderBase() {} 8902 8903 // Prints the held value as an action's result to os. 8904 virtual void PrintAsActionResult(::std::ostream* os) const = 0; 8905 }; 8906 8907 // This generic definition is used when T is not void. 8908 template <typename T> 8909 class ActionResultHolder : public UntypedActionResultHolderBase { 8910 public: 8911 explicit ActionResultHolder(T a_value) : value_(a_value) {} 8912 8913 // The compiler-generated copy constructor and assignment operator 8914 // are exactly what we need, so we don't need to define them. 8915 8916 // Returns the held value and deletes this object. 8917 T GetValueAndDelete() const { 8918 T retval(value_); 8919 delete this; 8920 return retval; 8921 } 8922 8923 // Prints the held value as an action's result to os. 8924 virtual void PrintAsActionResult(::std::ostream* os) const { 8925 *os << "\n Returns: "; 8926 // T may be a reference type, so we don't use UniversalPrint(). 8927 UniversalPrinter<T>::Print(value_, os); 8928 } 8929 8930 // Performs the given mock function's default action and returns the 8931 // result in a new-ed ActionResultHolder. 8932 template <typename F> 8933 static ActionResultHolder* PerformDefaultAction( 8934 const FunctionMockerBase<F>* func_mocker, 8935 const typename Function<F>::ArgumentTuple& args, 8936 const string& call_description) { 8937 return new ActionResultHolder( 8938 func_mocker->PerformDefaultAction(args, call_description)); 8939 } 8940 8941 // Performs the given action and returns the result in a new-ed 8942 // ActionResultHolder. 8943 template <typename F> 8944 static ActionResultHolder* 8945 PerformAction(const Action<F>& action, 8946 const typename Function<F>::ArgumentTuple& args) { 8947 return new ActionResultHolder(action.Perform(args)); 8948 } 8949 8950 private: 8951 T value_; 8952 8953 // T could be a reference type, so = isn't supported. 8954 GTEST_DISALLOW_ASSIGN_(ActionResultHolder); 8955 }; 8956 8957 // Specialization for T = void. 8958 template <> 8959 class ActionResultHolder<void> : public UntypedActionResultHolderBase { 8960 public: 8961 void GetValueAndDelete() const { delete this; } 8962 8963 virtual void PrintAsActionResult(::std::ostream* /* os */) const {} 8964 8965 // Performs the given mock function's default action and returns NULL; 8966 template <typename F> 8967 static ActionResultHolder* PerformDefaultAction( 8968 const FunctionMockerBase<F>* func_mocker, 8969 const typename Function<F>::ArgumentTuple& args, 8970 const string& call_description) { 8971 func_mocker->PerformDefaultAction(args, call_description); 8972 return NULL; 8973 } 8974 8975 // Performs the given action and returns NULL. 8976 template <typename F> 8977 static ActionResultHolder* PerformAction( 8978 const Action<F>& action, 8979 const typename Function<F>::ArgumentTuple& args) { 8980 action.Perform(args); 8981 return NULL; 8982 } 8983 }; 8984 8985 // The base of the function mocker class for the given function type. 8986 // We put the methods in this class instead of its child to avoid code 8987 // bloat. 8988 template <typename F> 8989 class FunctionMockerBase : public UntypedFunctionMockerBase { 8990 public: 8991 typedef typename Function<F>::Result Result; 8992 typedef typename Function<F>::ArgumentTuple ArgumentTuple; 8993 typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple; 8994 8995 FunctionMockerBase() : current_spec_(this) {} 8996 8997 // The destructor verifies that all expectations on this mock 8998 // function have been satisfied. If not, it will report Google Test 8999 // non-fatal failures for the violations. 9000 // L < g_gmock_mutex 9001 virtual ~FunctionMockerBase() { 9002 MutexLock l(&g_gmock_mutex); 9003 VerifyAndClearExpectationsLocked(); 9004 Mock::UnregisterLocked(this); 9005 ClearDefaultActionsLocked(); 9006 } 9007 9008 // Returns the ON_CALL spec that matches this mock function with the 9009 // given arguments; returns NULL if no matching ON_CALL is found. 9010 // L = * 9011 const OnCallSpec<F>* FindOnCallSpec( 9012 const ArgumentTuple& args) const { 9013 for (UntypedOnCallSpecs::const_reverse_iterator it 9014 = untyped_on_call_specs_.rbegin(); 9015 it != untyped_on_call_specs_.rend(); ++it) { 9016 const OnCallSpec<F>* spec = static_cast<const OnCallSpec<F>*>(*it); 9017 if (spec->Matches(args)) 9018 return spec; 9019 } 9020 9021 return NULL; 9022 } 9023 9024 // Performs the default action of this mock function on the given arguments 9025 // and returns the result. Asserts with a helpful call descrption if there is 9026 // no valid return value. This method doesn't depend on the mutable state of 9027 // this object, and thus can be called concurrently without locking. 9028 // L = * 9029 Result PerformDefaultAction(const ArgumentTuple& args, 9030 const string& call_description) const { 9031 const OnCallSpec<F>* const spec = 9032 this->FindOnCallSpec(args); 9033 if (spec != NULL) { 9034 return spec->GetAction().Perform(args); 9035 } 9036 Assert(DefaultValue<Result>::Exists(), "", -1, 9037 call_description + "\n The mock function has no default action " 9038 "set, and its return type has no default value set."); 9039 return DefaultValue<Result>::Get(); 9040 } 9041 9042 // Performs the default action with the given arguments and returns 9043 // the action's result. The call description string will be used in 9044 // the error message to describe the call in the case the default 9045 // action fails. The caller is responsible for deleting the result. 9046 // L = * 9047 virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction( 9048 const void* untyped_args, // must point to an ArgumentTuple 9049 const string& call_description) const { 9050 const ArgumentTuple& args = 9051 *static_cast<const ArgumentTuple*>(untyped_args); 9052 return ResultHolder::PerformDefaultAction(this, args, call_description); 9053 } 9054 9055 // Performs the given action with the given arguments and returns 9056 // the action's result. The caller is responsible for deleting the 9057 // result. 9058 // L = * 9059 virtual UntypedActionResultHolderBase* UntypedPerformAction( 9060 const void* untyped_action, const void* untyped_args) const { 9061 // Make a copy of the action before performing it, in case the 9062 // action deletes the mock object (and thus deletes itself). 9063 const Action<F> action = *static_cast<const Action<F>*>(untyped_action); 9064 const ArgumentTuple& args = 9065 *static_cast<const ArgumentTuple*>(untyped_args); 9066 return ResultHolder::PerformAction(action, args); 9067 } 9068 9069 // Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked(): 9070 // clears the ON_CALL()s set on this mock function. 9071 // L >= g_gmock_mutex 9072 virtual void ClearDefaultActionsLocked() { 9073 g_gmock_mutex.AssertHeld(); 9074 for (UntypedOnCallSpecs::const_iterator it = 9075 untyped_on_call_specs_.begin(); 9076 it != untyped_on_call_specs_.end(); ++it) { 9077 delete static_cast<const OnCallSpec<F>*>(*it); 9078 } 9079 untyped_on_call_specs_.clear(); 9080 } 9081 9082 protected: 9083 template <typename Function> 9084 friend class MockSpec; 9085 9086 typedef ActionResultHolder<Result> ResultHolder; 9087 9088 // Returns the result of invoking this mock function with the given 9089 // arguments. This function can be safely called from multiple 9090 // threads concurrently. 9091 // L < g_gmock_mutex 9092 Result InvokeWith(const ArgumentTuple& args) { 9093 return static_cast<const ResultHolder*>( 9094 this->UntypedInvokeWith(&args))->GetValueAndDelete(); 9095 } 9096 9097 // Adds and returns a default action spec for this mock function. 9098 // L < g_gmock_mutex 9099 OnCallSpec<F>& AddNewOnCallSpec( 9100 const char* file, int line, 9101 const ArgumentMatcherTuple& m) { 9102 Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line); 9103 OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m); 9104 untyped_on_call_specs_.push_back(on_call_spec); 9105 return *on_call_spec; 9106 } 9107 9108 // Adds and returns an expectation spec for this mock function. 9109 // L < g_gmock_mutex 9110 TypedExpectation<F>& AddNewExpectation( 9111 const char* file, 9112 int line, 9113 const string& source_text, 9114 const ArgumentMatcherTuple& m) { 9115 Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line); 9116 TypedExpectation<F>* const expectation = 9117 new TypedExpectation<F>(this, file, line, source_text, m); 9118 const linked_ptr<ExpectationBase> untyped_expectation(expectation); 9119 untyped_expectations_.push_back(untyped_expectation); 9120 9121 // Adds this expectation into the implicit sequence if there is one. 9122 Sequence* const implicit_sequence = g_gmock_implicit_sequence.get(); 9123 if (implicit_sequence != NULL) { 9124 implicit_sequence->AddExpectation(Expectation(untyped_expectation)); 9125 } 9126 9127 return *expectation; 9128 } 9129 9130 // The current spec (either default action spec or expectation spec) 9131 // being described on this function mocker. 9132 MockSpec<F>& current_spec() { return current_spec_; } 9133 9134 private: 9135 template <typename Func> friend class TypedExpectation; 9136 9137 // Some utilities needed for implementing UntypedInvokeWith(). 9138 9139 // Describes what default action will be performed for the given 9140 // arguments. 9141 // L = * 9142 void DescribeDefaultActionTo(const ArgumentTuple& args, 9143 ::std::ostream* os) const { 9144 const OnCallSpec<F>* const spec = FindOnCallSpec(args); 9145 9146 if (spec == NULL) { 9147 *os << (internal::type_equals<Result, void>::value ? 9148 "returning directly.\n" : 9149 "returning default value.\n"); 9150 } else { 9151 *os << "taking default action specified at:\n" 9152 << FormatFileLocation(spec->file(), spec->line()) << "\n"; 9153 } 9154 } 9155 9156 // Writes a message that the call is uninteresting (i.e. neither 9157 // explicitly expected nor explicitly unexpected) to the given 9158 // ostream. 9159 // L < g_gmock_mutex 9160 virtual void UntypedDescribeUninterestingCall(const void* untyped_args, 9161 ::std::ostream* os) const { 9162 const ArgumentTuple& args = 9163 *static_cast<const ArgumentTuple*>(untyped_args); 9164 *os << "Uninteresting mock function call - "; 9165 DescribeDefaultActionTo(args, os); 9166 *os << " Function call: " << Name(); 9167 UniversalPrint(args, os); 9168 } 9169 9170 // Returns the expectation that matches the given function arguments 9171 // (or NULL is there's no match); when a match is found, 9172 // untyped_action is set to point to the action that should be 9173 // performed (or NULL if the action is "do default"), and 9174 // is_excessive is modified to indicate whether the call exceeds the 9175 // expected number. 9176 // 9177 // Critical section: We must find the matching expectation and the 9178 // corresponding action that needs to be taken in an ATOMIC 9179 // transaction. Otherwise another thread may call this mock 9180 // method in the middle and mess up the state. 9181 // 9182 // However, performing the action has to be left out of the critical 9183 // section. The reason is that we have no control on what the 9184 // action does (it can invoke an arbitrary user function or even a 9185 // mock function) and excessive locking could cause a dead lock. 9186 // L < g_gmock_mutex 9187 virtual const ExpectationBase* UntypedFindMatchingExpectation( 9188 const void* untyped_args, 9189 const void** untyped_action, bool* is_excessive, 9190 ::std::ostream* what, ::std::ostream* why) { 9191 const ArgumentTuple& args = 9192 *static_cast<const ArgumentTuple*>(untyped_args); 9193 MutexLock l(&g_gmock_mutex); 9194 TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args); 9195 if (exp == NULL) { // A match wasn't found. 9196 this->FormatUnexpectedCallMessageLocked(args, what, why); 9197 return NULL; 9198 } 9199 9200 // This line must be done before calling GetActionForArguments(), 9201 // which will increment the call count for *exp and thus affect 9202 // its saturation status. 9203 *is_excessive = exp->IsSaturated(); 9204 const Action<F>* action = exp->GetActionForArguments(this, args, what, why); 9205 if (action != NULL && action->IsDoDefault()) 9206 action = NULL; // Normalize "do default" to NULL. 9207 *untyped_action = action; 9208 return exp; 9209 } 9210 9211 // Prints the given function arguments to the ostream. 9212 virtual void UntypedPrintArgs(const void* untyped_args, 9213 ::std::ostream* os) const { 9214 const ArgumentTuple& args = 9215 *static_cast<const ArgumentTuple*>(untyped_args); 9216 UniversalPrint(args, os); 9217 } 9218 9219 // Returns the expectation that matches the arguments, or NULL if no 9220 // expectation matches them. 9221 // L >= g_gmock_mutex 9222 TypedExpectation<F>* FindMatchingExpectationLocked( 9223 const ArgumentTuple& args) const { 9224 g_gmock_mutex.AssertHeld(); 9225 for (typename UntypedExpectations::const_reverse_iterator it = 9226 untyped_expectations_.rbegin(); 9227 it != untyped_expectations_.rend(); ++it) { 9228 TypedExpectation<F>* const exp = 9229 static_cast<TypedExpectation<F>*>(it->get()); 9230 if (exp->ShouldHandleArguments(args)) { 9231 return exp; 9232 } 9233 } 9234 return NULL; 9235 } 9236 9237 // Returns a message that the arguments don't match any expectation. 9238 // L >= g_gmock_mutex 9239 void FormatUnexpectedCallMessageLocked(const ArgumentTuple& args, 9240 ::std::ostream* os, 9241 ::std::ostream* why) const { 9242 g_gmock_mutex.AssertHeld(); 9243 *os << "\nUnexpected mock function call - "; 9244 DescribeDefaultActionTo(args, os); 9245 PrintTriedExpectationsLocked(args, why); 9246 } 9247 9248 // Prints a list of expectations that have been tried against the 9249 // current mock function call. 9250 // L >= g_gmock_mutex 9251 void PrintTriedExpectationsLocked(const ArgumentTuple& args, 9252 ::std::ostream* why) const { 9253 g_gmock_mutex.AssertHeld(); 9254 const int count = static_cast<int>(untyped_expectations_.size()); 9255 *why << "Google Mock tried the following " << count << " " 9256 << (count == 1 ? "expectation, but it didn't match" : 9257 "expectations, but none matched") 9258 << ":\n"; 9259 for (int i = 0; i < count; i++) { 9260 TypedExpectation<F>* const expectation = 9261 static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get()); 9262 *why << "\n"; 9263 expectation->DescribeLocationTo(why); 9264 if (count > 1) { 9265 *why << "tried expectation #" << i << ": "; 9266 } 9267 *why << expectation->source_text() << "...\n"; 9268 expectation->ExplainMatchResultTo(args, why); 9269 expectation->DescribeCallCountTo(why); 9270 } 9271 } 9272 9273 // The current spec (either default action spec or expectation spec) 9274 // being described on this function mocker. 9275 MockSpec<F> current_spec_; 9276 9277 // There is no generally useful and implementable semantics of 9278 // copying a mock object, so copying a mock is usually a user error. 9279 // Thus we disallow copying function mockers. If the user really 9280 // wants to copy a mock object, he should implement his own copy 9281 // operation, for example: 9282 // 9283 // class MockFoo : public Foo { 9284 // public: 9285 // // Defines a copy constructor explicitly. 9286 // MockFoo(const MockFoo& src) {} 9287 // ... 9288 // }; 9289 GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase); 9290 }; // class FunctionMockerBase 9291 9292 #ifdef _MSC_VER 9293 # pragma warning(pop) // Restores the warning state. 9294 #endif // _MSV_VER 9295 9296 // Implements methods of FunctionMockerBase. 9297 9298 // Verifies that all expectations on this mock function have been 9299 // satisfied. Reports one or more Google Test non-fatal failures and 9300 // returns false if not. 9301 // L >= g_gmock_mutex 9302 9303 // Reports an uninteresting call (whose description is in msg) in the 9304 // manner specified by 'reaction'. 9305 void ReportUninterestingCall(CallReaction reaction, const string& msg); 9306 9307 } // namespace internal 9308 9309 // The style guide prohibits "using" statements in a namespace scope 9310 // inside a header file. However, the MockSpec class template is 9311 // meant to be defined in the ::testing namespace. The following line 9312 // is just a trick for working around a bug in MSVC 8.0, which cannot 9313 // handle it if we define MockSpec in ::testing. 9314 using internal::MockSpec; 9315 9316 // Const(x) is a convenient function for obtaining a const reference 9317 // to x. This is useful for setting expectations on an overloaded 9318 // const mock method, e.g. 9319 // 9320 // class MockFoo : public FooInterface { 9321 // public: 9322 // MOCK_METHOD0(Bar, int()); 9323 // MOCK_CONST_METHOD0(Bar, int&()); 9324 // }; 9325 // 9326 // MockFoo foo; 9327 // // Expects a call to non-const MockFoo::Bar(). 9328 // EXPECT_CALL(foo, Bar()); 9329 // // Expects a call to const MockFoo::Bar(). 9330 // EXPECT_CALL(Const(foo), Bar()); 9331 template <typename T> 9332 inline const T& Const(const T& x) { return x; } 9333 9334 // Constructs an Expectation object that references and co-owns exp. 9335 inline Expectation::Expectation(internal::ExpectationBase& exp) // NOLINT 9336 : expectation_base_(exp.GetHandle().expectation_base()) {} 9337 9338 } // namespace testing 9339 9340 // A separate macro is required to avoid compile errors when the name 9341 // of the method used in call is a result of macro expansion. 9342 // See CompilesWithMethodNameExpandedFromMacro tests in 9343 // internal/gmock-spec-builders_test.cc for more details. 9344 #define GMOCK_ON_CALL_IMPL_(obj, call) \ 9345 ((obj).gmock_##call).InternalDefaultActionSetAt(__FILE__, __LINE__, \ 9346 #obj, #call) 9347 #define ON_CALL(obj, call) GMOCK_ON_CALL_IMPL_(obj, call) 9348 9349 #define GMOCK_EXPECT_CALL_IMPL_(obj, call) \ 9350 ((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call) 9351 #define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call) 9352 9353 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ 9354 9355 namespace testing { 9356 namespace internal { 9357 9358 template <typename F> 9359 class FunctionMockerBase; 9360 9361 // Note: class FunctionMocker really belongs to the ::testing 9362 // namespace. However if we define it in ::testing, MSVC will 9363 // complain when classes in ::testing::internal declare it as a 9364 // friend class template. To workaround this compiler bug, we define 9365 // FunctionMocker in ::testing::internal and import it into ::testing. 9366 template <typename F> 9367 class FunctionMocker; 9368 9369 template <typename R> 9370 class FunctionMocker<R()> : public 9371 internal::FunctionMockerBase<R()> { 9372 public: 9373 typedef R F(); 9374 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9375 9376 MockSpec<F>& With() { 9377 return this->current_spec(); 9378 } 9379 9380 R Invoke() { 9381 // Even though gcc and MSVC don't enforce it, 'this->' is required 9382 // by the C++ standard [14.6.4] here, as the base class type is 9383 // dependent on the template argument (and thus shouldn't be 9384 // looked into when resolving InvokeWith). 9385 return this->InvokeWith(ArgumentTuple()); 9386 } 9387 }; 9388 9389 template <typename R, typename A1> 9390 class FunctionMocker<R(A1)> : public 9391 internal::FunctionMockerBase<R(A1)> { 9392 public: 9393 typedef R F(A1); 9394 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9395 9396 MockSpec<F>& With(const Matcher<A1>& m1) { 9397 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1)); 9398 return this->current_spec(); 9399 } 9400 9401 R Invoke(A1 a1) { 9402 // Even though gcc and MSVC don't enforce it, 'this->' is required 9403 // by the C++ standard [14.6.4] here, as the base class type is 9404 // dependent on the template argument (and thus shouldn't be 9405 // looked into when resolving InvokeWith). 9406 return this->InvokeWith(ArgumentTuple(a1)); 9407 } 9408 }; 9409 9410 template <typename R, typename A1, typename A2> 9411 class FunctionMocker<R(A1, A2)> : public 9412 internal::FunctionMockerBase<R(A1, A2)> { 9413 public: 9414 typedef R F(A1, A2); 9415 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9416 9417 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2) { 9418 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2)); 9419 return this->current_spec(); 9420 } 9421 9422 R Invoke(A1 a1, A2 a2) { 9423 // Even though gcc and MSVC don't enforce it, 'this->' is required 9424 // by the C++ standard [14.6.4] here, as the base class type is 9425 // dependent on the template argument (and thus shouldn't be 9426 // looked into when resolving InvokeWith). 9427 return this->InvokeWith(ArgumentTuple(a1, a2)); 9428 } 9429 }; 9430 9431 template <typename R, typename A1, typename A2, typename A3> 9432 class FunctionMocker<R(A1, A2, A3)> : public 9433 internal::FunctionMockerBase<R(A1, A2, A3)> { 9434 public: 9435 typedef R F(A1, A2, A3); 9436 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9437 9438 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9439 const Matcher<A3>& m3) { 9440 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3)); 9441 return this->current_spec(); 9442 } 9443 9444 R Invoke(A1 a1, A2 a2, A3 a3) { 9445 // Even though gcc and MSVC don't enforce it, 'this->' is required 9446 // by the C++ standard [14.6.4] here, as the base class type is 9447 // dependent on the template argument (and thus shouldn't be 9448 // looked into when resolving InvokeWith). 9449 return this->InvokeWith(ArgumentTuple(a1, a2, a3)); 9450 } 9451 }; 9452 9453 template <typename R, typename A1, typename A2, typename A3, typename A4> 9454 class FunctionMocker<R(A1, A2, A3, A4)> : public 9455 internal::FunctionMockerBase<R(A1, A2, A3, A4)> { 9456 public: 9457 typedef R F(A1, A2, A3, A4); 9458 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9459 9460 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9461 const Matcher<A3>& m3, const Matcher<A4>& m4) { 9462 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4)); 9463 return this->current_spec(); 9464 } 9465 9466 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) { 9467 // Even though gcc and MSVC don't enforce it, 'this->' is required 9468 // by the C++ standard [14.6.4] here, as the base class type is 9469 // dependent on the template argument (and thus shouldn't be 9470 // looked into when resolving InvokeWith). 9471 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4)); 9472 } 9473 }; 9474 9475 template <typename R, typename A1, typename A2, typename A3, typename A4, 9476 typename A5> 9477 class FunctionMocker<R(A1, A2, A3, A4, A5)> : public 9478 internal::FunctionMockerBase<R(A1, A2, A3, A4, A5)> { 9479 public: 9480 typedef R F(A1, A2, A3, A4, A5); 9481 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9482 9483 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9484 const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) { 9485 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, 9486 m5)); 9487 return this->current_spec(); 9488 } 9489 9490 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { 9491 // Even though gcc and MSVC don't enforce it, 'this->' is required 9492 // by the C++ standard [14.6.4] here, as the base class type is 9493 // dependent on the template argument (and thus shouldn't be 9494 // looked into when resolving InvokeWith). 9495 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5)); 9496 } 9497 }; 9498 9499 template <typename R, typename A1, typename A2, typename A3, typename A4, 9500 typename A5, typename A6> 9501 class FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public 9502 internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6)> { 9503 public: 9504 typedef R F(A1, A2, A3, A4, A5, A6); 9505 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9506 9507 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9508 const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5, 9509 const Matcher<A6>& m6) { 9510 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, 9511 m6)); 9512 return this->current_spec(); 9513 } 9514 9515 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { 9516 // Even though gcc and MSVC don't enforce it, 'this->' is required 9517 // by the C++ standard [14.6.4] here, as the base class type is 9518 // dependent on the template argument (and thus shouldn't be 9519 // looked into when resolving InvokeWith). 9520 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6)); 9521 } 9522 }; 9523 9524 template <typename R, typename A1, typename A2, typename A3, typename A4, 9525 typename A5, typename A6, typename A7> 9526 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public 9527 internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7)> { 9528 public: 9529 typedef R F(A1, A2, A3, A4, A5, A6, A7); 9530 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9531 9532 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9533 const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5, 9534 const Matcher<A6>& m6, const Matcher<A7>& m7) { 9535 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, 9536 m6, m7)); 9537 return this->current_spec(); 9538 } 9539 9540 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { 9541 // Even though gcc and MSVC don't enforce it, 'this->' is required 9542 // by the C++ standard [14.6.4] here, as the base class type is 9543 // dependent on the template argument (and thus shouldn't be 9544 // looked into when resolving InvokeWith). 9545 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7)); 9546 } 9547 }; 9548 9549 template <typename R, typename A1, typename A2, typename A3, typename A4, 9550 typename A5, typename A6, typename A7, typename A8> 9551 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public 9552 internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8)> { 9553 public: 9554 typedef R F(A1, A2, A3, A4, A5, A6, A7, A8); 9555 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9556 9557 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9558 const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5, 9559 const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) { 9560 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, 9561 m6, m7, m8)); 9562 return this->current_spec(); 9563 } 9564 9565 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { 9566 // Even though gcc and MSVC don't enforce it, 'this->' is required 9567 // by the C++ standard [14.6.4] here, as the base class type is 9568 // dependent on the template argument (and thus shouldn't be 9569 // looked into when resolving InvokeWith). 9570 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8)); 9571 } 9572 }; 9573 9574 template <typename R, typename A1, typename A2, typename A3, typename A4, 9575 typename A5, typename A6, typename A7, typename A8, typename A9> 9576 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public 9577 internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> { 9578 public: 9579 typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9); 9580 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9581 9582 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9583 const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5, 9584 const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8, 9585 const Matcher<A9>& m9) { 9586 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, 9587 m6, m7, m8, m9)); 9588 return this->current_spec(); 9589 } 9590 9591 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { 9592 // Even though gcc and MSVC don't enforce it, 'this->' is required 9593 // by the C++ standard [14.6.4] here, as the base class type is 9594 // dependent on the template argument (and thus shouldn't be 9595 // looked into when resolving InvokeWith). 9596 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9)); 9597 } 9598 }; 9599 9600 template <typename R, typename A1, typename A2, typename A3, typename A4, 9601 typename A5, typename A6, typename A7, typename A8, typename A9, 9602 typename A10> 9603 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public 9604 internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> { 9605 public: 9606 typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); 9607 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; 9608 9609 MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, 9610 const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5, 9611 const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8, 9612 const Matcher<A9>& m9, const Matcher<A10>& m10) { 9613 this->current_spec().SetMatchers(::std::tr1::make_tuple(m1, m2, m3, m4, m5, 9614 m6, m7, m8, m9, m10)); 9615 return this->current_spec(); 9616 } 9617 9618 R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, 9619 A10 a10) { 9620 // Even though gcc and MSVC don't enforce it, 'this->' is required 9621 // by the C++ standard [14.6.4] here, as the base class type is 9622 // dependent on the template argument (and thus shouldn't be 9623 // looked into when resolving InvokeWith). 9624 return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9, 9625 a10)); 9626 } 9627 }; 9628 9629 } // namespace internal 9630 9631 // The style guide prohibits "using" statements in a namespace scope 9632 // inside a header file. However, the FunctionMocker class template 9633 // is meant to be defined in the ::testing namespace. The following 9634 // line is just a trick for working around a bug in MSVC 8.0, which 9635 // cannot handle it if we define FunctionMocker in ::testing. 9636 using internal::FunctionMocker; 9637 9638 // The result type of function type F. 9639 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9640 #define GMOCK_RESULT_(tn, F) tn ::testing::internal::Function<F>::Result 9641 9642 // The type of argument N of function type F. 9643 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9644 #define GMOCK_ARG_(tn, F, N) tn ::testing::internal::Function<F>::Argument##N 9645 9646 // The matcher type for argument N of function type F. 9647 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9648 #define GMOCK_MATCHER_(tn, F, N) const ::testing::Matcher<GMOCK_ARG_(tn, F, N)>& 9649 9650 // The variable for mocking the given method. 9651 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9652 #define GMOCK_MOCKER_(arity, constness, Method) \ 9653 GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) 9654 9655 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9656 #define GMOCK_METHOD0_(tn, constness, ct, Method, F) \ 9657 GMOCK_RESULT_(tn, F) ct Method() constness { \ 9658 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9659 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 0, \ 9660 this_method_does_not_take_0_arguments); \ 9661 GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \ 9662 return GMOCK_MOCKER_(0, constness, Method).Invoke(); \ 9663 } \ 9664 ::testing::MockSpec<F>& \ 9665 gmock_##Method() constness { \ 9666 GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \ 9667 return GMOCK_MOCKER_(0, constness, Method).With(); \ 9668 } \ 9669 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(0, constness, Method) 9670 9671 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9672 #define GMOCK_METHOD1_(tn, constness, ct, Method, F) \ 9673 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1) constness { \ 9674 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9675 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 1, \ 9676 this_method_does_not_take_1_argument); \ 9677 GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \ 9678 return GMOCK_MOCKER_(1, constness, Method).Invoke(gmock_a1); \ 9679 } \ 9680 ::testing::MockSpec<F>& \ 9681 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1) constness { \ 9682 GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \ 9683 return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \ 9684 } \ 9685 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(1, constness, Method) 9686 9687 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9688 #define GMOCK_METHOD2_(tn, constness, ct, Method, F) \ 9689 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9690 GMOCK_ARG_(tn, F, 2) gmock_a2) constness { \ 9691 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9692 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 2, \ 9693 this_method_does_not_take_2_arguments); \ 9694 GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \ 9695 return GMOCK_MOCKER_(2, constness, Method).Invoke(gmock_a1, gmock_a2); \ 9696 } \ 9697 ::testing::MockSpec<F>& \ 9698 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9699 GMOCK_MATCHER_(tn, F, 2) gmock_a2) constness { \ 9700 GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \ 9701 return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \ 9702 } \ 9703 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(2, constness, Method) 9704 9705 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9706 #define GMOCK_METHOD3_(tn, constness, ct, Method, F) \ 9707 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9708 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9709 GMOCK_ARG_(tn, F, 3) gmock_a3) constness { \ 9710 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9711 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 3, \ 9712 this_method_does_not_take_3_arguments); \ 9713 GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \ 9714 return GMOCK_MOCKER_(3, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9715 gmock_a3); \ 9716 } \ 9717 ::testing::MockSpec<F>& \ 9718 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9719 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9720 GMOCK_MATCHER_(tn, F, 3) gmock_a3) constness { \ 9721 GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \ 9722 return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \ 9723 gmock_a3); \ 9724 } \ 9725 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(3, constness, Method) 9726 9727 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9728 #define GMOCK_METHOD4_(tn, constness, ct, Method, F) \ 9729 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9730 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9731 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9732 GMOCK_ARG_(tn, F, 4) gmock_a4) constness { \ 9733 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9734 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 4, \ 9735 this_method_does_not_take_4_arguments); \ 9736 GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \ 9737 return GMOCK_MOCKER_(4, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9738 gmock_a3, gmock_a4); \ 9739 } \ 9740 ::testing::MockSpec<F>& \ 9741 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9742 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9743 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9744 GMOCK_MATCHER_(tn, F, 4) gmock_a4) constness { \ 9745 GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \ 9746 return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \ 9747 gmock_a3, gmock_a4); \ 9748 } \ 9749 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(4, constness, Method) 9750 9751 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9752 #define GMOCK_METHOD5_(tn, constness, ct, Method, F) \ 9753 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9754 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9755 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9756 GMOCK_ARG_(tn, F, 4) gmock_a4, \ 9757 GMOCK_ARG_(tn, F, 5) gmock_a5) constness { \ 9758 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9759 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 5, \ 9760 this_method_does_not_take_5_arguments); \ 9761 GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \ 9762 return GMOCK_MOCKER_(5, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9763 gmock_a3, gmock_a4, gmock_a5); \ 9764 } \ 9765 ::testing::MockSpec<F>& \ 9766 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9767 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9768 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9769 GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ 9770 GMOCK_MATCHER_(tn, F, 5) gmock_a5) constness { \ 9771 GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \ 9772 return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \ 9773 gmock_a3, gmock_a4, gmock_a5); \ 9774 } \ 9775 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(5, constness, Method) 9776 9777 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9778 #define GMOCK_METHOD6_(tn, constness, ct, Method, F) \ 9779 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9780 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9781 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9782 GMOCK_ARG_(tn, F, 4) gmock_a4, \ 9783 GMOCK_ARG_(tn, F, 5) gmock_a5, \ 9784 GMOCK_ARG_(tn, F, 6) gmock_a6) constness { \ 9785 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9786 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 6, \ 9787 this_method_does_not_take_6_arguments); \ 9788 GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \ 9789 return GMOCK_MOCKER_(6, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9790 gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ 9791 } \ 9792 ::testing::MockSpec<F>& \ 9793 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9794 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9795 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9796 GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ 9797 GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ 9798 GMOCK_MATCHER_(tn, F, 6) gmock_a6) constness { \ 9799 GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \ 9800 return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \ 9801 gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ 9802 } \ 9803 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(6, constness, Method) 9804 9805 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9806 #define GMOCK_METHOD7_(tn, constness, ct, Method, F) \ 9807 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9808 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9809 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9810 GMOCK_ARG_(tn, F, 4) gmock_a4, \ 9811 GMOCK_ARG_(tn, F, 5) gmock_a5, \ 9812 GMOCK_ARG_(tn, F, 6) gmock_a6, \ 9813 GMOCK_ARG_(tn, F, 7) gmock_a7) constness { \ 9814 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9815 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 7, \ 9816 this_method_does_not_take_7_arguments); \ 9817 GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \ 9818 return GMOCK_MOCKER_(7, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9819 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ 9820 } \ 9821 ::testing::MockSpec<F>& \ 9822 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9823 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9824 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9825 GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ 9826 GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ 9827 GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ 9828 GMOCK_MATCHER_(tn, F, 7) gmock_a7) constness { \ 9829 GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \ 9830 return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \ 9831 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ 9832 } \ 9833 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(7, constness, Method) 9834 9835 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9836 #define GMOCK_METHOD8_(tn, constness, ct, Method, F) \ 9837 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9838 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9839 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9840 GMOCK_ARG_(tn, F, 4) gmock_a4, \ 9841 GMOCK_ARG_(tn, F, 5) gmock_a5, \ 9842 GMOCK_ARG_(tn, F, 6) gmock_a6, \ 9843 GMOCK_ARG_(tn, F, 7) gmock_a7, \ 9844 GMOCK_ARG_(tn, F, 8) gmock_a8) constness { \ 9845 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9846 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 8, \ 9847 this_method_does_not_take_8_arguments); \ 9848 GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \ 9849 return GMOCK_MOCKER_(8, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9850 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ 9851 } \ 9852 ::testing::MockSpec<F>& \ 9853 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9854 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9855 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9856 GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ 9857 GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ 9858 GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ 9859 GMOCK_MATCHER_(tn, F, 7) gmock_a7, \ 9860 GMOCK_MATCHER_(tn, F, 8) gmock_a8) constness { \ 9861 GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \ 9862 return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \ 9863 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ 9864 } \ 9865 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(8, constness, Method) 9866 9867 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9868 #define GMOCK_METHOD9_(tn, constness, ct, Method, F) \ 9869 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9870 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9871 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9872 GMOCK_ARG_(tn, F, 4) gmock_a4, \ 9873 GMOCK_ARG_(tn, F, 5) gmock_a5, \ 9874 GMOCK_ARG_(tn, F, 6) gmock_a6, \ 9875 GMOCK_ARG_(tn, F, 7) gmock_a7, \ 9876 GMOCK_ARG_(tn, F, 8) gmock_a8, \ 9877 GMOCK_ARG_(tn, F, 9) gmock_a9) constness { \ 9878 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9879 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 9, \ 9880 this_method_does_not_take_9_arguments); \ 9881 GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \ 9882 return GMOCK_MOCKER_(9, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9883 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ 9884 gmock_a9); \ 9885 } \ 9886 ::testing::MockSpec<F>& \ 9887 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9888 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9889 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9890 GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ 9891 GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ 9892 GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ 9893 GMOCK_MATCHER_(tn, F, 7) gmock_a7, \ 9894 GMOCK_MATCHER_(tn, F, 8) gmock_a8, \ 9895 GMOCK_MATCHER_(tn, F, 9) gmock_a9) constness { \ 9896 GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \ 9897 return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \ 9898 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ 9899 gmock_a9); \ 9900 } \ 9901 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(9, constness, Method) 9902 9903 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!! 9904 #define GMOCK_METHOD10_(tn, constness, ct, Method, F) \ 9905 GMOCK_RESULT_(tn, F) ct Method(GMOCK_ARG_(tn, F, 1) gmock_a1, \ 9906 GMOCK_ARG_(tn, F, 2) gmock_a2, \ 9907 GMOCK_ARG_(tn, F, 3) gmock_a3, \ 9908 GMOCK_ARG_(tn, F, 4) gmock_a4, \ 9909 GMOCK_ARG_(tn, F, 5) gmock_a5, \ 9910 GMOCK_ARG_(tn, F, 6) gmock_a6, \ 9911 GMOCK_ARG_(tn, F, 7) gmock_a7, \ 9912 GMOCK_ARG_(tn, F, 8) gmock_a8, \ 9913 GMOCK_ARG_(tn, F, 9) gmock_a9, \ 9914 GMOCK_ARG_(tn, F, 10) gmock_a10) constness { \ 9915 GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \ 9916 tn ::testing::internal::Function<F>::ArgumentTuple>::value == 10, \ 9917 this_method_does_not_take_10_arguments); \ 9918 GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \ 9919 return GMOCK_MOCKER_(10, constness, Method).Invoke(gmock_a1, gmock_a2, \ 9920 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ 9921 gmock_a10); \ 9922 } \ 9923 ::testing::MockSpec<F>& \ 9924 gmock_##Method(GMOCK_MATCHER_(tn, F, 1) gmock_a1, \ 9925 GMOCK_MATCHER_(tn, F, 2) gmock_a2, \ 9926 GMOCK_MATCHER_(tn, F, 3) gmock_a3, \ 9927 GMOCK_MATCHER_(tn, F, 4) gmock_a4, \ 9928 GMOCK_MATCHER_(tn, F, 5) gmock_a5, \ 9929 GMOCK_MATCHER_(tn, F, 6) gmock_a6, \ 9930 GMOCK_MATCHER_(tn, F, 7) gmock_a7, \ 9931 GMOCK_MATCHER_(tn, F, 8) gmock_a8, \ 9932 GMOCK_MATCHER_(tn, F, 9) gmock_a9, \ 9933 GMOCK_MATCHER_(tn, F, 10) gmock_a10) constness { \ 9934 GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \ 9935 return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \ 9936 gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ 9937 gmock_a10); \ 9938 } \ 9939 mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(10, constness, Method) 9940 9941 #define MOCK_METHOD0(m, F) GMOCK_METHOD0_(, , , m, F) 9942 #define MOCK_METHOD1(m, F) GMOCK_METHOD1_(, , , m, F) 9943 #define MOCK_METHOD2(m, F) GMOCK_METHOD2_(, , , m, F) 9944 #define MOCK_METHOD3(m, F) GMOCK_METHOD3_(, , , m, F) 9945 #define MOCK_METHOD4(m, F) GMOCK_METHOD4_(, , , m, F) 9946 #define MOCK_METHOD5(m, F) GMOCK_METHOD5_(, , , m, F) 9947 #define MOCK_METHOD6(m, F) GMOCK_METHOD6_(, , , m, F) 9948 #define MOCK_METHOD7(m, F) GMOCK_METHOD7_(, , , m, F) 9949 #define MOCK_METHOD8(m, F) GMOCK_METHOD8_(, , , m, F) 9950 #define MOCK_METHOD9(m, F) GMOCK_METHOD9_(, , , m, F) 9951 #define MOCK_METHOD10(m, F) GMOCK_METHOD10_(, , , m, F) 9952 9953 #define MOCK_CONST_METHOD0(m, F) GMOCK_METHOD0_(, const, , m, F) 9954 #define MOCK_CONST_METHOD1(m, F) GMOCK_METHOD1_(, const, , m, F) 9955 #define MOCK_CONST_METHOD2(m, F) GMOCK_METHOD2_(, const, , m, F) 9956 #define MOCK_CONST_METHOD3(m, F) GMOCK_METHOD3_(, const, , m, F) 9957 #define MOCK_CONST_METHOD4(m, F) GMOCK_METHOD4_(, const, , m, F) 9958 #define MOCK_CONST_METHOD5(m, F) GMOCK_METHOD5_(, const, , m, F) 9959 #define MOCK_CONST_METHOD6(m, F) GMOCK_METHOD6_(, const, , m, F) 9960 #define MOCK_CONST_METHOD7(m, F) GMOCK_METHOD7_(, const, , m, F) 9961 #define MOCK_CONST_METHOD8(m, F) GMOCK_METHOD8_(, const, , m, F) 9962 #define MOCK_CONST_METHOD9(m, F) GMOCK_METHOD9_(, const, , m, F) 9963 #define MOCK_CONST_METHOD10(m, F) GMOCK_METHOD10_(, const, , m, F) 9964 9965 #define MOCK_METHOD0_T(m, F) GMOCK_METHOD0_(typename, , , m, F) 9966 #define MOCK_METHOD1_T(m, F) GMOCK_METHOD1_(typename, , , m, F) 9967 #define MOCK_METHOD2_T(m, F) GMOCK_METHOD2_(typename, , , m, F) 9968 #define MOCK_METHOD3_T(m, F) GMOCK_METHOD3_(typename, , , m, F) 9969 #define MOCK_METHOD4_T(m, F) GMOCK_METHOD4_(typename, , , m, F) 9970 #define MOCK_METHOD5_T(m, F) GMOCK_METHOD5_(typename, , , m, F) 9971 #define MOCK_METHOD6_T(m, F) GMOCK_METHOD6_(typename, , , m, F) 9972 #define MOCK_METHOD7_T(m, F) GMOCK_METHOD7_(typename, , , m, F) 9973 #define MOCK_METHOD8_T(m, F) GMOCK_METHOD8_(typename, , , m, F) 9974 #define MOCK_METHOD9_T(m, F) GMOCK_METHOD9_(typename, , , m, F) 9975 #define MOCK_METHOD10_T(m, F) GMOCK_METHOD10_(typename, , , m, F) 9976 9977 #define MOCK_CONST_METHOD0_T(m, F) GMOCK_METHOD0_(typename, const, , m, F) 9978 #define MOCK_CONST_METHOD1_T(m, F) GMOCK_METHOD1_(typename, const, , m, F) 9979 #define MOCK_CONST_METHOD2_T(m, F) GMOCK_METHOD2_(typename, const, , m, F) 9980 #define MOCK_CONST_METHOD3_T(m, F) GMOCK_METHOD3_(typename, const, , m, F) 9981 #define MOCK_CONST_METHOD4_T(m, F) GMOCK_METHOD4_(typename, const, , m, F) 9982 #define MOCK_CONST_METHOD5_T(m, F) GMOCK_METHOD5_(typename, const, , m, F) 9983 #define MOCK_CONST_METHOD6_T(m, F) GMOCK_METHOD6_(typename, const, , m, F) 9984 #define MOCK_CONST_METHOD7_T(m, F) GMOCK_METHOD7_(typename, const, , m, F) 9985 #define MOCK_CONST_METHOD8_T(m, F) GMOCK_METHOD8_(typename, const, , m, F) 9986 #define MOCK_CONST_METHOD9_T(m, F) GMOCK_METHOD9_(typename, const, , m, F) 9987 #define MOCK_CONST_METHOD10_T(m, F) GMOCK_METHOD10_(typename, const, , m, F) 9988 9989 #define MOCK_METHOD0_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD0_(, , ct, m, F) 9990 #define MOCK_METHOD1_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD1_(, , ct, m, F) 9991 #define MOCK_METHOD2_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD2_(, , ct, m, F) 9992 #define MOCK_METHOD3_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD3_(, , ct, m, F) 9993 #define MOCK_METHOD4_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD4_(, , ct, m, F) 9994 #define MOCK_METHOD5_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD5_(, , ct, m, F) 9995 #define MOCK_METHOD6_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD6_(, , ct, m, F) 9996 #define MOCK_METHOD7_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD7_(, , ct, m, F) 9997 #define MOCK_METHOD8_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD8_(, , ct, m, F) 9998 #define MOCK_METHOD9_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD9_(, , ct, m, F) 9999 #define MOCK_METHOD10_WITH_CALLTYPE(ct, m, F) GMOCK_METHOD10_(, , ct, m, F) 10000 10001 #define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, F) \ 10002 GMOCK_METHOD0_(, const, ct, m, F) 10003 #define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, F) \ 10004 GMOCK_METHOD1_(, const, ct, m, F) 10005 #define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, F) \ 10006 GMOCK_METHOD2_(, const, ct, m, F) 10007 #define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, F) \ 10008 GMOCK_METHOD3_(, const, ct, m, F) 10009 #define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, F) \ 10010 GMOCK_METHOD4_(, const, ct, m, F) 10011 #define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, F) \ 10012 GMOCK_METHOD5_(, const, ct, m, F) 10013 #define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, F) \ 10014 GMOCK_METHOD6_(, const, ct, m, F) 10015 #define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, F) \ 10016 GMOCK_METHOD7_(, const, ct, m, F) 10017 #define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, F) \ 10018 GMOCK_METHOD8_(, const, ct, m, F) 10019 #define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, F) \ 10020 GMOCK_METHOD9_(, const, ct, m, F) 10021 #define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, F) \ 10022 GMOCK_METHOD10_(, const, ct, m, F) 10023 10024 #define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, F) \ 10025 GMOCK_METHOD0_(typename, , ct, m, F) 10026 #define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, F) \ 10027 GMOCK_METHOD1_(typename, , ct, m, F) 10028 #define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, F) \ 10029 GMOCK_METHOD2_(typename, , ct, m, F) 10030 #define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, F) \ 10031 GMOCK_METHOD3_(typename, , ct, m, F) 10032 #define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, F) \ 10033 GMOCK_METHOD4_(typename, , ct, m, F) 10034 #define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, F) \ 10035 GMOCK_METHOD5_(typename, , ct, m, F) 10036 #define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, F) \ 10037 GMOCK_METHOD6_(typename, , ct, m, F) 10038 #define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, F) \ 10039 GMOCK_METHOD7_(typename, , ct, m, F) 10040 #define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, F) \ 10041 GMOCK_METHOD8_(typename, , ct, m, F) 10042 #define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, F) \ 10043 GMOCK_METHOD9_(typename, , ct, m, F) 10044 #define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, F) \ 10045 GMOCK_METHOD10_(typename, , ct, m, F) 10046 10047 #define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, F) \ 10048 GMOCK_METHOD0_(typename, const, ct, m, F) 10049 #define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, F) \ 10050 GMOCK_METHOD1_(typename, const, ct, m, F) 10051 #define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, F) \ 10052 GMOCK_METHOD2_(typename, const, ct, m, F) 10053 #define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, F) \ 10054 GMOCK_METHOD3_(typename, const, ct, m, F) 10055 #define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, F) \ 10056 GMOCK_METHOD4_(typename, const, ct, m, F) 10057 #define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, F) \ 10058 GMOCK_METHOD5_(typename, const, ct, m, F) 10059 #define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, F) \ 10060 GMOCK_METHOD6_(typename, const, ct, m, F) 10061 #define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, F) \ 10062 GMOCK_METHOD7_(typename, const, ct, m, F) 10063 #define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, F) \ 10064 GMOCK_METHOD8_(typename, const, ct, m, F) 10065 #define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, F) \ 10066 GMOCK_METHOD9_(typename, const, ct, m, F) 10067 #define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, F) \ 10068 GMOCK_METHOD10_(typename, const, ct, m, F) 10069 10070 // A MockFunction<F> class has one mock method whose type is F. It is 10071 // useful when you just want your test code to emit some messages and 10072 // have Google Mock verify the right messages are sent (and perhaps at 10073 // the right times). For example, if you are exercising code: 10074 // 10075 // Foo(1); 10076 // Foo(2); 10077 // Foo(3); 10078 // 10079 // and want to verify that Foo(1) and Foo(3) both invoke 10080 // mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write: 10081 // 10082 // TEST(FooTest, InvokesBarCorrectly) { 10083 // MyMock mock; 10084 // MockFunction<void(string check_point_name)> check; 10085 // { 10086 // InSequence s; 10087 // 10088 // EXPECT_CALL(mock, Bar("a")); 10089 // EXPECT_CALL(check, Call("1")); 10090 // EXPECT_CALL(check, Call("2")); 10091 // EXPECT_CALL(mock, Bar("a")); 10092 // } 10093 // Foo(1); 10094 // check.Call("1"); 10095 // Foo(2); 10096 // check.Call("2"); 10097 // Foo(3); 10098 // } 10099 // 10100 // The expectation spec says that the first Bar("a") must happen 10101 // before check point "1", the second Bar("a") must happen after check 10102 // point "2", and nothing should happen between the two check 10103 // points. The explicit check points make it easy to tell which 10104 // Bar("a") is called by which call to Foo(). 10105 template <typename F> 10106 class MockFunction; 10107 10108 template <typename R> 10109 class MockFunction<R()> { 10110 public: 10111 MockFunction() {} 10112 10113 MOCK_METHOD0_T(Call, R()); 10114 10115 private: 10116 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10117 }; 10118 10119 template <typename R, typename A0> 10120 class MockFunction<R(A0)> { 10121 public: 10122 MockFunction() {} 10123 10124 MOCK_METHOD1_T(Call, R(A0)); 10125 10126 private: 10127 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10128 }; 10129 10130 template <typename R, typename A0, typename A1> 10131 class MockFunction<R(A0, A1)> { 10132 public: 10133 MockFunction() {} 10134 10135 MOCK_METHOD2_T(Call, R(A0, A1)); 10136 10137 private: 10138 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10139 }; 10140 10141 template <typename R, typename A0, typename A1, typename A2> 10142 class MockFunction<R(A0, A1, A2)> { 10143 public: 10144 MockFunction() {} 10145 10146 MOCK_METHOD3_T(Call, R(A0, A1, A2)); 10147 10148 private: 10149 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10150 }; 10151 10152 template <typename R, typename A0, typename A1, typename A2, typename A3> 10153 class MockFunction<R(A0, A1, A2, A3)> { 10154 public: 10155 MockFunction() {} 10156 10157 MOCK_METHOD4_T(Call, R(A0, A1, A2, A3)); 10158 10159 private: 10160 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10161 }; 10162 10163 template <typename R, typename A0, typename A1, typename A2, typename A3, 10164 typename A4> 10165 class MockFunction<R(A0, A1, A2, A3, A4)> { 10166 public: 10167 MockFunction() {} 10168 10169 MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4)); 10170 10171 private: 10172 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10173 }; 10174 10175 template <typename R, typename A0, typename A1, typename A2, typename A3, 10176 typename A4, typename A5> 10177 class MockFunction<R(A0, A1, A2, A3, A4, A5)> { 10178 public: 10179 MockFunction() {} 10180 10181 MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5)); 10182 10183 private: 10184 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10185 }; 10186 10187 template <typename R, typename A0, typename A1, typename A2, typename A3, 10188 typename A4, typename A5, typename A6> 10189 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> { 10190 public: 10191 MockFunction() {} 10192 10193 MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6)); 10194 10195 private: 10196 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10197 }; 10198 10199 template <typename R, typename A0, typename A1, typename A2, typename A3, 10200 typename A4, typename A5, typename A6, typename A7> 10201 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> { 10202 public: 10203 MockFunction() {} 10204 10205 MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7)); 10206 10207 private: 10208 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10209 }; 10210 10211 template <typename R, typename A0, typename A1, typename A2, typename A3, 10212 typename A4, typename A5, typename A6, typename A7, typename A8> 10213 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> { 10214 public: 10215 MockFunction() {} 10216 10217 MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8)); 10218 10219 private: 10220 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10221 }; 10222 10223 template <typename R, typename A0, typename A1, typename A2, typename A3, 10224 typename A4, typename A5, typename A6, typename A7, typename A8, 10225 typename A9> 10226 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> { 10227 public: 10228 MockFunction() {} 10229 10230 MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)); 10231 10232 private: 10233 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction); 10234 }; 10235 10236 } // namespace testing 10237 10238 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ 10239 // This file was GENERATED by command: 10240 // pump.py gmock-generated-matchers.h.pump 10241 // DO NOT EDIT BY HAND!!! 10242 10243 // Copyright 2008, Google Inc. 10244 // All rights reserved. 10245 // 10246 // Redistribution and use in source and binary forms, with or without 10247 // modification, are permitted provided that the following conditions are 10248 // met: 10249 // 10250 // * Redistributions of source code must retain the above copyright 10251 // notice, this list of conditions and the following disclaimer. 10252 // * Redistributions in binary form must reproduce the above 10253 // copyright notice, this list of conditions and the following disclaimer 10254 // in the documentation and/or other materials provided with the 10255 // distribution. 10256 // * Neither the name of Google Inc. nor the names of its 10257 // contributors may be used to endorse or promote products derived from 10258 // this software without specific prior written permission. 10259 // 10260 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 10261 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10262 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 10263 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 10264 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 10265 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 10266 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 10267 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 10268 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 10269 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 10270 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10271 10272 // Google Mock - a framework for writing C++ mock classes. 10273 // 10274 // This file implements some commonly used variadic matchers. 10275 10276 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 10277 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 10278 10279 #include <sstream> 10280 #include <string> 10281 #include <vector> 10282 10283 namespace testing { 10284 namespace internal { 10285 10286 // The type of the i-th (0-based) field of Tuple. 10287 #define GMOCK_FIELD_TYPE_(Tuple, i) \ 10288 typename ::std::tr1::tuple_element<i, Tuple>::type 10289 10290 // TupleFields<Tuple, k0, ..., kn> is for selecting fields from a 10291 // tuple of type Tuple. It has two members: 10292 // 10293 // type: a tuple type whose i-th field is the ki-th field of Tuple. 10294 // GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. 10295 // 10296 // For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have: 10297 // 10298 // type is tuple<int, bool>, and 10299 // GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). 10300 10301 template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, 10302 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 10303 int k9 = -1> 10304 class TupleFields; 10305 10306 // This generic version is used when there are 10 selectors. 10307 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 10308 int k7, int k8, int k9> 10309 class TupleFields { 10310 public: 10311 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10312 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10313 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 10314 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 10315 GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8), 10316 GMOCK_FIELD_TYPE_(Tuple, k9)> type; 10317 static type GetSelectedFields(const Tuple& t) { 10318 using ::std::tr1::get; 10319 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 10320 get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t)); 10321 } 10322 }; 10323 10324 // The following specialization is used for 0 ~ 9 selectors. 10325 10326 template <class Tuple> 10327 class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 10328 public: 10329 typedef ::std::tr1::tuple<> type; 10330 static type GetSelectedFields(const Tuple& /* t */) { 10331 using ::std::tr1::get; 10332 return type(); 10333 } 10334 }; 10335 10336 template <class Tuple, int k0> 10337 class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 10338 public: 10339 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type; 10340 static type GetSelectedFields(const Tuple& t) { 10341 using ::std::tr1::get; 10342 return type(get<k0>(t)); 10343 } 10344 }; 10345 10346 template <class Tuple, int k0, int k1> 10347 class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> { 10348 public: 10349 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10350 GMOCK_FIELD_TYPE_(Tuple, k1)> type; 10351 static type GetSelectedFields(const Tuple& t) { 10352 using ::std::tr1::get; 10353 return type(get<k0>(t), get<k1>(t)); 10354 } 10355 }; 10356 10357 template <class Tuple, int k0, int k1, int k2> 10358 class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> { 10359 public: 10360 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10361 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type; 10362 static type GetSelectedFields(const Tuple& t) { 10363 using ::std::tr1::get; 10364 return type(get<k0>(t), get<k1>(t), get<k2>(t)); 10365 } 10366 }; 10367 10368 template <class Tuple, int k0, int k1, int k2, int k3> 10369 class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> { 10370 public: 10371 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10372 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10373 GMOCK_FIELD_TYPE_(Tuple, k3)> type; 10374 static type GetSelectedFields(const Tuple& t) { 10375 using ::std::tr1::get; 10376 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t)); 10377 } 10378 }; 10379 10380 template <class Tuple, int k0, int k1, int k2, int k3, int k4> 10381 class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> { 10382 public: 10383 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10384 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10385 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type; 10386 static type GetSelectedFields(const Tuple& t) { 10387 using ::std::tr1::get; 10388 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t)); 10389 } 10390 }; 10391 10392 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5> 10393 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> { 10394 public: 10395 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10396 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10397 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 10398 GMOCK_FIELD_TYPE_(Tuple, k5)> type; 10399 static type GetSelectedFields(const Tuple& t) { 10400 using ::std::tr1::get; 10401 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 10402 get<k5>(t)); 10403 } 10404 }; 10405 10406 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6> 10407 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> { 10408 public: 10409 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10410 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10411 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 10412 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type; 10413 static type GetSelectedFields(const Tuple& t) { 10414 using ::std::tr1::get; 10415 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 10416 get<k5>(t), get<k6>(t)); 10417 } 10418 }; 10419 10420 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 10421 int k7> 10422 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> { 10423 public: 10424 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10425 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10426 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 10427 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 10428 GMOCK_FIELD_TYPE_(Tuple, k7)> type; 10429 static type GetSelectedFields(const Tuple& t) { 10430 using ::std::tr1::get; 10431 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 10432 get<k5>(t), get<k6>(t), get<k7>(t)); 10433 } 10434 }; 10435 10436 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 10437 int k7, int k8> 10438 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> { 10439 public: 10440 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 10441 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 10442 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 10443 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 10444 GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type; 10445 static type GetSelectedFields(const Tuple& t) { 10446 using ::std::tr1::get; 10447 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 10448 get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t)); 10449 } 10450 }; 10451 10452 #undef GMOCK_FIELD_TYPE_ 10453 10454 // Implements the Args() matcher. 10455 template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, 10456 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 10457 int k9 = -1> 10458 class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> { 10459 public: 10460 // ArgsTuple may have top-level const or reference modifiers. 10461 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple; 10462 typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, 10463 k6, k7, k8, k9>::type SelectedArgs; 10464 typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher; 10465 10466 template <typename InnerMatcher> 10467 explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) 10468 : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {} 10469 10470 virtual bool MatchAndExplain(ArgsTuple args, 10471 MatchResultListener* listener) const { 10472 const SelectedArgs& selected_args = GetSelectedArgs(args); 10473 if (!listener->IsInterested()) 10474 return inner_matcher_.Matches(selected_args); 10475 10476 PrintIndices(listener->stream()); 10477 *listener << "are " << PrintToString(selected_args); 10478 10479 StringMatchResultListener inner_listener; 10480 const bool match = inner_matcher_.MatchAndExplain(selected_args, 10481 &inner_listener); 10482 PrintIfNotEmpty(inner_listener.str(), listener->stream()); 10483 return match; 10484 } 10485 10486 virtual void DescribeTo(::std::ostream* os) const { 10487 *os << "are a tuple "; 10488 PrintIndices(os); 10489 inner_matcher_.DescribeTo(os); 10490 } 10491 10492 virtual void DescribeNegationTo(::std::ostream* os) const { 10493 *os << "are a tuple "; 10494 PrintIndices(os); 10495 inner_matcher_.DescribeNegationTo(os); 10496 } 10497 10498 private: 10499 static SelectedArgs GetSelectedArgs(ArgsTuple args) { 10500 return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, 10501 k9>::GetSelectedFields(args); 10502 } 10503 10504 // Prints the indices of the selected fields. 10505 static void PrintIndices(::std::ostream* os) { 10506 *os << "whose fields ("; 10507 const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 }; 10508 for (int i = 0; i < 10; i++) { 10509 if (indices[i] < 0) 10510 break; 10511 10512 if (i >= 1) 10513 *os << ", "; 10514 10515 *os << "#" << indices[i]; 10516 } 10517 *os << ") "; 10518 } 10519 10520 const MonomorphicInnerMatcher inner_matcher_; 10521 10522 GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); 10523 }; 10524 10525 template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1, 10526 int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, 10527 int k8 = -1, int k9 = -1> 10528 class ArgsMatcher { 10529 public: 10530 explicit ArgsMatcher(const InnerMatcher& inner_matcher) 10531 : inner_matcher_(inner_matcher) {} 10532 10533 template <typename ArgsTuple> 10534 operator Matcher<ArgsTuple>() const { 10535 return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5, 10536 k6, k7, k8, k9>(inner_matcher_)); 10537 } 10538 10539 private: 10540 const InnerMatcher inner_matcher_; 10541 10542 GTEST_DISALLOW_ASSIGN_(ArgsMatcher); 10543 }; 10544 10545 // Implements ElementsAre() of 1-10 arguments. 10546 10547 template <typename T1> 10548 class ElementsAreMatcher1 { 10549 public: 10550 explicit ElementsAreMatcher1(const T1& e1) : e1_(e1) {} 10551 10552 template <typename Container> 10553 operator Matcher<Container>() const { 10554 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10555 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10556 Element; 10557 10558 // Nokia's Symbian Compiler has a nasty bug where the object put 10559 // in a one-element local array is not destructed when the array 10560 // goes out of scope. This leads to obvious badness as we've 10561 // added the linked_ptr in it to our other linked_ptrs list. 10562 // Hence we implement ElementsAreMatcher1 specially to avoid using 10563 // a local array. 10564 const Matcher<const Element&> matcher = 10565 MatcherCast<const Element&>(e1_); 10566 return MakeMatcher(new ElementsAreMatcherImpl<Container>(&matcher, 1)); 10567 } 10568 10569 private: 10570 const T1& e1_; 10571 10572 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher1); 10573 }; 10574 10575 template <typename T1, typename T2> 10576 class ElementsAreMatcher2 { 10577 public: 10578 ElementsAreMatcher2(const T1& e1, const T2& e2) : e1_(e1), e2_(e2) {} 10579 10580 template <typename Container> 10581 operator Matcher<Container>() const { 10582 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10583 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10584 Element; 10585 10586 const Matcher<const Element&> matchers[] = { 10587 MatcherCast<const Element&>(e1_), 10588 MatcherCast<const Element&>(e2_), 10589 }; 10590 10591 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 2)); 10592 } 10593 10594 private: 10595 const T1& e1_; 10596 const T2& e2_; 10597 10598 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher2); 10599 }; 10600 10601 template <typename T1, typename T2, typename T3> 10602 class ElementsAreMatcher3 { 10603 public: 10604 ElementsAreMatcher3(const T1& e1, const T2& e2, const T3& e3) : e1_(e1), 10605 e2_(e2), e3_(e3) {} 10606 10607 template <typename Container> 10608 operator Matcher<Container>() const { 10609 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10610 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10611 Element; 10612 10613 const Matcher<const Element&> matchers[] = { 10614 MatcherCast<const Element&>(e1_), 10615 MatcherCast<const Element&>(e2_), 10616 MatcherCast<const Element&>(e3_), 10617 }; 10618 10619 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 3)); 10620 } 10621 10622 private: 10623 const T1& e1_; 10624 const T2& e2_; 10625 const T3& e3_; 10626 10627 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher3); 10628 }; 10629 10630 template <typename T1, typename T2, typename T3, typename T4> 10631 class ElementsAreMatcher4 { 10632 public: 10633 ElementsAreMatcher4(const T1& e1, const T2& e2, const T3& e3, 10634 const T4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {} 10635 10636 template <typename Container> 10637 operator Matcher<Container>() const { 10638 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10639 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10640 Element; 10641 10642 const Matcher<const Element&> matchers[] = { 10643 MatcherCast<const Element&>(e1_), 10644 MatcherCast<const Element&>(e2_), 10645 MatcherCast<const Element&>(e3_), 10646 MatcherCast<const Element&>(e4_), 10647 }; 10648 10649 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 4)); 10650 } 10651 10652 private: 10653 const T1& e1_; 10654 const T2& e2_; 10655 const T3& e3_; 10656 const T4& e4_; 10657 10658 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher4); 10659 }; 10660 10661 template <typename T1, typename T2, typename T3, typename T4, typename T5> 10662 class ElementsAreMatcher5 { 10663 public: 10664 ElementsAreMatcher5(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 10665 const T5& e5) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {} 10666 10667 template <typename Container> 10668 operator Matcher<Container>() const { 10669 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10670 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10671 Element; 10672 10673 const Matcher<const Element&> matchers[] = { 10674 MatcherCast<const Element&>(e1_), 10675 MatcherCast<const Element&>(e2_), 10676 MatcherCast<const Element&>(e3_), 10677 MatcherCast<const Element&>(e4_), 10678 MatcherCast<const Element&>(e5_), 10679 }; 10680 10681 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 5)); 10682 } 10683 10684 private: 10685 const T1& e1_; 10686 const T2& e2_; 10687 const T3& e3_; 10688 const T4& e4_; 10689 const T5& e5_; 10690 10691 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher5); 10692 }; 10693 10694 template <typename T1, typename T2, typename T3, typename T4, typename T5, 10695 typename T6> 10696 class ElementsAreMatcher6 { 10697 public: 10698 ElementsAreMatcher6(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 10699 const T5& e5, const T6& e6) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), 10700 e5_(e5), e6_(e6) {} 10701 10702 template <typename Container> 10703 operator Matcher<Container>() const { 10704 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10705 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10706 Element; 10707 10708 const Matcher<const Element&> matchers[] = { 10709 MatcherCast<const Element&>(e1_), 10710 MatcherCast<const Element&>(e2_), 10711 MatcherCast<const Element&>(e3_), 10712 MatcherCast<const Element&>(e4_), 10713 MatcherCast<const Element&>(e5_), 10714 MatcherCast<const Element&>(e6_), 10715 }; 10716 10717 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 6)); 10718 } 10719 10720 private: 10721 const T1& e1_; 10722 const T2& e2_; 10723 const T3& e3_; 10724 const T4& e4_; 10725 const T5& e5_; 10726 const T6& e6_; 10727 10728 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher6); 10729 }; 10730 10731 template <typename T1, typename T2, typename T3, typename T4, typename T5, 10732 typename T6, typename T7> 10733 class ElementsAreMatcher7 { 10734 public: 10735 ElementsAreMatcher7(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 10736 const T5& e5, const T6& e6, const T7& e7) : e1_(e1), e2_(e2), e3_(e3), 10737 e4_(e4), e5_(e5), e6_(e6), e7_(e7) {} 10738 10739 template <typename Container> 10740 operator Matcher<Container>() const { 10741 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10742 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10743 Element; 10744 10745 const Matcher<const Element&> matchers[] = { 10746 MatcherCast<const Element&>(e1_), 10747 MatcherCast<const Element&>(e2_), 10748 MatcherCast<const Element&>(e3_), 10749 MatcherCast<const Element&>(e4_), 10750 MatcherCast<const Element&>(e5_), 10751 MatcherCast<const Element&>(e6_), 10752 MatcherCast<const Element&>(e7_), 10753 }; 10754 10755 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 7)); 10756 } 10757 10758 private: 10759 const T1& e1_; 10760 const T2& e2_; 10761 const T3& e3_; 10762 const T4& e4_; 10763 const T5& e5_; 10764 const T6& e6_; 10765 const T7& e7_; 10766 10767 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher7); 10768 }; 10769 10770 template <typename T1, typename T2, typename T3, typename T4, typename T5, 10771 typename T6, typename T7, typename T8> 10772 class ElementsAreMatcher8 { 10773 public: 10774 ElementsAreMatcher8(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 10775 const T5& e5, const T6& e6, const T7& e7, const T8& e8) : e1_(e1), 10776 e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8) {} 10777 10778 template <typename Container> 10779 operator Matcher<Container>() const { 10780 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10781 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10782 Element; 10783 10784 const Matcher<const Element&> matchers[] = { 10785 MatcherCast<const Element&>(e1_), 10786 MatcherCast<const Element&>(e2_), 10787 MatcherCast<const Element&>(e3_), 10788 MatcherCast<const Element&>(e4_), 10789 MatcherCast<const Element&>(e5_), 10790 MatcherCast<const Element&>(e6_), 10791 MatcherCast<const Element&>(e7_), 10792 MatcherCast<const Element&>(e8_), 10793 }; 10794 10795 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 8)); 10796 } 10797 10798 private: 10799 const T1& e1_; 10800 const T2& e2_; 10801 const T3& e3_; 10802 const T4& e4_; 10803 const T5& e5_; 10804 const T6& e6_; 10805 const T7& e7_; 10806 const T8& e8_; 10807 10808 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher8); 10809 }; 10810 10811 template <typename T1, typename T2, typename T3, typename T4, typename T5, 10812 typename T6, typename T7, typename T8, typename T9> 10813 class ElementsAreMatcher9 { 10814 public: 10815 ElementsAreMatcher9(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 10816 const T5& e5, const T6& e6, const T7& e7, const T8& e8, 10817 const T9& e9) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), 10818 e7_(e7), e8_(e8), e9_(e9) {} 10819 10820 template <typename Container> 10821 operator Matcher<Container>() const { 10822 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10823 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10824 Element; 10825 10826 const Matcher<const Element&> matchers[] = { 10827 MatcherCast<const Element&>(e1_), 10828 MatcherCast<const Element&>(e2_), 10829 MatcherCast<const Element&>(e3_), 10830 MatcherCast<const Element&>(e4_), 10831 MatcherCast<const Element&>(e5_), 10832 MatcherCast<const Element&>(e6_), 10833 MatcherCast<const Element&>(e7_), 10834 MatcherCast<const Element&>(e8_), 10835 MatcherCast<const Element&>(e9_), 10836 }; 10837 10838 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 9)); 10839 } 10840 10841 private: 10842 const T1& e1_; 10843 const T2& e2_; 10844 const T3& e3_; 10845 const T4& e4_; 10846 const T5& e5_; 10847 const T6& e6_; 10848 const T7& e7_; 10849 const T8& e8_; 10850 const T9& e9_; 10851 10852 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher9); 10853 }; 10854 10855 template <typename T1, typename T2, typename T3, typename T4, typename T5, 10856 typename T6, typename T7, typename T8, typename T9, typename T10> 10857 class ElementsAreMatcher10 { 10858 public: 10859 ElementsAreMatcher10(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 10860 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, 10861 const T10& e10) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), 10862 e7_(e7), e8_(e8), e9_(e9), e10_(e10) {} 10863 10864 template <typename Container> 10865 operator Matcher<Container>() const { 10866 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 10867 typedef typename internal::StlContainerView<RawContainer>::type::value_type 10868 Element; 10869 10870 const Matcher<const Element&> matchers[] = { 10871 MatcherCast<const Element&>(e1_), 10872 MatcherCast<const Element&>(e2_), 10873 MatcherCast<const Element&>(e3_), 10874 MatcherCast<const Element&>(e4_), 10875 MatcherCast<const Element&>(e5_), 10876 MatcherCast<const Element&>(e6_), 10877 MatcherCast<const Element&>(e7_), 10878 MatcherCast<const Element&>(e8_), 10879 MatcherCast<const Element&>(e9_), 10880 MatcherCast<const Element&>(e10_), 10881 }; 10882 10883 return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 10)); 10884 } 10885 10886 private: 10887 const T1& e1_; 10888 const T2& e2_; 10889 const T3& e3_; 10890 const T4& e4_; 10891 const T5& e5_; 10892 const T6& e6_; 10893 const T7& e7_; 10894 const T8& e8_; 10895 const T9& e9_; 10896 const T10& e10_; 10897 10898 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10); 10899 }; 10900 10901 } // namespace internal 10902 10903 // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected 10904 // fields of it matches a_matcher. C++ doesn't support default 10905 // arguments for function templates, so we have to overload it. 10906 template <typename InnerMatcher> 10907 inline internal::ArgsMatcher<InnerMatcher> 10908 Args(const InnerMatcher& matcher) { 10909 return internal::ArgsMatcher<InnerMatcher>(matcher); 10910 } 10911 10912 template <int k1, typename InnerMatcher> 10913 inline internal::ArgsMatcher<InnerMatcher, k1> 10914 Args(const InnerMatcher& matcher) { 10915 return internal::ArgsMatcher<InnerMatcher, k1>(matcher); 10916 } 10917 10918 template <int k1, int k2, typename InnerMatcher> 10919 inline internal::ArgsMatcher<InnerMatcher, k1, k2> 10920 Args(const InnerMatcher& matcher) { 10921 return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher); 10922 } 10923 10924 template <int k1, int k2, int k3, typename InnerMatcher> 10925 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3> 10926 Args(const InnerMatcher& matcher) { 10927 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher); 10928 } 10929 10930 template <int k1, int k2, int k3, int k4, typename InnerMatcher> 10931 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4> 10932 Args(const InnerMatcher& matcher) { 10933 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher); 10934 } 10935 10936 template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher> 10937 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5> 10938 Args(const InnerMatcher& matcher) { 10939 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher); 10940 } 10941 10942 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher> 10943 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6> 10944 Args(const InnerMatcher& matcher) { 10945 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher); 10946 } 10947 10948 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, 10949 typename InnerMatcher> 10950 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7> 10951 Args(const InnerMatcher& matcher) { 10952 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, 10953 k7>(matcher); 10954 } 10955 10956 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 10957 typename InnerMatcher> 10958 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8> 10959 Args(const InnerMatcher& matcher) { 10960 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, 10961 k8>(matcher); 10962 } 10963 10964 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 10965 int k9, typename InnerMatcher> 10966 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9> 10967 Args(const InnerMatcher& matcher) { 10968 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, 10969 k9>(matcher); 10970 } 10971 10972 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 10973 int k9, int k10, typename InnerMatcher> 10974 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9, 10975 k10> 10976 Args(const InnerMatcher& matcher) { 10977 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, 10978 k9, k10>(matcher); 10979 } 10980 10981 // ElementsAre(e0, e1, ..., e_n) matches an STL-style container with 10982 // (n + 1) elements, where the i-th element in the container must 10983 // match the i-th argument in the list. Each argument of 10984 // ElementsAre() can be either a value or a matcher. We support up to 10985 // 10 arguments. 10986 // 10987 // NOTE: Since ElementsAre() cares about the order of the elements, it 10988 // must not be used with containers whose elements's order is 10989 // undefined (e.g. hash_map). 10990 10991 inline internal::ElementsAreMatcher0 ElementsAre() { 10992 return internal::ElementsAreMatcher0(); 10993 } 10994 10995 template <typename T1> 10996 inline internal::ElementsAreMatcher1<T1> ElementsAre(const T1& e1) { 10997 return internal::ElementsAreMatcher1<T1>(e1); 10998 } 10999 11000 template <typename T1, typename T2> 11001 inline internal::ElementsAreMatcher2<T1, T2> ElementsAre(const T1& e1, 11002 const T2& e2) { 11003 return internal::ElementsAreMatcher2<T1, T2>(e1, e2); 11004 } 11005 11006 template <typename T1, typename T2, typename T3> 11007 inline internal::ElementsAreMatcher3<T1, T2, T3> ElementsAre(const T1& e1, 11008 const T2& e2, const T3& e3) { 11009 return internal::ElementsAreMatcher3<T1, T2, T3>(e1, e2, e3); 11010 } 11011 11012 template <typename T1, typename T2, typename T3, typename T4> 11013 inline internal::ElementsAreMatcher4<T1, T2, T3, T4> ElementsAre(const T1& e1, 11014 const T2& e2, const T3& e3, const T4& e4) { 11015 return internal::ElementsAreMatcher4<T1, T2, T3, T4>(e1, e2, e3, e4); 11016 } 11017 11018 template <typename T1, typename T2, typename T3, typename T4, typename T5> 11019 inline internal::ElementsAreMatcher5<T1, T2, T3, T4, 11020 T5> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 11021 const T5& e5) { 11022 return internal::ElementsAreMatcher5<T1, T2, T3, T4, T5>(e1, e2, e3, e4, e5); 11023 } 11024 11025 template <typename T1, typename T2, typename T3, typename T4, typename T5, 11026 typename T6> 11027 inline internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, 11028 T6> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 11029 const T5& e5, const T6& e6) { 11030 return internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, T6>(e1, e2, e3, e4, 11031 e5, e6); 11032 } 11033 11034 template <typename T1, typename T2, typename T3, typename T4, typename T5, 11035 typename T6, typename T7> 11036 inline internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, 11037 T7> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 11038 const T5& e5, const T6& e6, const T7& e7) { 11039 return internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, T7>(e1, e2, e3, 11040 e4, e5, e6, e7); 11041 } 11042 11043 template <typename T1, typename T2, typename T3, typename T4, typename T5, 11044 typename T6, typename T7, typename T8> 11045 inline internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, 11046 T8> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 11047 const T5& e5, const T6& e6, const T7& e7, const T8& e8) { 11048 return internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, T8>(e1, e2, 11049 e3, e4, e5, e6, e7, e8); 11050 } 11051 11052 template <typename T1, typename T2, typename T3, typename T4, typename T5, 11053 typename T6, typename T7, typename T8, typename T9> 11054 inline internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, 11055 T9> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 11056 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { 11057 return internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(e1, 11058 e2, e3, e4, e5, e6, e7, e8, e9); 11059 } 11060 11061 template <typename T1, typename T2, typename T3, typename T4, typename T5, 11062 typename T6, typename T7, typename T8, typename T9, typename T10> 11063 inline internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9, 11064 T10> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 11065 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, 11066 const T10& e10) { 11067 return internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9, 11068 T10>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); 11069 } 11070 11071 // ElementsAreArray(array) and ElementAreArray(array, count) are like 11072 // ElementsAre(), except that they take an array of values or 11073 // matchers. The former form infers the size of 'array', which must 11074 // be a static C-style array. In the latter form, 'array' can either 11075 // be a static array or a pointer to a dynamically created array. 11076 11077 template <typename T> 11078 inline internal::ElementsAreArrayMatcher<T> ElementsAreArray( 11079 const T* first, size_t count) { 11080 return internal::ElementsAreArrayMatcher<T>(first, count); 11081 } 11082 11083 template <typename T, size_t N> 11084 inline internal::ElementsAreArrayMatcher<T> 11085 ElementsAreArray(const T (&array)[N]) { 11086 return internal::ElementsAreArrayMatcher<T>(array, N); 11087 } 11088 11089 // AllOf(m1, m2, ..., mk) matches any value that matches all of the given 11090 // sub-matchers. AllOf is called fully qualified to prevent ADL from firing. 11091 11092 template <typename Matcher1, typename Matcher2> 11093 inline internal::BothOfMatcher<Matcher1, Matcher2> 11094 AllOf(Matcher1 m1, Matcher2 m2) { 11095 return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); 11096 } 11097 11098 template <typename Matcher1, typename Matcher2, typename Matcher3> 11099 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11100 Matcher3> > 11101 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { 11102 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3)); 11103 } 11104 11105 template <typename Matcher1, typename Matcher2, typename Matcher3, 11106 typename Matcher4> 11107 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11108 internal::BothOfMatcher<Matcher3, Matcher4> > > 11109 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { 11110 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4)); 11111 } 11112 11113 template <typename Matcher1, typename Matcher2, typename Matcher3, 11114 typename Matcher4, typename Matcher5> 11115 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11116 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 11117 Matcher5> > > > 11118 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { 11119 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5)); 11120 } 11121 11122 template <typename Matcher1, typename Matcher2, typename Matcher3, 11123 typename Matcher4, typename Matcher5, typename Matcher6> 11124 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11125 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 11126 internal::BothOfMatcher<Matcher5, Matcher6> > > > > 11127 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11128 Matcher6 m6) { 11129 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6)); 11130 } 11131 11132 template <typename Matcher1, typename Matcher2, typename Matcher3, 11133 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> 11134 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11135 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 11136 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 11137 Matcher7> > > > > > 11138 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11139 Matcher6 m6, Matcher7 m7) { 11140 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7)); 11141 } 11142 11143 template <typename Matcher1, typename Matcher2, typename Matcher3, 11144 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 11145 typename Matcher8> 11146 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11147 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 11148 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 11149 internal::BothOfMatcher<Matcher7, Matcher8> > > > > > > 11150 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11151 Matcher6 m6, Matcher7 m7, Matcher8 m8) { 11152 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8)); 11153 } 11154 11155 template <typename Matcher1, typename Matcher2, typename Matcher3, 11156 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 11157 typename Matcher8, typename Matcher9> 11158 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11159 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 11160 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 11161 internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, 11162 Matcher9> > > > > > > > 11163 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11164 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { 11165 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9)); 11166 } 11167 11168 template <typename Matcher1, typename Matcher2, typename Matcher3, 11169 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 11170 typename Matcher8, typename Matcher9, typename Matcher10> 11171 inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, 11172 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, 11173 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, 11174 internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, 11175 internal::BothOfMatcher<Matcher9, Matcher10> > > > > > > > > 11176 AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11177 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { 11178 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9, 11179 m10)); 11180 } 11181 11182 // AnyOf(m1, m2, ..., mk) matches any value that matches any of the given 11183 // sub-matchers. AnyOf is called fully qualified to prevent ADL from firing. 11184 11185 template <typename Matcher1, typename Matcher2> 11186 inline internal::EitherOfMatcher<Matcher1, Matcher2> 11187 AnyOf(Matcher1 m1, Matcher2 m2) { 11188 return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); 11189 } 11190 11191 template <typename Matcher1, typename Matcher2, typename Matcher3> 11192 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11193 Matcher3> > 11194 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { 11195 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3)); 11196 } 11197 11198 template <typename Matcher1, typename Matcher2, typename Matcher3, 11199 typename Matcher4> 11200 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11201 internal::EitherOfMatcher<Matcher3, Matcher4> > > 11202 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { 11203 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4)); 11204 } 11205 11206 template <typename Matcher1, typename Matcher2, typename Matcher3, 11207 typename Matcher4, typename Matcher5> 11208 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11209 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 11210 Matcher5> > > > 11211 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { 11212 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5)); 11213 } 11214 11215 template <typename Matcher1, typename Matcher2, typename Matcher3, 11216 typename Matcher4, typename Matcher5, typename Matcher6> 11217 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11218 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 11219 internal::EitherOfMatcher<Matcher5, Matcher6> > > > > 11220 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11221 Matcher6 m6) { 11222 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6)); 11223 } 11224 11225 template <typename Matcher1, typename Matcher2, typename Matcher3, 11226 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> 11227 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11228 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 11229 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 11230 Matcher7> > > > > > 11231 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11232 Matcher6 m6, Matcher7 m7) { 11233 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7)); 11234 } 11235 11236 template <typename Matcher1, typename Matcher2, typename Matcher3, 11237 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 11238 typename Matcher8> 11239 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11240 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 11241 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 11242 internal::EitherOfMatcher<Matcher7, Matcher8> > > > > > > 11243 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11244 Matcher6 m6, Matcher7 m7, Matcher8 m8) { 11245 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8)); 11246 } 11247 11248 template <typename Matcher1, typename Matcher2, typename Matcher3, 11249 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 11250 typename Matcher8, typename Matcher9> 11251 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11252 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 11253 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 11254 internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, 11255 Matcher9> > > > > > > > 11256 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11257 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { 11258 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9)); 11259 } 11260 11261 template <typename Matcher1, typename Matcher2, typename Matcher3, 11262 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, 11263 typename Matcher8, typename Matcher9, typename Matcher10> 11264 inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, 11265 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, 11266 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, 11267 internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, 11268 internal::EitherOfMatcher<Matcher9, Matcher10> > > > > > > > > 11269 AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, 11270 Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { 11271 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9, 11272 m10)); 11273 } 11274 11275 } // namespace testing 11276 11277 11278 // The MATCHER* family of macros can be used in a namespace scope to 11279 // define custom matchers easily. 11280 // 11281 // Basic Usage 11282 // =========== 11283 // 11284 // The syntax 11285 // 11286 // MATCHER(name, description_string) { statements; } 11287 // 11288 // defines a matcher with the given name that executes the statements, 11289 // which must return a bool to indicate if the match succeeds. Inside 11290 // the statements, you can refer to the value being matched by 'arg', 11291 // and refer to its type by 'arg_type'. 11292 // 11293 // The description string documents what the matcher does, and is used 11294 // to generate the failure message when the match fails. Since a 11295 // MATCHER() is usually defined in a header file shared by multiple 11296 // C++ source files, we require the description to be a C-string 11297 // literal to avoid possible side effects. It can be empty, in which 11298 // case we'll use the sequence of words in the matcher name as the 11299 // description. 11300 // 11301 // For example: 11302 // 11303 // MATCHER(IsEven, "") { return (arg % 2) == 0; } 11304 // 11305 // allows you to write 11306 // 11307 // // Expects mock_foo.Bar(n) to be called where n is even. 11308 // EXPECT_CALL(mock_foo, Bar(IsEven())); 11309 // 11310 // or, 11311 // 11312 // // Verifies that the value of some_expression is even. 11313 // EXPECT_THAT(some_expression, IsEven()); 11314 // 11315 // If the above assertion fails, it will print something like: 11316 // 11317 // Value of: some_expression 11318 // Expected: is even 11319 // Actual: 7 11320 // 11321 // where the description "is even" is automatically calculated from the 11322 // matcher name IsEven. 11323 // 11324 // Argument Type 11325 // ============= 11326 // 11327 // Note that the type of the value being matched (arg_type) is 11328 // determined by the context in which you use the matcher and is 11329 // supplied to you by the compiler, so you don't need to worry about 11330 // declaring it (nor can you). This allows the matcher to be 11331 // polymorphic. For example, IsEven() can be used to match any type 11332 // where the value of "(arg % 2) == 0" can be implicitly converted to 11333 // a bool. In the "Bar(IsEven())" example above, if method Bar() 11334 // takes an int, 'arg_type' will be int; if it takes an unsigned long, 11335 // 'arg_type' will be unsigned long; and so on. 11336 // 11337 // Parameterizing Matchers 11338 // ======================= 11339 // 11340 // Sometimes you'll want to parameterize the matcher. For that you 11341 // can use another macro: 11342 // 11343 // MATCHER_P(name, param_name, description_string) { statements; } 11344 // 11345 // For example: 11346 // 11347 // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } 11348 // 11349 // will allow you to write: 11350 // 11351 // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); 11352 // 11353 // which may lead to this message (assuming n is 10): 11354 // 11355 // Value of: Blah("a") 11356 // Expected: has absolute value 10 11357 // Actual: -9 11358 // 11359 // Note that both the matcher description and its parameter are 11360 // printed, making the message human-friendly. 11361 // 11362 // In the matcher definition body, you can write 'foo_type' to 11363 // reference the type of a parameter named 'foo'. For example, in the 11364 // body of MATCHER_P(HasAbsoluteValue, value) above, you can write 11365 // 'value_type' to refer to the type of 'value'. 11366 // 11367 // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to 11368 // support multi-parameter matchers. 11369 // 11370 // Describing Parameterized Matchers 11371 // ================================= 11372 // 11373 // The last argument to MATCHER*() is a string-typed expression. The 11374 // expression can reference all of the matcher's parameters and a 11375 // special bool-typed variable named 'negation'. When 'negation' is 11376 // false, the expression should evaluate to the matcher's description; 11377 // otherwise it should evaluate to the description of the negation of 11378 // the matcher. For example, 11379 // 11380 // using testing::PrintToString; 11381 // 11382 // MATCHER_P2(InClosedRange, low, hi, 11383 // string(negation ? "is not" : "is") + " in range [" + 11384 // PrintToString(low) + ", " + PrintToString(hi) + "]") { 11385 // return low <= arg && arg <= hi; 11386 // } 11387 // ... 11388 // EXPECT_THAT(3, InClosedRange(4, 6)); 11389 // EXPECT_THAT(3, Not(InClosedRange(2, 4))); 11390 // 11391 // would generate two failures that contain the text: 11392 // 11393 // Expected: is in range [4, 6] 11394 // ... 11395 // Expected: is not in range [2, 4] 11396 // 11397 // If you specify "" as the description, the failure message will 11398 // contain the sequence of words in the matcher name followed by the 11399 // parameter values printed as a tuple. For example, 11400 // 11401 // MATCHER_P2(InClosedRange, low, hi, "") { ... } 11402 // ... 11403 // EXPECT_THAT(3, InClosedRange(4, 6)); 11404 // EXPECT_THAT(3, Not(InClosedRange(2, 4))); 11405 // 11406 // would generate two failures that contain the text: 11407 // 11408 // Expected: in closed range (4, 6) 11409 // ... 11410 // Expected: not (in closed range (2, 4)) 11411 // 11412 // Types of Matcher Parameters 11413 // =========================== 11414 // 11415 // For the purpose of typing, you can view 11416 // 11417 // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } 11418 // 11419 // as shorthand for 11420 // 11421 // template <typename p1_type, ..., typename pk_type> 11422 // FooMatcherPk<p1_type, ..., pk_type> 11423 // Foo(p1_type p1, ..., pk_type pk) { ... } 11424 // 11425 // When you write Foo(v1, ..., vk), the compiler infers the types of 11426 // the parameters v1, ..., and vk for you. If you are not happy with 11427 // the result of the type inference, you can specify the types by 11428 // explicitly instantiating the template, as in Foo<long, bool>(5, 11429 // false). As said earlier, you don't get to (or need to) specify 11430 // 'arg_type' as that's determined by the context in which the matcher 11431 // is used. You can assign the result of expression Foo(p1, ..., pk) 11432 // to a variable of type FooMatcherPk<p1_type, ..., pk_type>. This 11433 // can be useful when composing matchers. 11434 // 11435 // While you can instantiate a matcher template with reference types, 11436 // passing the parameters by pointer usually makes your code more 11437 // readable. If, however, you still want to pass a parameter by 11438 // reference, be aware that in the failure message generated by the 11439 // matcher you will see the value of the referenced object but not its 11440 // address. 11441 // 11442 // Explaining Match Results 11443 // ======================== 11444 // 11445 // Sometimes the matcher description alone isn't enough to explain why 11446 // the match has failed or succeeded. For example, when expecting a 11447 // long string, it can be very helpful to also print the diff between 11448 // the expected string and the actual one. To achieve that, you can 11449 // optionally stream additional information to a special variable 11450 // named result_listener, whose type is a pointer to class 11451 // MatchResultListener: 11452 // 11453 // MATCHER_P(EqualsLongString, str, "") { 11454 // if (arg == str) return true; 11455 // 11456 // *result_listener << "the difference: " 11457 /// << DiffStrings(str, arg); 11458 // return false; 11459 // } 11460 // 11461 // Overloading Matchers 11462 // ==================== 11463 // 11464 // You can overload matchers with different numbers of parameters: 11465 // 11466 // MATCHER_P(Blah, a, description_string1) { ... } 11467 // MATCHER_P2(Blah, a, b, description_string2) { ... } 11468 // 11469 // Caveats 11470 // ======= 11471 // 11472 // When defining a new matcher, you should also consider implementing 11473 // MatcherInterface or using MakePolymorphicMatcher(). These 11474 // approaches require more work than the MATCHER* macros, but also 11475 // give you more control on the types of the value being matched and 11476 // the matcher parameters, which may leads to better compiler error 11477 // messages when the matcher is used wrong. They also allow 11478 // overloading matchers based on parameter types (as opposed to just 11479 // based on the number of parameters). 11480 // 11481 // MATCHER*() can only be used in a namespace scope. The reason is 11482 // that C++ doesn't yet allow function-local types to be used to 11483 // instantiate templates. The up-coming C++0x standard will fix this. 11484 // Once that's done, we'll consider supporting using MATCHER*() inside 11485 // a function. 11486 // 11487 // More Information 11488 // ================ 11489 // 11490 // To learn more about using these macros, please search for 'MATCHER' 11491 // on http://code.google.com/p/googlemock/wiki/CookBook. 11492 11493 #define MATCHER(name, description)\ 11494 class name##Matcher {\ 11495 public:\ 11496 template <typename arg_type>\ 11497 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11498 public:\ 11499 gmock_Impl()\ 11500 {}\ 11501 virtual bool MatchAndExplain(\ 11502 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11503 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11504 *gmock_os << FormatDescription(false);\ 11505 }\ 11506 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11507 *gmock_os << FormatDescription(true);\ 11508 }\ 11509 private:\ 11510 ::testing::internal::string FormatDescription(bool negation) const {\ 11511 const ::testing::internal::string gmock_description = (description);\ 11512 if (!gmock_description.empty())\ 11513 return gmock_description;\ 11514 return ::testing::internal::FormatMatcherDescription(\ 11515 negation, #name,\ 11516 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11517 ::std::tr1::tuple<>()));\ 11518 }\ 11519 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11520 };\ 11521 template <typename arg_type>\ 11522 operator ::testing::Matcher<arg_type>() const {\ 11523 return ::testing::Matcher<arg_type>(\ 11524 new gmock_Impl<arg_type>());\ 11525 }\ 11526 name##Matcher() {\ 11527 }\ 11528 private:\ 11529 GTEST_DISALLOW_ASSIGN_(name##Matcher);\ 11530 };\ 11531 inline name##Matcher name() {\ 11532 return name##Matcher();\ 11533 }\ 11534 template <typename arg_type>\ 11535 bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\ 11536 arg_type arg,\ 11537 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11538 const 11539 11540 #define MATCHER_P(name, p0, description)\ 11541 template <typename p0##_type>\ 11542 class name##MatcherP {\ 11543 public:\ 11544 template <typename arg_type>\ 11545 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11546 public:\ 11547 explicit gmock_Impl(p0##_type gmock_p0)\ 11548 : p0(gmock_p0) {}\ 11549 virtual bool MatchAndExplain(\ 11550 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11551 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11552 *gmock_os << FormatDescription(false);\ 11553 }\ 11554 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11555 *gmock_os << FormatDescription(true);\ 11556 }\ 11557 p0##_type p0;\ 11558 private:\ 11559 ::testing::internal::string FormatDescription(bool negation) const {\ 11560 const ::testing::internal::string gmock_description = (description);\ 11561 if (!gmock_description.empty())\ 11562 return gmock_description;\ 11563 return ::testing::internal::FormatMatcherDescription(\ 11564 negation, #name,\ 11565 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11566 ::std::tr1::tuple<p0##_type>(p0)));\ 11567 }\ 11568 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11569 };\ 11570 template <typename arg_type>\ 11571 operator ::testing::Matcher<arg_type>() const {\ 11572 return ::testing::Matcher<arg_type>(\ 11573 new gmock_Impl<arg_type>(p0));\ 11574 }\ 11575 name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\ 11576 }\ 11577 p0##_type p0;\ 11578 private:\ 11579 GTEST_DISALLOW_ASSIGN_(name##MatcherP);\ 11580 };\ 11581 template <typename p0##_type>\ 11582 inline name##MatcherP<p0##_type> name(p0##_type p0) {\ 11583 return name##MatcherP<p0##_type>(p0);\ 11584 }\ 11585 template <typename p0##_type>\ 11586 template <typename arg_type>\ 11587 bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 11588 arg_type arg,\ 11589 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11590 const 11591 11592 #define MATCHER_P2(name, p0, p1, description)\ 11593 template <typename p0##_type, typename p1##_type>\ 11594 class name##MatcherP2 {\ 11595 public:\ 11596 template <typename arg_type>\ 11597 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11598 public:\ 11599 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\ 11600 : p0(gmock_p0), p1(gmock_p1) {}\ 11601 virtual bool MatchAndExplain(\ 11602 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11603 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11604 *gmock_os << FormatDescription(false);\ 11605 }\ 11606 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11607 *gmock_os << FormatDescription(true);\ 11608 }\ 11609 p0##_type p0;\ 11610 p1##_type p1;\ 11611 private:\ 11612 ::testing::internal::string FormatDescription(bool negation) const {\ 11613 const ::testing::internal::string gmock_description = (description);\ 11614 if (!gmock_description.empty())\ 11615 return gmock_description;\ 11616 return ::testing::internal::FormatMatcherDescription(\ 11617 negation, #name,\ 11618 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11619 ::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\ 11620 }\ 11621 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11622 };\ 11623 template <typename arg_type>\ 11624 operator ::testing::Matcher<arg_type>() const {\ 11625 return ::testing::Matcher<arg_type>(\ 11626 new gmock_Impl<arg_type>(p0, p1));\ 11627 }\ 11628 name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 11629 p1(gmock_p1) {\ 11630 }\ 11631 p0##_type p0;\ 11632 p1##_type p1;\ 11633 private:\ 11634 GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\ 11635 };\ 11636 template <typename p0##_type, typename p1##_type>\ 11637 inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \ 11638 p1##_type p1) {\ 11639 return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\ 11640 }\ 11641 template <typename p0##_type, typename p1##_type>\ 11642 template <typename arg_type>\ 11643 bool name##MatcherP2<p0##_type, \ 11644 p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 11645 arg_type arg,\ 11646 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11647 const 11648 11649 #define MATCHER_P3(name, p0, p1, p2, description)\ 11650 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 11651 class name##MatcherP3 {\ 11652 public:\ 11653 template <typename arg_type>\ 11654 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11655 public:\ 11656 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\ 11657 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 11658 virtual bool MatchAndExplain(\ 11659 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11660 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11661 *gmock_os << FormatDescription(false);\ 11662 }\ 11663 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11664 *gmock_os << FormatDescription(true);\ 11665 }\ 11666 p0##_type p0;\ 11667 p1##_type p1;\ 11668 p2##_type p2;\ 11669 private:\ 11670 ::testing::internal::string FormatDescription(bool negation) const {\ 11671 const ::testing::internal::string gmock_description = (description);\ 11672 if (!gmock_description.empty())\ 11673 return gmock_description;\ 11674 return ::testing::internal::FormatMatcherDescription(\ 11675 negation, #name,\ 11676 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11677 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \ 11678 p2)));\ 11679 }\ 11680 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11681 };\ 11682 template <typename arg_type>\ 11683 operator ::testing::Matcher<arg_type>() const {\ 11684 return ::testing::Matcher<arg_type>(\ 11685 new gmock_Impl<arg_type>(p0, p1, p2));\ 11686 }\ 11687 name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ 11688 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\ 11689 }\ 11690 p0##_type p0;\ 11691 p1##_type p1;\ 11692 p2##_type p2;\ 11693 private:\ 11694 GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\ 11695 };\ 11696 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 11697 inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ 11698 p1##_type p1, p2##_type p2) {\ 11699 return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\ 11700 }\ 11701 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 11702 template <typename arg_type>\ 11703 bool name##MatcherP3<p0##_type, p1##_type, \ 11704 p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 11705 arg_type arg,\ 11706 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11707 const 11708 11709 #define MATCHER_P4(name, p0, p1, p2, p3, description)\ 11710 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11711 typename p3##_type>\ 11712 class name##MatcherP4 {\ 11713 public:\ 11714 template <typename arg_type>\ 11715 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11716 public:\ 11717 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 11718 p3##_type gmock_p3)\ 11719 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\ 11720 virtual bool MatchAndExplain(\ 11721 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11722 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11723 *gmock_os << FormatDescription(false);\ 11724 }\ 11725 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11726 *gmock_os << FormatDescription(true);\ 11727 }\ 11728 p0##_type p0;\ 11729 p1##_type p1;\ 11730 p2##_type p2;\ 11731 p3##_type p3;\ 11732 private:\ 11733 ::testing::internal::string FormatDescription(bool negation) const {\ 11734 const ::testing::internal::string gmock_description = (description);\ 11735 if (!gmock_description.empty())\ 11736 return gmock_description;\ 11737 return ::testing::internal::FormatMatcherDescription(\ 11738 negation, #name,\ 11739 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11740 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \ 11741 p3##_type>(p0, p1, p2, p3)));\ 11742 }\ 11743 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11744 };\ 11745 template <typename arg_type>\ 11746 operator ::testing::Matcher<arg_type>() const {\ 11747 return ::testing::Matcher<arg_type>(\ 11748 new gmock_Impl<arg_type>(p0, p1, p2, p3));\ 11749 }\ 11750 name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ 11751 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ 11752 p2(gmock_p2), p3(gmock_p3) {\ 11753 }\ 11754 p0##_type p0;\ 11755 p1##_type p1;\ 11756 p2##_type p2;\ 11757 p3##_type p3;\ 11758 private:\ 11759 GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\ 11760 };\ 11761 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11762 typename p3##_type>\ 11763 inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \ 11764 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 11765 p3##_type p3) {\ 11766 return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \ 11767 p1, p2, p3);\ 11768 }\ 11769 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11770 typename p3##_type>\ 11771 template <typename arg_type>\ 11772 bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \ 11773 p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 11774 arg_type arg,\ 11775 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11776 const 11777 11778 #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ 11779 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11780 typename p3##_type, typename p4##_type>\ 11781 class name##MatcherP5 {\ 11782 public:\ 11783 template <typename arg_type>\ 11784 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11785 public:\ 11786 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 11787 p3##_type gmock_p3, p4##_type gmock_p4)\ 11788 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 11789 p4(gmock_p4) {}\ 11790 virtual bool MatchAndExplain(\ 11791 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11792 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11793 *gmock_os << FormatDescription(false);\ 11794 }\ 11795 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11796 *gmock_os << FormatDescription(true);\ 11797 }\ 11798 p0##_type p0;\ 11799 p1##_type p1;\ 11800 p2##_type p2;\ 11801 p3##_type p3;\ 11802 p4##_type p4;\ 11803 private:\ 11804 ::testing::internal::string FormatDescription(bool negation) const {\ 11805 const ::testing::internal::string gmock_description = (description);\ 11806 if (!gmock_description.empty())\ 11807 return gmock_description;\ 11808 return ::testing::internal::FormatMatcherDescription(\ 11809 negation, #name,\ 11810 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11811 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 11812 p4##_type>(p0, p1, p2, p3, p4)));\ 11813 }\ 11814 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11815 };\ 11816 template <typename arg_type>\ 11817 operator ::testing::Matcher<arg_type>() const {\ 11818 return ::testing::Matcher<arg_type>(\ 11819 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\ 11820 }\ 11821 name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ 11822 p2##_type gmock_p2, p3##_type gmock_p3, \ 11823 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 11824 p3(gmock_p3), p4(gmock_p4) {\ 11825 }\ 11826 p0##_type p0;\ 11827 p1##_type p1;\ 11828 p2##_type p2;\ 11829 p3##_type p3;\ 11830 p4##_type p4;\ 11831 private:\ 11832 GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\ 11833 };\ 11834 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11835 typename p3##_type, typename p4##_type>\ 11836 inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 11837 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 11838 p4##_type p4) {\ 11839 return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 11840 p4##_type>(p0, p1, p2, p3, p4);\ 11841 }\ 11842 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11843 typename p3##_type, typename p4##_type>\ 11844 template <typename arg_type>\ 11845 bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 11846 p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 11847 arg_type arg,\ 11848 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11849 const 11850 11851 #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ 11852 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11853 typename p3##_type, typename p4##_type, typename p5##_type>\ 11854 class name##MatcherP6 {\ 11855 public:\ 11856 template <typename arg_type>\ 11857 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11858 public:\ 11859 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 11860 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\ 11861 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 11862 p4(gmock_p4), p5(gmock_p5) {}\ 11863 virtual bool MatchAndExplain(\ 11864 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11865 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11866 *gmock_os << FormatDescription(false);\ 11867 }\ 11868 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11869 *gmock_os << FormatDescription(true);\ 11870 }\ 11871 p0##_type p0;\ 11872 p1##_type p1;\ 11873 p2##_type p2;\ 11874 p3##_type p3;\ 11875 p4##_type p4;\ 11876 p5##_type p5;\ 11877 private:\ 11878 ::testing::internal::string FormatDescription(bool negation) const {\ 11879 const ::testing::internal::string gmock_description = (description);\ 11880 if (!gmock_description.empty())\ 11881 return gmock_description;\ 11882 return ::testing::internal::FormatMatcherDescription(\ 11883 negation, #name,\ 11884 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11885 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 11886 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\ 11887 }\ 11888 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11889 };\ 11890 template <typename arg_type>\ 11891 operator ::testing::Matcher<arg_type>() const {\ 11892 return ::testing::Matcher<arg_type>(\ 11893 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\ 11894 }\ 11895 name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ 11896 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 11897 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 11898 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\ 11899 }\ 11900 p0##_type p0;\ 11901 p1##_type p1;\ 11902 p2##_type p2;\ 11903 p3##_type p3;\ 11904 p4##_type p4;\ 11905 p5##_type p5;\ 11906 private:\ 11907 GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\ 11908 };\ 11909 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11910 typename p3##_type, typename p4##_type, typename p5##_type>\ 11911 inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 11912 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 11913 p3##_type p3, p4##_type p4, p5##_type p5) {\ 11914 return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 11915 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\ 11916 }\ 11917 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11918 typename p3##_type, typename p4##_type, typename p5##_type>\ 11919 template <typename arg_type>\ 11920 bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 11921 p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 11922 arg_type arg,\ 11923 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 11924 const 11925 11926 #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ 11927 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11928 typename p3##_type, typename p4##_type, typename p5##_type, \ 11929 typename p6##_type>\ 11930 class name##MatcherP7 {\ 11931 public:\ 11932 template <typename arg_type>\ 11933 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 11934 public:\ 11935 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 11936 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 11937 p6##_type gmock_p6)\ 11938 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 11939 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ 11940 virtual bool MatchAndExplain(\ 11941 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 11942 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 11943 *gmock_os << FormatDescription(false);\ 11944 }\ 11945 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 11946 *gmock_os << FormatDescription(true);\ 11947 }\ 11948 p0##_type p0;\ 11949 p1##_type p1;\ 11950 p2##_type p2;\ 11951 p3##_type p3;\ 11952 p4##_type p4;\ 11953 p5##_type p5;\ 11954 p6##_type p6;\ 11955 private:\ 11956 ::testing::internal::string FormatDescription(bool negation) const {\ 11957 const ::testing::internal::string gmock_description = (description);\ 11958 if (!gmock_description.empty())\ 11959 return gmock_description;\ 11960 return ::testing::internal::FormatMatcherDescription(\ 11961 negation, #name,\ 11962 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 11963 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 11964 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \ 11965 p6)));\ 11966 }\ 11967 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 11968 };\ 11969 template <typename arg_type>\ 11970 operator ::testing::Matcher<arg_type>() const {\ 11971 return ::testing::Matcher<arg_type>(\ 11972 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\ 11973 }\ 11974 name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ 11975 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 11976 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ 11977 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ 11978 p6(gmock_p6) {\ 11979 }\ 11980 p0##_type p0;\ 11981 p1##_type p1;\ 11982 p2##_type p2;\ 11983 p3##_type p3;\ 11984 p4##_type p4;\ 11985 p5##_type p5;\ 11986 p6##_type p6;\ 11987 private:\ 11988 GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\ 11989 };\ 11990 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 11991 typename p3##_type, typename p4##_type, typename p5##_type, \ 11992 typename p6##_type>\ 11993 inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 11994 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \ 11995 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 11996 p6##_type p6) {\ 11997 return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 11998 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\ 11999 }\ 12000 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12001 typename p3##_type, typename p4##_type, typename p5##_type, \ 12002 typename p6##_type>\ 12003 template <typename arg_type>\ 12004 bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 12005 p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 12006 arg_type arg,\ 12007 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 12008 const 12009 12010 #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ 12011 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12012 typename p3##_type, typename p4##_type, typename p5##_type, \ 12013 typename p6##_type, typename p7##_type>\ 12014 class name##MatcherP8 {\ 12015 public:\ 12016 template <typename arg_type>\ 12017 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 12018 public:\ 12019 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 12020 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 12021 p6##_type gmock_p6, p7##_type gmock_p7)\ 12022 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 12023 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ 12024 virtual bool MatchAndExplain(\ 12025 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 12026 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 12027 *gmock_os << FormatDescription(false);\ 12028 }\ 12029 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 12030 *gmock_os << FormatDescription(true);\ 12031 }\ 12032 p0##_type p0;\ 12033 p1##_type p1;\ 12034 p2##_type p2;\ 12035 p3##_type p3;\ 12036 p4##_type p4;\ 12037 p5##_type p5;\ 12038 p6##_type p6;\ 12039 p7##_type p7;\ 12040 private:\ 12041 ::testing::internal::string FormatDescription(bool negation) const {\ 12042 const ::testing::internal::string gmock_description = (description);\ 12043 if (!gmock_description.empty())\ 12044 return gmock_description;\ 12045 return ::testing::internal::FormatMatcherDescription(\ 12046 negation, #name,\ 12047 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 12048 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 12049 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \ 12050 p3, p4, p5, p6, p7)));\ 12051 }\ 12052 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 12053 };\ 12054 template <typename arg_type>\ 12055 operator ::testing::Matcher<arg_type>() const {\ 12056 return ::testing::Matcher<arg_type>(\ 12057 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\ 12058 }\ 12059 name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ 12060 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 12061 p5##_type gmock_p5, p6##_type gmock_p6, \ 12062 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 12063 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 12064 p7(gmock_p7) {\ 12065 }\ 12066 p0##_type p0;\ 12067 p1##_type p1;\ 12068 p2##_type p2;\ 12069 p3##_type p3;\ 12070 p4##_type p4;\ 12071 p5##_type p5;\ 12072 p6##_type p6;\ 12073 p7##_type p7;\ 12074 private:\ 12075 GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\ 12076 };\ 12077 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12078 typename p3##_type, typename p4##_type, typename p5##_type, \ 12079 typename p6##_type, typename p7##_type>\ 12080 inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 12081 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \ 12082 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 12083 p6##_type p6, p7##_type p7) {\ 12084 return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 12085 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \ 12086 p6, p7);\ 12087 }\ 12088 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12089 typename p3##_type, typename p4##_type, typename p5##_type, \ 12090 typename p6##_type, typename p7##_type>\ 12091 template <typename arg_type>\ 12092 bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 12093 p5##_type, p6##_type, \ 12094 p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 12095 arg_type arg,\ 12096 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 12097 const 12098 12099 #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ 12100 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12101 typename p3##_type, typename p4##_type, typename p5##_type, \ 12102 typename p6##_type, typename p7##_type, typename p8##_type>\ 12103 class name##MatcherP9 {\ 12104 public:\ 12105 template <typename arg_type>\ 12106 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 12107 public:\ 12108 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 12109 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 12110 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\ 12111 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 12112 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 12113 p8(gmock_p8) {}\ 12114 virtual bool MatchAndExplain(\ 12115 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 12116 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 12117 *gmock_os << FormatDescription(false);\ 12118 }\ 12119 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 12120 *gmock_os << FormatDescription(true);\ 12121 }\ 12122 p0##_type p0;\ 12123 p1##_type p1;\ 12124 p2##_type p2;\ 12125 p3##_type p3;\ 12126 p4##_type p4;\ 12127 p5##_type p5;\ 12128 p6##_type p6;\ 12129 p7##_type p7;\ 12130 p8##_type p8;\ 12131 private:\ 12132 ::testing::internal::string FormatDescription(bool negation) const {\ 12133 const ::testing::internal::string gmock_description = (description);\ 12134 if (!gmock_description.empty())\ 12135 return gmock_description;\ 12136 return ::testing::internal::FormatMatcherDescription(\ 12137 negation, #name,\ 12138 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 12139 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 12140 p4##_type, p5##_type, p6##_type, p7##_type, \ 12141 p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ 12142 }\ 12143 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 12144 };\ 12145 template <typename arg_type>\ 12146 operator ::testing::Matcher<arg_type>() const {\ 12147 return ::testing::Matcher<arg_type>(\ 12148 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ 12149 }\ 12150 name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ 12151 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 12152 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 12153 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 12154 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 12155 p8(gmock_p8) {\ 12156 }\ 12157 p0##_type p0;\ 12158 p1##_type p1;\ 12159 p2##_type p2;\ 12160 p3##_type p3;\ 12161 p4##_type p4;\ 12162 p5##_type p5;\ 12163 p6##_type p6;\ 12164 p7##_type p7;\ 12165 p8##_type p8;\ 12166 private:\ 12167 GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\ 12168 };\ 12169 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12170 typename p3##_type, typename p4##_type, typename p5##_type, \ 12171 typename p6##_type, typename p7##_type, typename p8##_type>\ 12172 inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 12173 p4##_type, p5##_type, p6##_type, p7##_type, \ 12174 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 12175 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ 12176 p8##_type p8) {\ 12177 return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 12178 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \ 12179 p3, p4, p5, p6, p7, p8);\ 12180 }\ 12181 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12182 typename p3##_type, typename p4##_type, typename p5##_type, \ 12183 typename p6##_type, typename p7##_type, typename p8##_type>\ 12184 template <typename arg_type>\ 12185 bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 12186 p5##_type, p6##_type, p7##_type, \ 12187 p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 12188 arg_type arg,\ 12189 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 12190 const 12191 12192 #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ 12193 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12194 typename p3##_type, typename p4##_type, typename p5##_type, \ 12195 typename p6##_type, typename p7##_type, typename p8##_type, \ 12196 typename p9##_type>\ 12197 class name##MatcherP10 {\ 12198 public:\ 12199 template <typename arg_type>\ 12200 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 12201 public:\ 12202 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 12203 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 12204 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 12205 p9##_type gmock_p9)\ 12206 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 12207 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 12208 p8(gmock_p8), p9(gmock_p9) {}\ 12209 virtual bool MatchAndExplain(\ 12210 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 12211 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 12212 *gmock_os << FormatDescription(false);\ 12213 }\ 12214 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 12215 *gmock_os << FormatDescription(true);\ 12216 }\ 12217 p0##_type p0;\ 12218 p1##_type p1;\ 12219 p2##_type p2;\ 12220 p3##_type p3;\ 12221 p4##_type p4;\ 12222 p5##_type p5;\ 12223 p6##_type p6;\ 12224 p7##_type p7;\ 12225 p8##_type p8;\ 12226 p9##_type p9;\ 12227 private:\ 12228 ::testing::internal::string FormatDescription(bool negation) const {\ 12229 const ::testing::internal::string gmock_description = (description);\ 12230 if (!gmock_description.empty())\ 12231 return gmock_description;\ 12232 return ::testing::internal::FormatMatcherDescription(\ 12233 negation, #name,\ 12234 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 12235 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 12236 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 12237 p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ 12238 }\ 12239 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 12240 };\ 12241 template <typename arg_type>\ 12242 operator ::testing::Matcher<arg_type>() const {\ 12243 return ::testing::Matcher<arg_type>(\ 12244 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ 12245 }\ 12246 name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ 12247 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 12248 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 12249 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ 12250 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 12251 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\ 12252 }\ 12253 p0##_type p0;\ 12254 p1##_type p1;\ 12255 p2##_type p2;\ 12256 p3##_type p3;\ 12257 p4##_type p4;\ 12258 p5##_type p5;\ 12259 p6##_type p6;\ 12260 p7##_type p7;\ 12261 p8##_type p8;\ 12262 p9##_type p9;\ 12263 private:\ 12264 GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\ 12265 };\ 12266 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12267 typename p3##_type, typename p4##_type, typename p5##_type, \ 12268 typename p6##_type, typename p7##_type, typename p8##_type, \ 12269 typename p9##_type>\ 12270 inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 12271 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 12272 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 12273 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 12274 p9##_type p9) {\ 12275 return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 12276 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \ 12277 p1, p2, p3, p4, p5, p6, p7, p8, p9);\ 12278 }\ 12279 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 12280 typename p3##_type, typename p4##_type, typename p5##_type, \ 12281 typename p6##_type, typename p7##_type, typename p8##_type, \ 12282 typename p9##_type>\ 12283 template <typename arg_type>\ 12284 bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 12285 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 12286 p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 12287 arg_type arg,\ 12288 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 12289 const 12290 12291 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 12292 // Copyright 2007, Google Inc. 12293 // All rights reserved. 12294 // 12295 // Redistribution and use in source and binary forms, with or without 12296 // modification, are permitted provided that the following conditions are 12297 // met: 12298 // 12299 // * Redistributions of source code must retain the above copyright 12300 // notice, this list of conditions and the following disclaimer. 12301 // * Redistributions in binary form must reproduce the above 12302 // copyright notice, this list of conditions and the following disclaimer 12303 // in the documentation and/or other materials provided with the 12304 // distribution. 12305 // * Neither the name of Google Inc. nor the names of its 12306 // contributors may be used to endorse or promote products derived from 12307 // this software without specific prior written permission. 12308 // 12309 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 12310 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 12311 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 12312 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12313 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 12314 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 12315 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 12316 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 12317 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 12318 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 12319 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 12320 // 12321 // Author: wan@google.com (Zhanyong Wan) 12322 12323 // Google Mock - a framework for writing C++ mock classes. 12324 // 12325 // This file implements some actions that depend on gmock-generated-actions.h. 12326 12327 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ 12328 #define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ 12329 12330 #include <algorithm> 12331 12332 12333 namespace testing { 12334 namespace internal { 12335 12336 // Implements the Invoke(f) action. The template argument 12337 // FunctionImpl is the implementation type of f, which can be either a 12338 // function pointer or a functor. Invoke(f) can be used as an 12339 // Action<F> as long as f's type is compatible with F (i.e. f can be 12340 // assigned to a tr1::function<F>). 12341 template <typename FunctionImpl> 12342 class InvokeAction { 12343 public: 12344 // The c'tor makes a copy of function_impl (either a function 12345 // pointer or a functor). 12346 explicit InvokeAction(FunctionImpl function_impl) 12347 : function_impl_(function_impl) {} 12348 12349 template <typename Result, typename ArgumentTuple> 12350 Result Perform(const ArgumentTuple& args) { 12351 return InvokeHelper<Result, ArgumentTuple>::Invoke(function_impl_, args); 12352 } 12353 12354 private: 12355 FunctionImpl function_impl_; 12356 12357 GTEST_DISALLOW_ASSIGN_(InvokeAction); 12358 }; 12359 12360 // Implements the Invoke(object_ptr, &Class::Method) action. 12361 template <class Class, typename MethodPtr> 12362 class InvokeMethodAction { 12363 public: 12364 InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr) 12365 : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {} 12366 12367 template <typename Result, typename ArgumentTuple> 12368 Result Perform(const ArgumentTuple& args) const { 12369 return InvokeHelper<Result, ArgumentTuple>::InvokeMethod( 12370 obj_ptr_, method_ptr_, args); 12371 } 12372 12373 private: 12374 Class* const obj_ptr_; 12375 const MethodPtr method_ptr_; 12376 12377 GTEST_DISALLOW_ASSIGN_(InvokeMethodAction); 12378 }; 12379 12380 } // namespace internal 12381 12382 // Various overloads for Invoke(). 12383 12384 // Creates an action that invokes 'function_impl' with the mock 12385 // function's arguments. 12386 template <typename FunctionImpl> 12387 PolymorphicAction<internal::InvokeAction<FunctionImpl> > Invoke( 12388 FunctionImpl function_impl) { 12389 return MakePolymorphicAction( 12390 internal::InvokeAction<FunctionImpl>(function_impl)); 12391 } 12392 12393 // Creates an action that invokes the given method on the given object 12394 // with the mock function's arguments. 12395 template <class Class, typename MethodPtr> 12396 PolymorphicAction<internal::InvokeMethodAction<Class, MethodPtr> > Invoke( 12397 Class* obj_ptr, MethodPtr method_ptr) { 12398 return MakePolymorphicAction( 12399 internal::InvokeMethodAction<Class, MethodPtr>(obj_ptr, method_ptr)); 12400 } 12401 12402 // WithoutArgs(inner_action) can be used in a mock function with a 12403 // non-empty argument list to perform inner_action, which takes no 12404 // argument. In other words, it adapts an action accepting no 12405 // argument to one that accepts (and ignores) arguments. 12406 template <typename InnerAction> 12407 inline internal::WithArgsAction<InnerAction> 12408 WithoutArgs(const InnerAction& action) { 12409 return internal::WithArgsAction<InnerAction>(action); 12410 } 12411 12412 // WithArg<k>(an_action) creates an action that passes the k-th 12413 // (0-based) argument of the mock function to an_action and performs 12414 // it. It adapts an action accepting one argument to one that accepts 12415 // multiple arguments. For convenience, we also provide 12416 // WithArgs<k>(an_action) (defined below) as a synonym. 12417 template <int k, typename InnerAction> 12418 inline internal::WithArgsAction<InnerAction, k> 12419 WithArg(const InnerAction& action) { 12420 return internal::WithArgsAction<InnerAction, k>(action); 12421 } 12422 12423 // The ACTION*() macros trigger warning C4100 (unreferenced formal 12424 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 12425 // the macro definition, as the warnings are generated when the macro 12426 // is expanded and macro expansion cannot contain #pragma. Therefore 12427 // we suppress them here. 12428 #ifdef _MSC_VER 12429 # pragma warning(push) 12430 # pragma warning(disable:4100) 12431 #endif 12432 12433 // Action ReturnArg<k>() returns the k-th argument of the mock function. 12434 ACTION_TEMPLATE(ReturnArg, 12435 HAS_1_TEMPLATE_PARAMS(int, k), 12436 AND_0_VALUE_PARAMS()) { 12437 return std::tr1::get<k>(args); 12438 } 12439 12440 // Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the 12441 // mock function to *pointer. 12442 ACTION_TEMPLATE(SaveArg, 12443 HAS_1_TEMPLATE_PARAMS(int, k), 12444 AND_1_VALUE_PARAMS(pointer)) { 12445 *pointer = ::std::tr1::get<k>(args); 12446 } 12447 12448 // Action SaveArgPointee<k>(pointer) saves the value pointed to 12449 // by the k-th (0-based) argument of the mock function to *pointer. 12450 ACTION_TEMPLATE(SaveArgPointee, 12451 HAS_1_TEMPLATE_PARAMS(int, k), 12452 AND_1_VALUE_PARAMS(pointer)) { 12453 *pointer = *::std::tr1::get<k>(args); 12454 } 12455 12456 // Action SetArgReferee<k>(value) assigns 'value' to the variable 12457 // referenced by the k-th (0-based) argument of the mock function. 12458 ACTION_TEMPLATE(SetArgReferee, 12459 HAS_1_TEMPLATE_PARAMS(int, k), 12460 AND_1_VALUE_PARAMS(value)) { 12461 typedef typename ::std::tr1::tuple_element<k, args_type>::type argk_type; 12462 // Ensures that argument #k is a reference. If you get a compiler 12463 // error on the next line, you are using SetArgReferee<k>(value) in 12464 // a mock function whose k-th (0-based) argument is not a reference. 12465 GTEST_COMPILE_ASSERT_(internal::is_reference<argk_type>::value, 12466 SetArgReferee_must_be_used_with_a_reference_argument); 12467 ::std::tr1::get<k>(args) = value; 12468 } 12469 12470 // Action SetArrayArgument<k>(first, last) copies the elements in 12471 // source range [first, last) to the array pointed to by the k-th 12472 // (0-based) argument, which can be either a pointer or an 12473 // iterator. The action does not take ownership of the elements in the 12474 // source range. 12475 ACTION_TEMPLATE(SetArrayArgument, 12476 HAS_1_TEMPLATE_PARAMS(int, k), 12477 AND_2_VALUE_PARAMS(first, last)) { 12478 // Microsoft compiler deprecates ::std::copy, so we want to suppress warning 12479 // 4996 (Function call with parameters that may be unsafe) there. 12480 #ifdef _MSC_VER 12481 # pragma warning(push) // Saves the current warning state. 12482 # pragma warning(disable:4996) // Temporarily disables warning 4996. 12483 #endif 12484 ::std::copy(first, last, ::std::tr1::get<k>(args)); 12485 #ifdef _MSC_VER 12486 # pragma warning(pop) // Restores the warning state. 12487 #endif 12488 } 12489 12490 // Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock 12491 // function. 12492 ACTION_TEMPLATE(DeleteArg, 12493 HAS_1_TEMPLATE_PARAMS(int, k), 12494 AND_0_VALUE_PARAMS()) { 12495 delete ::std::tr1::get<k>(args); 12496 } 12497 12498 // This action returns the value pointed to by 'pointer'. 12499 ACTION_P(ReturnPointee, pointer) { return *pointer; } 12500 12501 // Action Throw(exception) can be used in a mock function of any type 12502 // to throw the given exception. Any copyable value can be thrown. 12503 #if GTEST_HAS_EXCEPTIONS 12504 12505 // Suppresses the 'unreachable code' warning that VC generates in opt modes. 12506 # ifdef _MSC_VER 12507 # pragma warning(push) // Saves the current warning state. 12508 # pragma warning(disable:4702) // Temporarily disables warning 4702. 12509 # endif 12510 ACTION_P(Throw, exception) { throw exception; } 12511 # ifdef _MSC_VER 12512 # pragma warning(pop) // Restores the warning state. 12513 # endif 12514 12515 #endif // GTEST_HAS_EXCEPTIONS 12516 12517 #ifdef _MSC_VER 12518 # pragma warning(pop) 12519 #endif 12520 12521 } // namespace testing 12522 12523 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ 12524 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!! 12525 12526 // Copyright 2008, Google Inc. 12527 // All rights reserved. 12528 // 12529 // Redistribution and use in source and binary forms, with or without 12530 // modification, are permitted provided that the following conditions are 12531 // met: 12532 // 12533 // * Redistributions of source code must retain the above copyright 12534 // notice, this list of conditions and the following disclaimer. 12535 // * Redistributions in binary form must reproduce the above 12536 // copyright notice, this list of conditions and the following disclaimer 12537 // in the documentation and/or other materials provided with the 12538 // distribution. 12539 // * Neither the name of Google Inc. nor the names of its 12540 // contributors may be used to endorse or promote products derived from 12541 // this software without specific prior written permission. 12542 // 12543 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 12544 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 12545 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 12546 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12547 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 12548 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 12549 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 12550 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 12551 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 12552 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 12553 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 12554 // 12555 // Author: wan@google.com (Zhanyong Wan) 12556 12557 // Implements class templates NiceMock and StrictMock. 12558 // 12559 // Given a mock class MockFoo that is created using Google Mock, 12560 // NiceMock<MockFoo> is a subclass of MockFoo that allows 12561 // uninteresting calls (i.e. calls to mock methods that have no 12562 // EXPECT_CALL specs), and StrictMock<MockFoo> is a subclass of 12563 // MockFoo that treats all uninteresting calls as errors. 12564 // 12565 // NiceMock and StrictMock "inherits" the constructors of their 12566 // respective base class, with up-to 10 arguments. Therefore you can 12567 // write NiceMock<MockFoo>(5, "a") to construct a nice mock where 12568 // MockFoo has a constructor that accepts (int, const char*), for 12569 // example. 12570 // 12571 // A known limitation is that NiceMock<MockFoo> and 12572 // StrictMock<MockFoo> only works for mock methods defined using the 12573 // MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. If a 12574 // mock method is defined in a base class of MockFoo, the "nice" or 12575 // "strict" modifier may not affect it, depending on the compiler. In 12576 // particular, nesting NiceMock and StrictMock is NOT supported. 12577 // 12578 // Another known limitation is that the constructors of the base mock 12579 // cannot have arguments passed by non-const reference, which are 12580 // banned by the Google C++ style guide anyway. 12581 12582 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ 12583 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ 12584 12585 12586 namespace testing { 12587 12588 template <class MockClass> 12589 class NiceMock : public MockClass { 12590 public: 12591 // We don't factor out the constructor body to a common method, as 12592 // we have to avoid a possible clash with members of MockClass. 12593 NiceMock() { 12594 ::testing::Mock::AllowUninterestingCalls( 12595 internal::ImplicitCast_<MockClass*>(this)); 12596 } 12597 12598 // C++ doesn't (yet) allow inheritance of constructors, so we have 12599 // to define it for each arity. 12600 template <typename A1> 12601 explicit NiceMock(const A1& a1) : MockClass(a1) { 12602 ::testing::Mock::AllowUninterestingCalls( 12603 internal::ImplicitCast_<MockClass*>(this)); 12604 } 12605 template <typename A1, typename A2> 12606 NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { 12607 ::testing::Mock::AllowUninterestingCalls( 12608 internal::ImplicitCast_<MockClass*>(this)); 12609 } 12610 12611 template <typename A1, typename A2, typename A3> 12612 NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { 12613 ::testing::Mock::AllowUninterestingCalls( 12614 internal::ImplicitCast_<MockClass*>(this)); 12615 } 12616 12617 template <typename A1, typename A2, typename A3, typename A4> 12618 NiceMock(const A1& a1, const A2& a2, const A3& a3, 12619 const A4& a4) : MockClass(a1, a2, a3, a4) { 12620 ::testing::Mock::AllowUninterestingCalls( 12621 internal::ImplicitCast_<MockClass*>(this)); 12622 } 12623 12624 template <typename A1, typename A2, typename A3, typename A4, typename A5> 12625 NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12626 const A5& a5) : MockClass(a1, a2, a3, a4, a5) { 12627 ::testing::Mock::AllowUninterestingCalls( 12628 internal::ImplicitCast_<MockClass*>(this)); 12629 } 12630 12631 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12632 typename A6> 12633 NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12634 const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { 12635 ::testing::Mock::AllowUninterestingCalls( 12636 internal::ImplicitCast_<MockClass*>(this)); 12637 } 12638 12639 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12640 typename A6, typename A7> 12641 NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12642 const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, 12643 a6, a7) { 12644 ::testing::Mock::AllowUninterestingCalls( 12645 internal::ImplicitCast_<MockClass*>(this)); 12646 } 12647 12648 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12649 typename A6, typename A7, typename A8> 12650 NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12651 const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, 12652 a2, a3, a4, a5, a6, a7, a8) { 12653 ::testing::Mock::AllowUninterestingCalls( 12654 internal::ImplicitCast_<MockClass*>(this)); 12655 } 12656 12657 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12658 typename A6, typename A7, typename A8, typename A9> 12659 NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12660 const A5& a5, const A6& a6, const A7& a7, const A8& a8, 12661 const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { 12662 ::testing::Mock::AllowUninterestingCalls( 12663 internal::ImplicitCast_<MockClass*>(this)); 12664 } 12665 12666 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12667 typename A6, typename A7, typename A8, typename A9, typename A10> 12668 NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12669 const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, 12670 const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { 12671 ::testing::Mock::AllowUninterestingCalls( 12672 internal::ImplicitCast_<MockClass*>(this)); 12673 } 12674 12675 virtual ~NiceMock() { 12676 ::testing::Mock::UnregisterCallReaction( 12677 internal::ImplicitCast_<MockClass*>(this)); 12678 } 12679 12680 private: 12681 GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock); 12682 }; 12683 12684 template <class MockClass> 12685 class StrictMock : public MockClass { 12686 public: 12687 // We don't factor out the constructor body to a common method, as 12688 // we have to avoid a possible clash with members of MockClass. 12689 StrictMock() { 12690 ::testing::Mock::FailUninterestingCalls( 12691 internal::ImplicitCast_<MockClass*>(this)); 12692 } 12693 12694 template <typename A1> 12695 explicit StrictMock(const A1& a1) : MockClass(a1) { 12696 ::testing::Mock::FailUninterestingCalls( 12697 internal::ImplicitCast_<MockClass*>(this)); 12698 } 12699 template <typename A1, typename A2> 12700 StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { 12701 ::testing::Mock::FailUninterestingCalls( 12702 internal::ImplicitCast_<MockClass*>(this)); 12703 } 12704 12705 template <typename A1, typename A2, typename A3> 12706 StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { 12707 ::testing::Mock::FailUninterestingCalls( 12708 internal::ImplicitCast_<MockClass*>(this)); 12709 } 12710 12711 template <typename A1, typename A2, typename A3, typename A4> 12712 StrictMock(const A1& a1, const A2& a2, const A3& a3, 12713 const A4& a4) : MockClass(a1, a2, a3, a4) { 12714 ::testing::Mock::FailUninterestingCalls( 12715 internal::ImplicitCast_<MockClass*>(this)); 12716 } 12717 12718 template <typename A1, typename A2, typename A3, typename A4, typename A5> 12719 StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12720 const A5& a5) : MockClass(a1, a2, a3, a4, a5) { 12721 ::testing::Mock::FailUninterestingCalls( 12722 internal::ImplicitCast_<MockClass*>(this)); 12723 } 12724 12725 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12726 typename A6> 12727 StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12728 const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { 12729 ::testing::Mock::FailUninterestingCalls( 12730 internal::ImplicitCast_<MockClass*>(this)); 12731 } 12732 12733 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12734 typename A6, typename A7> 12735 StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12736 const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, 12737 a6, a7) { 12738 ::testing::Mock::FailUninterestingCalls( 12739 internal::ImplicitCast_<MockClass*>(this)); 12740 } 12741 12742 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12743 typename A6, typename A7, typename A8> 12744 StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12745 const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, 12746 a2, a3, a4, a5, a6, a7, a8) { 12747 ::testing::Mock::FailUninterestingCalls( 12748 internal::ImplicitCast_<MockClass*>(this)); 12749 } 12750 12751 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12752 typename A6, typename A7, typename A8, typename A9> 12753 StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12754 const A5& a5, const A6& a6, const A7& a7, const A8& a8, 12755 const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { 12756 ::testing::Mock::FailUninterestingCalls( 12757 internal::ImplicitCast_<MockClass*>(this)); 12758 } 12759 12760 template <typename A1, typename A2, typename A3, typename A4, typename A5, 12761 typename A6, typename A7, typename A8, typename A9, typename A10> 12762 StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 12763 const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, 12764 const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { 12765 ::testing::Mock::FailUninterestingCalls( 12766 internal::ImplicitCast_<MockClass*>(this)); 12767 } 12768 12769 virtual ~StrictMock() { 12770 ::testing::Mock::UnregisterCallReaction( 12771 internal::ImplicitCast_<MockClass*>(this)); 12772 } 12773 12774 private: 12775 GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock); 12776 }; 12777 12778 // The following specializations catch some (relatively more common) 12779 // user errors of nesting nice and strict mocks. They do NOT catch 12780 // all possible errors. 12781 12782 // These specializations are declared but not defined, as NiceMock and 12783 // StrictMock cannot be nested. 12784 template <typename MockClass> 12785 class NiceMock<NiceMock<MockClass> >; 12786 template <typename MockClass> 12787 class NiceMock<StrictMock<MockClass> >; 12788 template <typename MockClass> 12789 class StrictMock<NiceMock<MockClass> >; 12790 template <typename MockClass> 12791 class StrictMock<StrictMock<MockClass> >; 12792 12793 } // namespace testing 12794 12795 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ 12796 12797 namespace testing { 12798 12799 // Declares Google Mock flags that we want a user to use programmatically. 12800 GMOCK_DECLARE_bool_(catch_leaked_mocks); 12801 GMOCK_DECLARE_string_(verbose); 12802 12803 // Initializes Google Mock. This must be called before running the 12804 // tests. In particular, it parses the command line for the flags 12805 // that Google Mock recognizes. Whenever a Google Mock flag is seen, 12806 // it is removed from argv, and *argc is decremented. 12807 // 12808 // No value is returned. Instead, the Google Mock flag variables are 12809 // updated. 12810 // 12811 // Since Google Test is needed for Google Mock to work, this function 12812 // also initializes Google Test and parses its flags, if that hasn't 12813 // been done. 12814 void InitGoogleMock(int* argc, char** argv); 12815 12816 // This overloaded version can be used in Windows programs compiled in 12817 // UNICODE mode. 12818 void InitGoogleMock(int* argc, wchar_t** argv); 12819 12820 } // namespace testing 12821 12822 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_ 12823