gmock-generated-matchers.h 58.9 KB
Newer Older
1
2
3
// This file was GENERATED by command:
//     pump.py gmock-generated-matchers.h.pump
// DO NOT EDIT BY HAND!!!
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// Google Mock - a framework for writing C++ mock classes.
//
// This file implements some commonly used variadic matchers.

Gennadiy Civil's avatar
 
Gennadiy Civil committed
38
39
// GOOGLETEST_CM0002 DO NOT DELETE

40
41
42
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_

43
#include <iterator>
44
45
46
#include <sstream>
#include <string>
#include <vector>
47
#include "gmock/gmock-matchers.h"
48
49
50
51

namespace testing {
namespace internal {

52
53
// The type of the i-th (0-based) field of Tuple.
#define GMOCK_FIELD_TYPE_(Tuple, i) \
Abseil Team's avatar
Abseil Team committed
54
    typename ::std::tuple_element<i, Tuple>::type
55
56
57
58
59
60
61

// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
// tuple of type Tuple.  It has two members:
//
//   type: a tuple type whose i-th field is the ki-th field of Tuple.
//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
//
Abseil Team's avatar
Abseil Team committed
62
63
// For example, in class TupleFields<std::tuple<bool, char, int>, 2, 0>,
// we have:
64
//
Abseil Team's avatar
Abseil Team committed
65
66
//   type is std::tuple<int, bool>, and
//   GetSelectedFields(std::make_tuple(true, 'a', 42)) is (42, true).
67
68
69
70
71
72
73
74
75
76
77

template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
    int k9 = -1>
class TupleFields;

// This generic version is used when there are 10 selectors.
template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
    int k7, int k8, int k9>
class TupleFields {
 public:
Abseil Team's avatar
Abseil Team committed
78
79
80
81
82
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3),
      GMOCK_FIELD_TYPE_(Tuple, k4), GMOCK_FIELD_TYPE_(Tuple, k5),
      GMOCK_FIELD_TYPE_(Tuple, k6), GMOCK_FIELD_TYPE_(Tuple, k7),
      GMOCK_FIELD_TYPE_(Tuple, k8), GMOCK_FIELD_TYPE_(Tuple, k9)> type;
83
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
84
85
86
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t), std::get<k4>(t), std::get<k5>(t), std::get<k6>(t),
        std::get<k7>(t), std::get<k8>(t), std::get<k9>(t));
87
88
89
90
91
92
93
94
  }
};

// The following specialization is used for 0 ~ 9 selectors.

template <class Tuple>
class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
95
  typedef ::std::tuple<> type;
96
  static type GetSelectedFields(const Tuple& /* t */) {
97
98
99
100
101
102
103
    return type();
  }
};

template <class Tuple, int k0>
class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
104
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;
105
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
106
    return type(std::get<k0>(t));
107
108
109
110
111
112
  }
};

template <class Tuple, int k0, int k1>
class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
113
114
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1)> type;
115
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
116
    return type(std::get<k0>(t), std::get<k1>(t));
117
118
119
120
121
122
  }
};

template <class Tuple, int k0, int k1, int k2>
class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
123
124
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;
125
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
126
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t));
127
128
129
130
131
132
  }
};

template <class Tuple, int k0, int k1, int k2, int k3>
class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
133
134
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3)> type;
135
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
136
137
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t));
138
139
140
141
142
143
  }
};

template <class Tuple, int k0, int k1, int k2, int k3, int k4>
class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
144
145
146
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3),
      GMOCK_FIELD_TYPE_(Tuple, k4)> type;
147
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
148
149
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t), std::get<k4>(t));
150
151
152
153
154
155
  }
};

template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
156
157
158
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3),
      GMOCK_FIELD_TYPE_(Tuple, k4), GMOCK_FIELD_TYPE_(Tuple, k5)> type;
159
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
160
161
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t), std::get<k4>(t), std::get<k5>(t));
162
163
164
165
166
167
  }
};

template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
168
169
170
171
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3),
      GMOCK_FIELD_TYPE_(Tuple, k4), GMOCK_FIELD_TYPE_(Tuple, k5),
      GMOCK_FIELD_TYPE_(Tuple, k6)> type;
172
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
173
174
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t), std::get<k4>(t), std::get<k5>(t), std::get<k6>(t));
175
176
177
178
179
180
181
  }
};

template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
    int k7>
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
182
183
184
185
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3),
      GMOCK_FIELD_TYPE_(Tuple, k4), GMOCK_FIELD_TYPE_(Tuple, k5),
      GMOCK_FIELD_TYPE_(Tuple, k6), GMOCK_FIELD_TYPE_(Tuple, k7)> type;
186
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
187
188
189
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t), std::get<k4>(t), std::get<k5>(t), std::get<k6>(t),
        std::get<k7>(t));
190
191
192
193
194
195
196
  }
};

