gmock-generated-actions_test.cc
Go to the documentation of this file.
1 // Copyright 2007, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: wan@google.com (Zhanyong Wan)
31 
32 // Google Mock - a framework for writing C++ mock classes.
33 //
34 // This file tests the built-in actions generated by a script.
35 
37 
38 #include <functional>
39 #include <sstream>
40 #include <string>
41 #include "gmock/gmock.h"
42 #include "gtest/gtest.h"
43 
44 namespace testing {
45 namespace gmock_generated_actions_test {
46 
47 using ::std::plus;
51 using ::std::tr1::tuple;
52 using ::std::tr1::tuple_element;
53 using testing::_;
54 using testing::Action;
56 using testing::ByRef;
57 using testing::DoAll;
58 using testing::Invoke;
59 using testing::Return;
60 using testing::ReturnNew;
63 using testing::Unused;
64 using testing::WithArgs;
65 
66 // For suppressing compiler warnings on conversion possibly losing precision.
67 inline short Short(short n) { return n; } // NOLINT
68 inline char Char(char ch) { return ch; }
69 
70 // Sample functions and functors for testing various actions.
71 int Nullary() { return 1; }
72 
74  public:
75  int operator()() { return 2; }
76 };
77 
78 bool g_done = false;
79 
80 bool Unary(int x) { return x < 0; }
81 
82 const char* Plus1(const char* s) { return s + 1; }
83 
84 bool ByConstRef(const string& s) { return s == "Hi"; }
85 
86 const double g_double = 0;
87 bool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }
88 
89 string ByNonConstRef(string& s) { return s += "+"; } // NOLINT
90 
91 struct UnaryFunctor {
92  int operator()(bool x) { return x ? 1 : -1; }
93 };
94 
95 const char* Binary(const char* input, short n) { return input + n; } // NOLINT
96 
97 void VoidBinary(int, char) { g_done = true; }
98 
99 int Ternary(int x, char y, short z) { return x + y + z; } // NOLINT
100 
101 void VoidTernary(int, char, bool) { g_done = true; }
102 
103 int SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
104 
105 string Concat4(const char* s1, const char* s2, const char* s3,
106  const char* s4) {
107  return string(s1) + s2 + s3 + s4;
108 }
109 
110 int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
111 
113  int operator()(int a, int b, int c, int d, int e) {
114  return a + b + c + d + e;
115  }
116 };
117 
118 string Concat5(const char* s1, const char* s2, const char* s3,
119  const char* s4, const char* s5) {
120  return string(s1) + s2 + s3 + s4 + s5;
121 }
122 
123 int SumOf6(int a, int b, int c, int d, int e, int f) {
124  return a + b + c + d + e + f;
125 }
126 
128  int operator()(int a, int b, int c, int d, int e, int f) {
129  return a + b + c + d + e + f;
130  }
131 };
132 
133 string Concat6(const char* s1, const char* s2, const char* s3,
134  const char* s4, const char* s5, const char* s6) {
135  return string(s1) + s2 + s3 + s4 + s5 + s6;
136 }
137 
138 string Concat7(const char* s1, const char* s2, const char* s3,
139  const char* s4, const char* s5, const char* s6,
140  const char* s7) {
141  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
142 }
143 
144 string Concat8(const char* s1, const char* s2, const char* s3,
145  const char* s4, const char* s5, const char* s6,
146  const char* s7, const char* s8) {
147  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
148 }
149 
150 string Concat9(const char* s1, const char* s2, const char* s3,
151  const char* s4, const char* s5, const char* s6,
152  const char* s7, const char* s8, const char* s9) {
153  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
154 }
155 
156 string Concat10(const char* s1, const char* s2, const char* s3,
157  const char* s4, const char* s5, const char* s6,
158  const char* s7, const char* s8, const char* s9,
159  const char* s10) {
160  return string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
161 }
162 
163 // A helper that turns the type of a C-string literal from const
164 // char[N] to const char*.
165 inline const char* CharPtr(const char* s) { return s; }
166 
167 // Tests InvokeArgument<N>(...).
168 
169 // Tests using InvokeArgument with a nullary function.
170 TEST(InvokeArgumentTest, Function0) {
171  Action<int(int, int(*)())> a = InvokeArgument<1>(); // NOLINT
172  EXPECT_EQ(1, a.Perform(make_tuple(2, &Nullary)));
173 }
174 
175 // Tests using InvokeArgument with a unary function.
176 TEST(InvokeArgumentTest, Functor1) {
177  Action<int(UnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT
179 }
180 
181 // Tests using InvokeArgument with a 5-ary function.
182 TEST(InvokeArgumentTest, Function5) {
184  InvokeArgument<0>(10000, 2000, 300, 40, 5);
185  EXPECT_EQ(12345, a.Perform(make_tuple(&SumOf5)));
186 }
187 
188 // Tests using InvokeArgument with a 5-ary functor.
189 TEST(InvokeArgumentTest, Functor5) {
190  Action<int(SumOf5Functor)> a = // NOLINT
191  InvokeArgument<0>(10000, 2000, 300, 40, 5);
193 }
194 
195 // Tests using InvokeArgument with a 6-ary function.
196 TEST(InvokeArgumentTest, Function6) {
198  InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
199  EXPECT_EQ(123456, a.Perform(make_tuple(&SumOf6)));
200 }
201 
202 // Tests using InvokeArgument with a 6-ary functor.
203 TEST(InvokeArgumentTest, Functor6) {
204  Action<int(SumOf6Functor)> a = // NOLINT
205  InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
206  EXPECT_EQ(123456, a.Perform(make_tuple(SumOf6Functor())));
207 }
208 
209 // Tests using InvokeArgument with a 7-ary function.
210 TEST(InvokeArgumentTest, Function7) {
211  Action<string(string(*)(const char*, const char*, const char*,
212  const char*, const char*, const char*,
213  const char*))> a =
214  InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7");
215  EXPECT_EQ("1234567", a.Perform(make_tuple(&Concat7)));
216 }
217 
218 // Tests using InvokeArgument with a 8-ary function.
219 TEST(InvokeArgumentTest, Function8) {
220  Action<string(string(*)(const char*, const char*, const char*,
221  const char*, const char*, const char*,
222  const char*, const char*))> a =
223  InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8");
224  EXPECT_EQ("12345678", a.Perform(make_tuple(&Concat8)));
225 }
226 
227 // Tests using InvokeArgument with a 9-ary function.
228 TEST(InvokeArgumentTest, Function9) {
229  Action<string(string(*)(const char*, const char*, const char*,
230  const char*, const char*, const char*,
231  const char*, const char*, const char*))> a =
232  InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9");
233  EXPECT_EQ("123456789", a.Perform(make_tuple(&Concat9)));
234 }
235 
236 // Tests using InvokeArgument with a 10-ary function.
237 TEST(InvokeArgumentTest, Function10) {
238  Action<string(string(*)(const char*, const char*, const char*,
239  const char*, const char*, const char*,
240  const char*, const char*, const char*,
241  const char*))> a =
242  InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
243  EXPECT_EQ("1234567890", a.Perform(make_tuple(&Concat10)));
244 }
245 
246 // Tests using InvokeArgument with a function that takes a pointer argument.
247 TEST(InvokeArgumentTest, ByPointerFunction) {
249  InvokeArgument<0>(static_cast<const char*>("Hi"), Short(1));
251 }
252 
253 // Tests using InvokeArgument with a function that takes a const char*
254 // by passing it a C-string literal.
255 TEST(InvokeArgumentTest, FunctionWithCStringLiteral) {
257  InvokeArgument<0>("Hi", Short(1));
259 }
260 
261 // Tests using InvokeArgument with a function that takes a const reference.
262 TEST(InvokeArgumentTest, ByConstReferenceFunction) {
264  InvokeArgument<0>(string("Hi"));
265  // When action 'a' is constructed, it makes a copy of the temporary
266  // string object passed to it, so it's OK to use 'a' later, when the
267  // temporary object has already died.
269 }
270 
271 // Tests using InvokeArgument with ByRef() and a function that takes a
272 // const reference.
273 TEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) {
275  InvokeArgument<0>(ByRef(g_double));
276  // The above line calls ByRef() on a const value.
278 
279  double x = 0;
280  a = InvokeArgument<0>(ByRef(x)); // This calls ByRef() on a non-const.
282 }
283 
284 // Tests using WithArgs and with an action that takes 1 argument.
285 TEST(WithArgsTest, OneArg) {
286  Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary)); // NOLINT
287  EXPECT_TRUE(a.Perform(make_tuple(1.5, -1)));
288  EXPECT_FALSE(a.Perform(make_tuple(1.5, 1)));
289 }
290 
291 // Tests using WithArgs with an action that takes 2 arguments.
292 TEST(WithArgsTest, TwoArgs) {
294  WithArgs<0, 2>(Invoke(Binary));
295  const char s[] = "Hello";
296  EXPECT_EQ(s + 2, a.Perform(make_tuple(CharPtr(s), 0.5, Short(2))));
297 }
298 
299 // Tests using WithArgs with an action that takes 3 arguments.
300 TEST(WithArgsTest, ThreeArgs) {
302  WithArgs<0, 2, 3>(Invoke(Ternary));
303  EXPECT_EQ(123, a.Perform(make_tuple(100, 6.5, Char(20), Short(3))));
304 }
305 
306 // Tests using WithArgs with an action that takes 4 arguments.
307 TEST(WithArgsTest, FourArgs) {
309  WithArgs<4, 3, 1, 0>(Invoke(Concat4));
310  EXPECT_EQ("4310", a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), 2.5,
311  CharPtr("3"), CharPtr("4"))));
312 }
313 
314 // Tests using WithArgs with an action that takes 5 arguments.
315 TEST(WithArgsTest, FiveArgs) {
316  Action<string(const char*, const char*, const char*,
317  const char*, const char*)> a =
318  WithArgs<4, 3, 2, 1, 0>(Invoke(Concat5));
319  EXPECT_EQ("43210",
320  a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
321  CharPtr("3"), CharPtr("4"))));
322 }
323 
324 // Tests using WithArgs with an action that takes 6 arguments.
325 TEST(WithArgsTest, SixArgs) {
327  WithArgs<0, 1, 2, 2, 1, 0>(Invoke(Concat6));
328  EXPECT_EQ("012210",
329  a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"))));
330 }
331 
332 // Tests using WithArgs with an action that takes 7 arguments.
333 TEST(WithArgsTest, SevenArgs) {
335  WithArgs<0, 1, 2, 3, 2, 1, 0>(Invoke(Concat7));
336  EXPECT_EQ("0123210",
337  a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
338  CharPtr("3"))));
339 }
340 
341 // Tests using WithArgs with an action that takes 8 arguments.
342 TEST(WithArgsTest, EightArgs) {
344  WithArgs<0, 1, 2, 3, 0, 1, 2, 3>(Invoke(Concat8));
345  EXPECT_EQ("01230123",
346  a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
347  CharPtr("3"))));
348 }
349 
350 // Tests using WithArgs with an action that takes 9 arguments.
351 TEST(WithArgsTest, NineArgs) {
353  WithArgs<0, 1, 2, 3, 1, 2, 3, 2, 3>(Invoke(Concat9));
354  EXPECT_EQ("012312323",
355  a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
356  CharPtr("3"))));
357 }
358 
359 // Tests using WithArgs with an action that takes 10 arguments.
360 TEST(WithArgsTest, TenArgs) {
362  WithArgs<0, 1, 2, 3, 2, 1, 0, 1, 2, 3>(Invoke(Concat10));
363  EXPECT_EQ("0123210123",
364  a.Perform(make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
365  CharPtr("3"))));
366 }
367 
368 // Tests using WithArgs with an action that is not Invoke().
369 class SubstractAction : public ActionInterface<int(int, int)> { // NOLINT
370  public:
371  virtual int Perform(const tuple<int, int>& args) {
372  return get<0>(args) - get<1>(args);
373  }
374 };
375 
376 TEST(WithArgsTest, NonInvokeAction) {
378  WithArgs<2, 1>(MakeAction(new SubstractAction));
379  EXPECT_EQ(8, a.Perform(make_tuple(string("hi"), 2, 10)));
380 }
381 
382 // Tests using WithArgs to pass all original arguments in the original order.
383 TEST(WithArgsTest, Identity) {
385  WithArgs<0, 1, 2>(Invoke(Ternary));
386  EXPECT_EQ(123, a.Perform(make_tuple(100, Char(20), Short(3))));
387 }
388 
389 // Tests using WithArgs with repeated arguments.
390 TEST(WithArgsTest, RepeatedArguments) {
391  Action<int(bool, int m, int n)> a = // NOLINT
392  WithArgs<1, 1, 1, 1>(Invoke(SumOf4));
393  EXPECT_EQ(4, a.Perform(make_tuple(false, 1, 10)));
394 }
395 
396 // Tests using WithArgs with reversed argument order.
397 TEST(WithArgsTest, ReversedArgumentOrder) {
399  WithArgs<1, 0>(Invoke(Binary));
400  const char s[] = "Hello";
401  EXPECT_EQ(s + 2, a.Perform(make_tuple(Short(2), CharPtr(s))));
402 }
403 
404 // Tests using WithArgs with compatible, but not identical, argument types.
405 TEST(WithArgsTest, ArgsOfCompatibleTypes) {
407  WithArgs<0, 1, 3>(Invoke(Ternary));
408  EXPECT_EQ(123, a.Perform(make_tuple(Short(100), Char(20), 5.6, Char(3))));
409 }
410 
411 // Tests using WithArgs with an action that returns void.
412 TEST(WithArgsTest, VoidAction) {
414  g_done = false;
415  a.Perform(make_tuple(1.5, 'a', 3));
416  EXPECT_TRUE(g_done);
417 }
418 
419 // Tests DoAll(a1, a2).
420 TEST(DoAllTest, TwoActions) {
421  int n = 0;
422  Action<int(int*)> a = DoAll(SetArgPointee<0>(1), // NOLINT
423  Return(2));
424  EXPECT_EQ(2, a.Perform(make_tuple(&n)));
425  EXPECT_EQ(1, n);
426 }
427 
428 // Tests DoAll(a1, a2, a3).
429 TEST(DoAllTest, ThreeActions) {
430  int m = 0, n = 0;
431  Action<int(int*, int*)> a = DoAll(SetArgPointee<0>(1), // NOLINT
432  SetArgPointee<1>(2),
433  Return(3));
434  EXPECT_EQ(3, a.Perform(make_tuple(&m, &n)));
435  EXPECT_EQ(1, m);
436  EXPECT_EQ(2, n);
437 }
438 
439 // Tests DoAll(a1, a2, a3, a4).
440 TEST(DoAllTest, FourActions) {
441  int m = 0, n = 0;
442  char ch = '\0';
443  Action<int(int*, int*, char*)> a = // NOLINT
444  DoAll(SetArgPointee<0>(1),
445  SetArgPointee<1>(2),
446  SetArgPointee<2>('a'),
447  Return(3));
448  EXPECT_EQ(3, a.Perform(make_tuple(&m, &n, &ch)));
449  EXPECT_EQ(1, m);
450  EXPECT_EQ(2, n);
451  EXPECT_EQ('a', ch);
452 }
453 
454 // Tests DoAll(a1, a2, a3, a4, a5).
455 TEST(DoAllTest, FiveActions) {
456  int m = 0, n = 0;
457  char a = '\0', b = '\0';
458  Action<int(int*, int*, char*, char*)> action = // NOLINT
459  DoAll(SetArgPointee<0>(1),
460  SetArgPointee<1>(2),
461  SetArgPointee<2>('a'),
462  SetArgPointee<3>('b'),
463  Return(3));
464  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b)));
465  EXPECT_EQ(1, m);
466  EXPECT_EQ(2, n);
467  EXPECT_EQ('a', a);
468  EXPECT_EQ('b', b);
469 }
470 
471 // Tests DoAll(a1, a2, ..., a6).
472 TEST(DoAllTest, SixActions) {
473  int m = 0, n = 0;
474  char a = '\0', b = '\0', c = '\0';
476  DoAll(SetArgPointee<0>(1),
477  SetArgPointee<1>(2),
478  SetArgPointee<2>('a'),
479  SetArgPointee<3>('b'),
480  SetArgPointee<4>('c'),
481  Return(3));
482  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c)));
483  EXPECT_EQ(1, m);
484  EXPECT_EQ(2, n);
485  EXPECT_EQ('a', a);
486  EXPECT_EQ('b', b);
487  EXPECT_EQ('c', c);
488 }
489 
490 // Tests DoAll(a1, a2, ..., a7).
491 TEST(DoAllTest, SevenActions) {
492  int m = 0, n = 0;
493  char a = '\0', b = '\0', c = '\0', d = '\0';
495  DoAll(SetArgPointee<0>(1),
496  SetArgPointee<1>(2),
497  SetArgPointee<2>('a'),
498  SetArgPointee<3>('b'),
499  SetArgPointee<4>('c'),
500  SetArgPointee<5>('d'),
501  Return(3));
502  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d)));
503  EXPECT_EQ(1, m);
504  EXPECT_EQ(2, n);
505  EXPECT_EQ('a', a);
506  EXPECT_EQ('b', b);
507  EXPECT_EQ('c', c);
508  EXPECT_EQ('d', d);
509 }
510 
511 // Tests DoAll(a1, a2, ..., a8).
512 TEST(DoAllTest, EightActions) {
513  int m = 0, n = 0;
514  char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0';
515  Action<int(int*, int*, char*, char*, char*, char*, // NOLINT
516  char*)> action =
517  DoAll(SetArgPointee<0>(1),
518  SetArgPointee<1>(2),
519  SetArgPointee<2>('a'),
520  SetArgPointee<3>('b'),
521  SetArgPointee<4>('c'),
522  SetArgPointee<5>('d'),
523  SetArgPointee<6>('e'),
524  Return(3));
525  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e)));
526  EXPECT_EQ(1, m);
527  EXPECT_EQ(2, n);
528  EXPECT_EQ('a', a);
529  EXPECT_EQ('b', b);
530  EXPECT_EQ('c', c);
531  EXPECT_EQ('d', d);
532  EXPECT_EQ('e', e);
533 }
534 
535 // Tests DoAll(a1, a2, ..., a9).
536 TEST(DoAllTest, NineActions) {
537  int m = 0, n = 0;
538  char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0', f = '\0';
539  Action<int(int*, int*, char*, char*, char*, char*, // NOLINT
540  char*, char*)> action =
541  DoAll(SetArgPointee<0>(1),
542  SetArgPointee<1>(2),
543  SetArgPointee<2>('a'),
544  SetArgPointee<3>('b'),
545  SetArgPointee<4>('c'),
546  SetArgPointee<5>('d'),
547  SetArgPointee<6>('e'),
548  SetArgPointee<7>('f'),
549  Return(3));
550  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f)));
551  EXPECT_EQ(1, m);
552  EXPECT_EQ(2, n);
553  EXPECT_EQ('a', a);
554  EXPECT_EQ('b', b);
555  EXPECT_EQ('c', c);
556  EXPECT_EQ('d', d);
557  EXPECT_EQ('e', e);
558  EXPECT_EQ('f', f);
559 }
560 
561 // Tests DoAll(a1, a2, ..., a10).
562 TEST(DoAllTest, TenActions) {
563  int m = 0, n = 0;
564  char a = '\0', b = '\0', c = '\0', d = '\0';
565  char e = '\0', f = '\0', g = '\0';
566  Action<int(int*, int*, char*, char*, char*, char*, // NOLINT
567  char*, char*, char*)> action =
568  DoAll(SetArgPointee<0>(1),
569  SetArgPointee<1>(2),
570  SetArgPointee<2>('a'),
571  SetArgPointee<3>('b'),
572  SetArgPointee<4>('c'),
573  SetArgPointee<5>('d'),
574  SetArgPointee<6>('e'),
575  SetArgPointee<7>('f'),
576  SetArgPointee<8>('g'),
577  Return(3));
578  EXPECT_EQ(3, action.Perform(make_tuple(&m, &n, &a, &b, &c, &d, &e, &f, &g)));
579  EXPECT_EQ(1, m);
580  EXPECT_EQ(2, n);
581  EXPECT_EQ('a', a);
582  EXPECT_EQ('b', b);
583  EXPECT_EQ('c', c);
584  EXPECT_EQ('d', d);
585  EXPECT_EQ('e', e);
586  EXPECT_EQ('f', f);
587  EXPECT_EQ('g', g);
588 }
589 
590 // The ACTION*() macros trigger warning C4100 (unreferenced formal
591 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
592 // the macro definition, as the warnings are generated when the macro
593 // is expanded and macro expansion cannot contain #pragma. Therefore
594 // we suppress them here.
595 #ifdef _MSC_VER
596 # pragma warning(push)
597 # pragma warning(disable:4100)
598 #endif
599 
600 // Tests the ACTION*() macro family.
601 
602 // Tests that ACTION() can define an action that doesn't reference the
603 // mock function arguments.
604 ACTION(Return5) { return 5; }
605 
606 TEST(ActionMacroTest, WorksWhenNotReferencingArguments) {
607  Action<double()> a1 = Return5();
609 
610  Action<int(double, bool)> a2 = Return5();
611  EXPECT_EQ(5, a2.Perform(make_tuple(1, true)));
612 }
613 
614 // Tests that ACTION() can define an action that returns void.
615 ACTION(IncrementArg1) { (*arg1)++; }
616 
617 TEST(ActionMacroTest, WorksWhenReturningVoid) {
618  Action<void(int, int*)> a1 = IncrementArg1();
619  int n = 0;
620  a1.Perform(make_tuple(5, &n));
621  EXPECT_EQ(1, n);
622 }
623 
624 // Tests that the body of ACTION() can reference the type of the
625 // argument.
626 ACTION(IncrementArg2) {
627  StaticAssertTypeEq<int*, arg2_type>();
628  arg2_type temp = arg2;
629  (*temp)++;
630 }
631 
632 TEST(ActionMacroTest, CanReferenceArgumentType) {
633  Action<void(int, bool, int*)> a1 = IncrementArg2();
634  int n = 0;
635  a1.Perform(make_tuple(5, false, &n));
636  EXPECT_EQ(1, n);
637 }
638 
639 // Tests that the body of ACTION() can reference the argument tuple
640 // via args_type and args.
641 ACTION(Sum2) {
642  StaticAssertTypeEq< ::std::tr1::tuple<int, char, int*>, args_type>();
643  args_type args_copy = args;
644  return get<0>(args_copy) + get<1>(args_copy);
645 }
646 
647 TEST(ActionMacroTest, CanReferenceArgumentTuple) {
648  Action<int(int, char, int*)> a1 = Sum2();
649  int dummy = 0;
650  EXPECT_EQ(11, a1.Perform(make_tuple(5, Char(6), &dummy)));
651 }
652 
653 // Tests that the body of ACTION() can reference the mock function
654 // type.
655 int Dummy(bool flag) { return flag? 1 : 0; }
656 
657 ACTION(InvokeDummy) {
658  StaticAssertTypeEq<int(bool), function_type>();
659  function_type* fp = &Dummy;
660  return (*fp)(true);
661 }
662 
663 TEST(ActionMacroTest, CanReferenceMockFunctionType) {
664  Action<int(bool)> a1 = InvokeDummy();
665  EXPECT_EQ(1, a1.Perform(make_tuple(true)));
666  EXPECT_EQ(1, a1.Perform(make_tuple(false)));
667 }
668 
669 // Tests that the body of ACTION() can reference the mock function's
670 // return type.
671 ACTION(InvokeDummy2) {
672  StaticAssertTypeEq<int, return_type>();
673  return_type result = Dummy(true);
674  return result;
675 }
676 
677 TEST(ActionMacroTest, CanReferenceMockFunctionReturnType) {
678  Action<int(bool)> a1 = InvokeDummy2();
679  EXPECT_EQ(1, a1.Perform(make_tuple(true)));
680  EXPECT_EQ(1, a1.Perform(make_tuple(false)));
681 }
682 
683 // Tests that ACTION() works for arguments passed by const reference.
684 ACTION(ReturnAddrOfConstBoolReferenceArg) {
685  StaticAssertTypeEq<const bool&, arg1_type>();
686  return &arg1;
687 }
688 
689 TEST(ActionMacroTest, WorksForConstReferenceArg) {
690  Action<const bool*(int, const bool&)> a = ReturnAddrOfConstBoolReferenceArg();
691  const bool b = false;
692  EXPECT_EQ(&b, a.Perform(tuple<int, const bool&>(0, b)));
693 }
694 
695 // Tests that ACTION() works for arguments passed by non-const reference.
696 ACTION(ReturnAddrOfIntReferenceArg) {
697  StaticAssertTypeEq<int&, arg0_type>();
698  return &arg0;
699 }
700 
701 TEST(ActionMacroTest, WorksForNonConstReferenceArg) {
702  Action<int*(int&, bool, int)> a = ReturnAddrOfIntReferenceArg();
703  int n = 0;
704  EXPECT_EQ(&n, a.Perform(tuple<int&, bool, int>(n, true, 1)));
705 }
706 
707 // Tests that ACTION() can be used in a namespace.
708 namespace action_test {
709 ACTION(Sum) { return arg0 + arg1; }
710 } // namespace action_test
711 
712 TEST(ActionMacroTest, WorksInNamespace) {
713  Action<int(int, int)> a1 = action_test::Sum();
714  EXPECT_EQ(3, a1.Perform(make_tuple(1, 2)));
715 }
716 
717 // Tests that the same ACTION definition works for mock functions with
718 // different argument numbers.
719 ACTION(PlusTwo) { return arg0 + 2; }
720 
721 TEST(ActionMacroTest, WorksForDifferentArgumentNumbers) {
722  Action<int(int)> a1 = PlusTwo();
723  EXPECT_EQ(4, a1.Perform(make_tuple(2)));
724 
725  Action<double(float, void*)> a2 = PlusTwo();
726  int dummy;
727  EXPECT_DOUBLE_EQ(6, a2.Perform(make_tuple(4.0f, &dummy)));
728 }
729 
730 // Tests that ACTION_P can define a parameterized action.
731 ACTION_P(Plus, n) { return arg0 + n; }
732 
733 TEST(ActionPMacroTest, DefinesParameterizedAction) {
734  Action<int(int m, bool t)> a1 = Plus(9);
735  EXPECT_EQ(10, a1.Perform(make_tuple(1, true)));
736 }
737 
738 // Tests that the body of ACTION_P can reference the argument types
739 // and the parameter type.
740 ACTION_P(TypedPlus, n) {
741  arg0_type t1 = arg0;
742  n_type t2 = n;
743  return t1 + t2;
744 }
745 
746 TEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) {
747  Action<int(char m, bool t)> a1 = TypedPlus(9);
748  EXPECT_EQ(10, a1.Perform(make_tuple(Char(1), true)));
749 }
750 
751 // Tests that a parameterized action can be used in any mock function
752 // whose type is compatible.
753 TEST(ActionPMacroTest, WorksInCompatibleMockFunction) {
755  const std::string re = "re";
756  EXPECT_EQ("retail", a1.Perform(make_tuple(re)));
757 }
758 
759 // Tests that we can use ACTION*() to define actions overloaded on the
760 // number of parameters.
761 
762 ACTION(OverloadedAction) { return arg0 ? arg1 : "hello"; }
763 
764 ACTION_P(OverloadedAction, default_value) {
765  return arg0 ? arg1 : default_value;
766 }
767 
768 ACTION_P2(OverloadedAction, true_value, false_value) {
769  return arg0 ? true_value : false_value;
770 }
771 
772 TEST(ActionMacroTest, CanDefineOverloadedActions) {
774 
775  const MyAction a1 = OverloadedAction();
776  EXPECT_STREQ("hello", a1.Perform(make_tuple(false, CharPtr("world"))));
777  EXPECT_STREQ("world", a1.Perform(make_tuple(true, CharPtr("world"))));
778 
779  const MyAction a2 = OverloadedAction("hi");
780  EXPECT_STREQ("hi", a2.Perform(make_tuple(false, CharPtr("world"))));
781  EXPECT_STREQ("world", a2.Perform(make_tuple(true, CharPtr("world"))));
782 
783  const MyAction a3 = OverloadedAction("hi", "you");
784  EXPECT_STREQ("hi", a3.Perform(make_tuple(true, CharPtr("world"))));
785  EXPECT_STREQ("you", a3.Perform(make_tuple(false, CharPtr("world"))));
786 }
787 
788 // Tests ACTION_Pn where n >= 3.
789 
790 ACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; }
791 
792 TEST(ActionPnMacroTest, WorksFor3Parameters) {
793  Action<double(int m, bool t)> a1 = Plus(100, 20, 3.4);
794  EXPECT_DOUBLE_EQ(3123.4, a1.Perform(make_tuple(3000, true)));
795 
796  Action<std::string(const std::string& s)> a2 = Plus("tail", "-", ">");
797  const std::string re = "re";
798  EXPECT_EQ("retail->", a2.Perform(make_tuple(re)));
799 }
800 
801 ACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; }
802 
803 TEST(ActionPnMacroTest, WorksFor4Parameters) {
804  Action<int(int)> a1 = Plus(1, 2, 3, 4);
805  EXPECT_EQ(10 + 1 + 2 + 3 + 4, a1.Perform(make_tuple(10)));
806 }
807 
808 ACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; }
809 
810 TEST(ActionPnMacroTest, WorksFor5Parameters) {
811  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5);
812  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5, a1.Perform(make_tuple(10)));
813 }
814 
815 ACTION_P6(Plus, p0, p1, p2, p3, p4, p5) {
816  return arg0 + p0 + p1 + p2 + p3 + p4 + p5;
817 }
818 
819 TEST(ActionPnMacroTest, WorksFor6Parameters) {
820  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6);
821  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6, a1.Perform(make_tuple(10)));
822 }
823 
824 ACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) {
825  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6;
826 }
827 
828 TEST(ActionPnMacroTest, WorksFor7Parameters) {
829  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7);
830  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7, a1.Perform(make_tuple(10)));
831 }
832 
833 ACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7) {
834  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
835 }
836 
837 TEST(ActionPnMacroTest, WorksFor8Parameters) {
838  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8);
839  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8, a1.Perform(make_tuple(10)));
840 }
841 
842 ACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8) {
843  return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8;
844 }
845 
846 TEST(ActionPnMacroTest, WorksFor9Parameters) {
847  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9);
848  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9, a1.Perform(make_tuple(10)));
849 }
850 
851 ACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) {
852  arg0_type t0 = arg0;
853  last_param_type t9 = last_param;
854  return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9;
855 }
856 
857 TEST(ActionPnMacroTest, WorksFor10Parameters) {
858  Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
859  EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10,
860  a1.Perform(make_tuple(10)));
861 }
862 
863 // Tests that the action body can promote the parameter types.
864 
865 ACTION_P2(PadArgument, prefix, suffix) {
866  // The following lines promote the two parameters to desired types.
867  std::string prefix_str(prefix);
868  char suffix_char = static_cast<char>(suffix);
869  return prefix_str + arg0 + suffix_char;
870 }
871 
872 TEST(ActionPnMacroTest, SimpleTypePromotion) {
874  PadArgument(std::string("foo"), 'r');
876  PadArgument("foo", static_cast<int>('r'));
877  EXPECT_EQ("foobar", no_promo.Perform(make_tuple(CharPtr("ba"))));
878  EXPECT_EQ("foobar", promo.Perform(make_tuple(CharPtr("ba"))));
879 }
880 
881 // Tests that we can partially restrict parameter types using a
882 // straight-forward pattern.
883 
884 // Defines a generic action that doesn't restrict the types of its
885 // parameters.
886 ACTION_P3(ConcatImpl, a, b, c) {
887  std::stringstream ss;
888  ss << a << b << c;
889  return ss.str();
890 }
891 
892 // Next, we try to restrict that either the first parameter is a
893 // string, or the second parameter is an int.
894 
895 // Defines a partially specialized wrapper that restricts the first
896 // parameter to std::string.
897 template <typename T1, typename T2>
898 // ConcatImplActionP3 is the class template ACTION_P3 uses to
899 // implement ConcatImpl. We shouldn't change the name as this
900 // pattern requires the user to use it directly.
901 ConcatImplActionP3<std::string, T1, T2>
902 Concat(const std::string& a, T1 b, T2 c) {
903  if (true) {
904  // This branch verifies that ConcatImpl() can be invoked without
905  // explicit template arguments.
906  return ConcatImpl(a, b, c);
907  } else {
908  // This branch verifies that ConcatImpl() can also be invoked with
909  // explicit template arguments. It doesn't really need to be
910  // executed as this is a compile-time verification.
911  return ConcatImpl<std::string, T1, T2>(a, b, c);
912  }
913 }
914 
915 // Defines another partially specialized wrapper that restricts the
916 // second parameter to int.
917 template <typename T1, typename T2>
918 ConcatImplActionP3<T1, int, T2>
919 Concat(T1 a, int b, T2 c) {
920  return ConcatImpl(a, b, c);
921 }
922 
923 TEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) {
924  Action<const std::string()> a1 = Concat("Hello", "1", 2);
925  EXPECT_EQ("Hello12", a1.Perform(make_tuple()));
926 
927  a1 = Concat(1, 2, 3);
928  EXPECT_EQ("123", a1.Perform(make_tuple()));
929 }
930 
931 // Verifies the type of an ACTION*.
932 
933 ACTION(DoFoo) {}
934 ACTION_P(DoFoo, p) {}
935 ACTION_P2(DoFoo, p0, p1) {}
936 
937 TEST(ActionPnMacroTest, TypesAreCorrect) {
938  // DoFoo() must be assignable to a DoFooAction variable.
939  DoFooAction a0 = DoFoo();
940 
941  // DoFoo(1) must be assignable to a DoFooActionP variable.
942  DoFooActionP<int> a1 = DoFoo(1);
943 
944  // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk
945  // variable, and so on.
946  DoFooActionP2<int, char> a2 = DoFoo(1, '2');
947  PlusActionP3<int, int, char> a3 = Plus(1, 2, '3');
948  PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4');
949  PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5');
950  PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6');
951  PlusActionP7<int, int, int, int, int, int, char> a7 =
952  Plus(1, 2, 3, 4, 5, 6, '7');
953  PlusActionP8<int, int, int, int, int, int, int, char> a8 =
954  Plus(1, 2, 3, 4, 5, 6, 7, '8');
955  PlusActionP9<int, int, int, int, int, int, int, int, char> a9 =
956  Plus(1, 2, 3, 4, 5, 6, 7, 8, '9');
957  PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 =
958  Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0');
959 
960  // Avoid "unused variable" warnings.
961  (void)a0;
962  (void)a1;
963  (void)a2;
964  (void)a3;
965  (void)a4;
966  (void)a5;
967  (void)a6;
968  (void)a7;
969  (void)a8;
970  (void)a9;
971  (void)a10;
972 }
973 
974 // Tests that an ACTION_P*() action can be explicitly instantiated
975 // with reference-typed parameters.
976 
977 ACTION_P(Plus1, x) { return x; }
978 ACTION_P2(Plus2, x, y) { return x + y; }
979 ACTION_P3(Plus3, x, y, z) { return x + y + z; }
980 ACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
981  return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
982 }
983 
984 TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
985  int x = 1, y = 2, z = 3;
986  const tuple<> empty = make_tuple();
987 
988  Action<int()> a = Plus1<int&>(x);
989  EXPECT_EQ(1, a.Perform(empty));
990 
991  a = Plus2<const int&, int&>(x, y);
992  EXPECT_EQ(3, a.Perform(empty));
993 
994  a = Plus3<int&, const int&, int&>(x, y, z);
995  EXPECT_EQ(6, a.Perform(empty));
996 
997  int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
998  a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&,
999  int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7],
1000  n[8], n[9]);
1001  EXPECT_EQ(55, a.Perform(empty));
1002 }
1003 
1005  public:
1006  NullaryConstructorClass() : value_(123) {}
1007  int value_;
1008 };
1009 
1010 // Tests using ReturnNew() with a nullary constructor.
1011 TEST(ReturnNewTest, NoArgs) {
1012  Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>();
1014  EXPECT_EQ(123, c->value_);
1015  delete c;
1016 }
1017 
1019  public:
1020  explicit UnaryConstructorClass(int value) : value_(value) {}
1021  int value_;
1022 };
1023 
1024 // Tests using ReturnNew() with a unary constructor.
1025 TEST(ReturnNewTest, Unary) {
1026  Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
1028  EXPECT_EQ(4000, c->value_);
1029  delete c;
1030 }
1031 
1032 TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
1034  ReturnNew<UnaryConstructorClass>(4000);
1035  UnaryConstructorClass* c = a.Perform(make_tuple(false, 5));
1036  EXPECT_EQ(4000, c->value_);
1037  delete c;
1038 }
1039 
1040 TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
1042  ReturnNew<UnaryConstructorClass>(4000);
1043  const UnaryConstructorClass* c = a.Perform(make_tuple());
1044  EXPECT_EQ(4000, c->value_);
1045  delete c;
1046 }
1047 
1049  public:
1050  TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5,
1051  int a6, int a7, int a8, int a9, int a10)
1052  : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {
1053  }
1054  int value_;
1055 };
1056 
1057 // Tests using ReturnNew() with a 10-argument constructor.
1058 TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
1060  ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000,
1061  4000000, 500000, 60000,
1062  7000, 800, 90, 0);
1064  EXPECT_EQ(1234567890, c->value_);
1065  delete c;
1066 }
1067 
1068 // Tests that ACTION_TEMPLATE works when there is no value parameter.
1070  HAS_1_TEMPLATE_PARAMS(typename, T),
1071  AND_0_VALUE_PARAMS()) {
1072  return new T;
1073 }
1074 
1075 TEST(ActionTemplateTest, WorksWithoutValueParam) {
1076  const Action<int*()> a = CreateNew<int>();
1077  int* p = a.Perform(make_tuple());
1078  delete p;
1079 }
1080 
1081 // Tests that ACTION_TEMPLATE works when there are value parameters.
1083  HAS_1_TEMPLATE_PARAMS(typename, T),
1084  AND_1_VALUE_PARAMS(a0)) {
1085  return new T(a0);
1086 }
1087 
1088 TEST(ActionTemplateTest, WorksWithValueParams) {
1089  const Action<int*()> a = CreateNew<int>(42);
1090  int* p = a.Perform(make_tuple());
1091  EXPECT_EQ(42, *p);
1092  delete p;
1093 }
1094 
1095 // Tests that ACTION_TEMPLATE works for integral template parameters.
1096 ACTION_TEMPLATE(MyDeleteArg,
1097  HAS_1_TEMPLATE_PARAMS(int, k),
1098  AND_0_VALUE_PARAMS()) {
1099  delete std::tr1::get<k>(args);
1100 }
1101 
1102 // Resets a bool variable in the destructor.
1104  public:
1105  explicit BoolResetter(bool* value) : value_(value) {}
1106  ~BoolResetter() { *value_ = false; }
1107  private:
1108  bool* value_;
1109 };
1110 
1111 TEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
1112  const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();
1113  int n = 0;
1114  bool b = true;
1115  BoolResetter* resetter = new BoolResetter(&b);
1116  a.Perform(make_tuple(&n, resetter));
1117  EXPECT_FALSE(b); // Verifies that resetter is deleted.
1118 }
1119 
1120 // Tests that ACTION_TEMPLATES works for template template parameters.
1121 ACTION_TEMPLATE(ReturnSmartPointer,
1122  HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,
1123  Pointer),
1124  AND_1_VALUE_PARAMS(pointee)) {
1125  return Pointer<pointee_type>(new pointee_type(pointee));
1126 }
1127 
1128 TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
1129  using ::testing::internal::linked_ptr;
1130  const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42);
1131  linked_ptr<int> p = a.Perform(make_tuple());
1132  EXPECT_EQ(42, *p);
1133 }
1134 
1135 // Tests that ACTION_TEMPLATE works for 10 template parameters.
1136 template <typename T1, typename T2, typename T3, int k4, bool k5,
1137  unsigned int k6, typename T7, typename T8, typename T9>
1139  public:
1140  explicit GiantTemplate(int a_value) : value(a_value) {}
1141  int value;
1142 };
1143 
1144 ACTION_TEMPLATE(ReturnGiant,
1145  HAS_10_TEMPLATE_PARAMS(
1146  typename, T1,
1147  typename, T2,
1148  typename, T3,
1149  int, k4,
1150  bool, k5,
1151  unsigned int, k6,
1152  class, T7,
1153  class, T8,
1154  class, T9,
1155  template <typename T> class, T10),
1156  AND_1_VALUE_PARAMS(value)) {
1157  return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);
1158 }
1159 
1160 TEST(ActionTemplateTest, WorksFor10TemplateParameters) {
1161  using ::testing::internal::linked_ptr;
1162  typedef GiantTemplate<linked_ptr<int>, bool, double, 5,
1163  true, 6, char, unsigned, int> Giant;
1164  const Action<Giant()> a = ReturnGiant<
1165  int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42);
1166  Giant giant = a.Perform(make_tuple());
1167  EXPECT_EQ(42, giant.value);
1168 }
1169 
1170 // Tests that ACTION_TEMPLATE works for 10 value parameters.
1172  HAS_1_TEMPLATE_PARAMS(typename, Number),
1173  AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
1174  return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
1175 }
1176 
1177 TEST(ActionTemplateTest, WorksFor10ValueParameters) {
1178  const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
1179  EXPECT_EQ(55, a.Perform(make_tuple()));
1180 }
1181 
1182 // Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded
1183 // on the number of value parameters.
1184 
1185 ACTION(ReturnSum) { return 0; }
1186 
1187 ACTION_P(ReturnSum, x) { return x; }
1188 
1190  HAS_1_TEMPLATE_PARAMS(typename, Number),
1191  AND_2_VALUE_PARAMS(v1, v2)) {
1192  return static_cast<Number>(v1) + v2;
1193 }
1194 
1196  HAS_1_TEMPLATE_PARAMS(typename, Number),
1197  AND_3_VALUE_PARAMS(v1, v2, v3)) {
1198  return static_cast<Number>(v1) + v2 + v3;
1199 }
1200 
1202  HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),
1203  AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
1204  return static_cast<Number>(v1) + v2 + v3 + v4 + k;
1205 }
1206 
1207 TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
1208  const Action<int()> a0 = ReturnSum();
1209  const Action<int()> a1 = ReturnSum(1);
1210  const Action<int()> a2 = ReturnSum<int>(1, 2);
1211  const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
1212  const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
1213  EXPECT_EQ(0, a0.Perform(make_tuple()));
1214  EXPECT_EQ(1, a1.Perform(make_tuple()));
1215  EXPECT_EQ(3, a2.Perform(make_tuple()));
1216  EXPECT_EQ(6, a3.Perform(make_tuple()));
1217  EXPECT_EQ(12345, a4.Perform(make_tuple()));
1218 }
1219 
1220 #ifdef _MSC_VER
1221 # pragma warning(pop)
1222 #endif
1223 
1224 } // namespace gmock_generated_actions_test
1225 } // namespace testing
d
string Concat7(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7)
int SumOf5(int a, int b, int c, int d, int e)
int operator()(int a, int b, int c, int d, int e, int f)
internal::IgnoredValue Unused
string Concat9(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8, const char *s9)
ACTION_P2(OverloadedAction, true_value, false_value)
f
ACTION_TEMPLATE(CreateNew, HAS_1_TEMPLATE_PARAMS(typename, T), AND_0_VALUE_PARAMS())
XmlRpcServer s
#define EXPECT_TRUE(condition)
def default_value(type_)
string Concat4(const char *s1, const char *s2, const char *s3, const char *s4)
#define EXPECT_STREQ(expected, actual)
ACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param)
Action< F > MakeAction(ActionInterface< F > *impl)
#define EXPECT_DOUBLE_EQ(expected, actual)
PolymorphicAction< internal::SetArgumentPointeeAction< N, T, internal::IsAProtocolMessage< T >::value > > SetArgPointee(const T &x)
PolymorphicAction< internal::InvokeAction< FunctionImpl > > Invoke(FunctionImpl function_impl)
#define EXPECT_FALSE(condition)
internal::WithArgsAction< InnerAction, k1 > WithArgs(const InnerAction &action)
ACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8)
TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10)
int SumOf6(int a, int b, int c, int d, int e, int f)
string Concat10(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8, const char *s9, const char *s10)
const char * Binary(const char *input, short n)
string Concat5(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5)
ACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7)
Result Perform(const ArgumentTuple &args) const
string Concat8(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6, const char *s7, const char *s8)
internal::ReferenceWrapper< T > ByRef(T &l_value)
internal::DoBothAction< Action1, Action2 > DoAll(Action1 a1, Action2 a2)
const internal::AnythingMatcher _
ConcatImplActionP3< std::string, T1, T2 > Concat(const std::string &a, T1 b, T2 c)
string Concat6(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5, const char *s6)
#define EXPECT_EQ(expected, actual)
internal::ReturnAction< R > Return(R value)


ros_opcua_impl_freeopcua
Author(s): Denis Štogl
autogenerated on Tue Jan 19 2021 03:06:05