uia 0.0.5 → 0.0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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_