template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
    int k7, int k8>
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {
 public:
Abseil Team's avatar
Abseil Team committed
197
198
199
200
201
  typedef ::std::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), GMOCK_FIELD_TYPE_(Tuple,
      k1), GMOCK_FIELD_TYPE_(Tuple, k2), GMOCK_FIELD_TYPE_(Tuple, k3),
      GMOCK_FIELD_TYPE_(Tuple, k4), GMOCK_FIELD_TYPE_(Tuple, k5),
      GMOCK_FIELD_TYPE_(Tuple, k6), GMOCK_FIELD_TYPE_(Tuple, k7),
      GMOCK_FIELD_TYPE_(Tuple, k8)> type;
202
  static type GetSelectedFields(const Tuple& t) {
Abseil Team's avatar
Abseil Team committed
203
204
205
    return type(std::get<k0>(t), std::get<k1>(t), std::get<k2>(t),
        std::get<k3>(t), std::get<k4>(t), std::get<k5>(t), std::get<k6>(t),
        std::get<k7>(t), std::get<k8>(t));
206
207
208
209
210
211
212
213
214
215
216
217
  }
};

#undef GMOCK_FIELD_TYPE_

// Implements the Args() matcher.
template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
    int k9 = -1>
class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
 public:
  // ArgsTuple may have top-level const or reference modifiers.
zhanyong.wan's avatar
zhanyong.wan committed
218
  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;
219
220
221
222
223
224
225
226
  typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,
      k6, k7, k8, k9>::type SelectedArgs;
  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;

  template <typename InnerMatcher>
  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}

zhanyong.wan's avatar
zhanyong.wan committed
227
228
  virtual bool MatchAndExplain(ArgsTuple args,
                               MatchResultListener* listener) const {
229
230
231
232
233
234
235
236
237
238
239
240
    const SelectedArgs& selected_args = GetSelectedArgs(args);
    if (!listener->IsInterested())
      return inner_matcher_.Matches(selected_args);

    PrintIndices(listener->stream());
    *listener << "are " << PrintToString(selected_args);

    StringMatchResultListener inner_listener;
    const bool match = inner_matcher_.MatchAndExplain(selected_args,
                                                      &inner_listener);
    PrintIfNotEmpty(inner_listener.str(), listener->stream());
    return match;
241
242
243
  }

  virtual void DescribeTo(::std::ostream* os) const {
244
    *os << "are a tuple ";
245
246
247
248
249
    PrintIndices(os);
    inner_matcher_.DescribeTo(os);
  }

  virtual void DescribeNegationTo(::std::ostream* os) const {
250
    *os << "are a tuple ";
251
252
253
254
255
256
257
258
259
260
261
262
    PrintIndices(os);
    inner_matcher_.DescribeNegationTo(os);
  }

 private:
  static SelectedArgs GetSelectedArgs(ArgsTuple args) {
    return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,
        k9>::GetSelectedFields(args);
  }

  // Prints the indices of the selected fields.
  static void PrintIndices(::std::ostream* os) {
263
    *os << "whose fields (";
264
265
266
267
268
269
270
271
272
273
274
275
276
277
    const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };
    for (int i = 0; i < 10; i++) {
      if (indices[i] < 0)
        break;

      if (i >= 1)
        *os << ", ";

      *os << "#" << indices[i];
    }
    *os << ") ";
  }

  const MonomorphicInnerMatcher inner_matcher_;
278
279

  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
};

template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,
    int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,
    int k8 = -1, int k9 = -1>
class ArgsMatcher {
 public:
  explicit ArgsMatcher(const InnerMatcher& inner_matcher)
      : inner_matcher_(inner_matcher) {}

  template <typename ArgsTuple>
  operator Matcher<ArgsTuple>() const {
    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,
        k6, k7, k8, k9>(inner_matcher_));
  }

296
 private:
297
  const InnerMatcher inner_matcher_;
298
299

  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);
300
301
};

302
303
}  // namespace internal

304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
// fields of it matches a_matcher.  C++ doesn't support default
// arguments for function templates, so we have to overload it.
template <typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher>(matcher);
}

template <int k1, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1>(matcher);
}

template <int k1, int k2, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);
}

template <int k1, int k2, int k3, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);
}

template <int k1, int k2, int k3, int k4, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);
}

template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);
}

template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);
}

template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
    typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,
      k7>(matcher);
}

template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
    typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,
      k8>(matcher);
}

template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
    int k9, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
      k9>(matcher);
}

template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
    int k9, int k10, typename InnerMatcher>
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,
    k10>
Args(const InnerMatcher& matcher) {
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
      k9, k10>(matcher);
}

382

Abseil Team's avatar
Abseil Team committed
383

384
385
}  // namespace testing

386

