uia 0.0.5 → 0.0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/ChangeLog +5 -1
  2. data/lib/uia/version.rb +1 -1
  3. data/uia.gemspec +3 -1
  4. metadata +1 -48
  5. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-actions.h +0 -1078
  6. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-cardinalities.h +0 -147
  7. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h +0 -2415
  8. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h.pump +0 -821
  9. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h +0 -991
  10. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h.pump +0 -265
  11. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h +0 -2190
  12. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h.pump +0 -674
  13. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h +0 -397
  14. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h.pump +0 -161
  15. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-matchers.h +0 -3986
  16. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-actions.h +0 -233
  17. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-matchers.h +0 -58
  18. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-spec-builders.h +0 -1791
  19. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock.h +0 -94
  20. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h +0 -279
  21. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h.pump +0 -136
  22. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-internal-utils.h +0 -498
  23. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-port.h +0 -78
  24. data/ext/UiaDll/UiaDll.Test/gmock/lib/gmock.lib +0 -0
  25. data/ext/UiaDll/UiaDll.Test/gmock/lib/gmockd.lib +0 -0
  26. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-death-test.h +0 -294
  27. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-message.h +0 -250
  28. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h +0 -1421
  29. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h.pump +0 -487
  30. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-printers.h +0 -855
  31. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-spi.h +0 -232
  32. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-test-part.h +0 -179
  33. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-typed-test.h +0 -259
  34. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest.h +0 -2291
  35. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_pred_impl.h +0 -358
  36. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_prod.h +0 -58
  37. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-death-test-internal.h +0 -319
  38. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-filepath.h +0 -206
  39. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-internal.h +0 -1158
  40. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-linked_ptr.h +0 -233
  41. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h +0 -5143
  42. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump +0 -301
  43. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util.h +0 -619
  44. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-port.h +0 -1947
  45. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-string.h +0 -167
  46. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h +0 -1012
  47. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h.pump +0 -339
  48. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h +0 -3331
  49. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h.pump +0 -297
  50. data/ext/UiaDll/UiaDll.Test/gtest/lib/gtest.lib +0 -0
  51. data/ext/UiaDll/UiaDll.Test/gtest/lib/gtestd.lib +0 -0
