blob: 2ce6dc15c72a26346aba62f1115032f941502e29 [file] [log] [blame]
Keir Mierle8ebb0732012-04-30 23:09:08 -07001// 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
266namespace testing {
267
268template <typename T>
269class Matcher;
270
271namespace internal {
272
273// An IgnoredValue object can be implicitly constructed from ANY value.
274// This is used in implementing the IgnoreResult(a) action.
275class 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>
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.
288template <typename Tuple>
289struct MatcherTuple;
290
291template <>
292struct MatcherTuple< ::std::tr1::tuple<> > {
293 typedef ::std::tr1::tuple< > type;
294};
295
296template <typename A1>
297struct MatcherTuple< ::std::tr1::tuple<A1> > {
298 typedef ::std::tr1::tuple<Matcher<A1> > type;
299};
300
301template <typename A1, typename A2>
302struct MatcherTuple< ::std::tr1::tuple<A1, A2> > {
303 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2> > type;
304};
305
306template <typename A1, typename A2, typename A3>
307struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3> > {
308 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type;
309};
310
311template <typename A1, typename A2, typename A3, typename A4>
312struct 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
317template <typename A1, typename A2, typename A3, typename A4, typename A5>
318struct 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
323template <typename A1, typename A2, typename A3, typename A4, typename A5,
324 typename A6>
325struct 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
330template <typename A1, typename A2, typename A3, typename A4, typename A5,
331 typename A6, typename A7>
332struct 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
337template <typename A1, typename A2, typename A3, typename A4, typename A5,
338 typename A6, typename A7, typename A8>
339struct 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
344template <typename A1, typename A2, typename A3, typename A4, typename A5,
345 typename A6, typename A7, typename A8, typename A9>
346struct 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
351template <typename A1, typename A2, typename A3, typename A4, typename A5,
352 typename A6, typename A7, typename A8, typename A9, typename A10>
353struct 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.
373template <typename F>
374struct Function;
375
376template <typename R>
377struct 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
385template <typename R, typename A1>
386struct 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
395template <typename R, typename A1, typename A2>
396struct 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
405template <typename R, typename A1, typename A2, typename A3>
406struct 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
415template <typename R, typename A1, typename A2, typename A3, typename A4>
416struct 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
425template <typename R, typename A1, typename A2, typename A3, typename A4,
426 typename A5>
427struct 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
436template <typename R, typename A1, typename A2, typename A3, typename A4,
437 typename A5, typename A6>
438struct 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
447template <typename R, typename A1, typename A2, typename A3, typename A4,
448 typename A5, typename A6, typename A7>
449struct 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
458template <typename R, typename A1, typename A2, typename A3, typename A4,
459 typename A5, typename A6, typename A7, typename A8>
460struct 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
469template <typename R, typename A1, typename A2, typename A3, typename A4,
470 typename A5, typename A6, typename A7, typename A8, typename A9>
471struct 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
481template <typename R, typename A1, typename A2, typename A3, typename A4,
482 typename A5, typename A6, typename A7, typename A8, typename A9,
483 typename A10>
484struct 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
501namespace testing {
502namespace 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".
508string 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.
514template <typename Pointer>
515struct 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.
521template <typename T>
522struct 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.
527template <typename Pointer>
528inline typename Pointer::element_type* GetRawPointer(const Pointer& p) {
529 return p.get();
530}
531// This overloaded version is for the raw pointer case.
532template <typename Element>
533inline Element* GetRawPointer(Element* p) { return p; }
534
535// This comparator allows linked_ptr to be stored in sets.
536template <typename T>
537struct 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.
578enum TypeKind {
579 kBool, kInteger, kFloatingPoint, kOther
580};
581
582// KindOf<T>::value is the kind of type T.
583template <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
591GMOCK_DECLARE_KIND_(bool, kBool);
592
593// All standard integer types.
594GMOCK_DECLARE_KIND_(char, kInteger);
595GMOCK_DECLARE_KIND_(signed char, kInteger);
596GMOCK_DECLARE_KIND_(unsigned char, kInteger);
597GMOCK_DECLARE_KIND_(short, kInteger); // NOLINT
598GMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT
599GMOCK_DECLARE_KIND_(int, kInteger);
600GMOCK_DECLARE_KIND_(unsigned int, kInteger);
601GMOCK_DECLARE_KIND_(long, kInteger); // NOLINT
602GMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT
603
604#if GMOCK_WCHAR_T_IS_NATIVE_
605GMOCK_DECLARE_KIND_(wchar_t, kInteger);
606#endif
607
608// Non-standard integer types.
609GMOCK_DECLARE_KIND_(Int64, kInteger);
610GMOCK_DECLARE_KIND_(UInt64, kInteger);
611
612// All standard floating-point types.
613GMOCK_DECLARE_KIND_(float, kFloatingPoint);
614GMOCK_DECLARE_KIND_(double, kFloatingPoint);
615GMOCK_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.
636template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To>
637struct LosslessArithmeticConvertibleImpl : public false_type {};
638
639// Converting bool to bool is lossless.
640template <>
641struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool>
642 : public true_type {}; // NOLINT
643
644// Converting bool to any integer type is lossless.
645template <typename To>
646struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To>
647 : public true_type {}; // NOLINT
648
649// Converting bool to any floating-point type is lossless.
650template <typename To>
651struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To>
652 : public true_type {}; // NOLINT
653
654// Converting an integer to bool is lossy.
655template <typename From>
656struct 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.
661template <typename From, typename To>
662struct 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.
676template <typename From, typename To>
677struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To>
678 : public false_type {}; // NOLINT
679
680// Converting a floating-point to bool is lossy.
681template <typename From>
682struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool>
683 : public false_type {}; // NOLINT
684
685// Converting a floating-point to an integer is lossy.
686template <typename From, typename To>
687struct 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.
692template <typename From, typename To>
693struct 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.
704template <typename From, typename To>
705struct 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).
711class 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.
726FailureReporterInterface* 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.
733inline 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}
740inline 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.
746inline 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}
753inline void Expect(bool condition, const char* file, int line) {
754 Expect(condition, file, line, "Expectation failed.");
755}
756
757// Severity level of a log.
758enum 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.
766const char kInfoVerbosity[] = "info";
767// Only warnings are printed.
768const char kWarningVerbosity[] = "warning";
769// No logs are printed.
770const char kErrorVerbosity[] = "error";
771
772// Returns true iff a log with the given severity is visible according
773// to the --gmock_verbose flag.
774bool 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.
783void 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.
790template <typename T> struct is_reference : public false_type {};
791template <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.
794template <typename T1, typename T2> struct type_equals : public false_type {};
795template <typename T> struct type_equals<T, T> : public true_type {};
796
797// remove_reference<T>::type removes the reference from type T, if any.
798template <typename T> struct remove_reference { typedef T type; }; // NOLINT
799template <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).
805template <typename T>
806inline T Invalid() {
807 return *static_cast<typename remove_reference<T>::type*>(NULL);
808}
809template <>
810inline 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.
828template <class RawContainer>
829class 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.
844template <typename Element, size_t N>
845class 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.
889template <typename ElementPointer, typename Size>
890class 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.
910template <typename T> class StlContainerView<T&>;
911
912} // namespace internal
913} // namespace testing
914
915#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
916
917namespace 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
928namespace internal {
929
930template <typename F1, typename F2>
931class 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.
938template <typename T>
939class 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.
954template <typename T>
955class 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.
963template <typename T>
964class 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
980GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT
981#if GTEST_HAS_GLOBAL_STRING
982GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, "");
983#endif // GTEST_HAS_GLOBAL_STRING
984GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, "");
985GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);
986GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0');
987GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0');
988GMOCK_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_
997GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT
998#endif
999
1000GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT
1001GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT
1002GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U);
1003GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0);
1004GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT
1005GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT
1006GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0);
1007GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0);
1008GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0);
1009GMOCK_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);
1028template <typename T>
1029class 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.
1066template <typename T>
1067class 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.
1101template <>
1102class 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.
1109template <typename T>
1110const T* DefaultValue<T>::value_ = NULL;
1111
1112// Points to the user-set default value for type T&.
1113template <typename T>
1114T* DefaultValue<T&>::address_ = NULL;
1115
1116// Implement this interface to define an action for function type F.
1117template <typename F>
1118class 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.
1145template <typename F>
1146class 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.
1217template <typename Impl>
1218class 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.
1253template <typename F>
1254Action<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);
1265template <typename Impl>
1266inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {
1267 return PolymorphicAction<Impl>(impl);
1268}
1269
1270namespace internal {
1271
1272// Allows an Action<F2> object to pose as an Action<F1>, as long as F2
1273// and F1 are compatible.
1274template <typename F1, typename F2>
1275class 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//
1316template <typename R>
1317class 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.
1377class 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.
1389class 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.
1401template <typename T>
1402class 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.
1448template <typename T>
1449class 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.
1495class 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.
1505template <typename T1, typename T2>
1506class 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.
1526template <typename T>
1527class 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.
1551template <size_t N, typename A, bool kIsProto>
1552class 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
1570template <size_t N, typename Proto>
1571class 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>).
1598template <typename FunctionImpl>
1599class 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.
1618template <class Class, typename MethodPtr>
1619class 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.
1637template <typename A>
1638class 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.
1697template <typename T>
1698class 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.
1711template <typename T>
1712void 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.
1719template <typename Action1, typename Action2>
1720class 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));
1794typedef 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.
1800template <typename To>
1801template <typename From>
1802Action<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.
1808template <typename R>
1809internal::ReturnAction<R> Return(R value) {
1810 return internal::ReturnAction<R>(value);
1811}
1812
1813// Creates an action that returns NULL.
1814inline PolymorphicAction<internal::ReturnNullAction> ReturnNull() {
1815 return MakePolymorphicAction(internal::ReturnNullAction());
1816}
1817
1818// Creates an action that returns from a void function.
1819inline PolymorphicAction<internal::ReturnVoidAction> Return() {
1820 return MakePolymorphicAction(internal::ReturnVoidAction());
1821}
1822
1823// Creates an action that returns the reference to a variable.
1824template <typename R>
1825inline 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.
1832template <typename R>
1833inline 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.
1838inline 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'.
1844template <size_t N, typename T>
1845PolymorphicAction<
1846 internal::SetArgumentPointeeAction<
1847 N, T, internal::IsAProtocolMessage<T>::value> >
1848SetArgPointee(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.
1857template <size_t N>
1858PolymorphicAction<
1859 internal::SetArgumentPointeeAction<N, const char*, false> >
1860SetArgPointee(const char* p) {
1861 return MakePolymorphicAction(internal::SetArgumentPointeeAction<
1862 N, const char*, false>(p));
1863}
1864
1865template <size_t N>
1866PolymorphicAction<
1867 internal::SetArgumentPointeeAction<N, const wchar_t*, false> >
1868SetArgPointee(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.
1875template <size_t N, typename T>
1876PolymorphicAction<
1877 internal::SetArgumentPointeeAction<
1878 N, T, internal::IsAProtocolMessage<T>::value> >
1879SetArgumentPointee(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.
1885template <typename T1, typename T2>
1886PolymorphicAction<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.
1893template <typename T>
1894PolymorphicAction<internal::SetErrnoAndReturnAction<T> >
1895SetErrnoAndReturn(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.
1905template <typename FunctionImpl>
1906PolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> >
1907InvokeWithoutArgs(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.
1914template <class Class, typename MethodPtr>
1915PolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> >
1916InvokeWithoutArgs(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.
1925template <typename A>
1926inline 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)
1937template <typename T>
1938inline 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
1988namespace 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.
2001class 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!
2025class 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.
2067Cardinality AtLeast(int n);
2068
2069// Creates a cardinality that allows at most n calls.
2070Cardinality AtMost(int n);
2071
2072// Creates a cardinality that allows any number of calls.
2073Cardinality AnyNumber();
2074
2075// Creates a cardinality that allows between min and max calls.
2076Cardinality Between(int min, int max);
2077
2078// Creates a cardinality that allows exactly n calls.
2079Cardinality Exactly(int n);
2080
2081// Creates a cardinality from its implementation.
2082inline 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
2130namespace testing {
2131namespace 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.
2136template <typename Result, typename ArgumentTuple>
2137class InvokeHelper;
2138
2139template <typename R>
2140class 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
2155template <typename R, typename A1>
2156class 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
2173template <typename R, typename A1, typename A2>
2174class 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
2191template <typename R, typename A1, typename A2, typename A3>
2192class 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
2210template <typename R, typename A1, typename A2, typename A3, typename A4>
2211class 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
2230template <typename R, typename A1, typename A2, typename A3, typename A4,
2231 typename A5>
2232class 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
2252template <typename R, typename A1, typename A2, typename A3, typename A4,
2253 typename A5, typename A6>
2254class 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
2274template <typename R, typename A1, typename A2, typename A3, typename A4,
2275 typename A5, typename A6, typename A7>
2276class 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
2297template <typename R, typename A1, typename A2, typename A3, typename A4,
2298 typename A5, typename A6, typename A7, typename A8>
2299class 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
2320template <typename R, typename A1, typename A2, typename A3, typename A4,
2321 typename A5, typename A6, typename A7, typename A8, typename A9>
2322class 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
2344template <typename R, typename A1, typename A2, typename A3, typename A4,
2345 typename A5, typename A6, typename A7, typename A8, typename A9,
2346 typename A10>
2347class 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.
2381template <typename R>
2382class 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
2496template <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>
2498class 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
2515template <typename Result, typename ArgumentTuple>
2516class 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
2527template <typename Result, typename ArgumentTuple, int k1>
2528class 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
2539template <typename Result, typename ArgumentTuple, int k1, int k2>
2540class 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
2552template <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
2553class 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
2565template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
2566 int k4>
2567class 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
2581template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
2582 int k4, int k5>
2583class 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
2597template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
2598 int k4, int k5, int k6>
2599class 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
2614template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
2615 int k4, int k5, int k6, int k7>
2616class 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
2631template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
2632 int k4, int k5, int k6, int k7, int k8>
2633class 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
2650template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
2651 int k4, int k5, int k6, int k7, int k8, int k9>
2652class 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.
2672template <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>
2675class 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.
2722struct ExcessiveArg {};
2723
2724// A helper class needed for implementing the ACTION* macros.
2725template <typename Result, class Impl>
2726class 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.
2848template <int k1, typename InnerAction>
2849inline internal::WithArgsAction<InnerAction, k1>
2850WithArgs(const InnerAction& action) {
2851 return internal::WithArgsAction<InnerAction, k1>(action);
2852}
2853
2854template <int k1, int k2, typename InnerAction>
2855inline internal::WithArgsAction<InnerAction, k1, k2>
2856WithArgs(const InnerAction& action) {
2857 return internal::WithArgsAction<InnerAction, k1, k2>(action);
2858}
2859
2860template <int k1, int k2, int k3, typename InnerAction>
2861inline internal::WithArgsAction<InnerAction, k1, k2, k3>
2862WithArgs(const InnerAction& action) {
2863 return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
2864}
2865
2866template <int k1, int k2, int k3, int k4, typename InnerAction>
2867inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
2868WithArgs(const InnerAction& action) {
2869 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
2870}
2871
2872template <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
2873inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
2874WithArgs(const InnerAction& action) {
2875 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
2876}
2877
2878template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
2879inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
2880WithArgs(const InnerAction& action) {
2881 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
2882}
2883
2884template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
2885 typename InnerAction>
2886inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
2887WithArgs(const InnerAction& action) {
2888 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
2889 k7>(action);
2890}
2891
2892template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
2893 typename InnerAction>
2894inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
2895WithArgs(const InnerAction& action) {
2896 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
2897 k8>(action);
2898}
2899
2900template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
2901 int k9, typename InnerAction>
2902inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
2903WithArgs(const InnerAction& action) {
2904 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
2905 k9>(action);
2906}
2907
2908template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
2909 int k9, int k10, typename InnerAction>
2910inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
2911 k9, k10>
2912WithArgs(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.
2919template <typename Action1, typename Action2>
2920inline internal::DoBothAction<Action1, Action2>
2921DoAll(Action1 a1, Action2 a2) {
2922 return internal::DoBothAction<Action1, Action2>(a1, a2);
2923}
2924
2925template <typename Action1, typename Action2, typename Action3>
2926inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
2927 Action3> >
2928DoAll(Action1 a1, Action2 a2, Action3 a3) {
2929 return DoAll(a1, DoAll(a2, a3));
2930}
2931
2932template <typename Action1, typename Action2, typename Action3,
2933 typename Action4>
2934inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
2935 internal::DoBothAction<Action3, Action4> > >
2936DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
2937 return DoAll(a1, DoAll(a2, a3, a4));
2938}
2939
2940template <typename Action1, typename Action2, typename Action3,
2941 typename Action4, typename Action5>
2942inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
2943 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
2944 Action5> > > >
2945DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
2946 return DoAll(a1, DoAll(a2, a3, a4, a5));
2947}
2948
2949template <typename Action1, typename Action2, typename Action3,
2950 typename Action4, typename Action5, typename Action6>
2951inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
2952 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
2953 internal::DoBothAction<Action5, Action6> > > > >
2954DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
2955 return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
2956}
2957
2958template <typename Action1, typename Action2, typename Action3,
2959 typename Action4, typename Action5, typename Action6, typename Action7>
2960inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
2961 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
2962 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
2963 Action7> > > > > >
2964DoAll(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
2969template <typename Action1, typename Action2, typename Action3,
2970 typename Action4, typename Action5, typename Action6, typename Action7,
2971 typename Action8>
2972inline 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> > > > > > >
2976DoAll(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
2981template <typename Action1, typename Action2, typename Action3,
2982 typename Action4, typename Action5, typename Action6, typename Action7,
2983 typename Action8, typename Action9>
2984inline 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> > > > > > > >
2989DoAll(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
2994template <typename Action1, typename Action2, typename Action3,
2995 typename Action4, typename Action5, typename Action6, typename Action7,
2996 typename Action8, typename Action9, typename Action10>
2997inline 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> > > > > > > > >
3002DoAll(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.
4309namespace 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
4351ACTION_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
4358ACTION_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
4365ACTION_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
4372ACTION_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
4379ACTION_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
4386ACTION_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
4393ACTION_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
4400ACTION_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
4407ACTION_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
4414ACTION_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
4421ACTION_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.
4433ACTION_TEMPLATE(ReturnNew,
4434 HAS_1_TEMPLATE_PARAMS(typename, T),
4435 AND_0_VALUE_PARAMS()) {
4436 return new T();
4437}
4438
4439ACTION_TEMPLATE(ReturnNew,
4440 HAS_1_TEMPLATE_PARAMS(typename, T),
4441 AND_1_VALUE_PARAMS(p0)) {
4442 return new T(p0);
4443}
4444
4445ACTION_TEMPLATE(ReturnNew,
4446 HAS_1_TEMPLATE_PARAMS(typename, T),
4447 AND_2_VALUE_PARAMS(p0, p1)) {
4448 return new T(p0, p1);
4449}
4450
4451ACTION_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
4457ACTION_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
4463ACTION_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
4469ACTION_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
4475ACTION_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
4481ACTION_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
4487ACTION_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
4493ACTION_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
4665namespace 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'.
4686class 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
4717inline MatchResultListener::~MatchResultListener() {
4718}
4719
4720// The implementation of a matcher.
4721template <typename T>
4722class 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
4762namespace internal {
4763
4764// A match result listener that ignores the explanation.
4765class 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.
4776class 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.
4786class 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.
4802template <typename T>
4803class 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!
4862template <typename T>
4863class 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.
4882template <>
4883class 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
4899template <>
4900class 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.
4928template <class Impl>
4929class 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);
4982template <typename T>
4983inline 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);
4994template <class Impl>
4995inline 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.
5003template <typename T, typename M>
5004Matcher<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.
5013template <typename T>
5014class 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
5056template <typename T, typename M>
5057inline 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.
5062template <typename T>
5063Matcher<T> A();
5064
5065// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
5066// and MUST NOT BE USED IN USER CODE!!!
5067namespace internal {
5068
5069// If the explanation is not empty, prints it to the ostream.
5070inline 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.
5080inline 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.
5092template <typename Value, typename T>
5093bool 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.
5117template <size_t N>
5118class 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.
5171template <>
5172class 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.
5191template <typename MatcherTuple, typename ValueTuple>
5192bool 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.
5206template <typename MatcherTuple, typename ValueTuple>
5207void 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)).
5224template <typename T, typename M>
5225class 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.
5235template <typename T, typename U>
5236class 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.
5270template <typename T>
5271class MatcherCastImpl<T, Matcher<T> > {
5272 public:
5273 static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
5274};
5275
5276// Implements A<T>().
5277template <typename T>
5278class 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.
5295class 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.
5350GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to");
5351GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >=");
5352GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >");
5353GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <=");
5354GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <");
5355GMOCK_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.
5361class 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.
5377class 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.
5404template <typename T>
5405class RefMatcher;
5406
5407template <typename T>
5408class 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.
5466inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {
5467 return String::CaseInsensitiveCStringEquals(lhs, rhs);
5468}
5469
5470inline 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.
5477template <typename StringType>
5478bool 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.
5501template <typename StringType>
5502class 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.
5555template <typename StringType>
5556class 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.
5596template <typename StringType>
5597class 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.
5637template <typename StringType>
5638class 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.
5677class 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.
5757GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==, "an equal pair");
5758GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
5759 Ge, >=, "a pair where the first >= the second");
5760GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
5761 Gt, >, "a pair where the first > the second");
5762GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
5763 Le, <=, "a pair where the first <= the second");
5764GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
5765 Lt, <, "a pair where the first < the second");
5766GMOCK_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.
5774template <typename T>
5775class 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.
5800template <typename InnerMatcher>
5801class 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.
5822template <typename T>
5823class 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.
5883template <typename Matcher1, typename Matcher2>
5884class 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.
5909template <typename T>
5910class 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.
5971template <typename Matcher1, typename Matcher2>
5972class 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.
5995template <typename Predicate>
5996class 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.
6034template <typename M>
6035class 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.
6072template <typename M>
6073class 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().
6113template <typename M>
6114inline PredicateFormatterFromMatcher<M>
6115MakePredicateFormatterFromMatcher(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.
6123template <typename FloatType>
6124class 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.
6220template <typename InnerMatcher>
6221class 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.
6281template <typename Class, typename FieldType>
6282class 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.
6336template <typename Class, typename PropertyType>
6337class 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.
6402template <typename Functor>
6403struct 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.
6413template <typename ArgType, typename ResType>
6414struct 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.
6430template <typename Callable>
6431class 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().
6501template <typename Container>
6502class 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.
6589template <typename TupleMatcher, typename RhsContainer>
6590class 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.
6696template <typename Container>
6697class 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.
6741template <typename Container>
6742class 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.
6770template <typename Container>
6771class 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).
6798template <typename M>
6799class 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).
6815template <typename M>
6816class 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.
6835template <typename PairType>
6836class 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).
6879template <typename M>
6880class 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.
6897template <typename PairType>
6898class 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).
6983template <typename FirstMatcher, typename SecondMatcher>
6984class 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().
7004template <typename Container>
7005class 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.
7120class 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().
7136template <typename T>
7137class 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.
7163string FormatMatcherDescription(bool negation, const char* matcher_name,
7164 const Strings& param_values);
7165
7166} // namespace internal
7167
7168// Implements MatcherCast().
7169template <typename T, typename M>
7170inline 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.
7183const internal::AnythingMatcher _ = {};
7184// Creates a matcher that matches any value of the given type T.
7185template <typename T>
7186inline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); }
7187
7188// Creates a matcher that matches any value of the given type T.
7189template <typename T>
7190inline 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.
7195template <typename T>
7196inline 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'.
7200template <typename T>
7201Matcher<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.
7215template <typename Lhs, typename Rhs>
7216inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }
7217
7218// Creates a polymorphic matcher that matches anything >= x.
7219template <typename Rhs>
7220inline internal::GeMatcher<Rhs> Ge(Rhs x) {
7221 return internal::GeMatcher<Rhs>(x);
7222}
7223
7224// Creates a polymorphic matcher that matches anything > x.
7225template <typename Rhs>
7226inline internal::GtMatcher<Rhs> Gt(Rhs x) {
7227 return internal::GtMatcher<Rhs>(x);
7228}
7229
7230// Creates a polymorphic matcher that matches anything <= x.
7231template <typename Rhs>
7232inline internal::LeMatcher<Rhs> Le(Rhs x) {
7233 return internal::LeMatcher<Rhs>(x);
7234}
7235
7236// Creates a polymorphic matcher that matches anything < x.
7237template <typename Rhs>
7238inline internal::LtMatcher<Rhs> Lt(Rhs x) {
7239 return internal::LtMatcher<Rhs>(x);
7240}
7241
7242// Creates a polymorphic matcher that matches anything != x.
7243template <typename Rhs>
7244inline internal::NeMatcher<Rhs> Ne(Rhs x) {
7245 return internal::NeMatcher<Rhs>(x);
7246}
7247
7248// Creates a polymorphic matcher that matches any NULL pointer.
7249inline 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).
7256inline 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.
7262template <typename T>
7263inline 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.
7269inline 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.
7275inline 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.
7281inline 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.
7287inline 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.
7293template <typename InnerMatcher>
7294inline 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.
7303template <typename Class, typename FieldType, typename FieldMatcher>
7304inline 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".
7320template <typename Class, typename PropertyType, typename PropertyMatcher>
7321inline 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.
7347template <typename Callable, typename ResultOfMatcher>
7348internal::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.
7363inline 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.
7370inline 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.
7377inline 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.
7384inline 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.
7392inline 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).
7399inline 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).
7406inline 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'.
7414inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
7415 const internal::RE* regex) {
7416 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));
7417}
7418inline 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'.
7425inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
7426 const internal::RE* regex) {
7427 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));
7428}
7429inline 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.
7438inline 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.
7445inline 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.
7452inline 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.
7459inline 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.
7467inline 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).
7474inline 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).
7481inline 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.
7491inline 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.
7495inline 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.
7499inline 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.
7503inline 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.
7507inline 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.
7511inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
7512
7513// Creates a matcher that matches any value of type T that m doesn't
7514// match.
7515template <typename InnerMatcher>
7516inline 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.
7523template <typename Predicate>
7524inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >
7525Truly(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.)
7533template <typename Container>
7534inline 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.
7550template <typename TupleMatcher, typename Container>
7551inline internal::PointwiseMatcher<TupleMatcher,
7552 GTEST_REMOVE_CONST_(Container)>
7553Pointwise(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"))));
7579template <typename M>
7580inline 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")))));
7611template <typename M>
7612inline 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.
7619template <typename M>
7620inline 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".
7629template <typename FirstMatcher, typename SecondMatcher>
7630inline internal::PairMatcher<FirstMatcher, SecondMatcher>
7631Pair(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.
7638template <typename M>
7639inline internal::MatcherAsPredicate<M> Matches(M matcher) {
7640 return internal::MatcherAsPredicate<M>(matcher);
7641}
7642
7643// Returns true iff the value matches the matcher.
7644template <typename T, typename M>
7645inline 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.
7651template <typename T, typename M>
7652inline 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());
7664template <typename InnerMatcher>
7665inline 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
7680namespace testing {
7681
7682// An abstract handle of an expectation.
7683class Expectation;
7684
7685// A set of expectation handles.
7686class ExpectationSet;
7687
7688// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
7689// and MUST NOT BE USED IN USER CODE!!!
7690namespace internal {
7691
7692// Implements a mock function.
7693template <typename F> class FunctionMocker;
7694
7695// Base class for expectations.
7696class ExpectationBase;
7697
7698// Implements an expectation.
7699template <typename F> class TypedExpectation;
7700
7701// Helper class for testing the Expectation class template.
7702class ExpectationTester;
7703
7704// Base class for function mockers.
7705template <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.
7718GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);
7719
7720// Untyped base class for ActionResultHolder<R>.
7721class 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.
7726class 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>.
7844class 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.
7883template <typename F>
7884class 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.
7961enum CallReaction {
7962 ALLOW,
7963 WARN,
7964 FAIL
7965};
7966
7967} // namespace internal
7968
7969// Utilities for manipulating mock objects.
7970class 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).
8078class 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.
8154class 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).
8210class 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.
8251class 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
8261namespace internal {
8262
8263// Points to the implicit sequence introduced by a living InSequence
8264// object (if any) in the current thread or NULL.
8265extern 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.
8281class 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.
8467template <typename F>
8468class 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.
8829void LogWithLocation(testing::internal::LogSeverity severity,
8830 const char* file, int line,
8831 const string& message);
8832
8833template <typename F>
8834class 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>.
8899class 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.
8908template <typename T>
8909class 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.
8958template <>
8959class 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.
8988template <typename F>
8989class 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'.
9305void 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.
9314using 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());
9331template <typename T>
9332inline const T& Const(const T& x) { return x; }
9333
9334// Constructs an Expectation object that references and co-owns exp.
9335inline 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
9355namespace testing {
9356namespace internal {
9357
9358template <typename F>
9359class 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.
9366template <typename F>
9367class FunctionMocker;
9368
9369template <typename R>
9370class 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
9389template <typename R, typename A1>
9390class 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
9410template <typename R, typename A1, typename A2>
9411class 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
9431template <typename R, typename A1, typename A2, typename A3>
9432class 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
9453template <typename R, typename A1, typename A2, typename A3, typename A4>
9454class 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
9475template <typename R, typename A1, typename A2, typename A3, typename A4,
9476 typename A5>
9477class 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
9499template <typename R, typename A1, typename A2, typename A3, typename A4,
9500 typename A5, typename A6>
9501class 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
9524template <typename R, typename A1, typename A2, typename A3, typename A4,
9525 typename A5, typename A6, typename A7>
9526class 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
9549template <typename R, typename A1, typename A2, typename A3, typename A4,
9550 typename A5, typename A6, typename A7, typename A8>
9551class 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
9574template <typename R, typename A1, typename A2, typename A3, typename A4,
9575 typename A5, typename A6, typename A7, typename A8, typename A9>
9576class 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
9600template <typename R, typename A1, typename A2, typename A3, typename A4,
9601 typename A5, typename A6, typename A7, typename A8, typename A9,
9602 typename A10>
9603class 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.
9636using 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().
10105template <typename F>
10106class MockFunction;
10107
10108template <typename R>
10109class 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
10119template <typename R, typename A0>
10120class 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
10130template <typename R, typename A0, typename A1>
10131class 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
10141template <typename R, typename A0, typename A1, typename A2>
10142class 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
10152template <typename R, typename A0, typename A1, typename A2, typename A3>
10153class 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
10163template <typename R, typename A0, typename A1, typename A2, typename A3,
10164 typename A4>
10165class 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
10175template <typename R, typename A0, typename A1, typename A2, typename A3,
10176 typename A4, typename A5>
10177class 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
10187template <typename R, typename A0, typename A1, typename A2, typename A3,
10188 typename A4, typename A5, typename A6>
10189class 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
10199template <typename R, typename A0, typename A1, typename A2, typename A3,
10200 typename A4, typename A5, typename A6, typename A7>
10201class 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
10211template <typename R, typename A0, typename A1, typename A2, typename A3,
10212 typename A4, typename A5, typename A6, typename A7, typename A8>
10213class 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
10223template <typename R, typename A0, typename A1, typename A2, typename A3,
10224 typename A4, typename A5, typename A6, typename A7, typename A8,
10225 typename A9>
10226class 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
10283namespace testing {
10284namespace 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
10301template <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>
10304class TupleFields;
10305
10306// This generic version is used when there are 10 selectors.
10307template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
10308 int k7, int k8, int k9>
10309class 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
10326template <class Tuple>
10327class 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
10336template <class Tuple, int k0>
10337class 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
10346template <class Tuple, int k0, int k1>
10347class 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
10357template <class Tuple, int k0, int k1, int k2>
10358class 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
10368template <class Tuple, int k0, int k1, int k2, int k3>
10369class 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
10380template <class Tuple, int k0, int k1, int k2, int k3, int k4>
10381class 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
10392template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>
10393class 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
10406template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>
10407class 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
10420template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
10421 int k7>
10422class 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
10436template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
10437 int k7, int k8>
10438class 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.
10455template <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>
10458class 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
10525template <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>
10528class 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
10547template <typename T1>
10548class 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
10575template <typename T1, typename T2>
10576class 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
10601template <typename T1, typename T2, typename T3>
10602class 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
10630template <typename T1, typename T2, typename T3, typename T4>
10631class 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
10661template <typename T1, typename T2, typename T3, typename T4, typename T5>
10662class 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
10694template <typename T1, typename T2, typename T3, typename T4, typename T5,
10695 typename T6>
10696class 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
10731template <typename T1, typename T2, typename T3, typename T4, typename T5,
10732 typename T6, typename T7>
10733class 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
10770template <typename T1, typename T2, typename T3, typename T4, typename T5,
10771 typename T6, typename T7, typename T8>
10772class 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
10811template <typename T1, typename T2, typename T3, typename T4, typename T5,
10812 typename T6, typename T7, typename T8, typename T9>
10813class 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
10855template <typename T1, typename T2, typename T3, typename T4, typename T5,
10856 typename T6, typename T7, typename T8, typename T9, typename T10>
10857class 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.
10906template <typename InnerMatcher>
10907inline internal::ArgsMatcher<InnerMatcher>
10908Args(const InnerMatcher& matcher) {
10909 return internal::ArgsMatcher<InnerMatcher>(matcher);
10910}
10911
10912template <int k1, typename InnerMatcher>
10913inline internal::ArgsMatcher<InnerMatcher, k1>
10914Args(const InnerMatcher& matcher) {
10915 return internal::ArgsMatcher<InnerMatcher, k1>(matcher);
10916}
10917
10918template <int k1, int k2, typename InnerMatcher>
10919inline internal::ArgsMatcher<InnerMatcher, k1, k2>
10920Args(const InnerMatcher& matcher) {
10921 return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);
10922}
10923
10924template <int k1, int k2, int k3, typename InnerMatcher>
10925inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>
10926Args(const InnerMatcher& matcher) {
10927 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);
10928}
10929
10930template <int k1, int k2, int k3, int k4, typename InnerMatcher>
10931inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>
10932Args(const InnerMatcher& matcher) {
10933 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);
10934}
10935
10936template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>
10937inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>
10938Args(const InnerMatcher& matcher) {
10939 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);
10940}
10941
10942template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>
10943inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>
10944Args(const InnerMatcher& matcher) {
10945 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);
10946}
10947
10948template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
10949 typename InnerMatcher>
10950inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>
10951Args(const InnerMatcher& matcher) {
10952 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,
10953 k7>(matcher);
10954}
10955
10956template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
10957 typename InnerMatcher>
10958inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>
10959Args(const InnerMatcher& matcher) {
10960 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,
10961 k8>(matcher);
10962}
10963
10964template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
10965 int k9, typename InnerMatcher>
10966inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>
10967Args(const InnerMatcher& matcher) {
10968 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
10969 k9>(matcher);
10970}
10971
10972template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
10973 int k9, int k10, typename InnerMatcher>
10974inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,
10975 k10>
10976Args(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
10991inline internal::ElementsAreMatcher0 ElementsAre() {
10992 return internal::ElementsAreMatcher0();
10993}
10994
10995template <typename T1>
10996inline internal::ElementsAreMatcher1<T1> ElementsAre(const T1& e1) {
10997 return internal::ElementsAreMatcher1<T1>(e1);
10998}
10999
11000template <typename T1, typename T2>
11001inline internal::ElementsAreMatcher2<T1, T2> ElementsAre(const T1& e1,
11002 const T2& e2) {
11003 return internal::ElementsAreMatcher2<T1, T2>(e1, e2);
11004}
11005
11006template <typename T1, typename T2, typename T3>
11007inline 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
11012template <typename T1, typename T2, typename T3, typename T4>
11013inline 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
11018template <typename T1, typename T2, typename T3, typename T4, typename T5>
11019inline 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
11025template <typename T1, typename T2, typename T3, typename T4, typename T5,
11026 typename T6>
11027inline 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
11034template <typename T1, typename T2, typename T3, typename T4, typename T5,
11035 typename T6, typename T7>
11036inline 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
11043template <typename T1, typename T2, typename T3, typename T4, typename T5,
11044 typename T6, typename T7, typename T8>
11045inline 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
11052template <typename T1, typename T2, typename T3, typename T4, typename T5,
11053 typename T6, typename T7, typename T8, typename T9>
11054inline 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
11061template <typename T1, typename T2, typename T3, typename T4, typename T5,
11062 typename T6, typename T7, typename T8, typename T9, typename T10>
11063inline 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
11077template <typename T>
11078inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
11079 const T* first, size_t count) {
11080 return internal::ElementsAreArrayMatcher<T>(first, count);
11081}
11082
11083template <typename T, size_t N>
11084inline internal::ElementsAreArrayMatcher<T>
11085ElementsAreArray(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
11092template <typename Matcher1, typename Matcher2>
11093inline internal::BothOfMatcher<Matcher1, Matcher2>
11094AllOf(Matcher1 m1, Matcher2 m2) {
11095 return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2);
11096}
11097
11098template <typename Matcher1, typename Matcher2, typename Matcher3>
11099inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
11100 Matcher3> >
11101AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) {
11102 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3));
11103}
11104
11105template <typename Matcher1, typename Matcher2, typename Matcher3,
11106 typename Matcher4>
11107inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
11108 internal::BothOfMatcher<Matcher3, Matcher4> > >
11109AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) {
11110 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4));
11111}
11112
11113template <typename Matcher1, typename Matcher2, typename Matcher3,
11114 typename Matcher4, typename Matcher5>
11115inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
11116 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
11117 Matcher5> > > >
11118AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) {
11119 return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5));
11120}
11121
11122template <typename Matcher1, typename Matcher2, typename Matcher3,
11123 typename Matcher4, typename Matcher5, typename Matcher6>
11124inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
11125 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
11126 internal::BothOfMatcher<Matcher5, Matcher6> > > > >
11127AllOf(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
11132template <typename Matcher1, typename Matcher2, typename Matcher3,
11133 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7>
11134inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2,
11135 internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4,
11136 internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6,
11137 Matcher7> > > > > >
11138AllOf(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
11143template <typename Matcher1, typename Matcher2, typename Matcher3,
11144 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
11145 typename Matcher8>
11146inline 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> > > > > > >
11150AllOf(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
11155template <typename Matcher1, typename Matcher2, typename Matcher3,
11156 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
11157 typename Matcher8, typename Matcher9>
11158inline 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> > > > > > > >
11163AllOf(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
11168template <typename Matcher1, typename Matcher2, typename Matcher3,
11169 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
11170 typename Matcher8, typename Matcher9, typename Matcher10>
11171inline 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> > > > > > > > >
11176AllOf(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
11185template <typename Matcher1, typename Matcher2>
11186inline internal::EitherOfMatcher<Matcher1, Matcher2>
11187AnyOf(Matcher1 m1, Matcher2 m2) {
11188 return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2);
11189}
11190
11191template <typename Matcher1, typename Matcher2, typename Matcher3>
11192inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
11193 Matcher3> >
11194AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) {
11195 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3));
11196}
11197
11198template <typename Matcher1, typename Matcher2, typename Matcher3,
11199 typename Matcher4>
11200inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
11201 internal::EitherOfMatcher<Matcher3, Matcher4> > >
11202AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) {
11203 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4));
11204}
11205
11206template <typename Matcher1, typename Matcher2, typename Matcher3,
11207 typename Matcher4, typename Matcher5>
11208inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
11209 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
11210 Matcher5> > > >
11211AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) {
11212 return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5));
11213}
11214
11215template <typename Matcher1, typename Matcher2, typename Matcher3,
11216 typename Matcher4, typename Matcher5, typename Matcher6>
11217inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
11218 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
11219 internal::EitherOfMatcher<Matcher5, Matcher6> > > > >
11220AnyOf(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
11225template <typename Matcher1, typename Matcher2, typename Matcher3,
11226 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7>
11227inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2,
11228 internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4,
11229 internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6,
11230 Matcher7> > > > > >
11231AnyOf(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
11236template <typename Matcher1, typename Matcher2, typename Matcher3,
11237 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
11238 typename Matcher8>
11239inline 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> > > > > > >
11243AnyOf(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
11248template <typename Matcher1, typename Matcher2, typename Matcher3,
11249 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
11250 typename Matcher8, typename Matcher9>
11251inline 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> > > > > > > >
11256AnyOf(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
11261template <typename Matcher1, typename Matcher2, typename Matcher3,
11262 typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7,
11263 typename Matcher8, typename Matcher9, typename Matcher10>
11264inline 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> > > > > > > > >
11269AnyOf(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
12333namespace testing {
12334namespace 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>).
12341template <typename FunctionImpl>
12342class 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.
12361template <class Class, typename MethodPtr>
12362class 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.
12386template <typename FunctionImpl>
12387PolymorphicAction<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.
12395template <class Class, typename MethodPtr>
12396PolymorphicAction<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.
12406template <typename InnerAction>
12407inline internal::WithArgsAction<InnerAction>
12408WithoutArgs(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.
12417template <int k, typename InnerAction>
12418inline internal::WithArgsAction<InnerAction, k>
12419WithArg(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.
12434ACTION_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.
12442ACTION_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.
12450ACTION_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.
12458ACTION_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.
12475ACTION_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.
12492ACTION_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'.
12499ACTION_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
12510ACTION_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
12586namespace testing {
12587
12588template <class MockClass>
12589class 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
12684template <class MockClass>
12685class 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.
12784template <typename MockClass>
12785class NiceMock<NiceMock<MockClass> >;
12786template <typename MockClass>
12787class NiceMock<StrictMock<MockClass> >;
12788template <typename MockClass>
12789class StrictMock<NiceMock<MockClass> >;
12790template <typename MockClass>
12791class StrictMock<StrictMock<MockClass> >;
12792
12793} // namespace testing
12794
12795#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
12796
12797namespace testing {
12798
12799// Declares Google Mock flags that we want a user to use programmatically.
12800GMOCK_DECLARE_bool_(catch_leaked_mocks);
12801GMOCK_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.
12814void InitGoogleMock(int* argc, char** argv);
12815
12816// This overloaded version can be used in Windows programs compiled in
12817// UNICODE mode.
12818void InitGoogleMock(int* argc, wchar_t** argv);
12819
12820} // namespace testing
12821
12822#endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_