zhanyong.wan's avatar
zhanyong.wan committed
387
// The MATCHER* family of macros can be used in a namespace scope to
zhanyong.wan's avatar
zhanyong.wan committed
388
389
390
391
392
393
// define custom matchers easily.
//
// Basic Usage
// ===========
//
// The syntax
zhanyong.wan's avatar
zhanyong.wan committed
394
395
396
//
//   MATCHER(name, description_string) { statements; }
//
zhanyong.wan's avatar
zhanyong.wan committed
397
398
399
400
// defines a matcher with the given name that executes the statements,
// which must return a bool to indicate if the match succeeds.  Inside
// the statements, you can refer to the value being matched by 'arg',
// and refer to its type by 'arg_type'.
401
402
403
404
405
406
407
408
409
410
//
// The description string documents what the matcher does, and is used
// to generate the failure message when the match fails.  Since a
// MATCHER() is usually defined in a header file shared by multiple
// C++ source files, we require the description to be a C-string
// literal to avoid possible side effects.  It can be empty, in which
// case we'll use the sequence of words in the matcher name as the
// description.
//
// For example:
zhanyong.wan's avatar
zhanyong.wan committed
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
//
//   MATCHER(IsEven, "") { return (arg % 2) == 0; }
//
// allows you to write
//
//   // Expects mock_foo.Bar(n) to be called where n is even.
//   EXPECT_CALL(mock_foo, Bar(IsEven()));
//
// or,
//
//   // Verifies that the value of some_expression is even.
//   EXPECT_THAT(some_expression, IsEven());
//
// If the above assertion fails, it will print something like:
//
//   Value of: some_expression
//   Expected: is even
//     Actual: 7
//
// where the description "is even" is automatically calculated from the
// matcher name IsEven.
//
zhanyong.wan's avatar
zhanyong.wan committed
433
434
435
// Argument Type
// =============
//
zhanyong.wan's avatar
zhanyong.wan committed
436
437
438
439
440
441
442
443
444
445
// Note that the type of the value being matched (arg_type) is
// determined by the context in which you use the matcher and is
// supplied to you by the compiler, so you don't need to worry about
// declaring it (nor can you).  This allows the matcher to be
// polymorphic.  For example, IsEven() can be used to match any type
// where the value of "(arg % 2) == 0" can be implicitly converted to
// a bool.  In the "Bar(IsEven())" example above, if method Bar()
// takes an int, 'arg_type' will be int; if it takes an unsigned long,
// 'arg_type' will be unsigned long; and so on.
//
zhanyong.wan's avatar
zhanyong.wan committed
446
447
448
// Parameterizing Matchers
// =======================
//
zhanyong.wan's avatar
zhanyong.wan committed
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
// Sometimes you'll want to parameterize the matcher.  For that you
// can use another macro:
//
//   MATCHER_P(name, param_name, description_string) { statements; }
//
// For example:
//
//   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
//
// will allow you to write:
//
//   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
//
// which may lead to this message (assuming n is 10):
//
//   Value of: Blah("a")
//   Expected: has absolute value 10
//     Actual: -9
//
// Note that both the matcher description and its parameter are
// printed, making the message human-friendly.
//
// In the matcher definition body, you can write 'foo_type' to
// reference the type of a parameter named 'foo'.  For example, in the
// body of MATCHER_P(HasAbsoluteValue, value) above, you can write
// 'value_type' to refer to the type of 'value'.
//
// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to
// support multi-parameter matchers.
//
zhanyong.wan's avatar
zhanyong.wan committed
479
480
481
// Describing Parameterized Matchers
// =================================
//
482
483
484
485
486
487
488
489
490
491
// The last argument to MATCHER*() is a string-typed expression.  The
// expression can reference all of the matcher's parameters and a
// special bool-typed variable named 'negation'.  When 'negation' is
// false, the expression should evaluate to the matcher's description;
// otherwise it should evaluate to the description of the negation of
// the matcher.  For example,
//
//   using testing::PrintToString;
//
//   MATCHER_P2(InClosedRange, low, hi,
492
//       std::string(negation ? "is not" : "is") + " in range [" +
493
//       PrintToString(low) + ", " + PrintToString(hi) + "]") {
494
495
496
497
//     return low <= arg && arg <= hi;
//   }
//   ...
//   EXPECT_THAT(3, InClosedRange(4, 6));
498
//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
499
//
500
// would generate two failures that contain the text:
501
502
//
//   Expected: is in range [4, 6]
503
504
//   ...
//   Expected: is not in range [2, 4]
505
506
507
508
509
510
511
512
//
// If you specify "" as the description, the failure message will
// contain the sequence of words in the matcher name followed by the
// parameter values printed as a tuple.  For example,
//
//   MATCHER_P2(InClosedRange, low, hi, "") { ... }
//   ...
//   EXPECT_THAT(3, InClosedRange(4, 6));
513
//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
514
//
515
// would generate two failures that contain the text:
516
517
//
//   Expected: in closed range (4, 6)
518
519
//   ...
//   Expected: not (in closed range (2, 4))
520
//
zhanyong.wan's avatar
zhanyong.wan committed
521
522
523
// Types of Matcher Parameters
// ===========================
//
zhanyong.wan's avatar
zhanyong.wan committed
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
// For the purpose of typing, you can view
//
//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
//
// as shorthand for
//
//   template <typename p1_type, ..., typename pk_type>
//   FooMatcherPk<p1_type, ..., pk_type>
//   Foo(p1_type p1, ..., pk_type pk) { ... }
//
// When you write Foo(v1, ..., vk), the compiler infers the types of
// the parameters v1, ..., and vk for you.  If you are not happy with
// the result of the type inference, you can specify the types by
// explicitly instantiating the template, as in Foo<long, bool>(5,
// false).  As said earlier, you don't get to (or need to) specify
// 'arg_type' as that's determined by the context in which the matcher
// is used.  You can assign the result of expression Foo(p1, ..., pk)
// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
// can be useful when composing matchers.
//
// While you can instantiate a matcher template with reference types,
// passing the parameters by pointer usually makes your code more
// readable.  If, however, you still want to pass a parameter by
// reference, be aware that in the failure message generated by the
// matcher you will see the value of the referenced object but not its
// address.
//
zhanyong.wan's avatar
zhanyong.wan committed
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
// Explaining Match Results
// ========================
//
// Sometimes the matcher description alone isn't enough to explain why
// the match has failed or succeeded.  For example, when expecting a
// long string, it can be very helpful to also print the diff between
// the expected string and the actual one.  To achieve that, you can
// optionally stream additional information to a special variable
// named result_listener, whose type is a pointer to class
// MatchResultListener:
//
//   MATCHER_P(EqualsLongString, str, "") {
//     if (arg == str) return true;
//
//     *result_listener << "the difference: "
///                     << DiffStrings(str, arg);
//     return false;
//   }
//
// Overloading Matchers
// ====================
//
zhanyong.wan's avatar
zhanyong.wan committed
573
574
575
576
577
// You can overload matchers with different numbers of parameters:
//
//   MATCHER_P(Blah, a, description_string1) { ... }
//   MATCHER_P2(Blah, a, b, description_string2) { ... }
//
zhanyong.wan's avatar
zhanyong.wan committed
578
579
// Caveats
// =======
zhanyong.wan's avatar
zhanyong.wan committed
580
//
zhanyong.wan's avatar
zhanyong.wan committed
581
582
583
584
585
586
587
588
// When defining a new matcher, you should also consider implementing
// MatcherInterface or using MakePolymorphicMatcher().  These
// approaches require more work than the MATCHER* macros, but also
// give you more control on the types of the value being matched and
// the matcher parameters, which may leads to better compiler error
// messages when the matcher is used wrong.  They also allow
// overloading matchers based on parameter types (as opposed to just
// based on the number of parameters).
zhanyong.wan's avatar
zhanyong.wan committed
589
590
591
592
593
594
595
//
// MATCHER*() can only be used in a namespace scope.  The reason is
// that C++ doesn't yet allow function-local types to be used to
// instantiate templates.  The up-coming C++0x standard will fix this.
// Once that's done, we'll consider supporting using MATCHER*() inside
// a function.
//
zhanyong.wan's avatar
zhanyong.wan committed
596
597
// More Information
// ================
zhanyong.wan's avatar
zhanyong.wan committed
598
599
//
// To learn more about using these macros, please search for 'MATCHER'
Abseil Team's avatar
Abseil Team committed
600
601
// on
// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md
zhanyong.wan's avatar
zhanyong.wan committed
602
603
604
605
606