@@ -1,3986 +0,0 @@
1
- // Copyright 2007, Google Inc.
2
- // All rights reserved.
3
- //
4
- // Redistribution and use in source and binary forms, with or without
5
- // modification, are permitted provided that the following conditions are
6
- // met:
7
- //
8
- // * Redistributions of source code must retain the above copyright
9
- // notice, this list of conditions and the following disclaimer.
10
- // * Redistributions in binary form must reproduce the above
11
- // copyright notice, this list of conditions and the following disclaimer
12
- // in the documentation and/or other materials provided with the
13
- // distribution.
14
- // * Neither the name of Google Inc. nor the names of its
15
- // contributors may be used to endorse or promote products derived from
16
- // this software without specific prior written permission.
17
- //
18
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- //
30
- // Author: wan@google.com (Zhanyong Wan)
31
-
32
- // Google Mock - a framework for writing C++ mock classes.
33
- //
34
- // This file implements some commonly used argument matchers. More
35
- // matchers can be defined by the user implementing the
36
- // MatcherInterface<T> interface if necessary.
37
-
38
- #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
39
- #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
40
-
41
- #include <math.h>
42
- #include <algorithm>
43
- #include <iterator>
44
- #include <limits>
45
- #include <ostream> // NOLINT
46
- #include <sstream>
47
- #include <string>
48
- #include <utility>
49
- #include <vector>
50
-
51
- #include "gmock/internal/gmock-internal-utils.h"
52
- #include "gmock/internal/gmock-port.h"
53
- #include "gtest/gtest.h"
54
-
55
- #if GTEST_LANG_CXX11
56
- #include <initializer_list> // NOLINT -- must be after gtest.h
57
- #endif
58
-
59
- namespace testing {
60
-
61
- // To implement a matcher Foo for type T, define:
62
- // 1. a class FooMatcherImpl that implements the
63
- // MatcherInterface<T> interface, and
64
- // 2. a factory function that creates a Matcher<T> object from a
65
- // FooMatcherImpl*.
66
- //
67
- // The two-level delegation design makes it possible to allow a user
68
- // to write "v" instead of "Eq(v)" where a Matcher is expected, which
69
- // is impossible if we pass matchers by pointers. It also eases
70
- // ownership management as Matcher objects can now be copied like
71
- // plain values.
72
-
73
- // MatchResultListener is an abstract class. Its << operator can be
74
- // used by a matcher to explain why a value matches or doesn't match.
75
- //
76
- // TODO(wan@google.com): add method
77
- // bool InterestedInWhy(bool result) const;
78
- // to indicate whether the listener is interested in why the match
79
- // result is 'result'.
80
- class MatchResultListener {
81
- public:
82
- // Creates a listener object with the given underlying ostream. The
83
- // listener does not own the ostream, and does not dereference it
84
- // in the constructor or destructor.
85
- explicit MatchResultListener(::std::ostream* os) : stream_(os) {}
86
- virtual ~MatchResultListener() = 0; // Makes this class abstract.
87
-
88
- // Streams x to the underlying ostream; does nothing if the ostream
89
- // is NULL.
90
- template <typename T>
91
- MatchResultListener& operator<<(const T& x) {
92
- if (stream_ != NULL)
93
- *stream_ << x;
94
- return *this;
95
- }
96
-
97
- // Returns the underlying ostream.
98
- ::std::ostream* stream() { return stream_; }
99
-
100
- // Returns true iff the listener is interested in an explanation of
101
- // the match result. A matcher's MatchAndExplain() method can use
102
- // this information to avoid generating the explanation when no one
103
- // intends to hear it.
104
- bool IsInterested() const { return stream_ != NULL; }
105
-
106
- private:
107
- ::std::ostream* const stream_;
108
-
109
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);
110
- };
111
-
112
- inline MatchResultListener::~MatchResultListener() {
113
- }
114
-
115
- // An instance of a subclass of this knows how to describe itself as a
116
- // matcher.
117
- class MatcherDescriberInterface {
118
- public:
119
- virtual ~MatcherDescriberInterface() {}
120
-
121
- // Describes this matcher to an ostream. The function should print
122
- // a verb phrase that describes the property a value matching this
123
- // matcher should have. The subject of the verb phrase is the value
124
- // being matched. For example, the DescribeTo() method of the Gt(7)
125
- // matcher prints "is greater than 7".
126
- virtual void DescribeTo(::std::ostream* os) const = 0;
127
-
128
- // Describes the negation of this matcher to an ostream. For
129
- // example, if the description of this matcher is "is greater than
130
- // 7", the negated description could be "is not greater than 7".
131
- // You are not required to override this when implementing
132
- // MatcherInterface, but it is highly advised so that your matcher
133
- // can produce good error messages.
134
- virtual void DescribeNegationTo(::std::ostream* os) const {
135
- *os << "not (";
136
- DescribeTo(os);
137
- *os << ")";
138
- }
139
- };
140
-
141
- // The implementation of a matcher.
142
- template <typename T>
143
- class MatcherInterface : public MatcherDescriberInterface {
144
- public:
145
- // Returns true iff the matcher matches x; also explains the match
146
- // result to 'listener' if necessary (see the next paragraph), in
147
- // the form of a non-restrictive relative clause ("which ...",
148
- // "whose ...", etc) that describes x. For example, the
149
- // MatchAndExplain() method of the Pointee(...) matcher should
150
- // generate an explanation like "which points to ...".
151
- //
152
- // Implementations of MatchAndExplain() should add an explanation of
153
- // the match result *if and only if* they can provide additional
154
- // information that's not already present (or not obvious) in the
155
- // print-out of x and the matcher's description. Whether the match
156
- // succeeds is not a factor in deciding whether an explanation is
157
- // needed, as sometimes the caller needs to print a failure message
158
- // when the match succeeds (e.g. when the matcher is used inside
159
- // Not()).
160
- //
161
- // For example, a "has at least 10 elements" matcher should explain
162
- // what the actual element count is, regardless of the match result,
163
- // as it is useful information to the reader; on the other hand, an
164
- // "is empty" matcher probably only needs to explain what the actual
165
- // size is when the match fails, as it's redundant to say that the
166
- // size is 0 when the value is already known to be empty.
167
- //
168
- // You should override this method when defining a new matcher.
169
- //
170
- // It's the responsibility of the caller (Google Mock) to guarantee
171
- // that 'listener' is not NULL. This helps to simplify a matcher's
172
- // implementation when it doesn't care about the performance, as it
173
- // can talk to 'listener' without checking its validity first.
174
- // However, in order to implement dummy listeners efficiently,
175
- // listener->stream() may be NULL.
176
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;
177
-
178
- // Inherits these methods from MatcherDescriberInterface:
179
- // virtual void DescribeTo(::std::ostream* os) const = 0;
180
- // virtual void DescribeNegationTo(::std::ostream* os) const;
181
- };
182
-
183
- // A match result listener that stores the explanation in a string.
184
- class StringMatchResultListener : public MatchResultListener {
185
- public:
186
- StringMatchResultListener() : MatchResultListener(&ss_) {}
187
-
188
- // Returns the explanation accumulated so far.
189
- internal::string str() const { return ss_.str(); }
190
-
191
- // Clears the explanation accumulated so far.
192
- void Clear() { ss_.str(""); }
193
-
194
- private:
195
- ::std::stringstream ss_;
196
-
197
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);
198
- };
199
-
200
- namespace internal {
201
-
202
- // A match result listener that ignores the explanation.
203
- class DummyMatchResultListener : public MatchResultListener {
204
- public:
205
- DummyMatchResultListener() : MatchResultListener(NULL) {}
206
-
207
- private:
208
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);
209
- };
210
-
211
- // A match result listener that forwards the explanation to a given
212
- // ostream. The difference between this and MatchResultListener is
213
- // that the former is concrete.
214
- class StreamMatchResultListener : public MatchResultListener {
215
- public:
216
- explicit StreamMatchResultListener(::std::ostream* os)
217
- : MatchResultListener(os) {}
218
-
219
- private:
220
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);
221
- };
222
-
223
- // An internal class for implementing Matcher<T>, which will derive
224
- // from it. We put functionalities common to all Matcher<T>
225
- // specializations here to avoid code duplication.
226
- template <typename T>
227
- class MatcherBase {
228
- public:
229
- // Returns true iff the matcher matches x; also explains the match
230
- // result to 'listener'.
231
- bool MatchAndExplain(T x, MatchResultListener* listener) const {
232
- return impl_->MatchAndExplain(x, listener);
233
- }
234
-
235
- // Returns true iff this matcher matches x.
236
- bool Matches(T x) const {
237
- DummyMatchResultListener dummy;
238
- return MatchAndExplain(x, &dummy);
239
- }
240
-
241
- // Describes this matcher to an ostream.
242
- void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }
243
-
244
- // Describes the negation of this matcher to an ostream.
245
- void DescribeNegationTo(::std::ostream* os) const {
246
- impl_->DescribeNegationTo(os);
247
- }
248
-
249
- // Explains why x matches, or doesn't match, the matcher.
250
- void ExplainMatchResultTo(T x, ::std::ostream* os) const {
251
- StreamMatchResultListener listener(os);
252
- MatchAndExplain(x, &listener);
253
- }
254
-
255
- // Returns the describer for this matcher object; retains ownership
256
- // of the describer, which is only guaranteed to be alive when
257
- // this matcher object is alive.
258
- const MatcherDescriberInterface* GetDescriber() const {
259
- return impl_.get();
260
- }
261
-
262
- protected:
263
- MatcherBase() {}
264
-
265
- // Constructs a matcher from its implementation.
266
- explicit MatcherBase(const MatcherInterface<T>* impl)
267
- : impl_(impl) {}
268
-
269
- virtual ~MatcherBase() {}
270
-
271
- private:
272
- // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar
273
- // interfaces. The former dynamically allocates a chunk of memory
274
- // to hold the reference count, while the latter tracks all
275
- // references using a circular linked list without allocating
276
- // memory. It has been observed that linked_ptr performs better in
277
- // typical scenarios. However, shared_ptr can out-perform
278
- // linked_ptr when there are many more uses of the copy constructor
279
- // than the default constructor.
280
- //
281
- // If performance becomes a problem, we should see if using
282
- // shared_ptr helps.
283
- ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_;
284
- };
285
-
286
- } // namespace internal
287
-
288
- // A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
289
- // object that can check whether a value of type T matches. The
290
- // implementation of Matcher<T> is just a linked_ptr to const
291
- // MatcherInterface<T>, so copying is fairly cheap. Don't inherit
292
- // from Matcher!
293
- template <typename T>
294
- class Matcher : public internal::MatcherBase<T> {
295
- public:
296
- // Constructs a null matcher. Needed for storing Matcher objects in STL
297
- // containers. A default-constructed matcher is not yet initialized. You
298
- // cannot use it until a valid value has been assigned to it.
299
- Matcher() {}
300
-
301
- // Constructs a matcher from its implementation.
302
- explicit Matcher(const MatcherInterface<T>* impl)
303
- : internal::MatcherBase<T>(impl) {}
304
-
305
- // Implicit constructor here allows people to write
306
- // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes
307
- Matcher(T value); // NOLINT
308
- };
309
-
310
- // The following two specializations allow the user to write str
311
- // instead of Eq(str) and "foo" instead of Eq("foo") when a string
312
- // matcher is expected.
313
- template <>
314
- class GTEST_API_ Matcher<const internal::string&>
315
- : public internal::MatcherBase<const internal::string&> {
316
- public:
317
- Matcher() {}
318
-
319
- explicit Matcher(const MatcherInterface<const internal::string&>* impl)
320
- : internal::MatcherBase<const internal::string&>(impl) {}
321
-
322
- // Allows the user to write str instead of Eq(str) sometimes, where
323
- // str is a string object.
324
- Matcher(const internal::string& s); // NOLINT
325
-
326
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
327
- Matcher(const char* s); // NOLINT
328
- };
329
-
330
- template <>
331
- class GTEST_API_ Matcher<internal::string>
332
- : public internal::MatcherBase<internal::string> {
333
- public:
334
- Matcher() {}
335
-
336
- explicit Matcher(const MatcherInterface<internal::string>* impl)
337
- : internal::MatcherBase<internal::string>(impl) {}
338
-
339
- // Allows the user to write str instead of Eq(str) sometimes, where
340
- // str is a string object.
341
- Matcher(const internal::string& s); // NOLINT
342
-
343
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
344
- Matcher(const char* s); // NOLINT
345
- };
346
-
347
- #if GTEST_HAS_STRING_PIECE_
348
- // The following two specializations allow the user to write str
349
- // instead of Eq(str) and "foo" instead of Eq("foo") when a StringPiece
350
- // matcher is expected.
351
- template <>
352
- class GTEST_API_ Matcher<const StringPiece&>
353
- : public internal::MatcherBase<const StringPiece&> {
354
- public:
355
- Matcher() {}
356
-
357
- explicit Matcher(const MatcherInterface<const StringPiece&>* impl)
358
- : internal::MatcherBase<const StringPiece&>(impl) {}
359
-
360
- // Allows the user to write str instead of Eq(str) sometimes, where
361
- // str is a string object.
362
- Matcher(const internal::string& s); // NOLINT
363
-
364
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
365
- Matcher(const char* s); // NOLINT
366
-
367
- // Allows the user to pass StringPieces directly.
368
- Matcher(StringPiece s); // NOLINT
369
- };
370
-
371
- template <>
372
- class GTEST_API_ Matcher<StringPiece>
373
- : public internal::MatcherBase<StringPiece> {
374
- public:
375
- Matcher() {}
376
-
377
- explicit Matcher(const MatcherInterface<StringPiece>* impl)
378
- : internal::MatcherBase<StringPiece>(impl) {}
379
-
380
- // Allows the user to write str instead of Eq(str) sometimes, where
381
- // str is a string object.
382
- Matcher(const internal::string& s); // NOLINT
383
-
384
- // Allows the user to write "foo" instead of Eq("foo") sometimes.
385
- Matcher(const char* s); // NOLINT
386
-
387
- // Allows the user to pass StringPieces directly.
388
- Matcher(StringPiece s); // NOLINT
389
- };
390
- #endif // GTEST_HAS_STRING_PIECE_
391
-
392
- // The PolymorphicMatcher class template makes it easy to implement a
393
- // polymorphic matcher (i.e. a matcher that can match values of more
394
- // than one type, e.g. Eq(n) and NotNull()).
395
- //
396
- // To define a polymorphic matcher, a user should provide an Impl
397
- // class that has a DescribeTo() method and a DescribeNegationTo()
398
- // method, and define a member function (or member function template)
399
- //
400
- // bool MatchAndExplain(const Value& value,
401
- // MatchResultListener* listener) const;
402
- //
403
- // See the definition of NotNull() for a complete example.
404
- template <class Impl>
405
- class PolymorphicMatcher {
406
- public:
407
- explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}
408
-
409
- // Returns a mutable reference to the underlying matcher
410
- // implementation object.
411
- Impl& mutable_impl() { return impl_; }
412
-
413
- // Returns an immutable reference to the underlying matcher
414
- // implementation object.
415
- const Impl& impl() const { return impl_; }
416
-
417
- template <typename T>
418
- operator Matcher<T>() const {
419
- return Matcher<T>(new MonomorphicImpl<T>(impl_));
420
- }
421
-
422
- private:
423
- template <typename T>
424
- class MonomorphicImpl : public MatcherInterface<T> {
425
- public:
426
- explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
427
-
428
- virtual void DescribeTo(::std::ostream* os) const {
429
- impl_.DescribeTo(os);
430
- }
431
-
432
- virtual void DescribeNegationTo(::std::ostream* os) const {
433
- impl_.DescribeNegationTo(os);
434
- }
435
-
436
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
437
- return impl_.MatchAndExplain(x, listener);
438
- }
439
-
440
- private:
441
- const Impl impl_;
442
-
443
- GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);
444
- };
445
-
446
- Impl impl_;
447
-
448
- GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher);
449
- };
450
-
451
- // Creates a matcher from its implementation. This is easier to use
452
- // than the Matcher<T> constructor as it doesn't require you to
453
- // explicitly write the template argument, e.g.
454
- //
455
- // MakeMatcher(foo);
456
- // vs
457
- // Matcher<const string&>(foo);
458
- template <typename T>
459
- inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {
460
- return Matcher<T>(impl);
461
- }
462
-
463
- // Creates a polymorphic matcher from its implementation. This is
464
- // easier to use than the PolymorphicMatcher<Impl> constructor as it
465
- // doesn't require you to explicitly write the template argument, e.g.
466
- //
467
- // MakePolymorphicMatcher(foo);
468
- // vs
469
- // PolymorphicMatcher<TypeOfFoo>(foo);
470
- template <class Impl>
471
- inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {
472
- return PolymorphicMatcher<Impl>(impl);
473
- }
474
-
475
- // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
476
- // and MUST NOT BE USED IN USER CODE!!!
477
- namespace internal {
478
-
479
- // The MatcherCastImpl class template is a helper for implementing
480
- // MatcherCast(). We need this helper in order to partially
481
- // specialize the implementation of MatcherCast() (C++ allows
482
- // class/struct templates to be partially specialized, but not
483
- // function templates.).
484
-
485
- // This general version is used when MatcherCast()'s argument is a
486
- // polymorphic matcher (i.e. something that can be converted to a
487
- // Matcher but is not one yet; for example, Eq(value)) or a value (for
488
- // example, "hello").
489
- template <typename T, typename M>
490
- class MatcherCastImpl {
491
- public:
492
- static Matcher<T> Cast(M polymorphic_matcher_or_value) {
493
- // M can be a polymorhic matcher, in which case we want to use
494
- // its conversion operator to create Matcher<T>. Or it can be a value
495
- // that should be passed to the Matcher<T>'s constructor.
496
- //
497
- // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
498
- // polymorphic matcher because it'll be ambiguous if T has an implicit
499
- // constructor from M (this usually happens when T has an implicit
500
- // constructor from any type).
501
- //
502
- // It won't work to unconditionally implict_cast
503
- // polymorphic_matcher_or_value to Matcher<T> because it won't trigger
504
- // a user-defined conversion from M to T if one exists (assuming M is
505
- // a value).
506
- return CastImpl(
507
- polymorphic_matcher_or_value,
508
- BooleanConstant<
509
- internal::ImplicitlyConvertible<M, Matcher<T> >::value>());
510
- }
511
-
512
- private:
513
- static Matcher<T> CastImpl(M value, BooleanConstant<false>) {
514
- // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
515
- // matcher. It must be a value then. Use direct initialization to create
516
- // a matcher.
517
- return Matcher<T>(ImplicitCast_<T>(value));
518
- }
519
-
520
- static Matcher<T> CastImpl(M polymorphic_matcher_or_value,
521
- BooleanConstant<true>) {
522
- // M is implicitly convertible to Matcher<T>, which means that either
523
- // M is a polymorhpic matcher or Matcher<T> has an implicit constructor
524
- // from M. In both cases using the implicit conversion will produce a
525
- // matcher.
526
- //
527
- // Even if T has an implicit constructor from M, it won't be called because
528
- // creating Matcher<T> would require a chain of two user-defined conversions
529
- // (first to create T from M and then to create Matcher<T> from T).
530
- return polymorphic_matcher_or_value;
531
- }
532
- };
533
-
534
- // This more specialized version is used when MatcherCast()'s argument
535
- // is already a Matcher. This only compiles when type T can be
536
- // statically converted to type U.
537
- template <typename T, typename U>
538
- class MatcherCastImpl<T, Matcher<U> > {
539
- public:
540
- static Matcher<T> Cast(const Matcher<U>& source_matcher) {
541
- return Matcher<T>(new Impl(source_matcher));
542
- }
543
-
544
- private:
545
- class Impl : public MatcherInterface<T> {
546
- public:
547
- explicit Impl(const Matcher<U>& source_matcher)
548
- : source_matcher_(source_matcher) {}
549
-
550
- // We delegate the matching logic to the source matcher.
551
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
552
- return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
553
- }
554
-
555
- virtual void DescribeTo(::std::ostream* os) const {
556
- source_matcher_.DescribeTo(os);
557
- }
558
-
559
- virtual void DescribeNegationTo(::std::ostream* os) const {
560
- source_matcher_.DescribeNegationTo(os);
561
- }
562
-
563
- private:
564
- const Matcher<U> source_matcher_;
565
-
566
- GTEST_DISALLOW_ASSIGN_(Impl);
567
- };
568
- };
569
-
570
- // This even more specialized version is used for efficiently casting
571
- // a matcher to its own type.
572
- template <typename T>
573
- class MatcherCastImpl<T, Matcher<T> > {
574
- public:
575
- static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
576
- };
577
-
578
- } // namespace internal
579
-
580
- // In order to be safe and clear, casting between different matcher
581
- // types is done explicitly via MatcherCast<T>(m), which takes a
582
- // matcher m and returns a Matcher<T>. It compiles only when T can be
583
- // statically converted to the argument type of m.
584
- template <typename T, typename M>
585
- inline Matcher<T> MatcherCast(M matcher) {
586
- return internal::MatcherCastImpl<T, M>::Cast(matcher);
587
- }
588
-
589
- // Implements SafeMatcherCast().
590
- //
591
- // We use an intermediate class to do the actual safe casting as Nokia's
592
- // Symbian compiler cannot decide between
593
- // template <T, M> ... (M) and
594
- // template <T, U> ... (const Matcher<U>&)
595
- // for function templates but can for member function templates.
596
- template <typename T>
597
- class SafeMatcherCastImpl {
598
- public:
599
- // This overload handles polymorphic matchers and values only since
600
- // monomorphic matchers are handled by the next one.
601
- template <typename M>
602
- static inline Matcher<T> Cast(M polymorphic_matcher_or_value) {
603
- return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value);
604
- }
605
-
606
- // This overload handles monomorphic matchers.
607
- //
608
- // In general, if type T can be implicitly converted to type U, we can
609
- // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
610
- // contravariant): just keep a copy of the original Matcher<U>, convert the
611
- // argument from type T to U, and then pass it to the underlying Matcher<U>.
612
- // The only exception is when U is a reference and T is not, as the
613
- // underlying Matcher<U> may be interested in the argument's address, which
614
- // is not preserved in the conversion from T to U.
615
- template <typename U>
616
- static inline Matcher<T> Cast(const Matcher<U>& matcher) {
617
- // Enforce that T can be implicitly converted to U.
618
- GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value),
619
- T_must_be_implicitly_convertible_to_U);
620
- // Enforce that we are not converting a non-reference type T to a reference
621
- // type U.
622
- GTEST_COMPILE_ASSERT_(
623
- internal::is_reference<T>::value || !internal::is_reference<U>::value,
624
- cannot_convert_non_referentce_arg_to_reference);
625
- // In case both T and U are arithmetic types, enforce that the
626
- // conversion is not lossy.
627
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT;
628
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU;
629
- const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;
630
- const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;
631
- GTEST_COMPILE_ASSERT_(
632
- kTIsOther || kUIsOther ||
633
- (internal::LosslessArithmeticConvertible<RawT, RawU>::value),
634
- conversion_of_arithmetic_types_must_be_lossless);
635
- return MatcherCast<T>(matcher);
636
- }
637
- };
638
-
639
- template <typename T, typename M>
640
- inline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) {
641
- return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher);
642
- }
643
-
644
- // A<T>() returns a matcher that matches any value of type T.
645
- template <typename T>
646
- Matcher<T> A();
647
-
648
- // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
649
- // and MUST NOT BE USED IN USER CODE!!!
650
- namespace internal {
651
-
652
- // If the explanation is not empty, prints it to the ostream.
653
- inline void PrintIfNotEmpty(const internal::string& explanation,
654
- ::std::ostream* os) {
655
- if (explanation != "" && os != NULL) {
656
- *os << ", " << explanation;
657
- }
658
- }
659
-
660
- // Returns true if the given type name is easy to read by a human.
661
- // This is used to decide whether printing the type of a value might
662
- // be helpful.
663
- inline bool IsReadableTypeName(const string& type_name) {
664
- // We consider a type name readable if it's short or doesn't contain
665
- // a template or function type.
666
- return (type_name.length() <= 20 ||
667
- type_name.find_first_of("<(") == string::npos);
668
- }
669
-
670
- // Matches the value against the given matcher, prints the value and explains
671
- // the match result to the listener. Returns the match result.
672
- // 'listener' must not be NULL.
673
- // Value cannot be passed by const reference, because some matchers take a
674
- // non-const argument.
675
- template <typename Value, typename T>
676
- bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,
677
- MatchResultListener* listener) {
678
- if (!listener->IsInterested()) {
679
- // If the listener is not interested, we do not need to construct the
680
- // inner explanation.
681
- return matcher.Matches(value);
682
- }
683
-
684
- StringMatchResultListener inner_listener;
685
- const bool match = matcher.MatchAndExplain(value, &inner_listener);
686
-
687
- UniversalPrint(value, listener->stream());
688
- #if GTEST_HAS_RTTI
689
- const string& type_name = GetTypeName<Value>();
690
- if (IsReadableTypeName(type_name))
691
- *listener->stream() << " (of type " << type_name << ")";
692
- #endif
693
- PrintIfNotEmpty(inner_listener.str(), listener->stream());
694
-
695
- return match;
696
- }
697
-
698
- // An internal helper class for doing compile-time loop on a tuple's
699
- // fields.
700
- template <size_t N>
701
- class TuplePrefix {
702
- public:
703
- // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
704
- // iff the first N fields of matcher_tuple matches the first N
705
- // fields of value_tuple, respectively.
706
- template <typename MatcherTuple, typename ValueTuple>
707
- static bool Matches(const MatcherTuple& matcher_tuple,
708
- const ValueTuple& value_tuple) {
709
- using ::std::tr1::get;
710
- return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple)
711
- && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple));
712
- }
713
-
714
- // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
715
- // describes failures in matching the first N fields of matchers
716
- // against the first N fields of values. If there is no failure,
717
- // nothing will be streamed to os.
718
- template <typename MatcherTuple, typename ValueTuple>
719
- static void ExplainMatchFailuresTo(const MatcherTuple& matchers,
720
- const ValueTuple& values,
721
- ::std::ostream* os) {
722
- using ::std::tr1::tuple_element;
723
- using ::std::tr1::get;
724
-
725
- // First, describes failures in the first N - 1 fields.
726
- TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);
727
-
728
- // Then describes the failure (if any) in the (N - 1)-th (0-based)
729
- // field.
730
- typename tuple_element<N - 1, MatcherTuple>::type matcher =
731
- get<N - 1>(matchers);
732
- typedef typename tuple_element<N - 1, ValueTuple>::type Value;
733
- Value value = get<N - 1>(values);
734
- StringMatchResultListener listener;
735
- if (!matcher.MatchAndExplain(value, &listener)) {
736
- // TODO(wan): include in the message the name of the parameter
737
- // as used in MOCK_METHOD*() when possible.
738
- *os << " Expected arg #" << N - 1 << ": ";
739
- get<N - 1>(matchers).DescribeTo(os);
740
- *os << "\n Actual: ";
741
- // We remove the reference in type Value to prevent the
742
- // universal printer from printing the address of value, which
743
- // isn't interesting to the user most of the time. The
744
- // matcher's MatchAndExplain() method handles the case when
745
- // the address is interesting.
746
- internal::UniversalPrint(value, os);
747
- PrintIfNotEmpty(listener.str(), os);
748
- *os << "\n";
749
- }
750
- }
751
- };
752
-
753
- // The base case.
754
- template <>
755
- class TuplePrefix<0> {
756
- public:
757
- template <typename MatcherTuple, typename ValueTuple>
758
- static bool Matches(const MatcherTuple& /* matcher_tuple */,
759
- const ValueTuple& /* value_tuple */) {
760
- return true;
761
- }
762
-
763
- template <typename MatcherTuple, typename ValueTuple>
764
- static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,
765
- const ValueTuple& /* values */,
766
- ::std::ostream* /* os */) {}
767
- };
768
-
769
- // TupleMatches(matcher_tuple, value_tuple) returns true iff all
770
- // matchers in matcher_tuple match the corresponding fields in
771
- // value_tuple. It is a compiler error if matcher_tuple and
772
- // value_tuple have different number of fields or incompatible field
773
- // types.
774
- template <typename MatcherTuple, typename ValueTuple>
775
- bool TupleMatches(const MatcherTuple& matcher_tuple,
776
- const ValueTuple& value_tuple) {
777
- using ::std::tr1::tuple_size;
778
- // Makes sure that matcher_tuple and value_tuple have the same
779
- // number of fields.
780
- GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value ==
781
- tuple_size<ValueTuple>::value,
782
- matcher_and_value_have_different_numbers_of_fields);
783
- return TuplePrefix<tuple_size<ValueTuple>::value>::
784
- Matches(matcher_tuple, value_tuple);
785
- }
786
-
787
- // Describes failures in matching matchers against values. If there
788
- // is no failure, nothing will be streamed to os.
789
- template <typename MatcherTuple, typename ValueTuple>
790
- void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,
791
- const ValueTuple& values,
792
- ::std::ostream* os) {
793
- using ::std::tr1::tuple_size;
794
- TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(
795
- matchers, values, os);
796
- }
797
-
798
- // TransformTupleValues and its helper.
799
- //
800
- // TransformTupleValuesHelper hides the internal machinery that
801
- // TransformTupleValues uses to implement a tuple traversal.
802
- template <typename Tuple, typename Func, typename OutIter>
803
- class TransformTupleValuesHelper {
804
- private:
805
- typedef typename ::std::tr1::tuple_size<Tuple> TupleSize;
806
-
807
- public:
808
- // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.
809
- // Returns the final value of 'out' in case the caller needs it.
810
- static OutIter Run(Func f, const Tuple& t, OutIter out) {
811
- return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out);
812
- }
813
-
814
- private:
815
- template <typename Tup, size_t kRemainingSize>
816
- struct IterateOverTuple {
817
- OutIter operator() (Func f, const Tup& t, OutIter out) const {
818
- *out++ = f(::std::tr1::get<TupleSize::value - kRemainingSize>(t));
819
- return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);
820
- }
821
- };
822
- template <typename Tup>
823
- struct IterateOverTuple<Tup, 0> {
824
- OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const {
825
- return out;
826
- }
827
- };
828
- };
829
-
830
- // Successively invokes 'f(element)' on each element of the tuple 't',
831
- // appending each result to the 'out' iterator. Returns the final value
832
- // of 'out'.
833
- template <typename Tuple, typename Func, typename OutIter>
834
- OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {
835
- return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out);
836
- }
837
-
838
- // Implements A<T>().
839
- template <typename T>
840
- class AnyMatcherImpl : public MatcherInterface<T> {
841
- public:
842
- virtual bool MatchAndExplain(
843
- T /* x */, MatchResultListener* /* listener */) const { return true; }
844
- virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; }
845
- virtual void DescribeNegationTo(::std::ostream* os) const {
846
- // This is mostly for completeness' safe, as it's not very useful
847
- // to write Not(A<bool>()). However we cannot completely rule out
848
- // such a possibility, and it doesn't hurt to be prepared.
849
- *os << "never matches";
850
- }
851
- };
852
-
853
- // Implements _, a matcher that matches any value of any
854
- // type. This is a polymorphic matcher, so we need a template type
855
- // conversion operator to make it appearing as a Matcher<T> for any
856
- // type T.
857
- class AnythingMatcher {
858
- public:
859
- template <typename T>
860
- operator Matcher<T>() const { return A<T>(); }
861
- };
862
-
863
- // Implements a matcher that compares a given value with a
864
- // pre-supplied value using one of the ==, <=, <, etc, operators. The
865
- // two values being compared don't have to have the same type.
866
- //
867
- // The matcher defined here is polymorphic (for example, Eq(5) can be
868
- // used to match an int, a short, a double, etc). Therefore we use
869
- // a template type conversion operator in the implementation.
870
- //
871
- // We define this as a macro in order to eliminate duplicated source
872
- // code.
873
- //
874
- // The following template definition assumes that the Rhs parameter is
875
- // a "bare" type (i.e. neither 'const T' nor 'T&').
876
- #define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \
877
- name, op, relation, negated_relation) \
878
- template <typename Rhs> class name##Matcher { \
879
- public: \
880
- explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \
881
- template <typename Lhs> \
882
- operator Matcher<Lhs>() const { \
883
- return MakeMatcher(new Impl<Lhs>(rhs_)); \
884
- } \
885
- private: \
886
- template <typename Lhs> \
887
- class Impl : public MatcherInterface<Lhs> { \
888
- public: \
889
- explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \
890
- virtual bool MatchAndExplain(\
891
- Lhs lhs, MatchResultListener* /* listener */) const { \
892
- return lhs op rhs_; \
893
- } \
894
- virtual void DescribeTo(::std::ostream* os) const { \
895
- *os << relation " "; \
896
- UniversalPrint(rhs_, os); \
897
- } \
898
- virtual void DescribeNegationTo(::std::ostream* os) const { \
899
- *os << negated_relation " "; \
900
- UniversalPrint(rhs_, os); \
901
- } \
902
- private: \
903
- Rhs rhs_; \
904
- GTEST_DISALLOW_ASSIGN_(Impl); \
905
- }; \
906
- Rhs rhs_; \
907
- GTEST_DISALLOW_ASSIGN_(name##Matcher); \
908
- }
909
-
910
- // Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v)
911
- // respectively.
912
- GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to");
913
- GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >=");
914
- GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >");
915
- GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <=");
916
- GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <");
917
- GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to");
918
-
919
- #undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_
920
-
921
- // Implements the polymorphic IsNull() matcher, which matches any raw or smart
922
- // pointer that is NULL.
923
- class IsNullMatcher {
924
- public:
925
- template <typename Pointer>
926
- bool MatchAndExplain(const Pointer& p,
927
- MatchResultListener* /* listener */) const {
928
- return GetRawPointer(p) == NULL;
929
- }
930
-
931
- void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }
932
- void DescribeNegationTo(::std::ostream* os) const {
933
- *os << "isn't NULL";
934
- }
935
- };
936
-
937
- // Implements the polymorphic NotNull() matcher, which matches any raw or smart
938
- // pointer that is not NULL.
939
- class NotNullMatcher {
940
- public:
941
- template <typename Pointer>
942
- bool MatchAndExplain(const Pointer& p,
943
- MatchResultListener* /* listener */) const {
944
- return GetRawPointer(p) != NULL;
945
- }
946
-
947
- void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }
948
- void DescribeNegationTo(::std::ostream* os) const {
949
- *os << "is NULL";
950
- }
951
- };
952
-
953
- // Ref(variable) matches any argument that is a reference to
954
- // 'variable'. This matcher is polymorphic as it can match any
955
- // super type of the type of 'variable'.
956
- //
957
- // The RefMatcher template class implements Ref(variable). It can
958
- // only be instantiated with a reference type. This prevents a user
959
- // from mistakenly using Ref(x) to match a non-reference function
960
- // argument. For example, the following will righteously cause a
961
- // compiler error:
962
- //
963
- // int n;
964
- // Matcher<int> m1 = Ref(n); // This won't compile.
965
- // Matcher<int&> m2 = Ref(n); // This will compile.
966
- template <typename T>
967
- class RefMatcher;
968
-
969
- template <typename T>
970
- class RefMatcher<T&> {
971
- // Google Mock is a generic framework and thus needs to support
972
- // mocking any function types, including those that take non-const
973
- // reference arguments. Therefore the template parameter T (and
974
- // Super below) can be instantiated to either a const type or a
975
- // non-const type.
976
- public:
977
- // RefMatcher() takes a T& instead of const T&, as we want the
978
- // compiler to catch using Ref(const_value) as a matcher for a
979
- // non-const reference.
980
- explicit RefMatcher(T& x) : object_(x) {} // NOLINT
981
-
982
- template <typename Super>
983
- operator Matcher<Super&>() const {
984
- // By passing object_ (type T&) to Impl(), which expects a Super&,
985
- // we make sure that Super is a super type of T. In particular,
986
- // this catches using Ref(const_value) as a matcher for a
987
- // non-const reference, as you cannot implicitly convert a const
988
- // reference to a non-const reference.
989
- return MakeMatcher(new Impl<Super>(object_));
990
- }
991
-
992
- private:
993
- template <typename Super>
994
- class Impl : public MatcherInterface<Super&> {
995
- public:
996
- explicit Impl(Super& x) : object_(x) {} // NOLINT
997
-
998
- // MatchAndExplain() takes a Super& (as opposed to const Super&)
999
- // in order to match the interface MatcherInterface<Super&>.
1000
- virtual bool MatchAndExplain(
1001
- Super& x, MatchResultListener* listener) const {
1002
- *listener << "which is located @" << static_cast<const void*>(&x);
1003
- return &x == &object_;
1004
- }
1005
-
1006
- virtual void DescribeTo(::std::ostream* os) const {
1007
- *os << "references the variable ";
1008
- UniversalPrinter<Super&>::Print(object_, os);
1009
- }
1010
-
1011
- virtual void DescribeNegationTo(::std::ostream* os) const {
1012
- *os << "does not reference the variable ";
1013
- UniversalPrinter<Super&>::Print(object_, os);
1014
- }
1015
-
1016
- private:
1017
- const Super& object_;
1018
-
1019
- GTEST_DISALLOW_ASSIGN_(Impl);
1020
- };
1021
-
1022
- T& object_;
1023
-
1024
- GTEST_DISALLOW_ASSIGN_(RefMatcher);
1025
- };
1026
-
1027
- // Polymorphic helper functions for narrow and wide string matchers.
1028
- inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {
1029
- return String::CaseInsensitiveCStringEquals(lhs, rhs);
1030
- }
1031
-
1032
- inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,
1033
- const wchar_t* rhs) {
1034
- return String::CaseInsensitiveWideCStringEquals(lhs, rhs);
1035
- }
1036
-
1037
- // String comparison for narrow or wide strings that can have embedded NUL
1038
- // characters.
1039
- template <typename StringType>
1040
- bool CaseInsensitiveStringEquals(const StringType& s1,
1041
- const StringType& s2) {
1042
- // Are the heads equal?
1043
- if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {
1044
- return false;
1045
- }
1046
-
1047
- // Skip the equal heads.
1048
- const typename StringType::value_type nul = 0;
1049
- const size_t i1 = s1.find(nul), i2 = s2.find(nul);
1050
-
1051
- // Are we at the end of either s1 or s2?
1052
- if (i1 == StringType::npos || i2 == StringType::npos) {
1053
- return i1 == i2;
1054
- }
1055
-
1056
- // Are the tails equal?
1057
- return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));
1058
- }
1059
-
1060
- // String matchers.
1061
-
1062
- // Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
1063
- template <typename StringType>
1064
- class StrEqualityMatcher {
1065
- public:
1066
- StrEqualityMatcher(const StringType& str, bool expect_eq,
1067
- bool case_sensitive)
1068
- : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {}
1069
-
1070
- // Accepts pointer types, particularly:
1071
- // const char*
1072
- // char*
1073
- // const wchar_t*
1074
- // wchar_t*
1075
- template <typename CharType>
1076
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1077
- if (s == NULL) {
1078
- return !expect_eq_;
1079
- }
1080
- return MatchAndExplain(StringType(s), listener);
1081
- }
1082
-
1083
- // Matches anything that can convert to StringType.
1084
- //
1085
- // This is a template, not just a plain function with const StringType&,
1086
- // because StringPiece has some interfering non-explicit constructors.
1087
- template <typename MatcheeStringType>
1088
- bool MatchAndExplain(const MatcheeStringType& s,
1089
- MatchResultListener* /* listener */) const {
1090
- const StringType& s2(s);
1091
- const bool eq = case_sensitive_ ? s2 == string_ :
1092
- CaseInsensitiveStringEquals(s2, string_);
1093
- return expect_eq_ == eq;
1094
- }
1095
-
1096
- void DescribeTo(::std::ostream* os) const {
1097
- DescribeToHelper(expect_eq_, os);
1098
- }
1099
-
1100
- void DescribeNegationTo(::std::ostream* os) const {
1101
- DescribeToHelper(!expect_eq_, os);
1102
- }
1103
-
1104
- private:
1105
- void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {
1106
- *os << (expect_eq ? "is " : "isn't ");
1107
- *os << "equal to ";
1108
- if (!case_sensitive_) {
1109
- *os << "(ignoring case) ";
1110
- }
1111
- UniversalPrint(string_, os);
1112
- }
1113
-
1114
- const StringType string_;
1115
- const bool expect_eq_;
1116
- const bool case_sensitive_;
1117
-
1118
- GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher);
1119
- };
1120
-
1121
- // Implements the polymorphic HasSubstr(substring) matcher, which
1122
- // can be used as a Matcher<T> as long as T can be converted to a
1123
- // string.
1124
- template <typename StringType>
1125
- class HasSubstrMatcher {
1126
- public:
1127
- explicit HasSubstrMatcher(const StringType& substring)
1128
- : substring_(substring) {}
1129
-
1130
- // Accepts pointer types, particularly:
1131
- // const char*
1132
- // char*
1133
- // const wchar_t*
1134
- // wchar_t*
1135
- template <typename CharType>
1136
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1137
- return s != NULL && MatchAndExplain(StringType(s), listener);
1138
- }
1139
-
1140
- // Matches anything that can convert to StringType.
1141
- //
1142
- // This is a template, not just a plain function with const StringType&,
1143
- // because StringPiece has some interfering non-explicit constructors.
1144
- template <typename MatcheeStringType>
1145
- bool MatchAndExplain(const MatcheeStringType& s,
1146
- MatchResultListener* /* listener */) const {
1147
- const StringType& s2(s);
1148
- return s2.find(substring_) != StringType::npos;
1149
- }
1150
-
1151
- // Describes what this matcher matches.
1152
- void DescribeTo(::std::ostream* os) const {
1153
- *os << "has substring ";
1154
- UniversalPrint(substring_, os);
1155
- }
1156
-
1157
- void DescribeNegationTo(::std::ostream* os) const {
1158
- *os << "has no substring ";
1159
- UniversalPrint(substring_, os);
1160
- }
1161
-
1162
- private:
1163
- const StringType substring_;
1164
-
1165
- GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher);
1166
- };
1167
-
1168
- // Implements the polymorphic StartsWith(substring) matcher, which
1169
- // can be used as a Matcher<T> as long as T can be converted to a
1170
- // string.
1171
- template <typename StringType>
1172
- class StartsWithMatcher {
1173
- public:
1174
- explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {
1175
- }
1176
-
1177
- // Accepts pointer types, particularly:
1178
- // const char*
1179
- // char*
1180
- // const wchar_t*
1181
- // wchar_t*
1182
- template <typename CharType>
1183
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1184
- return s != NULL && MatchAndExplain(StringType(s), listener);
1185
- }
1186
-
1187
- // Matches anything that can convert to StringType.
1188
- //
1189
- // This is a template, not just a plain function with const StringType&,
1190
- // because StringPiece has some interfering non-explicit constructors.
1191
- template <typename MatcheeStringType>
1192
- bool MatchAndExplain(const MatcheeStringType& s,
1193
- MatchResultListener* /* listener */) const {
1194
- const StringType& s2(s);
1195
- return s2.length() >= prefix_.length() &&
1196
- s2.substr(0, prefix_.length()) == prefix_;
1197
- }
1198
-
1199
- void DescribeTo(::std::ostream* os) const {
1200
- *os << "starts with ";
1201
- UniversalPrint(prefix_, os);
1202
- }
1203
-
1204
- void DescribeNegationTo(::std::ostream* os) const {
1205
- *os << "doesn't start with ";
1206
- UniversalPrint(prefix_, os);
1207
- }
1208
-
1209
- private:
1210
- const StringType prefix_;
1211
-
1212
- GTEST_DISALLOW_ASSIGN_(StartsWithMatcher);
1213
- };
1214
-
1215
- // Implements the polymorphic EndsWith(substring) matcher, which
1216
- // can be used as a Matcher<T> as long as T can be converted to a
1217
- // string.
1218
- template <typename StringType>
1219
- class EndsWithMatcher {
1220
- public:
1221
- explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}
1222
-
1223
- // Accepts pointer types, particularly:
1224
- // const char*
1225
- // char*
1226
- // const wchar_t*
1227
- // wchar_t*
1228
- template <typename CharType>
1229
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1230
- return s != NULL && MatchAndExplain(StringType(s), listener);
1231
- }
1232
-
1233
- // Matches anything that can convert to StringType.
1234
- //
1235
- // This is a template, not just a plain function with const StringType&,
1236
- // because StringPiece has some interfering non-explicit constructors.
1237
- template <typename MatcheeStringType>
1238
- bool MatchAndExplain(const MatcheeStringType& s,
1239
- MatchResultListener* /* listener */) const {
1240
- const StringType& s2(s);
1241
- return s2.length() >= suffix_.length() &&
1242
- s2.substr(s2.length() - suffix_.length()) == suffix_;
1243
- }
1244
-
1245
- void DescribeTo(::std::ostream* os) const {
1246
- *os << "ends with ";
1247
- UniversalPrint(suffix_, os);
1248
- }
1249
-
1250
- void DescribeNegationTo(::std::ostream* os) const {
1251
- *os << "doesn't end with ";
1252
- UniversalPrint(suffix_, os);
1253
- }
1254
-
1255
- private:
1256
- const StringType suffix_;
1257
-
1258
- GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);
1259
- };
1260
-
1261
- // Implements polymorphic matchers MatchesRegex(regex) and
1262
- // ContainsRegex(regex), which can be used as a Matcher<T> as long as
1263
- // T can be converted to a string.
1264
- class MatchesRegexMatcher {
1265
- public:
1266
- MatchesRegexMatcher(const RE* regex, bool full_match)
1267
- : regex_(regex), full_match_(full_match) {}
1268
-
1269
- // Accepts pointer types, particularly:
1270
- // const char*
1271
- // char*
1272
- // const wchar_t*
1273
- // wchar_t*
1274
- template <typename CharType>
1275
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1276
- return s != NULL && MatchAndExplain(internal::string(s), listener);
1277
- }
1278
-
1279
- // Matches anything that can convert to internal::string.
1280
- //
1281
- // This is a template, not just a plain function with const internal::string&,
1282
- // because StringPiece has some interfering non-explicit constructors.
1283
- template <class MatcheeStringType>
1284
- bool MatchAndExplain(const MatcheeStringType& s,
1285
- MatchResultListener* /* listener */) const {
1286
- const internal::string& s2(s);
1287
- return full_match_ ? RE::FullMatch(s2, *regex_) :
1288
- RE::PartialMatch(s2, *regex_);
1289
- }
1290
-
1291
- void DescribeTo(::std::ostream* os) const {
1292
- *os << (full_match_ ? "matches" : "contains")
1293
- << " regular expression ";
1294
- UniversalPrinter<internal::string>::Print(regex_->pattern(), os);
1295
- }
1296
-
1297
- void DescribeNegationTo(::std::ostream* os) const {
1298
- *os << "doesn't " << (full_match_ ? "match" : "contain")
1299
- << " regular expression ";
1300
- UniversalPrinter<internal::string>::Print(regex_->pattern(), os);
1301
- }
1302
-
1303
- private:
1304
- const internal::linked_ptr<const RE> regex_;
1305
- const bool full_match_;
1306
-
1307
- GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);
1308
- };
1309
-
1310
- // Implements a matcher that compares the two fields of a 2-tuple
1311
- // using one of the ==, <=, <, etc, operators. The two fields being
1312
- // compared don't have to have the same type.
1313
- //
1314
- // The matcher defined here is polymorphic (for example, Eq() can be
1315
- // used to match a tuple<int, short>, a tuple<const long&, double>,
1316
- // etc). Therefore we use a template type conversion operator in the
1317
- // implementation.
1318
- //
1319
- // We define this as a macro in order to eliminate duplicated source
1320
- // code.
1321
- #define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op, relation) \
1322
- class name##2Matcher { \
1323
- public: \
1324
- template <typename T1, typename T2> \
1325
- operator Matcher< ::std::tr1::tuple<T1, T2> >() const { \
1326
- return MakeMatcher(new Impl< ::std::tr1::tuple<T1, T2> >); \
1327
- } \
1328
- template <typename T1, typename T2> \
1329
- operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \
1330
- return MakeMatcher(new Impl<const ::std::tr1::tuple<T1, T2>&>); \
1331
- } \
1332
- private: \
1333
- template <typename Tuple> \
1334
- class Impl : public MatcherInterface<Tuple> { \
1335
- public: \
1336
- virtual bool MatchAndExplain( \
1337
- Tuple args, \
1338
- MatchResultListener* /* listener */) const { \
1339
- return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \
1340
- } \
1341
- virtual void DescribeTo(::std::ostream* os) const { \
1342
- *os << "are " relation; \
1343
- } \
1344
- virtual void DescribeNegationTo(::std::ostream* os) const { \
1345
- *os << "aren't " relation; \
1346
- } \
1347
- }; \
1348
- }
1349
-
1350
- // Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively.
1351
- GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==, "an equal pair");
1352
- GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
1353
- Ge, >=, "a pair where the first >= the second");
1354
- GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
1355
- Gt, >, "a pair where the first > the second");
1356
- GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
1357
- Le, <=, "a pair where the first <= the second");
1358
- GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
1359
- Lt, <, "a pair where the first < the second");
1360
- GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=, "an unequal pair");
1361
-
1362
- #undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_
1363
-
1364
- // Implements the Not(...) matcher for a particular argument type T.
1365
- // We do not nest it inside the NotMatcher class template, as that
1366
- // will prevent different instantiations of NotMatcher from sharing
1367
- // the same NotMatcherImpl<T> class.
1368
- template <typename T>
1369
- class NotMatcherImpl : public MatcherInterface<T> {
1370
- public:
1371
- explicit NotMatcherImpl(const Matcher<T>& matcher)
1372
- : matcher_(matcher) {}
1373
-
1374
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
1375
- return !matcher_.MatchAndExplain(x, listener);
1376
- }
1377
-
1378
- virtual void DescribeTo(::std::ostream* os) const {
1379
- matcher_.DescribeNegationTo(os);
1380
- }
1381
-
1382
- virtual void DescribeNegationTo(::std::ostream* os) const {
1383
- matcher_.DescribeTo(os);
1384
- }
1385
-
1386
- private:
1387
- const Matcher<T> matcher_;
1388
-
1389
- GTEST_DISALLOW_ASSIGN_(NotMatcherImpl);
1390
- };
1391
-
1392
- // Implements the Not(m) matcher, which matches a value that doesn't
1393
- // match matcher m.
1394
- template <typename InnerMatcher>
1395
- class NotMatcher {
1396
- public:
1397
- explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}
1398
-
1399
- // This template type conversion operator allows Not(m) to be used
1400
- // to match any type m can match.
1401
- template <typename T>
1402
- operator Matcher<T>() const {
1403
- return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));
1404
- }
1405
-
1406
- private:
1407
- InnerMatcher matcher_;
1408
-
1409
- GTEST_DISALLOW_ASSIGN_(NotMatcher);
1410
- };
1411
-
1412
- // Implements the AllOf(m1, m2) matcher for a particular argument type
1413
- // T. We do not nest it inside the BothOfMatcher class template, as
1414
- // that will prevent different instantiations of BothOfMatcher from
1415
- // sharing the same BothOfMatcherImpl<T> class.
1416
- template <typename T>
1417
- class BothOfMatcherImpl : public MatcherInterface<T> {
1418
- public:
1419
- BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
1420
- : matcher1_(matcher1), matcher2_(matcher2) {}
1421
-
1422
- virtual void DescribeTo(::std::ostream* os) const {
1423
- *os << "(";
1424
- matcher1_.DescribeTo(os);
1425
- *os << ") and (";
1426
- matcher2_.DescribeTo(os);
1427
- *os << ")";
1428
- }
1429
-
1430
- virtual void DescribeNegationTo(::std::ostream* os) const {
1431
- *os << "(";
1432
- matcher1_.DescribeNegationTo(os);
1433
- *os << ") or (";
1434
- matcher2_.DescribeNegationTo(os);
1435
- *os << ")";
1436
- }
1437
-
1438
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
1439
- // If either matcher1_ or matcher2_ doesn't match x, we only need
1440
- // to explain why one of them fails.
1441
- StringMatchResultListener listener1;
1442
- if (!matcher1_.MatchAndExplain(x, &listener1)) {
1443
- *listener << listener1.str();
1444
- return false;
1445
- }
1446
-
1447
- StringMatchResultListener listener2;
1448
- if (!matcher2_.MatchAndExplain(x, &listener2)) {
1449
- *listener << listener2.str();
1450
- return false;
1451
- }
1452
-
1453
- // Otherwise we need to explain why *both* of them match.
1454
- const internal::string s1 = listener1.str();
1455
- const internal::string s2 = listener2.str();
1456
-
1457
- if (s1 == "") {
1458
- *listener << s2;
1459
- } else {
1460
- *listener << s1;
1461
- if (s2 != "") {
1462
- *listener << ", and " << s2;
1463
- }
1464
- }
1465
- return true;
1466
- }
1467
-
1468
- private:
1469
- const Matcher<T> matcher1_;
1470
- const Matcher<T> matcher2_;
1471
-
1472
- GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl);
1473
- };
1474
-
1475
- #if GTEST_LANG_CXX11
1476
- // MatcherList provides mechanisms for storing a variable number of matchers in
1477
- // a list structure (ListType) and creating a combining matcher from such a
1478
- // list.
1479
- // The template is defined recursively using the following template paramters:
1480
- // * kSize is the length of the MatcherList.
1481
- // * Head is the type of the first matcher of the list.
1482
- // * Tail denotes the types of the remaining matchers of the list.
1483
- template <int kSize, typename Head, typename... Tail>
1484
- struct MatcherList {
1485
- typedef MatcherList<kSize - 1, Tail...> MatcherListTail;
1486
- typedef ::std::pair<Head, typename MatcherListTail::ListType> ListType;
1487
-
1488
- // BuildList stores variadic type values in a nested pair structure.
1489
- // Example:
1490
- // MatcherList<3, int, string, float>::BuildList(5, "foo", 2.0) will return
1491
- // the corresponding result of type pair<int, pair<string, float>>.
1492
- static ListType BuildList(const Head& matcher, const Tail&... tail) {
1493
- return ListType(matcher, MatcherListTail::BuildList(tail...));
1494
- }
1495
-
1496
- // CreateMatcher<T> creates a Matcher<T> from a given list of matchers (built
1497
- // by BuildList()). CombiningMatcher<T> is used to combine the matchers of the
1498
- // list. CombiningMatcher<T> must implement MatcherInterface<T> and have a
1499
- // constructor taking two Matcher<T>s as input.
1500
- template <typename T, template <typename /* T */> class CombiningMatcher>
1501
- static Matcher<T> CreateMatcher(const ListType& matchers) {
1502
- return Matcher<T>(new CombiningMatcher<T>(
1503
- SafeMatcherCast<T>(matchers.first),
1504
- MatcherListTail::template CreateMatcher<T, CombiningMatcher>(
1505
- matchers.second)));
1506
- }
1507
- };
1508
-
1509
- // The following defines the base case for the recursive definition of
1510
- // MatcherList.
1511
- template <typename Matcher1, typename Matcher2>
1512
- struct MatcherList<2, Matcher1, Matcher2> {
1513
- typedef ::std::pair<Matcher1, Matcher2> ListType;
1514
-
1515
- static ListType BuildList(const Matcher1& matcher1,
1516
- const Matcher2& matcher2) {
1517
- return ::std::pair<Matcher1, Matcher2>(matcher1, matcher2);
1518
- }
1519
-
1520
- template <typename T, template <typename /* T */> class CombiningMatcher>
1521
- static Matcher<T> CreateMatcher(const ListType& matchers) {
1522
- return Matcher<T>(new CombiningMatcher<T>(
1523
- SafeMatcherCast<T>(matchers.first),
1524
- SafeMatcherCast<T>(matchers.second)));
1525
- }
1526
- };
1527
-
1528
- // VariadicMatcher is used for the variadic implementation of
1529
- // AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
1530
- // CombiningMatcher<T> is used to recursively combine the provided matchers
1531
- // (of type Args...).
1532
- template <template <typename T> class CombiningMatcher, typename... Args>
1533
- class VariadicMatcher {
1534
- public:
1535
- VariadicMatcher(const Args&... matchers) // NOLINT
1536
- : matchers_(MatcherListType::BuildList(matchers...)) {}
1537
-
1538
- // This template type conversion operator allows an
1539
- // VariadicMatcher<Matcher1, Matcher2...> object to match any type that
1540
- // all of the provided matchers (Matcher1, Matcher2, ...) can match.
1541
- template <typename T>
1542
- operator Matcher<T>() const {
1543
- return MatcherListType::template CreateMatcher<T, CombiningMatcher>(
1544
- matchers_);
1545
- }
1546
-
1547
- private:
1548
- typedef MatcherList<sizeof...(Args), Args...> MatcherListType;
1549
-
1550
- const typename MatcherListType::ListType matchers_;
1551
-
1552
- GTEST_DISALLOW_ASSIGN_(VariadicMatcher);
1553
- };
1554
-
1555
- template <typename... Args>
1556
- using AllOfMatcher = VariadicMatcher<BothOfMatcherImpl, Args...>;
1557
-
1558
- #endif // GTEST_LANG_CXX11
1559
-
1560
- // Used for implementing the AllOf(m_1, ..., m_n) matcher, which
1561
- // matches a value that matches all of the matchers m_1, ..., and m_n.
1562
- template <typename Matcher1, typename Matcher2>
1563
- class BothOfMatcher {
1564
- public:
1565
- BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2)
1566
- : matcher1_(matcher1), matcher2_(matcher2) {}
1567
-
1568
- // This template type conversion operator allows a
1569
- // BothOfMatcher<Matcher1, Matcher2> object to match any type that
1570
- // both Matcher1 and Matcher2 can match.
1571
- template <typename T>
1572
- operator Matcher<T>() const {
1573
- return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_),
1574
- SafeMatcherCast<T>(matcher2_)));
1575
- }
1576
-
1577
- private:
1578
- Matcher1 matcher1_;
1579
- Matcher2 matcher2_;
1580
-
1581
- GTEST_DISALLOW_ASSIGN_(BothOfMatcher);
1582
- };
1583
-
1584
- // Implements the AnyOf(m1, m2) matcher for a particular argument type
1585
- // T. We do not nest it inside the AnyOfMatcher class template, as
1586
- // that will prevent different instantiations of AnyOfMatcher from
1587
- // sharing the same EitherOfMatcherImpl<T> class.
1588
- template <typename T>
1589
- class EitherOfMatcherImpl : public MatcherInterface<T> {
1590
- public:
1591
- EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
1592
- : matcher1_(matcher1), matcher2_(matcher2) {}
1593
-
1594
- virtual void DescribeTo(::std::ostream* os) const {
1595
- *os << "(";
1596
- matcher1_.DescribeTo(os);
1597
- *os << ") or (";
1598
- matcher2_.DescribeTo(os);
1599
- *os << ")";
1600
- }
1601
-
1602
- virtual void DescribeNegationTo(::std::ostream* os) const {
1603
- *os << "(";
1604
- matcher1_.DescribeNegationTo(os);
1605
- *os << ") and (";
1606
- matcher2_.DescribeNegationTo(os);
1607
- *os << ")";
1608
- }
1609
-
1610
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
1611
- // If either matcher1_ or matcher2_ matches x, we just need to
1612
- // explain why *one* of them matches.
1613
- StringMatchResultListener listener1;
1614
- if (matcher1_.MatchAndExplain(x, &listener1)) {
1615
- *listener << listener1.str();
1616
- return true;
1617
- }
1618
-
1619
- StringMatchResultListener listener2;
1620
- if (matcher2_.MatchAndExplain(x, &listener2)) {
1621
- *listener << listener2.str();
1622
- return true;
1623
- }
1624
-
1625
- // Otherwise we need to explain why *both* of them fail.
1626
- const internal::string s1 = listener1.str();
1627
- const internal::string s2 = listener2.str();
1628
-
1629
- if (s1 == "") {
1630
- *listener << s2;
1631
- } else {
1632
- *listener << s1;
1633
- if (s2 != "") {
1634
- *listener << ", and " << s2;
1635
- }
1636
- }
1637
- return false;
1638
- }
1639
-
1640
- private:
1641
- const Matcher<T> matcher1_;
1642
- const Matcher<T> matcher2_;
1643
-
1644
- GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl);
1645
- };
1646
-
1647
- #if GTEST_LANG_CXX11
1648
- // AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
1649
- template <typename... Args>
1650
- using AnyOfMatcher = VariadicMatcher<EitherOfMatcherImpl, Args...>;
1651
-
1652
- #endif // GTEST_LANG_CXX11
1653
-
1654
- // Used for implementing the AnyOf(m_1, ..., m_n) matcher, which
1655
- // matches a value that matches at least one of the matchers m_1, ...,
1656
- // and m_n.
1657
- template <typename Matcher1, typename Matcher2>
1658
- class EitherOfMatcher {
1659
- public:
1660
- EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2)
1661
- : matcher1_(matcher1), matcher2_(matcher2) {}
1662
-
1663
- // This template type conversion operator allows a
1664
- // EitherOfMatcher<Matcher1, Matcher2> object to match any type that
1665
- // both Matcher1 and Matcher2 can match.
1666
- template <typename T>
1667
- operator Matcher<T>() const {
1668
- return Matcher<T>(new EitherOfMatcherImpl<T>(
1669
- SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_)));
1670
- }
1671
-
1672
- private:
1673
- Matcher1 matcher1_;
1674
- Matcher2 matcher2_;
1675
-
1676
- GTEST_DISALLOW_ASSIGN_(EitherOfMatcher);
1677
- };
1678
-
1679
- // Used for implementing Truly(pred), which turns a predicate into a
1680
- // matcher.
1681
- template <typename Predicate>
1682
- class TrulyMatcher {
1683
- public:
1684
- explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}
1685
-
1686
- // This method template allows Truly(pred) to be used as a matcher
1687
- // for type T where T is the argument type of predicate 'pred'. The
1688
- // argument is passed by reference as the predicate may be
1689
- // interested in the address of the argument.
1690
- template <typename T>
1691
- bool MatchAndExplain(T& x, // NOLINT
1692
- MatchResultListener* /* listener */) const {
1693
- // Without the if-statement, MSVC sometimes warns about converting
1694
- // a value to bool (warning 4800).
1695
- //
1696
- // We cannot write 'return !!predicate_(x);' as that doesn't work
1697
- // when predicate_(x) returns a class convertible to bool but
1698
- // having no operator!().
1699
- if (predicate_(x))
1700
- return true;
1701
- return false;
1702
- }
1703
-
1704
- void DescribeTo(::std::ostream* os) const {
1705
- *os << "satisfies the given predicate";
1706
- }
1707
-
1708
- void DescribeNegationTo(::std::ostream* os) const {
1709
- *os << "doesn't satisfy the given predicate";
1710
- }
1711
-
1712
- private:
1713
- Predicate predicate_;
1714
-
1715
- GTEST_DISALLOW_ASSIGN_(TrulyMatcher);
1716
- };
1717
-
1718
- // Used for implementing Matches(matcher), which turns a matcher into
1719
- // a predicate.
1720
- template <typename M>
1721
- class MatcherAsPredicate {
1722
- public:
1723
- explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}
1724
-
1725
- // This template operator() allows Matches(m) to be used as a
1726
- // predicate on type T where m is a matcher on type T.
1727
- //
1728
- // The argument x is passed by reference instead of by value, as
1729
- // some matcher may be interested in its address (e.g. as in
1730
- // Matches(Ref(n))(x)).
1731
- template <typename T>
1732
- bool operator()(const T& x) const {
1733
- // We let matcher_ commit to a particular type here instead of
1734
- // when the MatcherAsPredicate object was constructed. This
1735
- // allows us to write Matches(m) where m is a polymorphic matcher
1736
- // (e.g. Eq(5)).
1737
- //
1738
- // If we write Matcher<T>(matcher_).Matches(x) here, it won't
1739
- // compile when matcher_ has type Matcher<const T&>; if we write
1740
- // Matcher<const T&>(matcher_).Matches(x) here, it won't compile
1741
- // when matcher_ has type Matcher<T>; if we just write
1742
- // matcher_.Matches(x), it won't compile when matcher_ is
1743
- // polymorphic, e.g. Eq(5).
1744
- //
1745
- // MatcherCast<const T&>() is necessary for making the code work
1746
- // in all of the above situations.
1747
- return MatcherCast<const T&>(matcher_).Matches(x);
1748
- }
1749
-
1750
- private:
1751
- M matcher_;
1752
-
1753
- GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate);
1754
- };
1755
-
1756
- // For implementing ASSERT_THAT() and EXPECT_THAT(). The template
1757
- // argument M must be a type that can be converted to a matcher.
1758
- template <typename M>
1759
- class PredicateFormatterFromMatcher {
1760
- public:
1761
- explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {}
1762
-
1763
- // This template () operator allows a PredicateFormatterFromMatcher
1764
- // object to act as a predicate-formatter suitable for using with
1765
- // Google Test's EXPECT_PRED_FORMAT1() macro.
1766
- template <typename T>
1767
- AssertionResult operator()(const char* value_text, const T& x) const {
1768
- // We convert matcher_ to a Matcher<const T&> *now* instead of
1769
- // when the PredicateFormatterFromMatcher object was constructed,
1770
- // as matcher_ may be polymorphic (e.g. NotNull()) and we won't
1771
- // know which type to instantiate it to until we actually see the
1772
- // type of x here.
1773
- //
1774
- // We write SafeMatcherCast<const T&>(matcher_) instead of
1775
- // Matcher<const T&>(matcher_), as the latter won't compile when
1776
- // matcher_ has type Matcher<T> (e.g. An<int>()).
1777
- // We don't write MatcherCast<const T&> either, as that allows
1778
- // potentially unsafe downcasting of the matcher argument.
1779
- const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
1780
- StringMatchResultListener listener;
1781
- if (MatchPrintAndExplain(x, matcher, &listener))
1782
- return AssertionSuccess();
1783
-
1784
- ::std::stringstream ss;
1785
- ss << "Value of: " << value_text << "\n"
1786
- << "Expected: ";
1787
- matcher.DescribeTo(&ss);
1788
- ss << "\n Actual: " << listener.str();
1789
- return AssertionFailure() << ss.str();
1790
- }
1791
-
1792
- private:
1793
- const M matcher_;
1794
-
1795
- GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher);
1796
- };
1797
-
1798
- // A helper function for converting a matcher to a predicate-formatter
1799
- // without the user needing to explicitly write the type. This is
1800
- // used for implementing ASSERT_THAT() and EXPECT_THAT().
1801
- template <typename M>
1802
- inline PredicateFormatterFromMatcher<M>
1803
- MakePredicateFormatterFromMatcher(const M& matcher) {
1804
- return PredicateFormatterFromMatcher<M>(matcher);
1805
- }
1806
-
1807
- // Implements the polymorphic floating point equality matcher, which matches
1808
- // two float values using ULP-based approximation or, optionally, a
1809
- // user-specified epsilon. The template is meant to be instantiated with
1810
- // FloatType being either float or double.
1811
- template <typename FloatType>
1812
- class FloatingEqMatcher {
1813
- public:
1814
- // Constructor for FloatingEqMatcher.
1815
- // The matcher's input will be compared with rhs. The matcher treats two
1816
- // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards,
1817
- // equality comparisons between NANs will always return false. We specify a
1818
- // negative max_abs_error_ term to indicate that ULP-based approximation will
1819
- // be used for comparison.
1820
- FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) :
1821
- rhs_(rhs), nan_eq_nan_(nan_eq_nan), max_abs_error_(-1) {
1822
- }
1823
-
1824
- // Constructor that supports a user-specified max_abs_error that will be used
1825
- // for comparison instead of ULP-based approximation. The max absolute
1826
- // should be non-negative.
1827
- FloatingEqMatcher(FloatType rhs, bool nan_eq_nan, FloatType max_abs_error) :
1828
- rhs_(rhs), nan_eq_nan_(nan_eq_nan), max_abs_error_(max_abs_error) {
1829
- GTEST_CHECK_(max_abs_error >= 0)
1830
- << ", where max_abs_error is" << max_abs_error;
1831
- }
1832
-
1833
- // Implements floating point equality matcher as a Matcher<T>.
1834
- template <typename T>
1835
- class Impl : public MatcherInterface<T> {
1836
- public:
1837
- Impl(FloatType rhs, bool nan_eq_nan, FloatType max_abs_error) :
1838
- rhs_(rhs), nan_eq_nan_(nan_eq_nan), max_abs_error_(max_abs_error) {}
1839
-
1840
- virtual bool MatchAndExplain(T value,
1841
- MatchResultListener* /* listener */) const {
1842
- const FloatingPoint<FloatType> lhs(value), rhs(rhs_);
1843
-
1844
- // Compares NaNs first, if nan_eq_nan_ is true.
1845
- if (lhs.is_nan() || rhs.is_nan()) {
1846
- if (lhs.is_nan() && rhs.is_nan()) {
1847
- return nan_eq_nan_;
1848
- }
1849
- // One is nan; the other is not nan.
1850
- return false;
1851
- }
1852
- if (HasMaxAbsError()) {
1853
- // We perform an equality check so that inf will match inf, regardless
1854
- // of error bounds. If the result of value - rhs_ would result in
1855
- // overflow or if either value is inf, the default result is infinity,
1856
- // which should only match if max_abs_error_ is also infinity.
1857
- return value == rhs_ || fabs(value - rhs_) <= max_abs_error_;
1858
- } else {
1859
- return lhs.AlmostEquals(rhs);
1860
- }
1861
- }
1862
-
1863
- virtual void DescribeTo(::std::ostream* os) const {
1864
- // os->precision() returns the previously set precision, which we
1865
- // store to restore the ostream to its original configuration
1866
- // after outputting.
1867
- const ::std::streamsize old_precision = os->precision(
1868
- ::std::numeric_limits<FloatType>::digits10 + 2);
1869
- if (FloatingPoint<FloatType>(rhs_).is_nan()) {
1870
- if (nan_eq_nan_) {
1871
- *os << "is NaN";
1872
- } else {
1873
- *os << "never matches";
1874
- }
1875
- } else {
1876
- *os << "is approximately " << rhs_;
1877
- if (HasMaxAbsError()) {
1878
- *os << " (absolute error <= " << max_abs_error_ << ")";
1879
- }
1880
- }
1881
- os->precision(old_precision);
1882
- }
1883
-
1884
- virtual void DescribeNegationTo(::std::ostream* os) const {
1885
- // As before, get original precision.
1886
- const ::std::streamsize old_precision = os->precision(
1887
- ::std::numeric_limits<FloatType>::digits10 + 2);
1888
- if (FloatingPoint<FloatType>(rhs_).is_nan()) {
1889
- if (nan_eq_nan_) {
1890
- *os << "isn't NaN";
1891
- } else {
1892
- *os << "is anything";
1893
- }
1894
- } else {
1895
- *os << "isn't approximately " << rhs_;
1896
- if (HasMaxAbsError()) {
1897
- *os << " (absolute error > " << max_abs_error_ << ")";
1898
- }
1899
- }
1900
- // Restore original precision.
1901
- os->precision(old_precision);
1902
- }
1903
-
1904
- private:
1905
- bool HasMaxAbsError() const {
1906
- return max_abs_error_ >= 0;
1907
- }
1908
-
1909
- const FloatType rhs_;
1910
- const bool nan_eq_nan_;
1911
- // max_abs_error will be used for value comparison when >= 0.
1912
- const FloatType max_abs_error_;
1913
-
1914
- GTEST_DISALLOW_ASSIGN_(Impl);
1915
- };
1916
-
1917
- // The following 3 type conversion operators allow FloatEq(rhs) and
1918
- // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a
1919
- // Matcher<const float&>, or a Matcher<float&>, but nothing else.
1920
- // (While Google's C++ coding style doesn't allow arguments passed
1921
- // by non-const reference, we may see them in code not conforming to
1922
- // the style. Therefore Google Mock needs to support them.)
1923
- operator Matcher<FloatType>() const {
1924
- return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_, max_abs_error_));
1925
- }
1926
-
1927
- operator Matcher<const FloatType&>() const {
1928
- return MakeMatcher(
1929
- new Impl<const FloatType&>(rhs_, nan_eq_nan_, max_abs_error_));
1930
- }
1931
-
1932
- operator Matcher<FloatType&>() const {
1933
- return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_, max_abs_error_));
1934
- }
1935
-
1936
- private:
1937
- const FloatType rhs_;
1938
- const bool nan_eq_nan_;
1939
- // max_abs_error will be used for value comparison when >= 0.
1940
- const FloatType max_abs_error_;
1941
-
1942
- GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher);
1943
- };
1944
-
1945
- // Implements the Pointee(m) matcher for matching a pointer whose
1946
- // pointee matches matcher m. The pointer can be either raw or smart.
1947
- template <typename InnerMatcher>
1948
- class PointeeMatcher {
1949
- public:
1950
- explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}
1951
-
1952
- // This type conversion operator template allows Pointee(m) to be
1953
- // used as a matcher for any pointer type whose pointee type is
1954
- // compatible with the inner matcher, where type Pointer can be
1955
- // either a raw pointer or a smart pointer.
1956
- //
1957
- // The reason we do this instead of relying on
1958
- // MakePolymorphicMatcher() is that the latter is not flexible
1959
- // enough for implementing the DescribeTo() method of Pointee().
1960
- template <typename Pointer>
1961
- operator Matcher<Pointer>() const {
1962
- return MakeMatcher(new Impl<Pointer>(matcher_));
1963
- }
1964
-
1965
- private:
1966
- // The monomorphic implementation that works for a particular pointer type.
1967
- template <typename Pointer>
1968
- class Impl : public MatcherInterface<Pointer> {
1969
- public:
1970
- typedef typename PointeeOf<GTEST_REMOVE_CONST_( // NOLINT
1971
- GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee;
1972
-
1973
- explicit Impl(const InnerMatcher& matcher)
1974
- : matcher_(MatcherCast<const Pointee&>(matcher)) {}
1975
-
1976
- virtual void DescribeTo(::std::ostream* os) const {
1977
- *os << "points to a value that ";
1978
- matcher_.DescribeTo(os);
1979
- }
1980
-
1981
- virtual void DescribeNegationTo(::std::ostream* os) const {
1982
- *os << "does not point to a value that ";
1983
- matcher_.DescribeTo(os);
1984
- }
1985
-
1986
- virtual bool MatchAndExplain(Pointer pointer,
1987
- MatchResultListener* listener) const {
1988
- if (GetRawPointer(pointer) == NULL)
1989
- return false;
1990
-
1991
- *listener << "which points to ";
1992
- return MatchPrintAndExplain(*pointer, matcher_, listener);
1993
- }
1994
-
1995
- private:
1996
- const Matcher<const Pointee&> matcher_;
1997
-
1998
- GTEST_DISALLOW_ASSIGN_(Impl);
1999
- };
2000
-
2001
- const InnerMatcher matcher_;
2002
-
2003
- GTEST_DISALLOW_ASSIGN_(PointeeMatcher);
2004
- };
2005
-
2006
- // Implements the Field() matcher for matching a field (i.e. member
2007
- // variable) of an object.
2008
- template <typename Class, typename FieldType>
2009
- class FieldMatcher {
2010
- public:
2011
- FieldMatcher(FieldType Class::*field,
2012
- const Matcher<const FieldType&>& matcher)
2013
- : field_(field), matcher_(matcher) {}
2014
-
2015
- void DescribeTo(::std::ostream* os) const {
2016
- *os << "is an object whose given field ";
2017
- matcher_.DescribeTo(os);
2018
- }
2019
-
2020
- void DescribeNegationTo(::std::ostream* os) const {
2021
- *os << "is an object whose given field ";
2022
- matcher_.DescribeNegationTo(os);
2023
- }
2024
-
2025
- template <typename T>
2026
- bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
2027
- return MatchAndExplainImpl(
2028
- typename ::testing::internal::
2029
- is_pointer<GTEST_REMOVE_CONST_(T)>::type(),
2030
- value, listener);
2031
- }
2032
-
2033
- private:
2034
- // The first argument of MatchAndExplainImpl() is needed to help
2035
- // Symbian's C++ compiler choose which overload to use. Its type is
2036
- // true_type iff the Field() matcher is used to match a pointer.
2037
- bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
2038
- MatchResultListener* listener) const {
2039
- *listener << "whose given field is ";
2040
- return MatchPrintAndExplain(obj.*field_, matcher_, listener);
2041
- }
2042
-
2043
- bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
2044
- MatchResultListener* listener) const {
2045
- if (p == NULL)
2046
- return false;
2047
-
2048
- *listener << "which points to an object ";
2049
- // Since *p has a field, it must be a class/struct/union type and
2050
- // thus cannot be a pointer. Therefore we pass false_type() as
2051
- // the first argument.
2052
- return MatchAndExplainImpl(false_type(), *p, listener);
2053
- }
2054
-
2055
- const FieldType Class::*field_;
2056
- const Matcher<const FieldType&> matcher_;
2057
-
2058
- GTEST_DISALLOW_ASSIGN_(FieldMatcher);
2059
- };
2060
-
2061
- // Implements the Property() matcher for matching a property
2062
- // (i.e. return value of a getter method) of an object.
2063
- template <typename Class, typename PropertyType>
2064
- class PropertyMatcher {
2065
- public:
2066
- // The property may have a reference type, so 'const PropertyType&'
2067
- // may cause double references and fail to compile. That's why we
2068
- // need GTEST_REFERENCE_TO_CONST, which works regardless of
2069
- // PropertyType being a reference or not.
2070
- typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty;
2071
-
2072
- PropertyMatcher(PropertyType (Class::*property)() const,
2073
- const Matcher<RefToConstProperty>& matcher)
2074
- : property_(property), matcher_(matcher) {}
2075
-
2076
- void DescribeTo(::std::ostream* os) const {
2077
- *os << "is an object whose given property ";
2078
- matcher_.DescribeTo(os);
2079
- }
2080
-
2081
- void DescribeNegationTo(::std::ostream* os) const {
2082
- *os << "is an object whose given property ";
2083
- matcher_.DescribeNegationTo(os);
2084
- }
2085
-
2086
- template <typename T>
2087
- bool MatchAndExplain(const T&value, MatchResultListener* listener) const {
2088
- return MatchAndExplainImpl(
2089
- typename ::testing::internal::
2090
- is_pointer<GTEST_REMOVE_CONST_(T)>::type(),
2091
- value, listener);
2092
- }
2093
-
2094
- private:
2095
- // The first argument of MatchAndExplainImpl() is needed to help
2096
- // Symbian's C++ compiler choose which overload to use. Its type is
2097
- // true_type iff the Property() matcher is used to match a pointer.
2098
- bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
2099
- MatchResultListener* listener) const {
2100
- *listener << "whose given property is ";
2101
- // Cannot pass the return value (for example, int) to MatchPrintAndExplain,
2102
- // which takes a non-const reference as argument.
2103
- RefToConstProperty result = (obj.*property_)();
2104
- return MatchPrintAndExplain(result, matcher_, listener);
2105
- }
2106
-
2107
- bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
2108
- MatchResultListener* listener) const {
2109
- if (p == NULL)
2110
- return false;
2111
-
2112
- *listener << "which points to an object ";
2113
- // Since *p has a property method, it must be a class/struct/union
2114
- // type and thus cannot be a pointer. Therefore we pass
2115
- // false_type() as the first argument.
2116
- return MatchAndExplainImpl(false_type(), *p, listener);
2117
- }
2118
-
2119
- PropertyType (Class::*property_)() const;
2120
- const Matcher<RefToConstProperty> matcher_;
2121
-
2122
- GTEST_DISALLOW_ASSIGN_(PropertyMatcher);
2123
- };
2124
-
2125
- // Type traits specifying various features of different functors for ResultOf.
2126
- // The default template specifies features for functor objects.
2127
- // Functor classes have to typedef argument_type and result_type
2128
- // to be compatible with ResultOf.
2129
- template <typename Functor>
2130
- struct CallableTraits {
2131
- typedef typename Functor::result_type ResultType;
2132
- typedef Functor StorageType;
2133
-
2134
- static void CheckIsValid(Functor /* functor */) {}
2135
- template <typename T>
2136
- static ResultType Invoke(Functor f, T arg) { return f(arg); }
2137
- };
2138
-
2139
- // Specialization for function pointers.
2140
- template <typename ArgType, typename ResType>
2141
- struct CallableTraits<ResType(*)(ArgType)> {
2142
- typedef ResType ResultType;
2143
- typedef ResType(*StorageType)(ArgType);
2144
-
2145
- static void CheckIsValid(ResType(*f)(ArgType)) {
2146
- GTEST_CHECK_(f != NULL)
2147
- << "NULL function pointer is passed into ResultOf().";
2148
- }
2149
- template <typename T>
2150
- static ResType Invoke(ResType(*f)(ArgType), T arg) {
2151
- return (*f)(arg);
2152
- }
2153
- };
2154
-
2155
- // Implements the ResultOf() matcher for matching a return value of a
2156
- // unary function of an object.
2157
- template <typename Callable>
2158
- class ResultOfMatcher {
2159
- public:
2160
- typedef typename CallableTraits<Callable>::ResultType ResultType;
2161
-
2162
- ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher)
2163
- : callable_(callable), matcher_(matcher) {
2164
- CallableTraits<Callable>::CheckIsValid(callable_);
2165
- }
2166
-
2167
- template <typename T>
2168
- operator Matcher<T>() const {
2169
- return Matcher<T>(new Impl<T>(callable_, matcher_));
2170
- }
2171
-
2172
- private:
2173
- typedef typename CallableTraits<Callable>::StorageType CallableStorageType;
2174
-
2175
- template <typename T>
2176
- class Impl : public MatcherInterface<T> {
2177
- public:
2178
- Impl(CallableStorageType callable, const Matcher<ResultType>& matcher)
2179
- : callable_(callable), matcher_(matcher) {}
2180
-
2181
- virtual void DescribeTo(::std::ostream* os) const {
2182
- *os << "is mapped by the given callable to a value that ";
2183
- matcher_.DescribeTo(os);
2184
- }
2185
-
2186
- virtual void DescribeNegationTo(::std::ostream* os) const {
2187
- *os << "is mapped by the given callable to a value that ";
2188
- matcher_.DescribeNegationTo(os);
2189
- }
2190
-
2191
- virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const {
2192
- *listener << "which is mapped by the given callable to ";
2193
- // Cannot pass the return value (for example, int) to
2194
- // MatchPrintAndExplain, which takes a non-const reference as argument.
2195
- ResultType result =
2196
- CallableTraits<Callable>::template Invoke<T>(callable_, obj);
2197
- return MatchPrintAndExplain(result, matcher_, listener);
2198
- }
2199
-
2200
- private:
2201
- // Functors often define operator() as non-const method even though
2202
- // they are actualy stateless. But we need to use them even when
2203
- // 'this' is a const pointer. It's the user's responsibility not to
2204
- // use stateful callables with ResultOf(), which does't guarantee
2205
- // how many times the callable will be invoked.
2206
- mutable CallableStorageType callable_;
2207
- const Matcher<ResultType> matcher_;
2208
-
2209
- GTEST_DISALLOW_ASSIGN_(Impl);
2210
- }; // class Impl
2211
-
2212
- const CallableStorageType callable_;
2213
- const Matcher<ResultType> matcher_;
2214
-
2215
- GTEST_DISALLOW_ASSIGN_(ResultOfMatcher);
2216
- };
2217
-
2218
- // Implements a matcher that checks the size of an STL-style container.
2219
- template <typename SizeMatcher>
2220
- class SizeIsMatcher {
2221
- public:
2222
- explicit SizeIsMatcher(const SizeMatcher& size_matcher)
2223
- : size_matcher_(size_matcher) {
2224
- }
2225
-
2226
- template <typename Container>
2227
- operator Matcher<Container>() const {
2228
- return MakeMatcher(new Impl<Container>(size_matcher_));
2229
- }
2230
-
2231
- template <typename Container>
2232
- class Impl : public MatcherInterface<Container> {
2233
- public:
2234
- typedef internal::StlContainerView<
2235
- GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;
2236
- typedef typename ContainerView::type::size_type SizeType;
2237
- explicit Impl(const SizeMatcher& size_matcher)
2238
- : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}
2239
-
2240
- virtual void DescribeTo(::std::ostream* os) const {
2241
- *os << "size ";
2242
- size_matcher_.DescribeTo(os);
2243
- }
2244
- virtual void DescribeNegationTo(::std::ostream* os) const {
2245
- *os << "size ";
2246
- size_matcher_.DescribeNegationTo(os);
2247
- }
2248
-
2249
- virtual bool MatchAndExplain(Container container,
2250
- MatchResultListener* listener) const {
2251
- SizeType size = container.size();
2252
- StringMatchResultListener size_listener;
2253
- const bool result = size_matcher_.MatchAndExplain(size, &size_listener);
2254
- *listener
2255
- << "whose size " << size << (result ? " matches" : " doesn't match");
2256
- PrintIfNotEmpty(size_listener.str(), listener->stream());
2257
- return result;
2258
- }
2259
-
2260
- private:
2261
- const Matcher<SizeType> size_matcher_;
2262
- GTEST_DISALLOW_ASSIGN_(Impl);
2263
- };
2264
-
2265
- private:
2266
- const SizeMatcher size_matcher_;
2267
- GTEST_DISALLOW_ASSIGN_(SizeIsMatcher);
2268
- };
2269
-
2270
- // Implements an equality matcher for any STL-style container whose elements
2271
- // support ==. This matcher is like Eq(), but its failure explanations provide
2272
- // more detailed information that is useful when the container is used as a set.
2273
- // The failure message reports elements that are in one of the operands but not
2274
- // the other. The failure messages do not report duplicate or out-of-order
2275
- // elements in the containers (which don't properly matter to sets, but can
2276
- // occur if the containers are vectors or lists, for example).
2277
- //
2278
- // Uses the container's const_iterator, value_type, operator ==,
2279
- // begin(), and end().
2280
- template <typename Container>
2281
- class ContainerEqMatcher {
2282
- public:
2283
- typedef internal::StlContainerView<Container> View;
2284
- typedef typename View::type StlContainer;
2285
- typedef typename View::const_reference StlContainerReference;
2286
-
2287
- // We make a copy of rhs in case the elements in it are modified
2288
- // after this matcher is created.
2289
- explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) {
2290
- // Makes sure the user doesn't instantiate this class template
2291
- // with a const or reference type.
2292
- (void)testing::StaticAssertTypeEq<Container,
2293
- GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>();
2294
- }
2295
-
2296
- void DescribeTo(::std::ostream* os) const {
2297
- *os << "equals ";
2298
- UniversalPrint(rhs_, os);
2299
- }
2300
- void DescribeNegationTo(::std::ostream* os) const {
2301
- *os << "does not equal ";
2302
- UniversalPrint(rhs_, os);
2303
- }
2304
-
2305
- template <typename LhsContainer>
2306
- bool MatchAndExplain(const LhsContainer& lhs,
2307
- MatchResultListener* listener) const {
2308
- // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug
2309
- // that causes LhsContainer to be a const type sometimes.
2310
- typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)>
2311
- LhsView;
2312
- typedef typename LhsView::type LhsStlContainer;
2313
- StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2314
- if (lhs_stl_container == rhs_)
2315
- return true;
2316
-
2317
- ::std::ostream* const os = listener->stream();
2318
- if (os != NULL) {
2319
- // Something is different. Check for extra values first.
2320
- bool printed_header = false;
2321
- for (typename LhsStlContainer::const_iterator it =
2322
- lhs_stl_container.begin();
2323
- it != lhs_stl_container.end(); ++it) {
2324
- if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) ==
2325
- rhs_.end()) {
2326
- if (printed_header) {
2327
- *os << ", ";
2328
- } else {
2329
- *os << "which has these unexpected elements: ";
2330
- printed_header = true;
2331
- }
2332
- UniversalPrint(*it, os);
2333
- }
2334
- }
2335
-
2336
- // Now check for missing values.
2337
- bool printed_header2 = false;
2338
- for (typename StlContainer::const_iterator it = rhs_.begin();
2339
- it != rhs_.end(); ++it) {
2340
- if (internal::ArrayAwareFind(
2341
- lhs_stl_container.begin(), lhs_stl_container.end(), *it) ==
2342
- lhs_stl_container.end()) {
2343
- if (printed_header2) {
2344
- *os << ", ";
2345
- } else {
2346
- *os << (printed_header ? ",\nand" : "which")
2347
- << " doesn't have these expected elements: ";
2348
- printed_header2 = true;
2349
- }
2350
- UniversalPrint(*it, os);
2351
- }
2352
- }
2353
- }
2354
-
2355
- return false;
2356
- }
2357
-
2358
- private:
2359
- const StlContainer rhs_;
2360
-
2361
- GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
2362
- };
2363
-
2364
- // A comparator functor that uses the < operator to compare two values.
2365
- struct LessComparator {
2366
- template <typename T, typename U>
2367
- bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; }
2368
- };
2369
-
2370
- // Implements WhenSortedBy(comparator, container_matcher).
2371
- template <typename Comparator, typename ContainerMatcher>
2372
- class WhenSortedByMatcher {
2373
- public:
2374
- WhenSortedByMatcher(const Comparator& comparator,
2375
- const ContainerMatcher& matcher)
2376
- : comparator_(comparator), matcher_(matcher) {}
2377
-
2378
- template <typename LhsContainer>
2379
- operator Matcher<LhsContainer>() const {
2380
- return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));
2381
- }
2382
-
2383
- template <typename LhsContainer>
2384
- class Impl : public MatcherInterface<LhsContainer> {
2385
- public:
2386
- typedef internal::StlContainerView<
2387
- GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
2388
- typedef typename LhsView::type LhsStlContainer;
2389
- typedef typename LhsView::const_reference LhsStlContainerReference;
2390
- // Transforms std::pair<const Key, Value> into std::pair<Key, Value>
2391
- // so that we can match associative containers.
2392
- typedef typename RemoveConstFromKey<
2393
- typename LhsStlContainer::value_type>::type LhsValue;
2394
-
2395
- Impl(const Comparator& comparator, const ContainerMatcher& matcher)
2396
- : comparator_(comparator), matcher_(matcher) {}
2397
-
2398
- virtual void DescribeTo(::std::ostream* os) const {
2399
- *os << "(when sorted) ";
2400
- matcher_.DescribeTo(os);
2401
- }
2402
-
2403
- virtual void DescribeNegationTo(::std::ostream* os) const {
2404
- *os << "(when sorted) ";
2405
- matcher_.DescribeNegationTo(os);
2406
- }
2407
-
2408
- virtual bool MatchAndExplain(LhsContainer lhs,
2409
- MatchResultListener* listener) const {
2410
- LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2411
- ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),
2412
- lhs_stl_container.end());
2413
- ::std::sort(
2414
- sorted_container.begin(), sorted_container.end(), comparator_);
2415
-
2416
- if (!listener->IsInterested()) {
2417
- // If the listener is not interested, we do not need to
2418
- // construct the inner explanation.
2419
- return matcher_.Matches(sorted_container);
2420
- }
2421
-
2422
- *listener << "which is ";
2423
- UniversalPrint(sorted_container, listener->stream());
2424
- *listener << " when sorted";
2425
-
2426
- StringMatchResultListener inner_listener;
2427
- const bool match = matcher_.MatchAndExplain(sorted_container,
2428
- &inner_listener);
2429
- PrintIfNotEmpty(inner_listener.str(), listener->stream());
2430
- return match;
2431
- }
2432
-
2433
- private:
2434
- const Comparator comparator_;
2435
- const Matcher<const ::std::vector<LhsValue>&> matcher_;
2436
-
2437
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
2438
- };
2439
-
2440
- private:
2441
- const Comparator comparator_;
2442
- const ContainerMatcher matcher_;
2443
-
2444
- GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher);
2445
- };
2446
-
2447
- // Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
2448
- // must be able to be safely cast to Matcher<tuple<const T1&, const
2449
- // T2&> >, where T1 and T2 are the types of elements in the LHS
2450
- // container and the RHS container respectively.
2451
- template <typename TupleMatcher, typename RhsContainer>
2452
- class PointwiseMatcher {
2453
- public:
2454
- typedef internal::StlContainerView<RhsContainer> RhsView;
2455
- typedef typename RhsView::type RhsStlContainer;
2456
- typedef typename RhsStlContainer::value_type RhsValue;
2457
-
2458
- // Like ContainerEq, we make a copy of rhs in case the elements in
2459
- // it are modified after this matcher is created.
2460
- PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)
2461
- : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {
2462
- // Makes sure the user doesn't instantiate this class template
2463
- // with a const or reference type.
2464
- (void)testing::StaticAssertTypeEq<RhsContainer,
2465
- GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>();
2466
- }
2467
-
2468
- template <typename LhsContainer>
2469
- operator Matcher<LhsContainer>() const {
2470
- return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_));
2471
- }
2472
-
2473
- template <typename LhsContainer>
2474
- class Impl : public MatcherInterface<LhsContainer> {
2475
- public:
2476
- typedef internal::StlContainerView<
2477
- GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
2478
- typedef typename LhsView::type LhsStlContainer;
2479
- typedef typename LhsView::const_reference LhsStlContainerReference;
2480
- typedef typename LhsStlContainer::value_type LhsValue;
2481
- // We pass the LHS value and the RHS value to the inner matcher by
2482
- // reference, as they may be expensive to copy. We must use tuple
2483
- // instead of pair here, as a pair cannot hold references (C++ 98,
2484
- // 20.2.2 [lib.pairs]).
2485
- typedef ::std::tr1::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;
2486
-
2487
- Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)
2488
- // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.
2489
- : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),
2490
- rhs_(rhs) {}
2491
-
2492
- virtual void DescribeTo(::std::ostream* os) const {
2493
- *os << "contains " << rhs_.size()
2494
- << " values, where each value and its corresponding value in ";
2495
- UniversalPrinter<RhsStlContainer>::Print(rhs_, os);
2496
- *os << " ";
2497
- mono_tuple_matcher_.DescribeTo(os);
2498
- }
2499
- virtual void DescribeNegationTo(::std::ostream* os) const {
2500
- *os << "doesn't contain exactly " << rhs_.size()
2501
- << " values, or contains a value x at some index i"
2502
- << " where x and the i-th value of ";
2503
- UniversalPrint(rhs_, os);
2504
- *os << " ";
2505
- mono_tuple_matcher_.DescribeNegationTo(os);
2506
- }
2507
-
2508
- virtual bool MatchAndExplain(LhsContainer lhs,
2509
- MatchResultListener* listener) const {
2510
- LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2511
- const size_t actual_size = lhs_stl_container.size();
2512
- if (actual_size != rhs_.size()) {
2513
- *listener << "which contains " << actual_size << " values";
2514
- return false;
2515
- }
2516
-
2517
- typename LhsStlContainer::const_iterator left = lhs_stl_container.begin();
2518
- typename RhsStlContainer::const_iterator right = rhs_.begin();
2519
- for (size_t i = 0; i != actual_size; ++i, ++left, ++right) {
2520
- const InnerMatcherArg value_pair(*left, *right);
2521
-
2522
- if (listener->IsInterested()) {
2523
- StringMatchResultListener inner_listener;
2524
- if (!mono_tuple_matcher_.MatchAndExplain(
2525
- value_pair, &inner_listener)) {
2526
- *listener << "where the value pair (";
2527
- UniversalPrint(*left, listener->stream());
2528
- *listener << ", ";
2529
- UniversalPrint(*right, listener->stream());
2530
- *listener << ") at index #" << i << " don't match";
2531
- PrintIfNotEmpty(inner_listener.str(), listener->stream());
2532
- return false;
2533
- }
2534
- } else {
2535
- if (!mono_tuple_matcher_.Matches(value_pair))
2536
- return false;
2537
- }
2538
- }
2539
-
2540
- return true;
2541
- }
2542
-
2543
- private:
2544
- const Matcher<InnerMatcherArg> mono_tuple_matcher_;
2545
- const RhsStlContainer rhs_;
2546
-
2547
- GTEST_DISALLOW_ASSIGN_(Impl);
2548
- };
2549
-
2550
- private:
2551
- const TupleMatcher tuple_matcher_;
2552
- const RhsStlContainer rhs_;
2553
-
2554
- GTEST_DISALLOW_ASSIGN_(PointwiseMatcher);
2555
- };
2556
-
2557
- // Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
2558
- template <typename Container>
2559
- class QuantifierMatcherImpl : public MatcherInterface<Container> {
2560
- public:
2561
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
2562
- typedef StlContainerView<RawContainer> View;
2563
- typedef typename View::type StlContainer;
2564
- typedef typename View::const_reference StlContainerReference;
2565
- typedef typename StlContainer::value_type Element;
2566
-
2567
- template <typename InnerMatcher>
2568
- explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)
2569
- : inner_matcher_(
2570
- testing::SafeMatcherCast<const Element&>(inner_matcher)) {}
2571
-
2572
- // Checks whether:
2573
- // * All elements in the container match, if all_elements_should_match.
2574
- // * Any element in the container matches, if !all_elements_should_match.
2575
- bool MatchAndExplainImpl(bool all_elements_should_match,
2576
- Container container,
2577
- MatchResultListener* listener) const {
2578
- StlContainerReference stl_container = View::ConstReference(container);
2579
- size_t i = 0;
2580
- for (typename StlContainer::const_iterator it = stl_container.begin();
2581
- it != stl_container.end(); ++it, ++i) {
2582
- StringMatchResultListener inner_listener;
2583
- const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);
2584
-
2585
- if (matches != all_elements_should_match) {
2586
- *listener << "whose element #" << i
2587
- << (matches ? " matches" : " doesn't match");
2588
- PrintIfNotEmpty(inner_listener.str(), listener->stream());
2589
- return !all_elements_should_match;
2590
- }
2591
- }
2592
- return all_elements_should_match;
2593
- }
2594
-
2595
- protected:
2596
- const Matcher<const Element&> inner_matcher_;
2597
-
2598
- GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl);
2599
- };
2600
-
2601
- // Implements Contains(element_matcher) for the given argument type Container.
2602
- // Symmetric to EachMatcherImpl.
2603
- template <typename Container>
2604
- class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {
2605
- public:
2606
- template <typename InnerMatcher>
2607
- explicit ContainsMatcherImpl(InnerMatcher inner_matcher)
2608
- : QuantifierMatcherImpl<Container>(inner_matcher) {}
2609
-
2610
- // Describes what this matcher does.
2611
- virtual void DescribeTo(::std::ostream* os) const {
2612
- *os << "contains at least one element that ";
2613
- this->inner_matcher_.DescribeTo(os);
2614
- }
2615
-
2616
- virtual void DescribeNegationTo(::std::ostream* os) const {
2617
- *os << "doesn't contain any element that ";
2618
- this->inner_matcher_.DescribeTo(os);
2619
- }
2620
-
2621
- virtual bool MatchAndExplain(Container container,
2622
- MatchResultListener* listener) const {
2623
- return this->MatchAndExplainImpl(false, container, listener);
2624
- }
2625
-
2626
- private:
2627
- GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl);
2628
- };
2629
-
2630
- // Implements Each(element_matcher) for the given argument type Container.
2631
- // Symmetric to ContainsMatcherImpl.
2632
- template <typename Container>
2633
- class EachMatcherImpl : public QuantifierMatcherImpl<Container> {
2634
- public:
2635
- template <typename InnerMatcher>
2636
- explicit EachMatcherImpl(InnerMatcher inner_matcher)
2637
- : QuantifierMatcherImpl<Container>(inner_matcher) {}
2638
-
2639
- // Describes what this matcher does.
2640
- virtual void DescribeTo(::std::ostream* os) const {
2641
- *os << "only contains elements that ";
2642
- this->inner_matcher_.DescribeTo(os);
2643
- }
2644
-
2645
- virtual void DescribeNegationTo(::std::ostream* os) const {
2646
- *os << "contains some element that ";
2647
- this->inner_matcher_.DescribeNegationTo(os);
2648
- }
2649
-
2650
- virtual bool MatchAndExplain(Container container,
2651
- MatchResultListener* listener) const {
2652
- return this->MatchAndExplainImpl(true, container, listener);
2653
- }
2654
-
2655
- private:
2656
- GTEST_DISALLOW_ASSIGN_(EachMatcherImpl);
2657
- };
2658
-
2659
- // Implements polymorphic Contains(element_matcher).
2660
- template <typename M>
2661
- class ContainsMatcher {
2662
- public:
2663
- explicit ContainsMatcher(M m) : inner_matcher_(m) {}
2664
-
2665
- template <typename Container>
2666
- operator Matcher<Container>() const {
2667
- return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_));
2668
- }
2669
-
2670
- private:
2671
- const M inner_matcher_;
2672
-
2673
- GTEST_DISALLOW_ASSIGN_(ContainsMatcher);
2674
- };
2675
-
2676
- // Implements polymorphic Each(element_matcher).
2677
- template <typename M>
2678
- class EachMatcher {
2679
- public:
2680
- explicit EachMatcher(M m) : inner_matcher_(m) {}
2681
-
2682
- template <typename Container>
2683
- operator Matcher<Container>() const {
2684
- return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_));
2685
- }
2686
-
2687
- private:
2688
- const M inner_matcher_;
2689
-
2690
- GTEST_DISALLOW_ASSIGN_(EachMatcher);
2691
- };
2692
-
2693
- // Implements Key(inner_matcher) for the given argument pair type.
2694
- // Key(inner_matcher) matches an std::pair whose 'first' field matches
2695
- // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
2696
- // std::map that contains at least one element whose key is >= 5.
2697
- template <typename PairType>
2698
- class KeyMatcherImpl : public MatcherInterface<PairType> {
2699
- public:
2700
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
2701
- typedef typename RawPairType::first_type KeyType;
2702
-
2703
- template <typename InnerMatcher>
2704
- explicit KeyMatcherImpl(InnerMatcher inner_matcher)
2705
- : inner_matcher_(
2706
- testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {
2707
- }
2708
-
2709
- // Returns true iff 'key_value.first' (the key) matches the inner matcher.
2710
- virtual bool MatchAndExplain(PairType key_value,
2711
- MatchResultListener* listener) const {
2712
- StringMatchResultListener inner_listener;
2713
- const bool match = inner_matcher_.MatchAndExplain(key_value.first,
2714
- &inner_listener);
2715
- const internal::string explanation = inner_listener.str();
2716
- if (explanation != "") {
2717
- *listener << "whose first field is a value " << explanation;
2718
- }
2719
- return match;
2720
- }
2721
-
2722
- // Describes what this matcher does.
2723
- virtual void DescribeTo(::std::ostream* os) const {
2724
- *os << "has a key that ";
2725
- inner_matcher_.DescribeTo(os);
2726
- }
2727
-
2728
- // Describes what the negation of this matcher does.
2729
- virtual void DescribeNegationTo(::std::ostream* os) const {
2730
- *os << "doesn't have a key that ";
2731
- inner_matcher_.DescribeTo(os);
2732
- }
2733
-
2734
- private:
2735
- const Matcher<const KeyType&> inner_matcher_;
2736
-
2737
- GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl);
2738
- };
2739
-
2740
- // Implements polymorphic Key(matcher_for_key).
2741
- template <typename M>
2742
- class KeyMatcher {
2743
- public:
2744
- explicit KeyMatcher(M m) : matcher_for_key_(m) {}
2745
-
2746
- template <typename PairType>
2747
- operator Matcher<PairType>() const {
2748
- return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_));
2749
- }
2750
-
2751
- private:
2752
- const M matcher_for_key_;
2753
-
2754
- GTEST_DISALLOW_ASSIGN_(KeyMatcher);
2755
- };
2756
-
2757
- // Implements Pair(first_matcher, second_matcher) for the given argument pair
2758
- // type with its two matchers. See Pair() function below.
2759
- template <typename PairType>
2760
- class PairMatcherImpl : public MatcherInterface<PairType> {
2761
- public:
2762
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
2763
- typedef typename RawPairType::first_type FirstType;
2764
- typedef typename RawPairType::second_type SecondType;
2765
-
2766
- template <typename FirstMatcher, typename SecondMatcher>
2767
- PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)
2768
- : first_matcher_(
2769
- testing::SafeMatcherCast<const FirstType&>(first_matcher)),
2770
- second_matcher_(
2771
- testing::SafeMatcherCast<const SecondType&>(second_matcher)) {
2772
- }
2773
-
2774
- // Describes what this matcher does.
2775
- virtual void DescribeTo(::std::ostream* os) const {
2776
- *os << "has a first field that ";
2777
- first_matcher_.DescribeTo(os);
2778
- *os << ", and has a second field that ";
2779
- second_matcher_.DescribeTo(os);
2780
- }
2781
-
2782
- // Describes what the negation of this matcher does.
2783
- virtual void DescribeNegationTo(::std::ostream* os) const {
2784
- *os << "has a first field that ";
2785
- first_matcher_.DescribeNegationTo(os);
2786
- *os << ", or has a second field that ";
2787
- second_matcher_.DescribeNegationTo(os);
2788
- }
2789
-
2790
- // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'
2791
- // matches second_matcher.
2792
- virtual bool MatchAndExplain(PairType a_pair,
2793
- MatchResultListener* listener) const {
2794
- if (!listener->IsInterested()) {
2795
- // If the listener is not interested, we don't need to construct the
2796
- // explanation.
2797
- return first_matcher_.Matches(a_pair.first) &&
2798
- second_matcher_.Matches(a_pair.second);
2799
- }
2800
- StringMatchResultListener first_inner_listener;
2801
- if (!first_matcher_.MatchAndExplain(a_pair.first,
2802
- &first_inner_listener)) {
2803
- *listener << "whose first field does not match";
2804
- PrintIfNotEmpty(first_inner_listener.str(), listener->stream());
2805
- return false;
2806
- }
2807
- StringMatchResultListener second_inner_listener;
2808
- if (!second_matcher_.MatchAndExplain(a_pair.second,
2809
- &second_inner_listener)) {
2810
- *listener << "whose second field does not match";
2811
- PrintIfNotEmpty(second_inner_listener.str(), listener->stream());
2812
- return false;
2813
- }
2814
- ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),
2815
- listener);
2816
- return true;
2817
- }
2818
-
2819
- private:
2820
- void ExplainSuccess(const internal::string& first_explanation,
2821
- const internal::string& second_explanation,
2822
- MatchResultListener* listener) const {
2823
- *listener << "whose both fields match";
2824
- if (first_explanation != "") {
2825
- *listener << ", where the first field is a value " << first_explanation;
2826
- }
2827
- if (second_explanation != "") {
2828
- *listener << ", ";
2829
- if (first_explanation != "") {
2830
- *listener << "and ";
2831
- } else {
2832
- *listener << "where ";
2833
- }
2834
- *listener << "the second field is a value " << second_explanation;
2835
- }
2836
- }
2837
-
2838
- const Matcher<const FirstType&> first_matcher_;
2839
- const Matcher<const SecondType&> second_matcher_;
2840
-
2841
- GTEST_DISALLOW_ASSIGN_(PairMatcherImpl);
2842
- };
2843
-
2844
- // Implements polymorphic Pair(first_matcher, second_matcher).
2845
- template <typename FirstMatcher, typename SecondMatcher>
2846
- class PairMatcher {
2847
- public:
2848
- PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)
2849
- : first_matcher_(first_matcher), second_matcher_(second_matcher) {}
2850
-
2851
- template <typename PairType>
2852
- operator Matcher<PairType> () const {
2853
- return MakeMatcher(
2854
- new PairMatcherImpl<PairType>(
2855
- first_matcher_, second_matcher_));
2856
- }
2857
-
2858
- private:
2859
- const FirstMatcher first_matcher_;
2860
- const SecondMatcher second_matcher_;
2861
-
2862
- GTEST_DISALLOW_ASSIGN_(PairMatcher);
2863
- };
2864
-
2865
- // Implements ElementsAre() and ElementsAreArray().
2866
- template <typename Container>
2867
- class ElementsAreMatcherImpl : public MatcherInterface<Container> {
2868
- public:
2869
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
2870
- typedef internal::StlContainerView<RawContainer> View;
2871
- typedef typename View::type StlContainer;
2872
- typedef typename View::const_reference StlContainerReference;
2873
- typedef typename StlContainer::value_type Element;
2874
-
2875
- // Constructs the matcher from a sequence of element values or
2876
- // element matchers.
2877
- template <typename InputIter>
2878
- ElementsAreMatcherImpl(InputIter first, InputIter last) {
2879
- while (first != last) {
2880
- matchers_.push_back(MatcherCast<const Element&>(*first++));
2881
- }
2882
- }
2883
-
2884
- // Describes what this matcher does.
2885
- virtual void DescribeTo(::std::ostream* os) const {
2886
- if (count() == 0) {
2887
- *os << "is empty";
2888
- } else if (count() == 1) {
2889
- *os << "has 1 element that ";
2890
- matchers_[0].DescribeTo(os);
2891
- } else {
2892
- *os << "has " << Elements(count()) << " where\n";
2893
- for (size_t i = 0; i != count(); ++i) {
2894
- *os << "element #" << i << " ";
2895
- matchers_[i].DescribeTo(os);
2896
- if (i + 1 < count()) {
2897
- *os << ",\n";
2898
- }
2899
- }
2900
- }
2901
- }
2902
-
2903
- // Describes what the negation of this matcher does.
2904
- virtual void DescribeNegationTo(::std::ostream* os) const {
2905
- if (count() == 0) {
2906
- *os << "isn't empty";
2907
- return;
2908
- }
2909
-
2910
- *os << "doesn't have " << Elements(count()) << ", or\n";
2911
- for (size_t i = 0; i != count(); ++i) {
2912
- *os << "element #" << i << " ";
2913
- matchers_[i].DescribeNegationTo(os);
2914
- if (i + 1 < count()) {
2915
- *os << ", or\n";
2916
- }
2917
- }
2918
- }
2919
-
2920
- virtual bool MatchAndExplain(Container container,
2921
- MatchResultListener* listener) const {
2922
- // To work with stream-like "containers", we must only walk
2923
- // through the elements in one pass.
2924
-
2925
- const bool listener_interested = listener->IsInterested();
2926
-
2927
- // explanations[i] is the explanation of the element at index i.
2928
- ::std::vector<internal::string> explanations(count());
2929
- StlContainerReference stl_container = View::ConstReference(container);
2930
- typename StlContainer::const_iterator it = stl_container.begin();
2931
- size_t exam_pos = 0;
2932
- bool mismatch_found = false; // Have we found a mismatched element yet?
2933
-
2934
- // Go through the elements and matchers in pairs, until we reach
2935
- // the end of either the elements or the matchers, or until we find a
2936
- // mismatch.
2937
- for (; it != stl_container.end() && exam_pos != count(); ++it, ++exam_pos) {
2938
- bool match; // Does the current element match the current matcher?
2939
- if (listener_interested) {
2940
- StringMatchResultListener s;
2941
- match = matchers_[exam_pos].MatchAndExplain(*it, &s);
2942
- explanations[exam_pos] = s.str();
2943
- } else {
2944
- match = matchers_[exam_pos].Matches(*it);
2945
- }
2946
-
2947
- if (!match) {
2948
- mismatch_found = true;
2949
- break;
2950
- }
2951
- }
2952
- // If mismatch_found is true, 'exam_pos' is the index of the mismatch.
2953
-
2954
- // Find how many elements the actual container has. We avoid
2955
- // calling size() s.t. this code works for stream-like "containers"
2956
- // that don't define size().
2957
- size_t actual_count = exam_pos;
2958
- for (; it != stl_container.end(); ++it) {
2959
- ++actual_count;
2960
- }
2961
-
2962
- if (actual_count != count()) {
2963
- // The element count doesn't match. If the container is empty,
2964
- // there's no need to explain anything as Google Mock already
2965
- // prints the empty container. Otherwise we just need to show
2966
- // how many elements there actually are.
2967
- if (listener_interested && (actual_count != 0)) {
2968
- *listener << "which has " << Elements(actual_count);
2969
- }
2970
- return false;
2971
- }
2972
-
2973
- if (mismatch_found) {
2974
- // The element count matches, but the exam_pos-th element doesn't match.
2975
- if (listener_interested) {
2976
- *listener << "whose element #" << exam_pos << " doesn't match";
2977
- PrintIfNotEmpty(explanations[exam_pos], listener->stream());
2978
- }
2979
- return false;
2980
- }
2981
-
2982
- // Every element matches its expectation. We need to explain why
2983
- // (the obvious ones can be skipped).
2984
- if (listener_interested) {
2985
- bool reason_printed = false;
2986
- for (size_t i = 0; i != count(); ++i) {
2987
- const internal::string& s = explanations[i];
2988
- if (!s.empty()) {
2989
- if (reason_printed) {
2990
- *listener << ",\nand ";
2991
- }
2992
- *listener << "whose element #" << i << " matches, " << s;
2993
- reason_printed = true;
2994
- }
2995
- }
2996
- }
2997
- return true;
2998
- }
2999
-
3000
- private:
3001
- static Message Elements(size_t count) {
3002
- return Message() << count << (count == 1 ? " element" : " elements");
3003
- }
3004
-
3005
- size_t count() const { return matchers_.size(); }
3006
-
3007
- ::std::vector<Matcher<const Element&> > matchers_;
3008
-
3009
- GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl);
3010
- };
3011
-
3012
- // Connectivity matrix of (elements X matchers), in element-major order.
3013
- // Initially, there are no edges.
3014
- // Use NextGraph() to iterate over all possible edge configurations.
3015
- // Use Randomize() to generate a random edge configuration.
3016
- class GTEST_API_ MatchMatrix {
3017
- public:
3018
- MatchMatrix(size_t num_elements, size_t num_matchers)
3019
- : num_elements_(num_elements),
3020
- num_matchers_(num_matchers),
3021
- matched_(num_elements_* num_matchers_, 0) {
3022
- }
3023
-
3024
- size_t LhsSize() const { return num_elements_; }
3025
- size_t RhsSize() const { return num_matchers_; }
3026
- bool HasEdge(size_t ilhs, size_t irhs) const {
3027
- return matched_[SpaceIndex(ilhs, irhs)] == 1;
3028
- }
3029
- void SetEdge(size_t ilhs, size_t irhs, bool b) {
3030
- matched_[SpaceIndex(ilhs, irhs)] = b ? 1 : 0;
3031
- }
3032
-
3033
- // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,
3034
- // adds 1 to that number; returns false if incrementing the graph left it
3035
- // empty.
3036
- bool NextGraph();
3037
-
3038
- void Randomize();
3039
-
3040
- string DebugString() const;
3041
-
3042
- private:
3043
- size_t SpaceIndex(size_t ilhs, size_t irhs) const {
3044
- return ilhs * num_matchers_ + irhs;
3045
- }
3046
-
3047
- size_t num_elements_;
3048
- size_t num_matchers_;
3049
-
3050
- // Each element is a char interpreted as bool. They are stored as a
3051
- // flattened array in lhs-major order, use 'SpaceIndex()' to translate
3052
- // a (ilhs, irhs) matrix coordinate into an offset.
3053
- ::std::vector<char> matched_;
3054
- };
3055
-
3056
- typedef ::std::pair<size_t, size_t> ElementMatcherPair;
3057
- typedef ::std::vector<ElementMatcherPair> ElementMatcherPairs;
3058
-
3059
- // Returns a maximum bipartite matching for the specified graph 'g'.
3060
- // The matching is represented as a vector of {element, matcher} pairs.
3061
- GTEST_API_ ElementMatcherPairs
3062
- FindMaxBipartiteMatching(const MatchMatrix& g);
3063
-
3064
- GTEST_API_ bool FindPairing(const MatchMatrix& matrix,
3065
- MatchResultListener* listener);
3066
-
3067
- // Untyped base class for implementing UnorderedElementsAre. By
3068
- // putting logic that's not specific to the element type here, we
3069
- // reduce binary bloat and increase compilation speed.
3070
- class GTEST_API_ UnorderedElementsAreMatcherImplBase {
3071
- protected:
3072
- // A vector of matcher describers, one for each element matcher.
3073
- // Does not own the describers (and thus can be used only when the
3074
- // element matchers are alive).
3075
- typedef ::std::vector<const MatcherDescriberInterface*> MatcherDescriberVec;
3076
-
3077
- // Describes this UnorderedElementsAre matcher.
3078
- void DescribeToImpl(::std::ostream* os) const;
3079
-
3080
- // Describes the negation of this UnorderedElementsAre matcher.
3081
- void DescribeNegationToImpl(::std::ostream* os) const;
3082
-
3083
- bool VerifyAllElementsAndMatchersAreMatched(
3084
- const ::std::vector<string>& element_printouts,
3085
- const MatchMatrix& matrix,
3086
- MatchResultListener* listener) const;
3087
-
3088
- MatcherDescriberVec& matcher_describers() {
3089
- return matcher_describers_;
3090
- }
3091
-
3092
- static Message Elements(size_t n) {
3093
- return Message() << n << " element" << (n == 1 ? "" : "s");
3094
- }
3095
-
3096
- private:
3097
- MatcherDescriberVec matcher_describers_;
3098
-
3099
- GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImplBase);
3100
- };
3101
-
3102
- // Implements unordered ElementsAre and unordered ElementsAreArray.
3103
- template <typename Container>
3104
- class UnorderedElementsAreMatcherImpl
3105
- : public MatcherInterface<Container>,
3106
- public UnorderedElementsAreMatcherImplBase {
3107
- public:
3108
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3109
- typedef internal::StlContainerView<RawContainer> View;
3110
- typedef typename View::type StlContainer;
3111
- typedef typename View::const_reference StlContainerReference;
3112
- typedef typename StlContainer::const_iterator StlContainerConstIterator;
3113
- typedef typename StlContainer::value_type Element;
3114
-
3115
- // Constructs the matcher from a sequence of element values or
3116
- // element matchers.
3117
- template <typename InputIter>
3118
- UnorderedElementsAreMatcherImpl(InputIter first, InputIter last) {
3119
- for (; first != last; ++first) {
3120
- matchers_.push_back(MatcherCast<const Element&>(*first));
3121
- matcher_describers().push_back(matchers_.back().GetDescriber());
3122
- }
3123
- }
3124
-
3125
- // Describes what this matcher does.
3126
- virtual void DescribeTo(::std::ostream* os) const {
3127
- return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);
3128
- }
3129
-
3130
- // Describes what the negation of this matcher does.
3131
- virtual void DescribeNegationTo(::std::ostream* os) const {
3132
- return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);
3133
- }
3134
-
3135
- virtual bool MatchAndExplain(Container container,
3136
- MatchResultListener* listener) const {
3137
- StlContainerReference stl_container = View::ConstReference(container);
3138
- ::std::vector<string> element_printouts;
3139
- MatchMatrix matrix = AnalyzeElements(stl_container.begin(),
3140
- stl_container.end(),
3141
- &element_printouts,
3142
- listener);
3143
-
3144
- const size_t actual_count = matrix.LhsSize();
3145
- if (actual_count == 0 && matchers_.empty()) {
3146
- return true;
3147
- }
3148
- if (actual_count != matchers_.size()) {
3149
- // The element count doesn't match. If the container is empty,
3150
- // there's no need to explain anything as Google Mock already
3151
- // prints the empty container. Otherwise we just need to show
3152
- // how many elements there actually are.
3153
- if (actual_count != 0 && listener->IsInterested()) {
3154
- *listener << "which has " << Elements(actual_count);
3155
- }
3156
- return false;
3157
- }
3158
-
3159
- return VerifyAllElementsAndMatchersAreMatched(element_printouts,
3160
- matrix, listener) &&
3161
- FindPairing(matrix, listener);
3162
- }
3163
-
3164
- private:
3165
- typedef ::std::vector<Matcher<const Element&> > MatcherVec;
3166
-
3167
- template <typename ElementIter>
3168
- MatchMatrix AnalyzeElements(ElementIter elem_first, ElementIter elem_last,
3169
- ::std::vector<string>* element_printouts,
3170
- MatchResultListener* listener) const {
3171
- element_printouts->clear();
3172
- ::std::vector<char> did_match;
3173
- size_t num_elements = 0;
3174
- for (; elem_first != elem_last; ++num_elements, ++elem_first) {
3175
- if (listener->IsInterested()) {
3176
- element_printouts->push_back(PrintToString(*elem_first));
3177
- }
3178
- for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
3179
- did_match.push_back(Matches(matchers_[irhs])(*elem_first));
3180
- }
3181
- }
3182
-
3183
- MatchMatrix matrix(num_elements, matchers_.size());
3184
- ::std::vector<char>::const_iterator did_match_iter = did_match.begin();
3185
- for (size_t ilhs = 0; ilhs != num_elements; ++ilhs) {
3186
- for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
3187
- matrix.SetEdge(ilhs, irhs, *did_match_iter++ != 0);
3188
- }
3189
- }
3190
- return matrix;
3191
- }
3192
-
3193
- MatcherVec matchers_;
3194
-
3195
- GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImpl);
3196
- };
3197
-
3198
- // Functor for use in TransformTuple.
3199
- // Performs MatcherCast<Target> on an input argument of any type.
3200
- template <typename Target>
3201
- struct CastAndAppendTransform {
3202
- template <typename Arg>
3203
- Matcher<Target> operator()(const Arg& a) const {
3204
- return MatcherCast<Target>(a);
3205
- }
3206
- };
3207
-
3208
- // Implements UnorderedElementsAre.
3209
- template <typename MatcherTuple>
3210
- class UnorderedElementsAreMatcher {
3211
- public:
3212
- explicit UnorderedElementsAreMatcher(const MatcherTuple& args)
3213
- : matchers_(args) {}
3214
-
3215
- template <typename Container>
3216
- operator Matcher<Container>() const {
3217
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3218
- typedef typename internal::StlContainerView<RawContainer>::type View;
3219
- typedef typename View::value_type Element;
3220
- typedef ::std::vector<Matcher<const Element&> > MatcherVec;
3221
- MatcherVec matchers;
3222
- matchers.reserve(::std::tr1::tuple_size<MatcherTuple>::value);
3223
- TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
3224
- ::std::back_inserter(matchers));
3225
- return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(
3226
- matchers.begin(), matchers.end()));
3227
- }
3228
-
3229
- private:
3230
- const MatcherTuple matchers_;
3231
- GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcher);
3232
- };
3233
-
3234
- // Implements ElementsAre.
3235
- template <typename MatcherTuple>
3236
- class ElementsAreMatcher {
3237
- public:
3238
- explicit ElementsAreMatcher(const MatcherTuple& args) : matchers_(args) {}
3239
-
3240
- template <typename Container>
3241
- operator Matcher<Container>() const {
3242
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3243
- typedef typename internal::StlContainerView<RawContainer>::type View;
3244
- typedef typename View::value_type Element;
3245
- typedef ::std::vector<Matcher<const Element&> > MatcherVec;
3246
- MatcherVec matchers;
3247
- matchers.reserve(::std::tr1::tuple_size<MatcherTuple>::value);
3248
- TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
3249
- ::std::back_inserter(matchers));
3250
- return MakeMatcher(new ElementsAreMatcherImpl<Container>(
3251
- matchers.begin(), matchers.end()));
3252
- }
3253
-
3254
- private:
3255
- const MatcherTuple matchers_;
3256
- GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher);
3257
- };
3258
-
3259
- // Implements UnorderedElementsAreArray().
3260
- template <typename T>
3261
- class UnorderedElementsAreArrayMatcher {
3262
- public:
3263
- UnorderedElementsAreArrayMatcher() {}
3264
-
3265
- template <typename Iter>
3266
- UnorderedElementsAreArrayMatcher(Iter first, Iter last)
3267
- : matchers_(first, last) {}
3268
-
3269
- template <typename Container>
3270
- operator Matcher<Container>() const {
3271
- return MakeMatcher(
3272
- new UnorderedElementsAreMatcherImpl<Container>(matchers_.begin(),
3273
- matchers_.end()));
3274
- }
3275
-
3276
- private:
3277
- ::std::vector<T> matchers_;
3278
-
3279
- GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreArrayMatcher);
3280
- };
3281
-
3282
- // Implements ElementsAreArray().
3283
- template <typename T>
3284
- class ElementsAreArrayMatcher {
3285
- public:
3286
- template <typename Iter>
3287
- ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}
3288
-
3289
- template <typename Container>
3290
- operator Matcher<Container>() const {
3291
- return MakeMatcher(new ElementsAreMatcherImpl<Container>(
3292
- matchers_.begin(), matchers_.end()));
3293
- }
3294
-
3295
- private:
3296
- const ::std::vector<T> matchers_;
3297
-
3298
- GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher);
3299
- };
3300
-
3301
- // Returns the description for a matcher defined using the MATCHER*()
3302
- // macro where the user-supplied description string is "", if
3303
- // 'negation' is false; otherwise returns the description of the
3304
- // negation of the matcher. 'param_values' contains a list of strings
3305
- // that are the print-out of the matcher's parameters.
3306
- GTEST_API_ string FormatMatcherDescription(bool negation,
3307
- const char* matcher_name,
3308
- const Strings& param_values);
3309
-
3310
- } // namespace internal
3311
-
3312
- // ElementsAreArray(first, last)
3313
- // ElementsAreArray(pointer, count)
3314
- // ElementsAreArray(array)
3315
- // ElementsAreArray(vector)
3316
- // ElementsAreArray({ e1, e2, ..., en })
3317
- //
3318
- // The ElementsAreArray() functions are like ElementsAre(...), except
3319
- // that they are given a homogeneous sequence rather than taking each
3320
- // element as a function argument. The sequence can be specified as an
3321
- // array, a pointer and count, a vector, an initializer list, or an
3322
- // STL iterator range. In each of these cases, the underlying sequence
3323
- // can be either a sequence of values or a sequence of matchers.
3324
- //
3325
- // All forms of ElementsAreArray() make a copy of the input matcher sequence.
3326
-
3327
- template <typename Iter>
3328
- inline internal::ElementsAreArrayMatcher<
3329
- typename ::std::iterator_traits<Iter>::value_type>
3330
- ElementsAreArray(Iter first, Iter last) {
3331
- typedef typename ::std::iterator_traits<Iter>::value_type T;
3332
- return internal::ElementsAreArrayMatcher<T>(first, last);
3333
- }
3334
-
3335
- template <typename T>
3336
- inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
3337
- const T* pointer, size_t count) {
3338
- return ElementsAreArray(pointer, pointer + count);
3339
- }
3340
-
3341
- template <typename T, size_t N>
3342
- inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
3343
- const T (&array)[N]) {
3344
- return ElementsAreArray(array, N);
3345
- }
3346
-
3347
- template <typename T, typename A>
3348
- inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
3349
- const ::std::vector<T, A>& vec) {
3350
- return ElementsAreArray(vec.begin(), vec.end());
3351
- }
3352
-
3353
- #if GTEST_LANG_CXX11
3354
- template <typename T>
3355
- inline internal::ElementsAreArrayMatcher<T>
3356
- ElementsAreArray(::std::initializer_list<T> xs) {
3357
- return ElementsAreArray(xs.begin(), xs.end());
3358
- }
3359
- #endif
3360
-
3361
- // UnorderedElementsAreArray(first, last)
3362
- // UnorderedElementsAreArray(pointer, count)
3363
- // UnorderedElementsAreArray(array)
3364
- // UnorderedElementsAreArray(vector)
3365
- // UnorderedElementsAreArray({ e1, e2, ..., en })
3366
- //
3367
- // The UnorderedElementsAreArray() functions are like
3368
- // ElementsAreArray(...), but allow matching the elements in any order.
3369
- template <typename Iter>
3370
- inline internal::UnorderedElementsAreArrayMatcher<
3371
- typename ::std::iterator_traits<Iter>::value_type>
3372
- UnorderedElementsAreArray(Iter first, Iter last) {
3373
- typedef typename ::std::iterator_traits<Iter>::value_type T;
3374
- return internal::UnorderedElementsAreArrayMatcher<T>(first, last);
3375
- }
3376
-
3377
- template <typename T>
3378
- inline internal::UnorderedElementsAreArrayMatcher<T>
3379
- UnorderedElementsAreArray(const T* pointer, size_t count) {
3380
- return UnorderedElementsAreArray(pointer, pointer + count);
3381
- }
3382
-
3383
- template <typename T, size_t N>
3384
- inline internal::UnorderedElementsAreArrayMatcher<T>
3385
- UnorderedElementsAreArray(const T (&array)[N]) {
3386
- return UnorderedElementsAreArray(array, N);
3387
- }
3388
-
3389
- template <typename T, typename A>
3390
- inline internal::UnorderedElementsAreArrayMatcher<T>
3391
- UnorderedElementsAreArray(const ::std::vector<T, A>& vec) {
3392
- return UnorderedElementsAreArray(vec.begin(), vec.end());
3393
- }
3394
-
3395
- #if GTEST_LANG_CXX11
3396
- template <typename T>
3397
- inline internal::UnorderedElementsAreArrayMatcher<T>
3398
- UnorderedElementsAreArray(::std::initializer_list<T> xs) {
3399
- return UnorderedElementsAreArray(xs.begin(), xs.end());
3400
- }
3401
- #endif
3402
-
3403
- // _ is a matcher that matches anything of any type.
3404
- //
3405
- // This definition is fine as:
3406
- //
3407
- // 1. The C++ standard permits using the name _ in a namespace that
3408
- // is not the global namespace or ::std.
3409
- // 2. The AnythingMatcher class has no data member or constructor,
3410
- // so it's OK to create global variables of this type.
3411
- // 3. c-style has approved of using _ in this case.
3412
- const internal::AnythingMatcher _ = {};
3413
- // Creates a matcher that matches any value of the given type T.
3414
- template <typename T>
3415
- inline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); }
3416
-
3417
- // Creates a matcher that matches any value of the given type T.
3418
- template <typename T>
3419
- inline Matcher<T> An() { return A<T>(); }
3420
-
3421
- // Creates a polymorphic matcher that matches anything equal to x.
3422
- // Note: if the parameter of Eq() were declared as const T&, Eq("foo")
3423
- // wouldn't compile.
3424
- template <typename T>
3425
- inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }
3426
-
3427
- // Constructs a Matcher<T> from a 'value' of type T. The constructed
3428
- // matcher matches any value that's equal to 'value'.
3429
- template <typename T>
3430
- Matcher<T>::Matcher(T value) { *this = Eq(value); }
3431
-
3432
- // Creates a monomorphic matcher that matches anything with type Lhs
3433
- // and equal to rhs. A user may need to use this instead of Eq(...)
3434
- // in order to resolve an overloading ambiguity.
3435
- //
3436
- // TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))
3437
- // or Matcher<T>(x), but more readable than the latter.
3438
- //
3439
- // We could define similar monomorphic matchers for other comparison
3440
- // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do
3441
- // it yet as those are used much less than Eq() in practice. A user
3442
- // can always write Matcher<T>(Lt(5)) to be explicit about the type,
3443
- // for example.
3444
- template <typename Lhs, typename Rhs>
3445
- inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }
3446
-
3447
- // Creates a polymorphic matcher that matches anything >= x.
3448
- template <typename Rhs>
3449
- inline internal::GeMatcher<Rhs> Ge(Rhs x) {
3450
- return internal::GeMatcher<Rhs>(x);
3451
- }
3452
-
3453
- // Creates a polymorphic matcher that matches anything > x.
3454
- template <typename Rhs>
3455
- inline internal::GtMatcher<Rhs> Gt(Rhs x) {
3456
- return internal::GtMatcher<Rhs>(x);
3457
- }
3458
-
3459
- // Creates a polymorphic matcher that matches anything <= x.
3460
- template <typename Rhs>
3461
- inline internal::LeMatcher<Rhs> Le(Rhs x) {
3462
- return internal::LeMatcher<Rhs>(x);
3463
- }
3464
-
3465
- // Creates a polymorphic matcher that matches anything < x.
3466
- template <typename Rhs>
3467
- inline internal::LtMatcher<Rhs> Lt(Rhs x) {
3468
- return internal::LtMatcher<Rhs>(x);
3469
- }
3470
-
3471
- // Creates a polymorphic matcher that matches anything != x.
3472
- template <typename Rhs>
3473
- inline internal::NeMatcher<Rhs> Ne(Rhs x) {
3474
- return internal::NeMatcher<Rhs>(x);
3475
- }
3476
-
3477
- // Creates a polymorphic matcher that matches any NULL pointer.
3478
- inline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {
3479
- return MakePolymorphicMatcher(internal::IsNullMatcher());
3480
- }
3481
-
3482
- // Creates a polymorphic matcher that matches any non-NULL pointer.
3483
- // This is convenient as Not(NULL) doesn't compile (the compiler
3484
- // thinks that that expression is comparing a pointer with an integer).
3485
- inline PolymorphicMatcher<internal::NotNullMatcher > NotNull() {
3486
- return MakePolymorphicMatcher(internal::NotNullMatcher());
3487
- }
3488
-
3489
- // Creates a polymorphic matcher that matches any argument that
3490
- // references variable x.
3491
- template <typename T>
3492
- inline internal::RefMatcher<T&> Ref(T& x) { // NOLINT
3493
- return internal::RefMatcher<T&>(x);
3494
- }
3495
-
3496
- // Creates a matcher that matches any double argument approximately
3497
- // equal to rhs, where two NANs are considered unequal.
3498
- inline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {
3499
- return internal::FloatingEqMatcher<double>(rhs, false);
3500
- }
3501
-
3502
- // Creates a matcher that matches any double argument approximately
3503
- // equal to rhs, including NaN values when rhs is NaN.
3504
- inline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {
3505
- return internal::FloatingEqMatcher<double>(rhs, true);
3506
- }
3507
-
3508
- // Creates a matcher that matches any double argument approximately equal to
3509
- // rhs, up to the specified max absolute error bound, where two NANs are
3510
- // considered unequal. The max absolute error bound must be non-negative.
3511
- inline internal::FloatingEqMatcher<double> DoubleNear(
3512
- double rhs, double max_abs_error) {
3513
- return internal::FloatingEqMatcher<double>(rhs, false, max_abs_error);
3514
- }
3515
-
3516
- // Creates a matcher that matches any double argument approximately equal to
3517
- // rhs, up to the specified max absolute error bound, including NaN values when
3518
- // rhs is NaN. The max absolute error bound must be non-negative.
3519
- inline internal::FloatingEqMatcher<double> NanSensitiveDoubleNear(
3520
- double rhs, double max_abs_error) {
3521
- return internal::FloatingEqMatcher<double>(rhs, true, max_abs_error);
3522
- }
3523
-
3524
- // Creates a matcher that matches any float argument approximately
3525
- // equal to rhs, where two NANs are considered unequal.
3526
- inline internal::FloatingEqMatcher<float> FloatEq(float rhs) {
3527
- return internal::FloatingEqMatcher<float>(rhs, false);
3528
- }
3529
-
3530
- // Creates a matcher that matches any float argument approximately
3531
- // equal to rhs, including NaN values when rhs is NaN.
3532
- inline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {
3533
- return internal::FloatingEqMatcher<float>(rhs, true);
3534
- }
3535
-
3536
- // Creates a matcher that matches any float argument approximately equal to
3537
- // rhs, up to the specified max absolute error bound, where two NANs are
3538
- // considered unequal. The max absolute error bound must be non-negative.
3539
- inline internal::FloatingEqMatcher<float> FloatNear(
3540
- float rhs, float max_abs_error) {
3541
- return internal::FloatingEqMatcher<float>(rhs, false, max_abs_error);
3542
- }
3543
-
3544
- // Creates a matcher that matches any float argument approximately equal to
3545
- // rhs, up to the specified max absolute error bound, including NaN values when
3546
- // rhs is NaN. The max absolute error bound must be non-negative.
3547
- inline internal::FloatingEqMatcher<float> NanSensitiveFloatNear(
3548
- float rhs, float max_abs_error) {
3549
- return internal::FloatingEqMatcher<float>(rhs, true, max_abs_error);
3550
- }
3551
-
3552
- // Creates a matcher that matches a pointer (raw or smart) that points
3553
- // to a value that matches inner_matcher.
3554
- template <typename InnerMatcher>
3555
- inline internal::PointeeMatcher<InnerMatcher> Pointee(
3556
- const InnerMatcher& inner_matcher) {
3557
- return internal::PointeeMatcher<InnerMatcher>(inner_matcher);
3558
- }
3559
-
3560
- // Creates a matcher that matches an object whose given field matches
3561
- // 'matcher'. For example,
3562
- // Field(&Foo::number, Ge(5))
3563
- // matches a Foo object x iff x.number >= 5.
3564
- template <typename Class, typename FieldType, typename FieldMatcher>
3565
- inline PolymorphicMatcher<
3566
- internal::FieldMatcher<Class, FieldType> > Field(
3567
- FieldType Class::*field, const FieldMatcher& matcher) {
3568
- return MakePolymorphicMatcher(
3569
- internal::FieldMatcher<Class, FieldType>(
3570
- field, MatcherCast<const FieldType&>(matcher)));
3571
- // The call to MatcherCast() is required for supporting inner
3572
- // matchers of compatible types. For example, it allows
3573
- // Field(&Foo::bar, m)
3574
- // to compile where bar is an int32 and m is a matcher for int64.
3575
- }
3576
-
3577
- // Creates a matcher that matches an object whose given property
3578
- // matches 'matcher'. For example,
3579
- // Property(&Foo::str, StartsWith("hi"))
3580
- // matches a Foo object x iff x.str() starts with "hi".
3581
- template <typename Class, typename PropertyType, typename PropertyMatcher>
3582
- inline PolymorphicMatcher<
3583
- internal::PropertyMatcher<Class, PropertyType> > Property(
3584
- PropertyType (Class::*property)() const, const PropertyMatcher& matcher) {
3585
- return MakePolymorphicMatcher(
3586
- internal::PropertyMatcher<Class, PropertyType>(
3587
- property,
3588
- MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));
3589
- // The call to MatcherCast() is required for supporting inner
3590
- // matchers of compatible types. For example, it allows
3591
- // Property(&Foo::bar, m)
3592
- // to compile where bar() returns an int32 and m is a matcher for int64.
3593
- }
3594
-
3595
- // Creates a matcher that matches an object iff the result of applying
3596
- // a callable to x matches 'matcher'.
3597
- // For example,
3598
- // ResultOf(f, StartsWith("hi"))
3599
- // matches a Foo object x iff f(x) starts with "hi".
3600
- // callable parameter can be a function, function pointer, or a functor.
3601
- // Callable has to satisfy the following conditions:
3602
- // * It is required to keep no state affecting the results of
3603
- // the calls on it and make no assumptions about how many calls
3604
- // will be made. Any state it keeps must be protected from the
3605
- // concurrent access.
3606
- // * If it is a function object, it has to define type result_type.
3607
- // We recommend deriving your functor classes from std::unary_function.
3608
- template <typename Callable, typename ResultOfMatcher>
3609
- internal::ResultOfMatcher<Callable> ResultOf(
3610
- Callable callable, const ResultOfMatcher& matcher) {
3611
- return internal::ResultOfMatcher<Callable>(
3612
- callable,
3613
- MatcherCast<typename internal::CallableTraits<Callable>::ResultType>(
3614
- matcher));
3615
- // The call to MatcherCast() is required for supporting inner
3616
- // matchers of compatible types. For example, it allows
3617
- // ResultOf(Function, m)
3618
- // to compile where Function() returns an int32 and m is a matcher for int64.
3619
- }
3620
-
3621
- // String matchers.
3622
-
3623
- // Matches a string equal to str.
3624
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
3625
- StrEq(const internal::string& str) {
3626
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
3627
- str, true, true));
3628
- }
3629
-
3630
- // Matches a string not equal to str.
3631
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
3632
- StrNe(const internal::string& str) {
3633
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
3634
- str, false, true));
3635
- }
3636
-
3637
- // Matches a string equal to str, ignoring case.
3638
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
3639
- StrCaseEq(const internal::string& str) {
3640
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
3641
- str, true, false));
3642
- }
3643
-
3644
- // Matches a string not equal to str, ignoring case.
3645
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
3646
- StrCaseNe(const internal::string& str) {
3647
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
3648
- str, false, false));
3649
- }
3650
-
3651
- // Creates a matcher that matches any string, std::string, or C string
3652
- // that contains the given substring.
3653
- inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> >
3654
- HasSubstr(const internal::string& substring) {
3655
- return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>(
3656
- substring));
3657
- }
3658
-
3659
- // Matches a string that starts with 'prefix' (case-sensitive).
3660
- inline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> >
3661
- StartsWith(const internal::string& prefix) {
3662
- return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>(
3663
- prefix));
3664
- }
3665
-
3666
- // Matches a string that ends with 'suffix' (case-sensitive).
3667
- inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> >
3668
- EndsWith(const internal::string& suffix) {
3669
- return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>(
3670
- suffix));
3671
- }
3672
-
3673
- // Matches a string that fully matches regular expression 'regex'.
3674
- // The matcher takes ownership of 'regex'.
3675
- inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
3676
- const internal::RE* regex) {
3677
- return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));
3678
- }
3679
- inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
3680
- const internal::string& regex) {
3681
- return MatchesRegex(new internal::RE(regex));
3682
- }
3683
-
3684
- // Matches a string that contains regular expression 'regex'.
3685
- // The matcher takes ownership of 'regex'.
3686
- inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
3687
- const internal::RE* regex) {
3688
- return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));
3689
- }
3690
- inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
3691
- const internal::string& regex) {
3692
- return ContainsRegex(new internal::RE(regex));
3693
- }
3694
-
3695
- #if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
3696
- // Wide string matchers.
3697
-
3698
- // Matches a string equal to str.
3699
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
3700
- StrEq(const internal::wstring& str) {
3701
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
3702
- str, true, true));
3703
- }
3704
-
3705
- // Matches a string not equal to str.
3706
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
3707
- StrNe(const internal::wstring& str) {
3708
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
3709
- str, false, true));
3710
- }
3711
-
3712
- // Matches a string equal to str, ignoring case.
3713
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
3714
- StrCaseEq(const internal::wstring& str) {
3715
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
3716
- str, true, false));
3717
- }
3718
-
3719
- // Matches a string not equal to str, ignoring case.
3720
- inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
3721
- StrCaseNe(const internal::wstring& str) {
3722
- return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
3723
- str, false, false));
3724
- }
3725
-
3726
- // Creates a matcher that matches any wstring, std::wstring, or C wide string
3727
- // that contains the given substring.
3728
- inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> >
3729
- HasSubstr(const internal::wstring& substring) {
3730
- return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>(
3731
- substring));
3732
- }
3733
-
3734
- // Matches a string that starts with 'prefix' (case-sensitive).
3735
- inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> >
3736
- StartsWith(const internal::wstring& prefix) {
3737
- return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>(
3738
- prefix));
3739
- }
3740
-
3741
- // Matches a string that ends with 'suffix' (case-sensitive).
3742
- inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> >
3743
- EndsWith(const internal::wstring& suffix) {
3744
- return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>(
3745
- suffix));
3746
- }
3747
-
3748
- #endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
3749
-
3750
- // Creates a polymorphic matcher that matches a 2-tuple where the
3751
- // first field == the second field.
3752
- inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }
3753
-
3754
- // Creates a polymorphic matcher that matches a 2-tuple where the
3755
- // first field >= the second field.
3756
- inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }
3757
-
3758
- // Creates a polymorphic matcher that matches a 2-tuple where the
3759
- // first field > the second field.
3760
- inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }
3761
-
3762
- // Creates a polymorphic matcher that matches a 2-tuple where the
3763
- // first field <= the second field.
3764
- inline internal::Le2Matcher Le() { return internal::Le2Matcher(); }
3765
-
3766
- // Creates a polymorphic matcher that matches a 2-tuple where the
3767
- // first field < the second field.
3768
- inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }
3769
-
3770
- // Creates a polymorphic matcher that matches a 2-tuple where the
3771
- // first field != the second field.
3772
- inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
3773
-
3774
- // Creates a matcher that matches any value of type T that m doesn't
3775
- // match.
3776
- template <typename InnerMatcher>
3777
- inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {
3778
- return internal::NotMatcher<InnerMatcher>(m);
3779
- }
3780
-
3781
- // Returns a matcher that matches anything that satisfies the given
3782
- // predicate. The predicate can be any unary function or functor
3783
- // whose return type can be implicitly converted to bool.
3784
- template <typename Predicate>
3785
- inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >
3786
- Truly(Predicate pred) {
3787
- return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));
3788
- }
3789
-
3790
- // Returns a matcher that matches the container size. The container must
3791
- // support both size() and size_type which all STL-like containers provide.
3792
- // Note that the parameter 'size' can be a value of type size_type as well as
3793
- // matcher. For instance:
3794
- // EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements.
3795
- // EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2.
3796
- template <typename SizeMatcher>
3797
- inline internal::SizeIsMatcher<SizeMatcher>
3798
- SizeIs(const SizeMatcher& size_matcher) {
3799
- return internal::SizeIsMatcher<SizeMatcher>(size_matcher);
3800
- }
3801
-
3802
- // Returns a matcher that matches an equal container.
3803
- // This matcher behaves like Eq(), but in the event of mismatch lists the
3804
- // values that are included in one container but not the other. (Duplicate
3805
- // values and order differences are not explained.)
3806
- template <typename Container>
3807
- inline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT
3808
- GTEST_REMOVE_CONST_(Container)> >
3809
- ContainerEq(const Container& rhs) {
3810
- // This following line is for working around a bug in MSVC 8.0,
3811
- // which causes Container to be a const type sometimes.
3812
- typedef GTEST_REMOVE_CONST_(Container) RawContainer;
3813
- return MakePolymorphicMatcher(
3814
- internal::ContainerEqMatcher<RawContainer>(rhs));
3815
- }
3816
-
3817
- // Returns a matcher that matches a container that, when sorted using
3818
- // the given comparator, matches container_matcher.
3819
- template <typename Comparator, typename ContainerMatcher>
3820
- inline internal::WhenSortedByMatcher<Comparator, ContainerMatcher>
3821
- WhenSortedBy(const Comparator& comparator,
3822
- const ContainerMatcher& container_matcher) {
3823
- return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(
3824
- comparator, container_matcher);
3825
- }
3826
-
3827
- // Returns a matcher that matches a container that, when sorted using
3828
- // the < operator, matches container_matcher.
3829
- template <typename ContainerMatcher>
3830
- inline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>
3831
- WhenSorted(const ContainerMatcher& container_matcher) {
3832
- return
3833
- internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>(
3834
- internal::LessComparator(), container_matcher);
3835
- }
3836
-
3837
- // Matches an STL-style container or a native array that contains the
3838
- // same number of elements as in rhs, where its i-th element and rhs's
3839
- // i-th element (as a pair) satisfy the given pair matcher, for all i.
3840
- // TupleMatcher must be able to be safely cast to Matcher<tuple<const
3841
- // T1&, const T2&> >, where T1 and T2 are the types of elements in the
3842
- // LHS container and the RHS container respectively.
3843
- template <typename TupleMatcher, typename Container>
3844
- inline internal::PointwiseMatcher<TupleMatcher,
3845
- GTEST_REMOVE_CONST_(Container)>
3846
- Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {
3847
- // This following line is for working around a bug in MSVC 8.0,
3848
- // which causes Container to be a const type sometimes.
3849
- typedef GTEST_REMOVE_CONST_(Container) RawContainer;
3850
- return internal::PointwiseMatcher<TupleMatcher, RawContainer>(
3851
- tuple_matcher, rhs);
3852
- }
3853
-
3854
- // Matches an STL-style container or a native array that contains at
3855
- // least one element matching the given value or matcher.
3856
- //
3857
- // Examples:
3858
- // ::std::set<int> page_ids;
3859
- // page_ids.insert(3);
3860
- // page_ids.insert(1);
3861
- // EXPECT_THAT(page_ids, Contains(1));
3862
- // EXPECT_THAT(page_ids, Contains(Gt(2)));
3863
- // EXPECT_THAT(page_ids, Not(Contains(4)));
3864
- //
3865
- // ::std::map<int, size_t> page_lengths;
3866
- // page_lengths[1] = 100;
3867
- // EXPECT_THAT(page_lengths,
3868
- // Contains(::std::pair<const int, size_t>(1, 100)));
3869
- //
3870
- // const char* user_ids[] = { "joe", "mike", "tom" };
3871
- // EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
3872
- template <typename M>
3873
- inline internal::ContainsMatcher<M> Contains(M matcher) {
3874
- return internal::ContainsMatcher<M>(matcher);
3875
- }
3876
-
3877
- // Matches an STL-style container or a native array that contains only
3878
- // elements matching the given value or matcher.
3879
- //
3880
- // Each(m) is semantically equivalent to Not(Contains(Not(m))). Only
3881
- // the messages are different.
3882
- //
3883
- // Examples:
3884
- // ::std::set<int> page_ids;
3885
- // // Each(m) matches an empty container, regardless of what m is.
3886
- // EXPECT_THAT(page_ids, Each(Eq(1)));
3887
- // EXPECT_THAT(page_ids, Each(Eq(77)));
3888
- //
3889
- // page_ids.insert(3);
3890
- // EXPECT_THAT(page_ids, Each(Gt(0)));
3891
- // EXPECT_THAT(page_ids, Not(Each(Gt(4))));
3892
- // page_ids.insert(1);
3893
- // EXPECT_THAT(page_ids, Not(Each(Lt(2))));
3894
- //
3895
- // ::std::map<int, size_t> page_lengths;
3896
- // page_lengths[1] = 100;
3897
- // page_lengths[2] = 200;
3898
- // page_lengths[3] = 300;
3899
- // EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
3900
- // EXPECT_THAT(page_lengths, Each(Key(Le(3))));
3901
- //
3902
- // const char* user_ids[] = { "joe", "mike", "tom" };
3903
- // EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
3904
- template <typename M>
3905
- inline internal::EachMatcher<M> Each(M matcher) {
3906
- return internal::EachMatcher<M>(matcher);
3907
- }
3908
-
3909
- // Key(inner_matcher) matches an std::pair whose 'first' field matches
3910
- // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
3911
- // std::map that contains at least one element whose key is >= 5.
3912
- template <typename M>
3913
- inline internal::KeyMatcher<M> Key(M inner_matcher) {
3914
- return internal::KeyMatcher<M>(inner_matcher);
3915
- }
3916
-
3917
- // Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
3918
- // matches first_matcher and whose 'second' field matches second_matcher. For
3919
- // example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
3920
- // to match a std::map<int, string> that contains exactly one element whose key
3921
- // is >= 5 and whose value equals "foo".
3922
- template <typename FirstMatcher, typename SecondMatcher>
3923
- inline internal::PairMatcher<FirstMatcher, SecondMatcher>
3924
- Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) {
3925
- return internal::PairMatcher<FirstMatcher, SecondMatcher>(
3926
- first_matcher, second_matcher);
3927
- }
3928
-
3929
- // Returns a predicate that is satisfied by anything that matches the
3930
- // given matcher.
3931
- template <typename M>
3932
- inline internal::MatcherAsPredicate<M> Matches(M matcher) {
3933
- return internal::MatcherAsPredicate<M>(matcher);
3934
- }
3935
-
3936
- // Returns true iff the value matches the matcher.
3937
- template <typename T, typename M>
3938
- inline bool Value(const T& value, M matcher) {
3939
- return testing::Matches(matcher)(value);
3940
- }
3941
-
3942
- // Matches the value against the given matcher and explains the match
3943
- // result to listener.
3944
- template <typename T, typename M>
3945
- inline bool ExplainMatchResult(
3946
- M matcher, const T& value, MatchResultListener* listener) {
3947
- return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
3948
- }
3949
-
3950
- #if GTEST_LANG_CXX11
3951
- // Define variadic matcher versions. They are overloaded in
3952
- // gmock-generated-matchers.h for the cases supported by pre C++11 compilers.
3953
- template <typename... Args>
3954
- inline internal::AllOfMatcher<Args...> AllOf(const Args&... matchers) {
3955
- return internal::AllOfMatcher<Args...>(matchers...);
3956
- }
3957
-
3958
- template <typename... Args>
3959
- inline internal::AnyOfMatcher<Args...> AnyOf(const Args&... matchers) {
3960
- return internal::AnyOfMatcher<Args...>(matchers...);
3961
- }
3962
-
3963
- #endif // GTEST_LANG_CXX11
3964
-
3965
- // AllArgs(m) is a synonym of m. This is useful in
3966
- //
3967
- // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
3968
- //
3969
- // which is easier to read than
3970
- //
3971
- // EXPECT_CALL(foo, Bar(_, _)).With(Eq());
3972
- template <typename InnerMatcher>
3973
- inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }
3974
-
3975
- // These macros allow using matchers to check values in Google Test
3976
- // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
3977
- // succeed iff the value matches the matcher. If the assertion fails,
3978
- // the value and the description of the matcher will be printed.
3979
- #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\
3980
- ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
3981
- #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\
3982
- ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
3983
-
3984
- } // namespace testing
3985
-
3986
- #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_