1 | // This file was GENERATED by command: |
---|
2 | // pump.py gmock-generated-matchers.h.pump |
---|
3 | // DO NOT EDIT BY HAND!!! |
---|
4 | |
---|
5 | // Copyright 2008, Google Inc. |
---|
6 | // All rights reserved. |
---|
7 | // |
---|
8 | // Redistribution and use in source and binary forms, with or without |
---|
9 | // modification, are permitted provided that the following conditions are |
---|
10 | // met: |
---|
11 | // |
---|
12 | // * Redistributions of source code must retain the above copyright |
---|
13 | // notice, this list of conditions and the following disclaimer. |
---|
14 | // * Redistributions in binary form must reproduce the above |
---|
15 | // copyright notice, this list of conditions and the following disclaimer |
---|
16 | // in the documentation and/or other materials provided with the |
---|
17 | // distribution. |
---|
18 | // * Neither the name of Google Inc. nor the names of its |
---|
19 | // contributors may be used to endorse or promote products derived from |
---|
20 | // this software without specific prior written permission. |
---|
21 | // |
---|
22 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
---|
23 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
---|
24 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
---|
25 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
---|
26 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
---|
27 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
---|
28 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
---|
29 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
---|
30 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
---|
31 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
---|
32 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
33 | |
---|
34 | // Google Mock - a framework for writing C++ mock classes. |
---|
35 | // |
---|
36 | // This file implements some commonly used variadic matchers. |
---|
37 | |
---|
38 | #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ |
---|
39 | #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ |
---|
40 | |
---|
41 | #include <sstream> |
---|
42 | #include <string> |
---|
43 | #include <vector> |
---|
44 | #include "gmock/gmock-matchers.h" |
---|
45 | |
---|
46 | namespace testing { |
---|
47 | namespace internal { |
---|
48 | |
---|
49 | // The type of the i-th (0-based) field of Tuple. |
---|
50 | #define GMOCK_FIELD_TYPE_(Tuple, i) \ |
---|
51 | typename ::std::tr1::tuple_element<i, Tuple>::type |
---|
52 | |
---|
53 | // TupleFields<Tuple, k0, ..., kn> is for selecting fields from a |
---|
54 | // tuple of type Tuple. It has two members: |
---|
55 | // |
---|
56 | // type: a tuple type whose i-th field is the ki-th field of Tuple. |
---|
57 | // GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. |
---|
58 | // |
---|
59 | // For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have: |
---|
60 | // |
---|
61 | // type is tuple<int, bool>, and |
---|
62 | // GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). |
---|
63 | |
---|
64 | template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, |
---|
65 | int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, |
---|
66 | int k9 = -1> |
---|
67 | class TupleFields; |
---|
68 | |
---|
69 | // This generic version is used when there are 10 selectors. |
---|
70 | template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, |
---|
71 | int k7, int k8, int k9> |
---|
72 | class TupleFields { |
---|
73 | public: |
---|
74 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
75 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
76 | GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), |
---|
77 | GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), |
---|
78 | GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8), |
---|
79 | GMOCK_FIELD_TYPE_(Tuple, k9)> type; |
---|
80 | static type GetSelectedFields(const Tuple& t) { |
---|
81 | using ::std::tr1::get; |
---|
82 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), |
---|
83 | get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t)); |
---|
84 | } |
---|
85 | }; |
---|
86 | |
---|
87 | // The following specialization is used for 0 ~ 9 selectors. |
---|
88 | |
---|
89 | template <class Tuple> |
---|
90 | class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { |
---|
91 | public: |
---|
92 | typedef ::std::tr1::tuple<> type; |
---|
93 | static type GetSelectedFields(const Tuple& /* t */) { |
---|
94 | using ::std::tr1::get; |
---|
95 | return type(); |
---|
96 | } |
---|
97 | }; |
---|
98 | |
---|
99 | template <class Tuple, int k0> |
---|
100 | class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> { |
---|
101 | public: |
---|
102 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type; |
---|
103 | static type GetSelectedFields(const Tuple& t) { |
---|
104 | using ::std::tr1::get; |
---|
105 | return type(get<k0>(t)); |
---|
106 | } |
---|
107 | }; |
---|
108 | |
---|
109 | template <class Tuple, int k0, int k1> |
---|
110 | class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> { |
---|
111 | public: |
---|
112 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
113 | GMOCK_FIELD_TYPE_(Tuple, k1)> type; |
---|
114 | static type GetSelectedFields(const Tuple& t) { |
---|
115 | using ::std::tr1::get; |
---|
116 | return type(get<k0>(t), get<k1>(t)); |
---|
117 | } |
---|
118 | }; |
---|
119 | |
---|
120 | template <class Tuple, int k0, int k1, int k2> |
---|
121 | class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> { |
---|
122 | public: |
---|
123 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
124 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type; |
---|
125 | static type GetSelectedFields(const Tuple& t) { |
---|
126 | using ::std::tr1::get; |
---|
127 | return type(get<k0>(t), get<k1>(t), get<k2>(t)); |
---|
128 | } |
---|
129 | }; |
---|
130 | |
---|
131 | template <class Tuple, int k0, int k1, int k2, int k3> |
---|
132 | class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> { |
---|
133 | public: |
---|
134 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
135 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
136 | GMOCK_FIELD_TYPE_(Tuple, k3)> type; |
---|
137 | static type GetSelectedFields(const Tuple& t) { |
---|
138 | using ::std::tr1::get; |
---|
139 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t)); |
---|
140 | } |
---|
141 | }; |
---|
142 | |
---|
143 | template <class Tuple, int k0, int k1, int k2, int k3, int k4> |
---|
144 | class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> { |
---|
145 | public: |
---|
146 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
147 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
148 | GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type; |
---|
149 | static type GetSelectedFields(const Tuple& t) { |
---|
150 | using ::std::tr1::get; |
---|
151 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t)); |
---|
152 | } |
---|
153 | }; |
---|
154 | |
---|
155 | template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5> |
---|
156 | class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> { |
---|
157 | public: |
---|
158 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
159 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
160 | GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), |
---|
161 | GMOCK_FIELD_TYPE_(Tuple, k5)> type; |
---|
162 | static type GetSelectedFields(const Tuple& t) { |
---|
163 | using ::std::tr1::get; |
---|
164 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), |
---|
165 | get<k5>(t)); |
---|
166 | } |
---|
167 | }; |
---|
168 | |
---|
169 | template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6> |
---|
170 | class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> { |
---|
171 | public: |
---|
172 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
173 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
174 | GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), |
---|
175 | GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type; |
---|
176 | static type GetSelectedFields(const Tuple& t) { |
---|
177 | using ::std::tr1::get; |
---|
178 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), |
---|
179 | get<k5>(t), get<k6>(t)); |
---|
180 | } |
---|
181 | }; |
---|
182 | |
---|
183 | template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, |
---|
184 | int k7> |
---|
185 | class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> { |
---|
186 | public: |
---|
187 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
188 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
189 | GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), |
---|
190 | GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), |
---|
191 | GMOCK_FIELD_TYPE_(Tuple, k7)> type; |
---|
192 | static type GetSelectedFields(const Tuple& t) { |
---|
193 | using ::std::tr1::get; |
---|
194 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), |
---|
195 | get<k5>(t), get<k6>(t), get<k7>(t)); |
---|
196 | } |
---|
197 | }; |
---|
198 | |
---|
199 | template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, |
---|
200 | int k7, int k8> |
---|
201 | class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> { |
---|
202 | public: |
---|
203 | typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), |
---|
204 | GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), |
---|
205 | GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), |
---|
206 | GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), |
---|
207 | GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type; |
---|
208 | static type GetSelectedFields(const Tuple& t) { |
---|
209 | using ::std::tr1::get; |
---|
210 | return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), |
---|
211 | get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t)); |
---|
212 | } |
---|
213 | }; |
---|
214 | |
---|
215 | #undef GMOCK_FIELD_TYPE_ |
---|
216 | |
---|
217 | // Implements the Args() matcher. |
---|
218 | template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, |
---|
219 | int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, |
---|
220 | int k9 = -1> |
---|
221 | class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> { |
---|
222 | public: |
---|
223 | // ArgsTuple may have top-level const or reference modifiers. |
---|
224 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple; |
---|
225 | typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, |
---|
226 | k6, k7, k8, k9>::type SelectedArgs; |
---|
227 | typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher; |
---|
228 | |
---|
229 | template <typename InnerMatcher> |
---|
230 | explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) |
---|
231 | : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {} |
---|
232 | |
---|
233 | virtual bool MatchAndExplain(ArgsTuple args, |
---|
234 | MatchResultListener* listener) const { |
---|
235 | const SelectedArgs& selected_args = GetSelectedArgs(args); |
---|
236 | if (!listener->IsInterested()) |
---|
237 | return inner_matcher_.Matches(selected_args); |
---|
238 | |
---|
239 | PrintIndices(listener->stream()); |
---|
240 | *listener << "are " << PrintToString(selected_args); |
---|
241 | |
---|
242 | StringMatchResultListener inner_listener; |
---|
243 | const bool match = inner_matcher_.MatchAndExplain(selected_args, |
---|
244 | &inner_listener); |
---|
245 | PrintIfNotEmpty(inner_listener.str(), listener->stream()); |
---|
246 | return match; |
---|
247 | } |
---|
248 | |
---|
249 | virtual void DescribeTo(::std::ostream* os) const { |
---|
250 | *os << "are a tuple "; |
---|
251 | PrintIndices(os); |
---|
252 | inner_matcher_.DescribeTo(os); |
---|
253 | } |
---|
254 | |
---|
255 | virtual void DescribeNegationTo(::std::ostream* os) const { |
---|
256 | *os << "are a tuple "; |
---|
257 | PrintIndices(os); |
---|
258 | inner_matcher_.DescribeNegationTo(os); |
---|
259 | } |
---|
260 | |
---|
261 | private: |
---|
262 | static SelectedArgs GetSelectedArgs(ArgsTuple args) { |
---|
263 | return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, |
---|
264 | k9>::GetSelectedFields(args); |
---|
265 | } |
---|
266 | |
---|
267 | // Prints the indices of the selected fields. |
---|
268 | static void PrintIndices(::std::ostream* os) { |
---|
269 | *os << "whose fields ("; |
---|
270 | const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 }; |
---|
271 | for (int i = 0; i < 10; i++) { |
---|
272 | if (indices[i] < 0) |
---|
273 | break; |
---|
274 | |
---|
275 | if (i >= 1) |
---|
276 | *os << ", "; |
---|
277 | |
---|
278 | *os << "#" << indices[i]; |
---|
279 | } |
---|
280 | *os << ") "; |
---|
281 | } |
---|
282 | |
---|
283 | const MonomorphicInnerMatcher inner_matcher_; |
---|
284 | |
---|
285 | GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); |
---|
286 | }; |
---|
287 | |
---|
288 | template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1, |
---|
289 | int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, |
---|
290 | int k8 = -1, int k9 = -1> |
---|
291 | class ArgsMatcher { |
---|
292 | public: |
---|
293 | explicit ArgsMatcher(const InnerMatcher& inner_matcher) |
---|
294 | : inner_matcher_(inner_matcher) {} |
---|
295 | |
---|
296 | template <typename ArgsTuple> |
---|
297 | operator Matcher<ArgsTuple>() const { |
---|
298 | return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5, |
---|
299 | k6, k7, k8, k9>(inner_matcher_)); |
---|
300 | } |
---|
301 | |
---|
302 | private: |
---|
303 | const InnerMatcher inner_matcher_; |
---|
304 | |
---|
305 | GTEST_DISALLOW_ASSIGN_(ArgsMatcher); |
---|
306 | }; |
---|
307 | |
---|
308 | // Implements ElementsAre() of 1-10 arguments. |
---|
309 | |
---|
310 | template <typename T1> |
---|
311 | class ElementsAreMatcher1 { |
---|
312 | public: |
---|
313 | explicit ElementsAreMatcher1(const T1& e1) : e1_(e1) {} |
---|
314 | |
---|
315 | template <typename Container> |
---|
316 | operator Matcher<Container>() const { |
---|
317 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
318 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
319 | Element; |
---|
320 | |
---|
321 | // Nokia's Symbian Compiler has a nasty bug where the object put |
---|
322 | // in a one-element local array is not destructed when the array |
---|
323 | // goes out of scope. This leads to obvious badness as we've |
---|
324 | // added the linked_ptr in it to our other linked_ptrs list. |
---|
325 | // Hence we implement ElementsAreMatcher1 specially to avoid using |
---|
326 | // a local array. |
---|
327 | const Matcher<const Element&> matcher = |
---|
328 | MatcherCast<const Element&>(e1_); |
---|
329 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(&matcher, 1)); |
---|
330 | } |
---|
331 | |
---|
332 | private: |
---|
333 | const T1& e1_; |
---|
334 | |
---|
335 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher1); |
---|
336 | }; |
---|
337 | |
---|
338 | template <typename T1, typename T2> |
---|
339 | class ElementsAreMatcher2 { |
---|
340 | public: |
---|
341 | ElementsAreMatcher2(const T1& e1, const T2& e2) : e1_(e1), e2_(e2) {} |
---|
342 | |
---|
343 | template <typename Container> |
---|
344 | operator Matcher<Container>() const { |
---|
345 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
346 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
347 | Element; |
---|
348 | |
---|
349 | const Matcher<const Element&> matchers[] = { |
---|
350 | MatcherCast<const Element&>(e1_), |
---|
351 | MatcherCast<const Element&>(e2_), |
---|
352 | }; |
---|
353 | |
---|
354 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 2)); |
---|
355 | } |
---|
356 | |
---|
357 | private: |
---|
358 | const T1& e1_; |
---|
359 | const T2& e2_; |
---|
360 | |
---|
361 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher2); |
---|
362 | }; |
---|
363 | |
---|
364 | template <typename T1, typename T2, typename T3> |
---|
365 | class ElementsAreMatcher3 { |
---|
366 | public: |
---|
367 | ElementsAreMatcher3(const T1& e1, const T2& e2, const T3& e3) : e1_(e1), |
---|
368 | e2_(e2), e3_(e3) {} |
---|
369 | |
---|
370 | template <typename Container> |
---|
371 | operator Matcher<Container>() const { |
---|
372 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
373 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
374 | Element; |
---|
375 | |
---|
376 | const Matcher<const Element&> matchers[] = { |
---|
377 | MatcherCast<const Element&>(e1_), |
---|
378 | MatcherCast<const Element&>(e2_), |
---|
379 | MatcherCast<const Element&>(e3_), |
---|
380 | }; |
---|
381 | |
---|
382 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 3)); |
---|
383 | } |
---|
384 | |
---|
385 | private: |
---|
386 | const T1& e1_; |
---|
387 | const T2& e2_; |
---|
388 | const T3& e3_; |
---|
389 | |
---|
390 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher3); |
---|
391 | }; |
---|
392 | |
---|
393 | template <typename T1, typename T2, typename T3, typename T4> |
---|
394 | class ElementsAreMatcher4 { |
---|
395 | public: |
---|
396 | ElementsAreMatcher4(const T1& e1, const T2& e2, const T3& e3, |
---|
397 | const T4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {} |
---|
398 | |
---|
399 | template <typename Container> |
---|
400 | operator Matcher<Container>() const { |
---|
401 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
402 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
403 | Element; |
---|
404 | |
---|
405 | const Matcher<const Element&> matchers[] = { |
---|
406 | MatcherCast<const Element&>(e1_), |
---|
407 | MatcherCast<const Element&>(e2_), |
---|
408 | MatcherCast<const Element&>(e3_), |
---|
409 | MatcherCast<const Element&>(e4_), |
---|
410 | }; |
---|
411 | |
---|
412 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 4)); |
---|
413 | } |
---|
414 | |
---|
415 | private: |
---|
416 | const T1& e1_; |
---|
417 | const T2& e2_; |
---|
418 | const T3& e3_; |
---|
419 | const T4& e4_; |
---|
420 | |
---|
421 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher4); |
---|
422 | }; |
---|
423 | |
---|
424 | template <typename T1, typename T2, typename T3, typename T4, typename T5> |
---|
425 | class ElementsAreMatcher5 { |
---|
426 | public: |
---|
427 | ElementsAreMatcher5(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
428 | const T5& e5) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {} |
---|
429 | |
---|
430 | template <typename Container> |
---|
431 | operator Matcher<Container>() const { |
---|
432 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
433 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
434 | Element; |
---|
435 | |
---|
436 | const Matcher<const Element&> matchers[] = { |
---|
437 | MatcherCast<const Element&>(e1_), |
---|
438 | MatcherCast<const Element&>(e2_), |
---|
439 | MatcherCast<const Element&>(e3_), |
---|
440 | MatcherCast<const Element&>(e4_), |
---|
441 | MatcherCast<const Element&>(e5_), |
---|
442 | }; |
---|
443 | |
---|
444 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 5)); |
---|
445 | } |
---|
446 | |
---|
447 | private: |
---|
448 | const T1& e1_; |
---|
449 | const T2& e2_; |
---|
450 | const T3& e3_; |
---|
451 | const T4& e4_; |
---|
452 | const T5& e5_; |
---|
453 | |
---|
454 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher5); |
---|
455 | }; |
---|
456 | |
---|
457 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
458 | typename T6> |
---|
459 | class ElementsAreMatcher6 { |
---|
460 | public: |
---|
461 | ElementsAreMatcher6(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
462 | const T5& e5, const T6& e6) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), |
---|
463 | e5_(e5), e6_(e6) {} |
---|
464 | |
---|
465 | template <typename Container> |
---|
466 | operator Matcher<Container>() const { |
---|
467 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
468 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
469 | Element; |
---|
470 | |
---|
471 | const Matcher<const Element&> matchers[] = { |
---|
472 | MatcherCast<const Element&>(e1_), |
---|
473 | MatcherCast<const Element&>(e2_), |
---|
474 | MatcherCast<const Element&>(e3_), |
---|
475 | MatcherCast<const Element&>(e4_), |
---|
476 | MatcherCast<const Element&>(e5_), |
---|
477 | MatcherCast<const Element&>(e6_), |
---|
478 | }; |
---|
479 | |
---|
480 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 6)); |
---|
481 | } |
---|
482 | |
---|
483 | private: |
---|
484 | const T1& e1_; |
---|
485 | const T2& e2_; |
---|
486 | const T3& e3_; |
---|
487 | const T4& e4_; |
---|
488 | const T5& e5_; |
---|
489 | const T6& e6_; |
---|
490 | |
---|
491 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher6); |
---|
492 | }; |
---|
493 | |
---|
494 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
495 | typename T6, typename T7> |
---|
496 | class ElementsAreMatcher7 { |
---|
497 | public: |
---|
498 | ElementsAreMatcher7(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
499 | const T5& e5, const T6& e6, const T7& e7) : e1_(e1), e2_(e2), e3_(e3), |
---|
500 | e4_(e4), e5_(e5), e6_(e6), e7_(e7) {} |
---|
501 | |
---|
502 | template <typename Container> |
---|
503 | operator Matcher<Container>() const { |
---|
504 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
505 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
506 | Element; |
---|
507 | |
---|
508 | const Matcher<const Element&> matchers[] = { |
---|
509 | MatcherCast<const Element&>(e1_), |
---|
510 | MatcherCast<const Element&>(e2_), |
---|
511 | MatcherCast<const Element&>(e3_), |
---|
512 | MatcherCast<const Element&>(e4_), |
---|
513 | MatcherCast<const Element&>(e5_), |
---|
514 | MatcherCast<const Element&>(e6_), |
---|
515 | MatcherCast<const Element&>(e7_), |
---|
516 | }; |
---|
517 | |
---|
518 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 7)); |
---|
519 | } |
---|
520 | |
---|
521 | private: |
---|
522 | const T1& e1_; |
---|
523 | const T2& e2_; |
---|
524 | const T3& e3_; |
---|
525 | const T4& e4_; |
---|
526 | const T5& e5_; |
---|
527 | const T6& e6_; |
---|
528 | const T7& e7_; |
---|
529 | |
---|
530 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher7); |
---|
531 | }; |
---|
532 | |
---|
533 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
534 | typename T6, typename T7, typename T8> |
---|
535 | class ElementsAreMatcher8 { |
---|
536 | public: |
---|
537 | ElementsAreMatcher8(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
538 | const T5& e5, const T6& e6, const T7& e7, const T8& e8) : e1_(e1), |
---|
539 | e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8) {} |
---|
540 | |
---|
541 | template <typename Container> |
---|
542 | operator Matcher<Container>() const { |
---|
543 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
544 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
545 | Element; |
---|
546 | |
---|
547 | const Matcher<const Element&> matchers[] = { |
---|
548 | MatcherCast<const Element&>(e1_), |
---|
549 | MatcherCast<const Element&>(e2_), |
---|
550 | MatcherCast<const Element&>(e3_), |
---|
551 | MatcherCast<const Element&>(e4_), |
---|
552 | MatcherCast<const Element&>(e5_), |
---|
553 | MatcherCast<const Element&>(e6_), |
---|
554 | MatcherCast<const Element&>(e7_), |
---|
555 | MatcherCast<const Element&>(e8_), |
---|
556 | }; |
---|
557 | |
---|
558 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 8)); |
---|
559 | } |
---|
560 | |
---|
561 | private: |
---|
562 | const T1& e1_; |
---|
563 | const T2& e2_; |
---|
564 | const T3& e3_; |
---|
565 | const T4& e4_; |
---|
566 | const T5& e5_; |
---|
567 | const T6& e6_; |
---|
568 | const T7& e7_; |
---|
569 | const T8& e8_; |
---|
570 | |
---|
571 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher8); |
---|
572 | }; |
---|
573 | |
---|
574 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
575 | typename T6, typename T7, typename T8, typename T9> |
---|
576 | class ElementsAreMatcher9 { |
---|
577 | public: |
---|
578 | ElementsAreMatcher9(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
579 | const T5& e5, const T6& e6, const T7& e7, const T8& e8, |
---|
580 | const T9& e9) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), |
---|
581 | e7_(e7), e8_(e8), e9_(e9) {} |
---|
582 | |
---|
583 | template <typename Container> |
---|
584 | operator Matcher<Container>() const { |
---|
585 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
586 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
587 | Element; |
---|
588 | |
---|
589 | const Matcher<const Element&> matchers[] = { |
---|
590 | MatcherCast<const Element&>(e1_), |
---|
591 | MatcherCast<const Element&>(e2_), |
---|
592 | MatcherCast<const Element&>(e3_), |
---|
593 | MatcherCast<const Element&>(e4_), |
---|
594 | MatcherCast<const Element&>(e5_), |
---|
595 | MatcherCast<const Element&>(e6_), |
---|
596 | MatcherCast<const Element&>(e7_), |
---|
597 | MatcherCast<const Element&>(e8_), |
---|
598 | MatcherCast<const Element&>(e9_), |
---|
599 | }; |
---|
600 | |
---|
601 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 9)); |
---|
602 | } |
---|
603 | |
---|
604 | private: |
---|
605 | const T1& e1_; |
---|
606 | const T2& e2_; |
---|
607 | const T3& e3_; |
---|
608 | const T4& e4_; |
---|
609 | const T5& e5_; |
---|
610 | const T6& e6_; |
---|
611 | const T7& e7_; |
---|
612 | const T8& e8_; |
---|
613 | const T9& e9_; |
---|
614 | |
---|
615 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher9); |
---|
616 | }; |
---|
617 | |
---|
618 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
619 | typename T6, typename T7, typename T8, typename T9, typename T10> |
---|
620 | class ElementsAreMatcher10 { |
---|
621 | public: |
---|
622 | ElementsAreMatcher10(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
623 | const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, |
---|
624 | const T10& e10) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), |
---|
625 | e7_(e7), e8_(e8), e9_(e9), e10_(e10) {} |
---|
626 | |
---|
627 | template <typename Container> |
---|
628 | operator Matcher<Container>() const { |
---|
629 | typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; |
---|
630 | typedef typename internal::StlContainerView<RawContainer>::type::value_type |
---|
631 | Element; |
---|
632 | |
---|
633 | const Matcher<const Element&> matchers[] = { |
---|
634 | MatcherCast<const Element&>(e1_), |
---|
635 | MatcherCast<const Element&>(e2_), |
---|
636 | MatcherCast<const Element&>(e3_), |
---|
637 | MatcherCast<const Element&>(e4_), |
---|
638 | MatcherCast<const Element&>(e5_), |
---|
639 | MatcherCast<const Element&>(e6_), |
---|
640 | MatcherCast<const Element&>(e7_), |
---|
641 | MatcherCast<const Element&>(e8_), |
---|
642 | MatcherCast<const Element&>(e9_), |
---|
643 | MatcherCast<const Element&>(e10_), |
---|
644 | }; |
---|
645 | |
---|
646 | return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 10)); |
---|
647 | } |
---|
648 | |
---|
649 | private: |
---|
650 | const T1& e1_; |
---|
651 | const T2& e2_; |
---|
652 | const T3& e3_; |
---|
653 | const T4& e4_; |
---|
654 | const T5& e5_; |
---|
655 | const T6& e6_; |
---|
656 | const T7& e7_; |
---|
657 | const T8& e8_; |
---|
658 | const T9& e9_; |
---|
659 | const T10& e10_; |
---|
660 | |
---|
661 | GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10); |
---|
662 | }; |
---|
663 | |
---|
664 | } // namespace internal |
---|
665 | |
---|
666 | // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected |
---|
667 | // fields of it matches a_matcher. C++ doesn't support default |
---|
668 | // arguments for function templates, so we have to overload it. |
---|
669 | template <typename InnerMatcher> |
---|
670 | inline internal::ArgsMatcher<InnerMatcher> |
---|
671 | Args(const InnerMatcher& matcher) { |
---|
672 | return internal::ArgsMatcher<InnerMatcher>(matcher); |
---|
673 | } |
---|
674 | |
---|
675 | template <int k1, typename InnerMatcher> |
---|
676 | inline internal::ArgsMatcher<InnerMatcher, k1> |
---|
677 | Args(const InnerMatcher& matcher) { |
---|
678 | return internal::ArgsMatcher<InnerMatcher, k1>(matcher); |
---|
679 | } |
---|
680 | |
---|
681 | template <int k1, int k2, typename InnerMatcher> |
---|
682 | inline internal::ArgsMatcher<InnerMatcher, k1, k2> |
---|
683 | Args(const InnerMatcher& matcher) { |
---|
684 | return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher); |
---|
685 | } |
---|
686 | |
---|
687 | template <int k1, int k2, int k3, typename InnerMatcher> |
---|
688 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3> |
---|
689 | Args(const InnerMatcher& matcher) { |
---|
690 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher); |
---|
691 | } |
---|
692 | |
---|
693 | template <int k1, int k2, int k3, int k4, typename InnerMatcher> |
---|
694 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4> |
---|
695 | Args(const InnerMatcher& matcher) { |
---|
696 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher); |
---|
697 | } |
---|
698 | |
---|
699 | template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher> |
---|
700 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5> |
---|
701 | Args(const InnerMatcher& matcher) { |
---|
702 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher); |
---|
703 | } |
---|
704 | |
---|
705 | template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher> |
---|
706 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6> |
---|
707 | Args(const InnerMatcher& matcher) { |
---|
708 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher); |
---|
709 | } |
---|
710 | |
---|
711 | template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, |
---|
712 | typename InnerMatcher> |
---|
713 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7> |
---|
714 | Args(const InnerMatcher& matcher) { |
---|
715 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, |
---|
716 | k7>(matcher); |
---|
717 | } |
---|
718 | |
---|
719 | template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, |
---|
720 | typename InnerMatcher> |
---|
721 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8> |
---|
722 | Args(const InnerMatcher& matcher) { |
---|
723 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, |
---|
724 | k8>(matcher); |
---|
725 | } |
---|
726 | |
---|
727 | template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, |
---|
728 | int k9, typename InnerMatcher> |
---|
729 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9> |
---|
730 | Args(const InnerMatcher& matcher) { |
---|
731 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, |
---|
732 | k9>(matcher); |
---|
733 | } |
---|
734 | |
---|
735 | template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, |
---|
736 | int k9, int k10, typename InnerMatcher> |
---|
737 | inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9, |
---|
738 | k10> |
---|
739 | Args(const InnerMatcher& matcher) { |
---|
740 | return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, |
---|
741 | k9, k10>(matcher); |
---|
742 | } |
---|
743 | |
---|
744 | // ElementsAre(e0, e1, ..., e_n) matches an STL-style container with |
---|
745 | // (n + 1) elements, where the i-th element in the container must |
---|
746 | // match the i-th argument in the list. Each argument of |
---|
747 | // ElementsAre() can be either a value or a matcher. We support up to |
---|
748 | // 10 arguments. |
---|
749 | // |
---|
750 | // NOTE: Since ElementsAre() cares about the order of the elements, it |
---|
751 | // must not be used with containers whose elements's order is |
---|
752 | // undefined (e.g. hash_map). |
---|
753 | |
---|
754 | inline internal::ElementsAreMatcher0 ElementsAre() { |
---|
755 | return internal::ElementsAreMatcher0(); |
---|
756 | } |
---|
757 | |
---|
758 | template <typename T1> |
---|
759 | inline internal::ElementsAreMatcher1<T1> ElementsAre(const T1& e1) { |
---|
760 | return internal::ElementsAreMatcher1<T1>(e1); |
---|
761 | } |
---|
762 | |
---|
763 | template <typename T1, typename T2> |
---|
764 | inline internal::ElementsAreMatcher2<T1, T2> ElementsAre(const T1& e1, |
---|
765 | const T2& e2) { |
---|
766 | return internal::ElementsAreMatcher2<T1, T2>(e1, e2); |
---|
767 | } |
---|
768 | |
---|
769 | template <typename T1, typename T2, typename T3> |
---|
770 | inline internal::ElementsAreMatcher3<T1, T2, T3> ElementsAre(const T1& e1, |
---|
771 | const T2& e2, const T3& e3) { |
---|
772 | return internal::ElementsAreMatcher3<T1, T2, T3>(e1, e2, e3); |
---|
773 | } |
---|
774 | |
---|
775 | template <typename T1, typename T2, typename T3, typename T4> |
---|
776 | inline internal::ElementsAreMatcher4<T1, T2, T3, T4> ElementsAre(const T1& e1, |
---|
777 | const T2& e2, const T3& e3, const T4& e4) { |
---|
778 | return internal::ElementsAreMatcher4<T1, T2, T3, T4>(e1, e2, e3, e4); |
---|
779 | } |
---|
780 | |
---|
781 | template <typename T1, typename T2, typename T3, typename T4, typename T5> |
---|
782 | inline internal::ElementsAreMatcher5<T1, T2, T3, T4, |
---|
783 | T5> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
784 | const T5& e5) { |
---|
785 | return internal::ElementsAreMatcher5<T1, T2, T3, T4, T5>(e1, e2, e3, e4, e5); |
---|
786 | } |
---|
787 | |
---|
788 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
789 | typename T6> |
---|
790 | inline internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, |
---|
791 | T6> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
792 | const T5& e5, const T6& e6) { |
---|
793 | return internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, T6>(e1, e2, e3, e4, |
---|
794 | e5, e6); |
---|
795 | } |
---|
796 | |
---|
797 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
798 | typename T6, typename T7> |
---|
799 | inline internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, |
---|
800 | T7> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
801 | const T5& e5, const T6& e6, const T7& e7) { |
---|
802 | return internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, T7>(e1, e2, e3, |
---|
803 | e4, e5, e6, e7); |
---|
804 | } |
---|
805 | |
---|
806 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
807 | typename T6, typename T7, typename T8> |
---|
808 | inline internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, |
---|
809 | T8> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
810 | const T5& e5, const T6& e6, const T7& e7, const T8& e8) { |
---|
811 | return internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, T8>(e1, e2, |
---|
812 | e3, e4, e5, e6, e7, e8); |
---|
813 | } |
---|
814 | |
---|
815 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
816 | typename T6, typename T7, typename T8, typename T9> |
---|
817 | inline internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, |
---|
818 | T9> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
819 | const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { |
---|
820 | return internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(e1, |
---|
821 | e2, e3, e4, e5, e6, e7, e8, e9); |
---|
822 | } |
---|
823 | |
---|
824 | template <typename T1, typename T2, typename T3, typename T4, typename T5, |
---|
825 | typename T6, typename T7, typename T8, typename T9, typename T10> |
---|
826 | inline internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9, |
---|
827 | T10> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, |
---|
828 | const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, |
---|
829 | const T10& e10) { |
---|
830 | return internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9, |
---|
831 | T10>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); |
---|
832 | } |
---|
833 | |
---|
834 | // ElementsAreArray(array) and ElementAreArray(array, count) are like |
---|
835 | // ElementsAre(), except that they take an array of values or |
---|
836 | // matchers. The former form infers the size of 'array', which must |
---|
837 | // be a static C-style array. In the latter form, 'array' can either |
---|
838 | // be a static array or a pointer to a dynamically created array. |
---|
839 | |
---|
840 | template <typename T> |
---|
841 | inline internal::ElementsAreArrayMatcher<T> ElementsAreArray( |
---|
842 | const T* first, size_t count) { |
---|
843 | return internal::ElementsAreArrayMatcher<T>(first, count); |
---|
844 | } |
---|
845 | |
---|
846 | template <typename T, size_t N> |
---|
847 | inline internal::ElementsAreArrayMatcher<T> |
---|
848 | ElementsAreArray(const T (&array)[N]) { |
---|
849 | return internal::ElementsAreArrayMatcher<T>(array, N); |
---|
850 | } |
---|
851 | |
---|
852 | // AllOf(m1, m2, ..., mk) matches any value that matches all of the given |
---|
853 | // sub-matchers. AllOf is called fully qualified to prevent ADL from firing. |
---|
854 | |
---|
855 | template <typename Matcher1, typename Matcher2> |
---|
856 | inline internal::BothOfMatcher<Matcher1, Matcher2> |
---|
857 | AllOf(Matcher1 m1, Matcher2 m2) { |
---|
858 | return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); |
---|
859 | } |
---|
860 | |
---|
861 | template <typename Matcher1, typename Matcher2, typename Matcher3> |
---|
862 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
863 | Matcher3> > |
---|
864 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { |
---|
865 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3)); |
---|
866 | } |
---|
867 | |
---|
868 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
869 | typename Matcher4> |
---|
870 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
871 | internal::BothOfMatcher<Matcher3, Matcher4> > > |
---|
872 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { |
---|
873 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4)); |
---|
874 | } |
---|
875 | |
---|
876 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
877 | typename Matcher4, typename Matcher5> |
---|
878 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
879 | internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, |
---|
880 | Matcher5> > > > |
---|
881 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { |
---|
882 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5)); |
---|
883 | } |
---|
884 | |
---|
885 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
886 | typename Matcher4, typename Matcher5, typename Matcher6> |
---|
887 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
888 | internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, |
---|
889 | internal::BothOfMatcher<Matcher5, Matcher6> > > > > |
---|
890 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
891 | Matcher6 m6) { |
---|
892 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6)); |
---|
893 | } |
---|
894 | |
---|
895 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
896 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> |
---|
897 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
898 | internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, |
---|
899 | internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, |
---|
900 | Matcher7> > > > > > |
---|
901 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
902 | Matcher6 m6, Matcher7 m7) { |
---|
903 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7)); |
---|
904 | } |
---|
905 | |
---|
906 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
907 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, |
---|
908 | typename Matcher8> |
---|
909 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
910 | internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, |
---|
911 | internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, |
---|
912 | internal::BothOfMatcher<Matcher7, Matcher8> > > > > > > |
---|
913 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
914 | Matcher6 m6, Matcher7 m7, Matcher8 m8) { |
---|
915 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8)); |
---|
916 | } |
---|
917 | |
---|
918 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
919 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, |
---|
920 | typename Matcher8, typename Matcher9> |
---|
921 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
922 | internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, |
---|
923 | internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, |
---|
924 | internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, |
---|
925 | Matcher9> > > > > > > > |
---|
926 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
927 | Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { |
---|
928 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9)); |
---|
929 | } |
---|
930 | |
---|
931 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
932 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, |
---|
933 | typename Matcher8, typename Matcher9, typename Matcher10> |
---|
934 | inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, |
---|
935 | internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, |
---|
936 | internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, |
---|
937 | internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, |
---|
938 | internal::BothOfMatcher<Matcher9, Matcher10> > > > > > > > > |
---|
939 | AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
940 | Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { |
---|
941 | return ::testing::AllOf(m1, ::testing::AllOf(m2, m3, m4, m5, m6, m7, m8, m9, |
---|
942 | m10)); |
---|
943 | } |
---|
944 | |
---|
945 | // AnyOf(m1, m2, ..., mk) matches any value that matches any of the given |
---|
946 | // sub-matchers. AnyOf is called fully qualified to prevent ADL from firing. |
---|
947 | |
---|
948 | template <typename Matcher1, typename Matcher2> |
---|
949 | inline internal::EitherOfMatcher<Matcher1, Matcher2> |
---|
950 | AnyOf(Matcher1 m1, Matcher2 m2) { |
---|
951 | return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); |
---|
952 | } |
---|
953 | |
---|
954 | template <typename Matcher1, typename Matcher2, typename Matcher3> |
---|
955 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
956 | Matcher3> > |
---|
957 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { |
---|
958 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3)); |
---|
959 | } |
---|
960 | |
---|
961 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
962 | typename Matcher4> |
---|
963 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
964 | internal::EitherOfMatcher<Matcher3, Matcher4> > > |
---|
965 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { |
---|
966 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4)); |
---|
967 | } |
---|
968 | |
---|
969 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
970 | typename Matcher4, typename Matcher5> |
---|
971 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
972 | internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, |
---|
973 | Matcher5> > > > |
---|
974 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { |
---|
975 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5)); |
---|
976 | } |
---|
977 | |
---|
978 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
979 | typename Matcher4, typename Matcher5, typename Matcher6> |
---|
980 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
981 | internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, |
---|
982 | internal::EitherOfMatcher<Matcher5, Matcher6> > > > > |
---|
983 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
984 | Matcher6 m6) { |
---|
985 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6)); |
---|
986 | } |
---|
987 | |
---|
988 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
989 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> |
---|
990 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
991 | internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, |
---|
992 | internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, |
---|
993 | Matcher7> > > > > > |
---|
994 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
995 | Matcher6 m6, Matcher7 m7) { |
---|
996 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7)); |
---|
997 | } |
---|
998 | |
---|
999 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
1000 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, |
---|
1001 | typename Matcher8> |
---|
1002 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
1003 | internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, |
---|
1004 | internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, |
---|
1005 | internal::EitherOfMatcher<Matcher7, Matcher8> > > > > > > |
---|
1006 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
1007 | Matcher6 m6, Matcher7 m7, Matcher8 m8) { |
---|
1008 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8)); |
---|
1009 | } |
---|
1010 | |
---|
1011 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
1012 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, |
---|
1013 | typename Matcher8, typename Matcher9> |
---|
1014 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
1015 | internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, |
---|
1016 | internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, |
---|
1017 | internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, |
---|
1018 | Matcher9> > > > > > > > |
---|
1019 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
1020 | Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { |
---|
1021 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9)); |
---|
1022 | } |
---|
1023 | |
---|
1024 | template <typename Matcher1, typename Matcher2, typename Matcher3, |
---|
1025 | typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, |
---|
1026 | typename Matcher8, typename Matcher9, typename Matcher10> |
---|
1027 | inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, |
---|
1028 | internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, |
---|
1029 | internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, |
---|
1030 | internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, |
---|
1031 | internal::EitherOfMatcher<Matcher9, Matcher10> > > > > > > > > |
---|
1032 | AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, |
---|
1033 | Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { |
---|
1034 | return ::testing::AnyOf(m1, ::testing::AnyOf(m2, m3, m4, m5, m6, m7, m8, m9, |
---|
1035 | m10)); |
---|
1036 | } |
---|
1037 | |
---|
1038 | } // namespace testing |
---|
1039 | |
---|
1040 | |
---|
1041 | // The MATCHER* family of macros can be used in a namespace scope to |
---|
1042 | // define custom matchers easily. |
---|
1043 | // |
---|
1044 | // Basic Usage |
---|
1045 | // =========== |
---|
1046 | // |
---|
1047 | // The syntax |
---|
1048 | // |
---|
1049 | // MATCHER(name, description_string) { statements; } |
---|
1050 | // |
---|
1051 | // defines a matcher with the given name that executes the statements, |
---|
1052 | // which must return a bool to indicate if the match succeeds. Inside |
---|
1053 | // the statements, you can refer to the value being matched by 'arg', |
---|
1054 | // and refer to its type by 'arg_type'. |
---|
1055 | // |
---|
1056 | // The description string documents what the matcher does, and is used |
---|
1057 | // to generate the failure message when the match fails. Since a |
---|
1058 | // MATCHER() is usually defined in a header file shared by multiple |
---|
1059 | // C++ source files, we require the description to be a C-string |
---|
1060 | // literal to avoid possible side effects. It can be empty, in which |
---|
1061 | // case we'll use the sequence of words in the matcher name as the |
---|
1062 | // description. |
---|
1063 | // |
---|
1064 | // For example: |
---|
1065 | // |
---|
1066 | // MATCHER(IsEven, "") { return (arg % 2) == 0; } |
---|
1067 | // |
---|
1068 | // allows you to write |
---|
1069 | // |
---|
1070 | // // Expects mock_foo.Bar(n) to be called where n is even. |
---|
1071 | // EXPECT_CALL(mock_foo, Bar(IsEven())); |
---|
1072 | // |
---|
1073 | // or, |
---|
1074 | // |
---|
1075 | // // Verifies that the value of some_expression is even. |
---|
1076 | // EXPECT_THAT(some_expression, IsEven()); |
---|
1077 | // |
---|
1078 | // If the above assertion fails, it will print something like: |
---|
1079 | // |
---|
1080 | // Value of: some_expression |
---|
1081 | // Expected: is even |
---|
1082 | // Actual: 7 |
---|
1083 | // |
---|
1084 | // where the description "is even" is automatically calculated from the |
---|
1085 | // matcher name IsEven. |
---|
1086 | // |
---|
1087 | // Argument Type |
---|
1088 | // ============= |
---|
1089 | // |
---|
1090 | // Note that the type of the value being matched (arg_type) is |
---|
1091 | // determined by the context in which you use the matcher and is |
---|
1092 | // supplied to you by the compiler, so you don't need to worry about |
---|
1093 | // declaring it (nor can you). This allows the matcher to be |
---|
1094 | // polymorphic. For example, IsEven() can be used to match any type |
---|
1095 | // where the value of "(arg % 2) == 0" can be implicitly converted to |
---|
1096 | // a bool. In the "Bar(IsEven())" example above, if method Bar() |
---|
1097 | // takes an int, 'arg_type' will be int; if it takes an unsigned long, |
---|
1098 | // 'arg_type' will be unsigned long; and so on. |
---|
1099 | // |
---|
1100 | // Parameterizing Matchers |
---|
1101 | // ======================= |
---|
1102 | // |
---|
1103 | // Sometimes you'll want to parameterize the matcher. For that you |
---|
1104 | // can use another macro: |
---|
1105 | // |
---|
1106 | // MATCHER_P(name, param_name, description_string) { statements; } |
---|
1107 | // |
---|
1108 | // For example: |
---|
1109 | // |
---|
1110 | // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } |
---|
1111 | // |
---|
1112 | // will allow you to write: |
---|
1113 | // |
---|
1114 | // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); |
---|
1115 | // |
---|
1116 | // which may lead to this message (assuming n is 10): |
---|
1117 | // |
---|
1118 | // Value of: Blah("a") |
---|
1119 | // Expected: has absolute value 10 |
---|
1120 | // Actual: -9 |
---|
1121 | // |
---|
1122 | // Note that both the matcher description and its parameter are |
---|
1123 | // printed, making the message human-friendly. |
---|
1124 | // |
---|
1125 | // In the matcher definition body, you can write 'foo_type' to |
---|
1126 | // reference the type of a parameter named 'foo'. For example, in the |
---|
1127 | // body of MATCHER_P(HasAbsoluteValue, value) above, you can write |
---|
1128 | // 'value_type' to refer to the type of 'value'. |
---|
1129 | // |
---|
1130 | // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to |
---|
1131 | // support multi-parameter matchers. |
---|
1132 | // |
---|
1133 | // Describing Parameterized Matchers |
---|
1134 | // ================================= |
---|
1135 | // |
---|
1136 | // The last argument to MATCHER*() is a string-typed expression. The |
---|
1137 | // expression can reference all of the matcher's parameters and a |
---|
1138 | // special bool-typed variable named 'negation'. When 'negation' is |
---|
1139 | // false, the expression should evaluate to the matcher's description; |
---|
1140 | // otherwise it should evaluate to the description of the negation of |
---|
1141 | // the matcher. For example, |
---|
1142 | // |
---|
1143 | // using testing::PrintToString; |
---|
1144 | // |
---|
1145 | // MATCHER_P2(InClosedRange, low, hi, |
---|
1146 | // string(negation ? "is not" : "is") + " in range [" + |
---|
1147 | // PrintToString(low) + ", " + PrintToString(hi) + "]") { |
---|
1148 | // return low <= arg && arg <= hi; |
---|
1149 | // } |
---|
1150 | // ... |
---|
1151 | // EXPECT_THAT(3, InClosedRange(4, 6)); |
---|
1152 | // EXPECT_THAT(3, Not(InClosedRange(2, 4))); |
---|
1153 | // |
---|
1154 | // would generate two failures that contain the text: |
---|
1155 | // |
---|
1156 | // Expected: is in range [4, 6] |
---|
1157 | // ... |
---|
1158 | // Expected: is not in range [2, 4] |
---|
1159 | // |
---|
1160 | // If you specify "" as the description, the failure message will |
---|
1161 | // contain the sequence of words in the matcher name followed by the |
---|
1162 | // parameter values printed as a tuple. For example, |
---|
1163 | // |
---|
1164 | // MATCHER_P2(InClosedRange, low, hi, "") { ... } |
---|
1165 | // ... |
---|
1166 | // EXPECT_THAT(3, InClosedRange(4, 6)); |
---|
1167 | // EXPECT_THAT(3, Not(InClosedRange(2, 4))); |
---|
1168 | // |
---|
1169 | // would generate two failures that contain the text: |
---|
1170 | // |
---|
1171 | // Expected: in closed range (4, 6) |
---|
1172 | // ... |
---|
1173 | // Expected: not (in closed range (2, 4)) |
---|
1174 | // |
---|
1175 | // Types of Matcher Parameters |
---|
1176 | // =========================== |
---|
1177 | // |
---|
1178 | // For the purpose of typing, you can view |
---|
1179 | // |
---|
1180 | // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } |
---|
1181 | // |
---|
1182 | // as shorthand for |
---|
1183 | // |
---|
1184 | // template <typename p1_type, ..., typename pk_type> |
---|
1185 | // FooMatcherPk<p1_type, ..., pk_type> |
---|
1186 | // Foo(p1_type p1, ..., pk_type pk) { ... } |
---|
1187 | // |
---|
1188 | // When you write Foo(v1, ..., vk), the compiler infers the types of |
---|
1189 | // the parameters v1, ..., and vk for you. If you are not happy with |
---|
1190 | // the result of the type inference, you can specify the types by |
---|
1191 | // explicitly instantiating the template, as in Foo<long, bool>(5, |
---|
1192 | // false). As said earlier, you don't get to (or need to) specify |
---|
1193 | // 'arg_type' as that's determined by the context in which the matcher |
---|
1194 | // is used. You can assign the result of expression Foo(p1, ..., pk) |
---|
1195 | // to a variable of type FooMatcherPk<p1_type, ..., pk_type>. This |
---|
1196 | // can be useful when composing matchers. |
---|
1197 | // |
---|
1198 | // While you can instantiate a matcher template with reference types, |
---|
1199 | // passing the parameters by pointer usually makes your code more |
---|
1200 | // readable. If, however, you still want to pass a parameter by |
---|
1201 | // reference, be aware that in the failure message generated by the |
---|
1202 | // matcher you will see the value of the referenced object but not its |
---|
1203 | // address. |
---|
1204 | // |
---|
1205 | // Explaining Match Results |
---|
1206 | // ======================== |
---|
1207 | // |
---|
1208 | // Sometimes the matcher description alone isn't enough to explain why |
---|
1209 | // the match has failed or succeeded. For example, when expecting a |
---|
1210 | // long string, it can be very helpful to also print the diff between |
---|
1211 | // the expected string and the actual one. To achieve that, you can |
---|
1212 | // optionally stream additional information to a special variable |
---|
1213 | // named result_listener, whose type is a pointer to class |
---|
1214 | // MatchResultListener: |
---|
1215 | // |
---|
1216 | // MATCHER_P(EqualsLongString, str, "") { |
---|
1217 | // if (arg == str) return true; |
---|
1218 | // |
---|
1219 | // *result_listener << "the difference: " |
---|
1220 | /// << DiffStrings(str, arg); |
---|
1221 | // return false; |
---|
1222 | // } |
---|
1223 | // |
---|
1224 | // Overloading Matchers |
---|
1225 | // ==================== |
---|
1226 | // |
---|
1227 | // You can overload matchers with different numbers of parameters: |
---|
1228 | // |
---|
1229 | // MATCHER_P(Blah, a, description_string1) { ... } |
---|
1230 | // MATCHER_P2(Blah, a, b, description_string2) { ... } |
---|
1231 | // |
---|
1232 | // Caveats |
---|
1233 | // ======= |
---|
1234 | // |
---|
1235 | // When defining a new matcher, you should also consider implementing |
---|
1236 | // MatcherInterface or using MakePolymorphicMatcher(). These |
---|
1237 | // approaches require more work than the MATCHER* macros, but also |
---|
1238 | // give you more control on the types of the value being matched and |
---|
1239 | // the matcher parameters, which may leads to better compiler error |
---|
1240 | // messages when the matcher is used wrong. They also allow |
---|
1241 | // overloading matchers based on parameter types (as opposed to just |
---|
1242 | // based on the number of parameters). |
---|
1243 | // |
---|
1244 | // MATCHER*() can only be used in a namespace scope. The reason is |
---|
1245 | // that C++ doesn't yet allow function-local types to be used to |
---|
1246 | // instantiate templates. The up-coming C++0x standard will fix this. |
---|
1247 | // Once that's done, we'll consider supporting using MATCHER*() inside |
---|
1248 | // a function. |
---|
1249 | // |
---|
1250 | // More Information |
---|
1251 | // ================ |
---|
1252 | // |
---|
1253 | // To learn more about using these macros, please search for 'MATCHER' |
---|
1254 | // on http://code.google.com/p/googlemock/wiki/CookBook. |
---|
1255 | |
---|
1256 | #define MATCHER(name, description)\ |
---|
1257 | class name##Matcher {\ |
---|
1258 | public:\ |
---|
1259 | template <typename arg_type>\ |
---|
1260 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1261 | public:\ |
---|
1262 | gmock_Impl()\ |
---|
1263 | {}\ |
---|
1264 | virtual bool MatchAndExplain(\ |
---|
1265 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1266 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1267 | *gmock_os << FormatDescription(false);\ |
---|
1268 | }\ |
---|
1269 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1270 | *gmock_os << FormatDescription(true);\ |
---|
1271 | }\ |
---|
1272 | private:\ |
---|
1273 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1274 | const ::testing::internal::string gmock_description = (description);\ |
---|
1275 | if (!gmock_description.empty())\ |
---|
1276 | return gmock_description;\ |
---|
1277 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1278 | negation, #name,\ |
---|
1279 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1280 | ::std::tr1::tuple<>()));\ |
---|
1281 | }\ |
---|
1282 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1283 | };\ |
---|
1284 | template <typename arg_type>\ |
---|
1285 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1286 | return ::testing::Matcher<arg_type>(\ |
---|
1287 | new gmock_Impl<arg_type>());\ |
---|
1288 | }\ |
---|
1289 | name##Matcher() {\ |
---|
1290 | }\ |
---|
1291 | private:\ |
---|
1292 | GTEST_DISALLOW_ASSIGN_(name##Matcher);\ |
---|
1293 | };\ |
---|
1294 | inline name##Matcher name() {\ |
---|
1295 | return name##Matcher();\ |
---|
1296 | }\ |
---|
1297 | template <typename arg_type>\ |
---|
1298 | bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1299 | arg_type arg,\ |
---|
1300 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1301 | const |
---|
1302 | |
---|
1303 | #define MATCHER_P(name, p0, description)\ |
---|
1304 | template <typename p0##_type>\ |
---|
1305 | class name##MatcherP {\ |
---|
1306 | public:\ |
---|
1307 | template <typename arg_type>\ |
---|
1308 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1309 | public:\ |
---|
1310 | explicit gmock_Impl(p0##_type gmock_p0)\ |
---|
1311 | : p0(gmock_p0) {}\ |
---|
1312 | virtual bool MatchAndExplain(\ |
---|
1313 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1314 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1315 | *gmock_os << FormatDescription(false);\ |
---|
1316 | }\ |
---|
1317 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1318 | *gmock_os << FormatDescription(true);\ |
---|
1319 | }\ |
---|
1320 | p0##_type p0;\ |
---|
1321 | private:\ |
---|
1322 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1323 | const ::testing::internal::string gmock_description = (description);\ |
---|
1324 | if (!gmock_description.empty())\ |
---|
1325 | return gmock_description;\ |
---|
1326 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1327 | negation, #name,\ |
---|
1328 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1329 | ::std::tr1::tuple<p0##_type>(p0)));\ |
---|
1330 | }\ |
---|
1331 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1332 | };\ |
---|
1333 | template <typename arg_type>\ |
---|
1334 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1335 | return ::testing::Matcher<arg_type>(\ |
---|
1336 | new gmock_Impl<arg_type>(p0));\ |
---|
1337 | }\ |
---|
1338 | name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\ |
---|
1339 | }\ |
---|
1340 | p0##_type p0;\ |
---|
1341 | private:\ |
---|
1342 | GTEST_DISALLOW_ASSIGN_(name##MatcherP);\ |
---|
1343 | };\ |
---|
1344 | template <typename p0##_type>\ |
---|
1345 | inline name##MatcherP<p0##_type> name(p0##_type p0) {\ |
---|
1346 | return name##MatcherP<p0##_type>(p0);\ |
---|
1347 | }\ |
---|
1348 | template <typename p0##_type>\ |
---|
1349 | template <typename arg_type>\ |
---|
1350 | bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1351 | arg_type arg,\ |
---|
1352 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1353 | const |
---|
1354 | |
---|
1355 | #define MATCHER_P2(name, p0, p1, description)\ |
---|
1356 | template <typename p0##_type, typename p1##_type>\ |
---|
1357 | class name##MatcherP2 {\ |
---|
1358 | public:\ |
---|
1359 | template <typename arg_type>\ |
---|
1360 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1361 | public:\ |
---|
1362 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\ |
---|
1363 | : p0(gmock_p0), p1(gmock_p1) {}\ |
---|
1364 | virtual bool MatchAndExplain(\ |
---|
1365 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1366 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1367 | *gmock_os << FormatDescription(false);\ |
---|
1368 | }\ |
---|
1369 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1370 | *gmock_os << FormatDescription(true);\ |
---|
1371 | }\ |
---|
1372 | p0##_type p0;\ |
---|
1373 | p1##_type p1;\ |
---|
1374 | private:\ |
---|
1375 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1376 | const ::testing::internal::string gmock_description = (description);\ |
---|
1377 | if (!gmock_description.empty())\ |
---|
1378 | return gmock_description;\ |
---|
1379 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1380 | negation, #name,\ |
---|
1381 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1382 | ::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\ |
---|
1383 | }\ |
---|
1384 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1385 | };\ |
---|
1386 | template <typename arg_type>\ |
---|
1387 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1388 | return ::testing::Matcher<arg_type>(\ |
---|
1389 | new gmock_Impl<arg_type>(p0, p1));\ |
---|
1390 | }\ |
---|
1391 | name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ |
---|
1392 | p1(gmock_p1) {\ |
---|
1393 | }\ |
---|
1394 | p0##_type p0;\ |
---|
1395 | p1##_type p1;\ |
---|
1396 | private:\ |
---|
1397 | GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\ |
---|
1398 | };\ |
---|
1399 | template <typename p0##_type, typename p1##_type>\ |
---|
1400 | inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \ |
---|
1401 | p1##_type p1) {\ |
---|
1402 | return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\ |
---|
1403 | }\ |
---|
1404 | template <typename p0##_type, typename p1##_type>\ |
---|
1405 | template <typename arg_type>\ |
---|
1406 | bool name##MatcherP2<p0##_type, \ |
---|
1407 | p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1408 | arg_type arg,\ |
---|
1409 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1410 | const |
---|
1411 | |
---|
1412 | #define MATCHER_P3(name, p0, p1, p2, description)\ |
---|
1413 | template <typename p0##_type, typename p1##_type, typename p2##_type>\ |
---|
1414 | class name##MatcherP3 {\ |
---|
1415 | public:\ |
---|
1416 | template <typename arg_type>\ |
---|
1417 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1418 | public:\ |
---|
1419 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\ |
---|
1420 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ |
---|
1421 | virtual bool MatchAndExplain(\ |
---|
1422 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1423 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1424 | *gmock_os << FormatDescription(false);\ |
---|
1425 | }\ |
---|
1426 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1427 | *gmock_os << FormatDescription(true);\ |
---|
1428 | }\ |
---|
1429 | p0##_type p0;\ |
---|
1430 | p1##_type p1;\ |
---|
1431 | p2##_type p2;\ |
---|
1432 | private:\ |
---|
1433 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1434 | const ::testing::internal::string gmock_description = (description);\ |
---|
1435 | if (!gmock_description.empty())\ |
---|
1436 | return gmock_description;\ |
---|
1437 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1438 | negation, #name,\ |
---|
1439 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1440 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \ |
---|
1441 | p2)));\ |
---|
1442 | }\ |
---|
1443 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1444 | };\ |
---|
1445 | template <typename arg_type>\ |
---|
1446 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1447 | return ::testing::Matcher<arg_type>(\ |
---|
1448 | new gmock_Impl<arg_type>(p0, p1, p2));\ |
---|
1449 | }\ |
---|
1450 | name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1451 | p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\ |
---|
1452 | }\ |
---|
1453 | p0##_type p0;\ |
---|
1454 | p1##_type p1;\ |
---|
1455 | p2##_type p2;\ |
---|
1456 | private:\ |
---|
1457 | GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\ |
---|
1458 | };\ |
---|
1459 | template <typename p0##_type, typename p1##_type, typename p2##_type>\ |
---|
1460 | inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ |
---|
1461 | p1##_type p1, p2##_type p2) {\ |
---|
1462 | return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\ |
---|
1463 | }\ |
---|
1464 | template <typename p0##_type, typename p1##_type, typename p2##_type>\ |
---|
1465 | template <typename arg_type>\ |
---|
1466 | bool name##MatcherP3<p0##_type, p1##_type, \ |
---|
1467 | p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1468 | arg_type arg,\ |
---|
1469 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1470 | const |
---|
1471 | |
---|
1472 | #define MATCHER_P4(name, p0, p1, p2, p3, description)\ |
---|
1473 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1474 | typename p3##_type>\ |
---|
1475 | class name##MatcherP4 {\ |
---|
1476 | public:\ |
---|
1477 | template <typename arg_type>\ |
---|
1478 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1479 | public:\ |
---|
1480 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1481 | p3##_type gmock_p3)\ |
---|
1482 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\ |
---|
1483 | virtual bool MatchAndExplain(\ |
---|
1484 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1485 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1486 | *gmock_os << FormatDescription(false);\ |
---|
1487 | }\ |
---|
1488 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1489 | *gmock_os << FormatDescription(true);\ |
---|
1490 | }\ |
---|
1491 | p0##_type p0;\ |
---|
1492 | p1##_type p1;\ |
---|
1493 | p2##_type p2;\ |
---|
1494 | p3##_type p3;\ |
---|
1495 | private:\ |
---|
1496 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1497 | const ::testing::internal::string gmock_description = (description);\ |
---|
1498 | if (!gmock_description.empty())\ |
---|
1499 | return gmock_description;\ |
---|
1500 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1501 | negation, #name,\ |
---|
1502 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1503 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \ |
---|
1504 | p3##_type>(p0, p1, p2, p3)));\ |
---|
1505 | }\ |
---|
1506 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1507 | };\ |
---|
1508 | template <typename arg_type>\ |
---|
1509 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1510 | return ::testing::Matcher<arg_type>(\ |
---|
1511 | new gmock_Impl<arg_type>(p0, p1, p2, p3));\ |
---|
1512 | }\ |
---|
1513 | name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1514 | p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ |
---|
1515 | p2(gmock_p2), p3(gmock_p3) {\ |
---|
1516 | }\ |
---|
1517 | p0##_type p0;\ |
---|
1518 | p1##_type p1;\ |
---|
1519 | p2##_type p2;\ |
---|
1520 | p3##_type p3;\ |
---|
1521 | private:\ |
---|
1522 | GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\ |
---|
1523 | };\ |
---|
1524 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1525 | typename p3##_type>\ |
---|
1526 | inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \ |
---|
1527 | p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ |
---|
1528 | p3##_type p3) {\ |
---|
1529 | return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \ |
---|
1530 | p1, p2, p3);\ |
---|
1531 | }\ |
---|
1532 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1533 | typename p3##_type>\ |
---|
1534 | template <typename arg_type>\ |
---|
1535 | bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \ |
---|
1536 | p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1537 | arg_type arg,\ |
---|
1538 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1539 | const |
---|
1540 | |
---|
1541 | #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ |
---|
1542 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1543 | typename p3##_type, typename p4##_type>\ |
---|
1544 | class name##MatcherP5 {\ |
---|
1545 | public:\ |
---|
1546 | template <typename arg_type>\ |
---|
1547 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1548 | public:\ |
---|
1549 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1550 | p3##_type gmock_p3, p4##_type gmock_p4)\ |
---|
1551 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ |
---|
1552 | p4(gmock_p4) {}\ |
---|
1553 | virtual bool MatchAndExplain(\ |
---|
1554 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1555 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1556 | *gmock_os << FormatDescription(false);\ |
---|
1557 | }\ |
---|
1558 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1559 | *gmock_os << FormatDescription(true);\ |
---|
1560 | }\ |
---|
1561 | p0##_type p0;\ |
---|
1562 | p1##_type p1;\ |
---|
1563 | p2##_type p2;\ |
---|
1564 | p3##_type p3;\ |
---|
1565 | p4##_type p4;\ |
---|
1566 | private:\ |
---|
1567 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1568 | const ::testing::internal::string gmock_description = (description);\ |
---|
1569 | if (!gmock_description.empty())\ |
---|
1570 | return gmock_description;\ |
---|
1571 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1572 | negation, #name,\ |
---|
1573 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1574 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1575 | p4##_type>(p0, p1, p2, p3, p4)));\ |
---|
1576 | }\ |
---|
1577 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1578 | };\ |
---|
1579 | template <typename arg_type>\ |
---|
1580 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1581 | return ::testing::Matcher<arg_type>(\ |
---|
1582 | new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\ |
---|
1583 | }\ |
---|
1584 | name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1585 | p2##_type gmock_p2, p3##_type gmock_p3, \ |
---|
1586 | p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ |
---|
1587 | p3(gmock_p3), p4(gmock_p4) {\ |
---|
1588 | }\ |
---|
1589 | p0##_type p0;\ |
---|
1590 | p1##_type p1;\ |
---|
1591 | p2##_type p2;\ |
---|
1592 | p3##_type p3;\ |
---|
1593 | p4##_type p4;\ |
---|
1594 | private:\ |
---|
1595 | GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\ |
---|
1596 | };\ |
---|
1597 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1598 | typename p3##_type, typename p4##_type>\ |
---|
1599 | inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1600 | p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ |
---|
1601 | p4##_type p4) {\ |
---|
1602 | return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1603 | p4##_type>(p0, p1, p2, p3, p4);\ |
---|
1604 | }\ |
---|
1605 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1606 | typename p3##_type, typename p4##_type>\ |
---|
1607 | template <typename arg_type>\ |
---|
1608 | bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1609 | p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1610 | arg_type arg,\ |
---|
1611 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1612 | const |
---|
1613 | |
---|
1614 | #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ |
---|
1615 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1616 | typename p3##_type, typename p4##_type, typename p5##_type>\ |
---|
1617 | class name##MatcherP6 {\ |
---|
1618 | public:\ |
---|
1619 | template <typename arg_type>\ |
---|
1620 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1621 | public:\ |
---|
1622 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1623 | p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\ |
---|
1624 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ |
---|
1625 | p4(gmock_p4), p5(gmock_p5) {}\ |
---|
1626 | virtual bool MatchAndExplain(\ |
---|
1627 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1628 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1629 | *gmock_os << FormatDescription(false);\ |
---|
1630 | }\ |
---|
1631 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1632 | *gmock_os << FormatDescription(true);\ |
---|
1633 | }\ |
---|
1634 | p0##_type p0;\ |
---|
1635 | p1##_type p1;\ |
---|
1636 | p2##_type p2;\ |
---|
1637 | p3##_type p3;\ |
---|
1638 | p4##_type p4;\ |
---|
1639 | p5##_type p5;\ |
---|
1640 | private:\ |
---|
1641 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1642 | const ::testing::internal::string gmock_description = (description);\ |
---|
1643 | if (!gmock_description.empty())\ |
---|
1644 | return gmock_description;\ |
---|
1645 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1646 | negation, #name,\ |
---|
1647 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1648 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1649 | p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\ |
---|
1650 | }\ |
---|
1651 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1652 | };\ |
---|
1653 | template <typename arg_type>\ |
---|
1654 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1655 | return ::testing::Matcher<arg_type>(\ |
---|
1656 | new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\ |
---|
1657 | }\ |
---|
1658 | name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1659 | p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ |
---|
1660 | p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ |
---|
1661 | p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\ |
---|
1662 | }\ |
---|
1663 | p0##_type p0;\ |
---|
1664 | p1##_type p1;\ |
---|
1665 | p2##_type p2;\ |
---|
1666 | p3##_type p3;\ |
---|
1667 | p4##_type p4;\ |
---|
1668 | p5##_type p5;\ |
---|
1669 | private:\ |
---|
1670 | GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\ |
---|
1671 | };\ |
---|
1672 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1673 | typename p3##_type, typename p4##_type, typename p5##_type>\ |
---|
1674 | inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1675 | p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ |
---|
1676 | p3##_type p3, p4##_type p4, p5##_type p5) {\ |
---|
1677 | return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1678 | p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\ |
---|
1679 | }\ |
---|
1680 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1681 | typename p3##_type, typename p4##_type, typename p5##_type>\ |
---|
1682 | template <typename arg_type>\ |
---|
1683 | bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ |
---|
1684 | p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1685 | arg_type arg,\ |
---|
1686 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1687 | const |
---|
1688 | |
---|
1689 | #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ |
---|
1690 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1691 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1692 | typename p6##_type>\ |
---|
1693 | class name##MatcherP7 {\ |
---|
1694 | public:\ |
---|
1695 | template <typename arg_type>\ |
---|
1696 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1697 | public:\ |
---|
1698 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1699 | p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ |
---|
1700 | p6##_type gmock_p6)\ |
---|
1701 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ |
---|
1702 | p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ |
---|
1703 | virtual bool MatchAndExplain(\ |
---|
1704 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1705 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1706 | *gmock_os << FormatDescription(false);\ |
---|
1707 | }\ |
---|
1708 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1709 | *gmock_os << FormatDescription(true);\ |
---|
1710 | }\ |
---|
1711 | p0##_type p0;\ |
---|
1712 | p1##_type p1;\ |
---|
1713 | p2##_type p2;\ |
---|
1714 | p3##_type p3;\ |
---|
1715 | p4##_type p4;\ |
---|
1716 | p5##_type p5;\ |
---|
1717 | p6##_type p6;\ |
---|
1718 | private:\ |
---|
1719 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1720 | const ::testing::internal::string gmock_description = (description);\ |
---|
1721 | if (!gmock_description.empty())\ |
---|
1722 | return gmock_description;\ |
---|
1723 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1724 | negation, #name,\ |
---|
1725 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1726 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1727 | p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \ |
---|
1728 | p6)));\ |
---|
1729 | }\ |
---|
1730 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1731 | };\ |
---|
1732 | template <typename arg_type>\ |
---|
1733 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1734 | return ::testing::Matcher<arg_type>(\ |
---|
1735 | new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\ |
---|
1736 | }\ |
---|
1737 | name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1738 | p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ |
---|
1739 | p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ |
---|
1740 | p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ |
---|
1741 | p6(gmock_p6) {\ |
---|
1742 | }\ |
---|
1743 | p0##_type p0;\ |
---|
1744 | p1##_type p1;\ |
---|
1745 | p2##_type p2;\ |
---|
1746 | p3##_type p3;\ |
---|
1747 | p4##_type p4;\ |
---|
1748 | p5##_type p5;\ |
---|
1749 | p6##_type p6;\ |
---|
1750 | private:\ |
---|
1751 | GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\ |
---|
1752 | };\ |
---|
1753 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1754 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1755 | typename p6##_type>\ |
---|
1756 | inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1757 | p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \ |
---|
1758 | p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ |
---|
1759 | p6##_type p6) {\ |
---|
1760 | return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1761 | p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\ |
---|
1762 | }\ |
---|
1763 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1764 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1765 | typename p6##_type>\ |
---|
1766 | template <typename arg_type>\ |
---|
1767 | bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ |
---|
1768 | p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1769 | arg_type arg,\ |
---|
1770 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1771 | const |
---|
1772 | |
---|
1773 | #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ |
---|
1774 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1775 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1776 | typename p6##_type, typename p7##_type>\ |
---|
1777 | class name##MatcherP8 {\ |
---|
1778 | public:\ |
---|
1779 | template <typename arg_type>\ |
---|
1780 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1781 | public:\ |
---|
1782 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1783 | p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ |
---|
1784 | p6##_type gmock_p6, p7##_type gmock_p7)\ |
---|
1785 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ |
---|
1786 | p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ |
---|
1787 | virtual bool MatchAndExplain(\ |
---|
1788 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1789 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1790 | *gmock_os << FormatDescription(false);\ |
---|
1791 | }\ |
---|
1792 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1793 | *gmock_os << FormatDescription(true);\ |
---|
1794 | }\ |
---|
1795 | p0##_type p0;\ |
---|
1796 | p1##_type p1;\ |
---|
1797 | p2##_type p2;\ |
---|
1798 | p3##_type p3;\ |
---|
1799 | p4##_type p4;\ |
---|
1800 | p5##_type p5;\ |
---|
1801 | p6##_type p6;\ |
---|
1802 | p7##_type p7;\ |
---|
1803 | private:\ |
---|
1804 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1805 | const ::testing::internal::string gmock_description = (description);\ |
---|
1806 | if (!gmock_description.empty())\ |
---|
1807 | return gmock_description;\ |
---|
1808 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1809 | negation, #name,\ |
---|
1810 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1811 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1812 | p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \ |
---|
1813 | p3, p4, p5, p6, p7)));\ |
---|
1814 | }\ |
---|
1815 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1816 | };\ |
---|
1817 | template <typename arg_type>\ |
---|
1818 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1819 | return ::testing::Matcher<arg_type>(\ |
---|
1820 | new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\ |
---|
1821 | }\ |
---|
1822 | name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1823 | p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ |
---|
1824 | p5##_type gmock_p5, p6##_type gmock_p6, \ |
---|
1825 | p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ |
---|
1826 | p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ |
---|
1827 | p7(gmock_p7) {\ |
---|
1828 | }\ |
---|
1829 | p0##_type p0;\ |
---|
1830 | p1##_type p1;\ |
---|
1831 | p2##_type p2;\ |
---|
1832 | p3##_type p3;\ |
---|
1833 | p4##_type p4;\ |
---|
1834 | p5##_type p5;\ |
---|
1835 | p6##_type p6;\ |
---|
1836 | p7##_type p7;\ |
---|
1837 | private:\ |
---|
1838 | GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\ |
---|
1839 | };\ |
---|
1840 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1841 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1842 | typename p6##_type, typename p7##_type>\ |
---|
1843 | inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1844 | p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \ |
---|
1845 | p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ |
---|
1846 | p6##_type p6, p7##_type p7) {\ |
---|
1847 | return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1848 | p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \ |
---|
1849 | p6, p7);\ |
---|
1850 | }\ |
---|
1851 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1852 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1853 | typename p6##_type, typename p7##_type>\ |
---|
1854 | template <typename arg_type>\ |
---|
1855 | bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ |
---|
1856 | p5##_type, p6##_type, \ |
---|
1857 | p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1858 | arg_type arg,\ |
---|
1859 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1860 | const |
---|
1861 | |
---|
1862 | #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ |
---|
1863 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1864 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1865 | typename p6##_type, typename p7##_type, typename p8##_type>\ |
---|
1866 | class name##MatcherP9 {\ |
---|
1867 | public:\ |
---|
1868 | template <typename arg_type>\ |
---|
1869 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1870 | public:\ |
---|
1871 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1872 | p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ |
---|
1873 | p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\ |
---|
1874 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ |
---|
1875 | p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ |
---|
1876 | p8(gmock_p8) {}\ |
---|
1877 | virtual bool MatchAndExplain(\ |
---|
1878 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1879 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1880 | *gmock_os << FormatDescription(false);\ |
---|
1881 | }\ |
---|
1882 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1883 | *gmock_os << FormatDescription(true);\ |
---|
1884 | }\ |
---|
1885 | p0##_type p0;\ |
---|
1886 | p1##_type p1;\ |
---|
1887 | p2##_type p2;\ |
---|
1888 | p3##_type p3;\ |
---|
1889 | p4##_type p4;\ |
---|
1890 | p5##_type p5;\ |
---|
1891 | p6##_type p6;\ |
---|
1892 | p7##_type p7;\ |
---|
1893 | p8##_type p8;\ |
---|
1894 | private:\ |
---|
1895 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1896 | const ::testing::internal::string gmock_description = (description);\ |
---|
1897 | if (!gmock_description.empty())\ |
---|
1898 | return gmock_description;\ |
---|
1899 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1900 | negation, #name,\ |
---|
1901 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1902 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1903 | p4##_type, p5##_type, p6##_type, p7##_type, \ |
---|
1904 | p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ |
---|
1905 | }\ |
---|
1906 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
1907 | };\ |
---|
1908 | template <typename arg_type>\ |
---|
1909 | operator ::testing::Matcher<arg_type>() const {\ |
---|
1910 | return ::testing::Matcher<arg_type>(\ |
---|
1911 | new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ |
---|
1912 | }\ |
---|
1913 | name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
1914 | p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ |
---|
1915 | p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ |
---|
1916 | p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ |
---|
1917 | p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ |
---|
1918 | p8(gmock_p8) {\ |
---|
1919 | }\ |
---|
1920 | p0##_type p0;\ |
---|
1921 | p1##_type p1;\ |
---|
1922 | p2##_type p2;\ |
---|
1923 | p3##_type p3;\ |
---|
1924 | p4##_type p4;\ |
---|
1925 | p5##_type p5;\ |
---|
1926 | p6##_type p6;\ |
---|
1927 | p7##_type p7;\ |
---|
1928 | p8##_type p8;\ |
---|
1929 | private:\ |
---|
1930 | GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\ |
---|
1931 | };\ |
---|
1932 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1933 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1934 | typename p6##_type, typename p7##_type, typename p8##_type>\ |
---|
1935 | inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1936 | p4##_type, p5##_type, p6##_type, p7##_type, \ |
---|
1937 | p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ |
---|
1938 | p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ |
---|
1939 | p8##_type p8) {\ |
---|
1940 | return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1941 | p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \ |
---|
1942 | p3, p4, p5, p6, p7, p8);\ |
---|
1943 | }\ |
---|
1944 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1945 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1946 | typename p6##_type, typename p7##_type, typename p8##_type>\ |
---|
1947 | template <typename arg_type>\ |
---|
1948 | bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ |
---|
1949 | p5##_type, p6##_type, p7##_type, \ |
---|
1950 | p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
1951 | arg_type arg,\ |
---|
1952 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
1953 | const |
---|
1954 | |
---|
1955 | #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ |
---|
1956 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
1957 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
1958 | typename p6##_type, typename p7##_type, typename p8##_type, \ |
---|
1959 | typename p9##_type>\ |
---|
1960 | class name##MatcherP10 {\ |
---|
1961 | public:\ |
---|
1962 | template <typename arg_type>\ |
---|
1963 | class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ |
---|
1964 | public:\ |
---|
1965 | gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ |
---|
1966 | p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ |
---|
1967 | p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ |
---|
1968 | p9##_type gmock_p9)\ |
---|
1969 | : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ |
---|
1970 | p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ |
---|
1971 | p8(gmock_p8), p9(gmock_p9) {}\ |
---|
1972 | virtual bool MatchAndExplain(\ |
---|
1973 | arg_type arg, ::testing::MatchResultListener* result_listener) const;\ |
---|
1974 | virtual void DescribeTo(::std::ostream* gmock_os) const {\ |
---|
1975 | *gmock_os << FormatDescription(false);\ |
---|
1976 | }\ |
---|
1977 | virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ |
---|
1978 | *gmock_os << FormatDescription(true);\ |
---|
1979 | }\ |
---|
1980 | p0##_type p0;\ |
---|
1981 | p1##_type p1;\ |
---|
1982 | p2##_type p2;\ |
---|
1983 | p3##_type p3;\ |
---|
1984 | p4##_type p4;\ |
---|
1985 | p5##_type p5;\ |
---|
1986 | p6##_type p6;\ |
---|
1987 | p7##_type p7;\ |
---|
1988 | p8##_type p8;\ |
---|
1989 | p9##_type p9;\ |
---|
1990 | private:\ |
---|
1991 | ::testing::internal::string FormatDescription(bool negation) const {\ |
---|
1992 | const ::testing::internal::string gmock_description = (description);\ |
---|
1993 | if (!gmock_description.empty())\ |
---|
1994 | return gmock_description;\ |
---|
1995 | return ::testing::internal::FormatMatcherDescription(\ |
---|
1996 | negation, #name,\ |
---|
1997 | ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ |
---|
1998 | ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
1999 | p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ |
---|
2000 | p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ |
---|
2001 | }\ |
---|
2002 | GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ |
---|
2003 | };\ |
---|
2004 | template <typename arg_type>\ |
---|
2005 | operator ::testing::Matcher<arg_type>() const {\ |
---|
2006 | return ::testing::Matcher<arg_type>(\ |
---|
2007 | new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ |
---|
2008 | }\ |
---|
2009 | name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ |
---|
2010 | p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ |
---|
2011 | p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ |
---|
2012 | p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ |
---|
2013 | p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ |
---|
2014 | p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\ |
---|
2015 | }\ |
---|
2016 | p0##_type p0;\ |
---|
2017 | p1##_type p1;\ |
---|
2018 | p2##_type p2;\ |
---|
2019 | p3##_type p3;\ |
---|
2020 | p4##_type p4;\ |
---|
2021 | p5##_type p5;\ |
---|
2022 | p6##_type p6;\ |
---|
2023 | p7##_type p7;\ |
---|
2024 | p8##_type p8;\ |
---|
2025 | p9##_type p9;\ |
---|
2026 | private:\ |
---|
2027 | GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\ |
---|
2028 | };\ |
---|
2029 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
2030 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
2031 | typename p6##_type, typename p7##_type, typename p8##_type, \ |
---|
2032 | typename p9##_type>\ |
---|
2033 | inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
2034 | p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ |
---|
2035 | p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ |
---|
2036 | p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ |
---|
2037 | p9##_type p9) {\ |
---|
2038 | return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
2039 | p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \ |
---|
2040 | p1, p2, p3, p4, p5, p6, p7, p8, p9);\ |
---|
2041 | }\ |
---|
2042 | template <typename p0##_type, typename p1##_type, typename p2##_type, \ |
---|
2043 | typename p3##_type, typename p4##_type, typename p5##_type, \ |
---|
2044 | typename p6##_type, typename p7##_type, typename p8##_type, \ |
---|
2045 | typename p9##_type>\ |
---|
2046 | template <typename arg_type>\ |
---|
2047 | bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ |
---|
2048 | p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ |
---|
2049 | p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ |
---|
2050 | arg_type arg,\ |
---|
2051 | ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ |
---|
2052 | const |
---|
2053 | |
---|
2054 | #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ |
---|