#define MATCHER(name, description)\
  class name##Matcher {\
   public:\
    template <typename arg_type>\
607
608
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
609
     public:\
610
611
      gmock_Impl()\
           {}\
zhanyong.wan's avatar
zhanyong.wan committed
612
      virtual bool MatchAndExplain(\
613
614
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
615
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
616
617
618
619
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
620
      }\
621
     private:\
622
623
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
624
        if (!gmock_description.empty()) {\
625
          return gmock_description;\
626
        }\
627
        return ::testing::internal::FormatMatcherDescription(\
628
            negation, #name, \
629
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
630
                ::std::tuple<>()));\
631
      }\
zhanyong.wan's avatar
zhanyong.wan committed
632
633
634
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
635
      return ::testing::Matcher<arg_type>(\
636
          new gmock_Impl<arg_type>());\
zhanyong.wan's avatar
zhanyong.wan committed
637
638
639
    }\
    name##Matcher() {\
    }\
640
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
641
642
643
644
645
  };\
  inline name##Matcher name() {\
    return name##Matcher();\
  }\
  template <typename arg_type>\
zhanyong.wan's avatar
zhanyong.wan committed
646
  bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
647
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
648
649
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
650
651
652
653
654
655

#define MATCHER_P(name, p0, description)\
  template <typename p0##_type>\
  class name##MatcherP {\
   public:\
    template <typename arg_type>\
656
657
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
658
     public:\
659
      explicit gmock_Impl(p0##_type gmock_p0)\
660
           : p0(::testing::internal::move(gmock_p0)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
661
      virtual bool MatchAndExplain(\
662
663
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
664
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
665
666
667
668
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
669
      }\
670
      p0##_type const p0;\
671
     private:\
672
673
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
674
        if (!gmock_description.empty()) {\
675
          return gmock_description;\
676
        }\
677
        return ::testing::internal::FormatMatcherDescription(\
678
            negation, #name, \
679
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
680
                ::std::tuple<p0##_type>(p0)));\
681
      }\
zhanyong.wan's avatar
zhanyong.wan committed
682
683
684
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
685
      return ::testing::Matcher<arg_type>(\
686
          new gmock_Impl<arg_type>(p0));\
zhanyong.wan's avatar
zhanyong.wan committed
687
    }\
688
689
    explicit name##MatcherP(p0##_type gmock_p0) : \
        p0(::testing::internal::move(gmock_p0)) {\
zhanyong.wan's avatar
zhanyong.wan committed
690
    }\
691
    p0##_type const p0;\
692
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
693
694
695
696
697
698
699
  };\
  template <typename p0##_type>\
  inline name##MatcherP<p0##_type> name(p0##_type p0) {\
    return name##MatcherP<p0##_type>(p0);\
  }\
  template <typename p0##_type>\
  template <typename arg_type>\
zhanyong.wan's avatar
zhanyong.wan committed
700
  bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
701
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
702
703
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
704
705
706
707
708
709

#define MATCHER_P2(name, p0, p1, description)\
  template <typename p0##_type, typename p1##_type>\
  class name##MatcherP2 {\
   public:\
    template <typename arg_type>\
710
711
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
712
     public:\
713
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
714
715
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
716
      virtual bool MatchAndExplain(\
717
718
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
719
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
720
721
722
723
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
724
      }\
725
726
      p0##_type const p0;\
      p1##_type const p1;\
727
     private:\
728
729
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
730
        if (!gmock_description.empty()) {\
731
          return gmock_description;\
732
        }\
733
        return ::testing::internal::FormatMatcherDescription(\
734
            negation, #name, \
735
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
736
                ::std::tuple<p0##_type, p1##_type>(p0, p1)));\
737
      }\
zhanyong.wan's avatar
zhanyong.wan committed
738
739
740
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
741
      return ::testing::Matcher<arg_type>(\
742
          new gmock_Impl<arg_type>(p0, p1));\
zhanyong.wan's avatar
zhanyong.wan committed
743
    }\
744
745
746
    name##MatcherP2(p0##_type gmock_p0, \
        p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)) {\
zhanyong.wan's avatar
zhanyong.wan committed
747
    }\
748
749
    p0##_type const p0;\
    p1##_type const p1;\
750
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
751
752
753
754
755
756
757
758
  };\
  template <typename p0##_type, typename p1##_type>\
  inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \
      p1##_type p1) {\
    return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\
  }\
  template <typename p0##_type, typename p1##_type>\
  template <typename arg_type>\
zhanyong.wan's avatar
zhanyong.wan committed
759
760
  bool name##MatcherP2<p0##_type, \
      p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
761
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
762
763
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
764
765
766
767
768
769

#define MATCHER_P3(name, p0, p1, p2, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type>\
  class name##MatcherP3 {\
   public:\
    template <typename arg_type>\
770
771
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
772
     public:\
773
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
774
775
776
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
777
      virtual bool MatchAndExplain(\
778
779
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
780
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
781
782
783
784
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
785
      }\
786
787
788
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
789
     private:\
790
791
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
792
        if (!gmock_description.empty()) {\
793
          return gmock_description;\
794
        }\
795
        return ::testing::internal::FormatMatcherDescription(\
796
            negation, #name, \
797
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
798
                ::std::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, p2)));\
799
      }\
zhanyong.wan's avatar
zhanyong.wan committed
800
801
802
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
803
      return ::testing::Matcher<arg_type>(\
804
          new gmock_Impl<arg_type>(p0, p1, p2));\
zhanyong.wan's avatar
zhanyong.wan committed
805
806
    }\
    name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \
807
808
809
        p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)) {\
zhanyong.wan's avatar
zhanyong.wan committed
810
    }\
811
812
813
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
814
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
815
816
817
818
819
820
821
822
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type>\
  inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
      p1##_type p1, p2##_type p2) {\
    return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type>\
  template <typename arg_type>\
zhanyong.wan's avatar
zhanyong.wan committed
823
824
  bool name##MatcherP3<p0##_type, p1##_type, \
      p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
825
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
826
827
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
828
829
830
831
832
833
834

#define MATCHER_P4(name, p0, p1, p2, p3, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type>\
  class name##MatcherP4 {\
   public:\
    template <typename arg_type>\
835
836
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
837
838
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
839
          p3##_type gmock_p3)\
840
841
842
843
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
844
      virtual bool MatchAndExplain(\
845
846
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
847
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
848
849
850
851
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
852
      }\
853
854
855
856
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
857
     private:\
858
859
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
860
        if (!gmock_description.empty()) {\
861
          return gmock_description;\
862
        }\
863
        return ::testing::internal::FormatMatcherDescription(\
864
            negation, #name, \
865
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
866
867
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
                    p1, p2, p3)));\
868
      }\
zhanyong.wan's avatar
zhanyong.wan committed
869
870
871
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
872
      return ::testing::Matcher<arg_type>(\
873
          new gmock_Impl<arg_type>(p0, p1, p2, p3));\
zhanyong.wan's avatar
zhanyong.wan committed
874
875
    }\
    name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \
876
877
878
879
880
        p2##_type gmock_p2, \
        p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)) {\
zhanyong.wan's avatar
zhanyong.wan committed
881
    }\
882
883
884
885
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
886
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
887
888
889
890
891
892
893
894
895
896
897
898
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type>\
  inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \
      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
      p3##_type p3) {\
    return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
        p1, p2, p3);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type>\
  template <typename arg_type>\
zhanyong.wan's avatar
zhanyong.wan committed
899
900
  bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
      p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
901
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
902
903
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
904
905
906
907
908
909
910

#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type>\
  class name##MatcherP5 {\
   public:\
    template <typename arg_type>\
911
912
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
913
914
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
915
          p3##_type gmock_p3, p4##_type gmock_p4)\
916
917
918
919
920
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)), \
               p4(::testing::internal::move(gmock_p4)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
921
      virtual bool MatchAndExplain(\
922
923
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
924
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
925
926
927
928
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
929
      }\
930
931
932
933
934
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
      p4##_type const p4;\
935
     private:\
936
937
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
938
        if (!gmock_description.empty()) {\
939
          return gmock_description;\
940
        }\
941
        return ::testing::internal::FormatMatcherDescription(\
942
            negation, #name, \
943
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
944
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
945
946
                    p4##_type>(p0, p1, p2, p3, p4)));\
      }\
zhanyong.wan's avatar
zhanyong.wan committed
947
948
949
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
950
      return ::testing::Matcher<arg_type>(\
951
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\
zhanyong.wan's avatar
zhanyong.wan committed
952
953
954
    }\
    name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \
        p2##_type gmock_p2, p3##_type gmock_p3, \
955
956
957
958
959
        p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)), \
        p4(::testing::internal::move(gmock_p4)) {\
zhanyong.wan's avatar
zhanyong.wan committed
960
    }\
961
962
963
964
965
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
    p4##_type const p4;\
966
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
967
968
969
970
971
972
973
974
975
976
977
978
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type>\
  inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
      p4##_type p4) {\
    return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
        p4##_type>(p0, p1, p2, p3, p4);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type>\
  template <typename arg_type>\
zhanyong.wan's avatar
zhanyong.wan committed
979
980
  bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
981
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
982
983
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
984
985
986
987
988
989
990

#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type>\
  class name##MatcherP6 {\
   public:\
    template <typename arg_type>\
991
992
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
993
994
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
995
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\
996
997
998
999
1000
1001
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)), \
               p4(::testing::internal::move(gmock_p4)), \
               p5(::testing::internal::move(gmock_p5)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
1002
      virtual bool MatchAndExplain(\
1003
1004
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
1005
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1006
1007
1008
1009
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
1010
      }\
1011
1012
1013
1014
1015
1016
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
      p4##_type const p4;\
      p5##_type const p5;\
1017
     private:\
1018
1019
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
1020
        if (!gmock_description.empty()) {\
1021
          return gmock_description;\
1022
        }\
1023
        return ::testing::internal::FormatMatcherDescription(\
1024
            negation, #name, \
1025
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
1026
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1027
1028
                    p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
      }\
zhanyong.wan's avatar
zhanyong.wan committed
1029
1030
1031
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
1032
      return ::testing::Matcher<arg_type>(\
1033
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\
zhanyong.wan's avatar
zhanyong.wan committed
1034
1035
1036
    }\
    name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1037
1038
1039
1040
1041
1042
        p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)), \
        p4(::testing::internal::move(gmock_p4)), \
        p5(::testing::internal::move(gmock_p5)) {\
zhanyong.wan's avatar
zhanyong.wan committed
1043
    }\
1044
1045
1046
1047
1048
1049
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
    p4##_type const p4;\
    p5##_type const p5;\
1050
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type>\
  inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
      p3##_type p3, p4##_type p4, p5##_type p5) {\
    return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type>\
  template <typename arg_type>\
  bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan's avatar
zhanyong.wan committed
1064
      p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1065
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
1066
1067
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
1068
1069
1070
1071
1072
1073
1074
1075

#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type>\
  class name##MatcherP7 {\
   public:\
    template <typename arg_type>\
1076
1077
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
1078
1079
1080
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1081
          p6##_type gmock_p6)\
1082
1083
1084
1085
1086
1087
1088
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)), \
               p4(::testing::internal::move(gmock_p4)), \
               p5(::testing::internal::move(gmock_p5)), \
               p6(::testing::internal::move(gmock_p6)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
1089
      virtual bool MatchAndExplain(\
1090
1091
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
1092
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1093
1094
1095
1096
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
1097
      }\
1098
1099
1100
1101
1102
1103
1104
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
      p4##_type const p4;\
      p5##_type const p5;\
      p6##_type const p6;\
1105
     private:\
1106
1107
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
1108
        if (!gmock_description.empty()) {\
1109
          return gmock_description;\
1110
        }\
1111
        return ::testing::internal::FormatMatcherDescription(\
1112
            negation, #name, \
1113
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
1114
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1115
1116
1117
                    p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
                    p6)));\
      }\
zhanyong.wan's avatar
zhanyong.wan committed
1118
1119
1120
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
1121
      return ::testing::Matcher<arg_type>(\
1122
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\
zhanyong.wan's avatar
zhanyong.wan committed
1123
1124
1125
    }\
    name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1126
1127
1128
1129
1130
1131
1132
1133
        p5##_type gmock_p5, \
        p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)), \
        p4(::testing::internal::move(gmock_p4)), \
        p5(::testing::internal::move(gmock_p5)), \
        p6(::testing::internal::move(gmock_p6)) {\
zhanyong.wan's avatar
zhanyong.wan committed
1134
    }\
1135
1136
1137
1138
1139
1140
1141
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
    p4##_type const p4;\
    p5##_type const p5;\
    p6##_type const p6;\
1142
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type>\
  inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
      p6##_type p6) {\
    return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type>\
  template <typename arg_type>\
  bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan's avatar
zhanyong.wan committed
1159
      p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1160
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
1161
1162
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
1163
1164
1165
1166
1167
1168
1169
1170

#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type>\
  class name##MatcherP8 {\
   public:\
    template <typename arg_type>\
1171
1172
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
1173
1174
1175
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1176
          p6##_type gmock_p6, p7##_type gmock_p7)\
1177
1178
1179
1180
1181
1182
1183
1184
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)), \
               p4(::testing::internal::move(gmock_p4)), \
               p5(::testing::internal::move(gmock_p5)), \
               p6(::testing::internal::move(gmock_p6)), \
               p7(::testing::internal::move(gmock_p7)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
1185
      virtual bool MatchAndExplain(\
1186
1187
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
1188
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1189
1190
1191
1192
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
1193
      }\
1194
1195
1196
1197
1198
1199
1200
1201
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
      p4##_type const p4;\
      p5##_type const p5;\
      p6##_type const p6;\
      p7##_type const p7;\
1202
     private:\
1203
1204
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
1205
        if (!gmock_description.empty()) {\
1206
          return gmock_description;\
1207
        }\
1208
        return ::testing::internal::FormatMatcherDescription(\
1209
            negation, #name, \
1210
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
1211
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1212
1213
1214
                    p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
                    p3, p4, p5, p6, p7)));\
      }\
zhanyong.wan's avatar
zhanyong.wan committed
1215
1216
1217
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
1218
      return ::testing::Matcher<arg_type>(\
1219
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\
zhanyong.wan's avatar
zhanyong.wan committed
1220
1221
1222
1223
    }\
    name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
        p5##_type gmock_p5, p6##_type gmock_p6, \
1224
1225
1226
1227
1228
1229
1230
1231
        p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)), \
        p4(::testing::internal::move(gmock_p4)), \
        p5(::testing::internal::move(gmock_p5)), \
        p6(::testing::internal::move(gmock_p6)), \
        p7(::testing::internal::move(gmock_p7)) {\
zhanyong.wan's avatar
zhanyong.wan committed
1232
    }\
1233
1234
1235
1236
1237
1238
1239
1240
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
    p4##_type const p4;\
    p5##_type const p5;\
    p6##_type const p6;\
    p7##_type const p7;\
1241
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type>\
  inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
      p6##_type p6, p7##_type p7) {\
    return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
        p6, p7);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type>\
  template <typename arg_type>\
  bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan's avatar
zhanyong.wan committed
1259
1260
      p5##_type, p6##_type, \
      p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1261
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
1262
1263
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
1264
1265
1266
1267
1268
1269
1270
1271

#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type, typename p8##_type>\
  class name##MatcherP9 {\
   public:\
    template <typename arg_type>\
1272
1273
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
1274
1275
1276
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1277
          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\
1278
1279
1280
1281
1282
1283
1284
1285
1286
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)), \
               p4(::testing::internal::move(gmock_p4)), \
               p5(::testing::internal::move(gmock_p5)), \
               p6(::testing::internal::move(gmock_p6)), \
               p7(::testing::internal::move(gmock_p7)), \
               p8(::testing::internal::move(gmock_p8)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
1287
      virtual bool MatchAndExplain(\
1288
1289
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
1290
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1291
1292
1293
1294
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
1295
      }\
1296
1297
1298
1299
1300
1301
1302
1303
1304
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
      p4##_type const p4;\
      p5##_type const p5;\
      p6##_type const p6;\
      p7##_type const p7;\
      p8##_type const p8;\
1305
     private:\
1306
1307
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
1308
        if (!gmock_description.empty()) {\
1309
          return gmock_description;\
1310
        }\
1311
        return ::testing::internal::FormatMatcherDescription(\
1312
            negation, #name, \
1313
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
1314
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1315
1316
1317
                    p4##_type, p5##_type, p6##_type, p7##_type, \
                    p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\
      }\
zhanyong.wan's avatar
zhanyong.wan committed
1318
1319
1320
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
1321
      return ::testing::Matcher<arg_type>(\
1322
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\
zhanyong.wan's avatar
zhanyong.wan committed
1323
1324
1325
1326
    }\
    name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
1327
1328
1329
1330
1331
1332
1333
1334
1335
        p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)), \
        p4(::testing::internal::move(gmock_p4)), \
        p5(::testing::internal::move(gmock_p5)), \
        p6(::testing::internal::move(gmock_p6)), \
        p7(::testing::internal::move(gmock_p7)), \
        p8(::testing::internal::move(gmock_p8)) {\
zhanyong.wan's avatar
zhanyong.wan committed
1336
    }\
1337
1338
1339
1340
1341
1342
1343
1344
1345
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
    p4##_type const p4;\
    p5##_type const p5;\
    p6##_type const p6;\
    p7##_type const p7;\
    p8##_type const p8;\
1346
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type, typename p8##_type>\
  inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type, p5##_type, p6##_type, p7##_type, \
      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
      p8##_type p8) {\
    return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
        p3, p4, p5, p6, p7, p8);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type, typename p8##_type>\
  template <typename arg_type>\
  bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan's avatar
zhanyong.wan committed
1365
1366
      p5##_type, p6##_type, p7##_type, \
      p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1367
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
1368
1369
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
1370
1371
1372
1373
1374
1375
1376
1377
1378

#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type, typename p8##_type, \
      typename p9##_type>\
  class name##MatcherP10 {\
   public:\
    template <typename arg_type>\
1379
1380
    class gmock_Impl : public ::testing::MatcherInterface<\
        GTEST_REFERENCE_TO_CONST_(arg_type)> {\
zhanyong.wan's avatar
zhanyong.wan committed
1381
1382
1383
1384
     public:\
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
1385
          p9##_type gmock_p9)\
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
           : p0(::testing::internal::move(gmock_p0)), \
               p1(::testing::internal::move(gmock_p1)), \
               p2(::testing::internal::move(gmock_p2)), \
               p3(::testing::internal::move(gmock_p3)), \
               p4(::testing::internal::move(gmock_p4)), \
               p5(::testing::internal::move(gmock_p5)), \
               p6(::testing::internal::move(gmock_p6)), \
               p7(::testing::internal::move(gmock_p7)), \
               p8(::testing::internal::move(gmock_p8)), \
               p9(::testing::internal::move(gmock_p9)) {}\
zhanyong.wan's avatar
zhanyong.wan committed
1396
      virtual bool MatchAndExplain(\
1397
1398
          GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
          ::testing::MatchResultListener* result_listener) const;\
1399
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1400
1401
1402
1403
        *gmock_os << FormatDescription(false);\
      }\
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
        *gmock_os << FormatDescription(true);\
zhanyong.wan's avatar
zhanyong.wan committed
1404
      }\
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
      p0##_type const p0;\
      p1##_type const p1;\
      p2##_type const p2;\
      p3##_type const p3;\
      p4##_type const p4;\
      p5##_type const p5;\
      p6##_type const p6;\
      p7##_type const p7;\
      p8##_type const p8;\
      p9##_type const p9;\
1415
     private:\
1416
1417
      ::std::string FormatDescription(bool negation) const {\
        ::std::string gmock_description = (description);\
1418
        if (!gmock_description.empty()) {\
1419
          return gmock_description;\
1420
        }\
1421
        return ::testing::internal::FormatMatcherDescription(\
1422
            negation, #name, \
1423
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
Abseil Team's avatar
Abseil Team committed
1424
                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1425
1426
1427
                    p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
                    p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\
      }\
zhanyong.wan's avatar
zhanyong.wan committed
1428
1429
1430
    };\
    template <typename arg_type>\
    operator ::testing::Matcher<arg_type>() const {\
1431
      return ::testing::Matcher<arg_type>(\
1432
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\
zhanyong.wan's avatar
zhanyong.wan committed
1433
1434
1435
1436
    }\
    name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
        p8##_type gmock_p8, \
        p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \
        p1(::testing::internal::move(gmock_p1)), \
        p2(::testing::internal::move(gmock_p2)), \
        p3(::testing::internal::move(gmock_p3)), \
        p4(::testing::internal::move(gmock_p4)), \
        p5(::testing::internal::move(gmock_p5)), \
        p6(::testing::internal::move(gmock_p6)), \
        p7(::testing::internal::move(gmock_p7)), \
        p8(::testing::internal::move(gmock_p8)), \
        p9(::testing::internal::move(gmock_p9)) {\
zhanyong.wan's avatar
zhanyong.wan committed
1448
    }\
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
    p0##_type const p0;\
    p1##_type const p1;\
    p2##_type const p2;\
    p3##_type const p3;\
    p4##_type const p4;\
    p5##_type const p5;\
    p6##_type const p6;\
    p7##_type const p7;\
    p8##_type const p8;\
    p9##_type const p9;\
1459
   private:\
zhanyong.wan's avatar
zhanyong.wan committed
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
  };\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type, typename p8##_type, \
      typename p9##_type>\
  inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
      p9##_type p9) {\
    return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
        p1, p2, p3, p4, p5, p6, p7, p8, p9);\
  }\
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
      typename p3##_type, typename p4##_type, typename p5##_type, \
      typename p6##_type, typename p7##_type, typename p8##_type, \
      typename p9##_type>\
  template <typename arg_type>\
  bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
zhanyong.wan's avatar
zhanyong.wan committed
1480
1481
      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
      p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1482
      GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
zhanyong.wan's avatar
zhanyong.wan committed
1483
1484
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
          const
zhanyong.wan's avatar
zhanyong.wan committed
1485

1486
#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_