• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
36 #include "gmock/gmock-generated-actions.h"
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;
48 using ::std::string;
49 using testing::get;
50 using testing::make_tuple;
51 using testing::tuple;
52 using testing::tuple_element;
53 using testing::_;
54 using testing::Action;
55 using testing::ActionInterface;
56 using testing::ByRef;
57 using testing::DoAll;
58 using testing::Invoke;
59 using testing::Return;
60 using testing::ReturnNew;
61 using testing::SetArgPointee;
62 using testing::StaticAssertTypeEq;
63 using testing::Unused;
64 using testing::WithArgs;
65 
66 // For suppressing compiler warnings on conversion possibly losing precision.
Short(short n)67 inline short Short(short n) { return n; }  // NOLINT
Char(char ch)68 inline char Char(char ch) { return ch; }
69 
70 // Sample functions and functors for testing various actions.
Nullary()71 int Nullary() { return 1; }
72 
73 class NullaryFunctor {
74  public:
operator ()()75   int operator()() { return 2; }
76 };
77 
78 bool g_done = false;
79 
Unary(int x)80 bool Unary(int x) { return x < 0; }
81 
Plus1(const char * s)82 const char* Plus1(const char* s) { return s + 1; }
83 
ByConstRef(const string & s)84 bool ByConstRef(const string& s) { return s == "Hi"; }
85 
86 const double g_double = 0;
ReferencesGlobalDouble(const double & x)87 bool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }
88 
ByNonConstRef(string & s)89 string ByNonConstRef(string& s) { return s += "+"; }  // NOLINT
90 
91 struct UnaryFunctor {
operator ()testing::gmock_generated_actions_test::UnaryFunctor92   int operator()(bool x) { return x ? 1 : -1; }
93 };
94 
Binary(const char * input,short n)95 const char* Binary(const char* input, short n) { return input + n; }  // NOLINT
96 
VoidBinary(int,char)97 void VoidBinary(int, char) { g_done = true; }
98 
Ternary(int x,char y,short z)99 int Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
100 
VoidTernary(int,char,bool)101 void VoidTernary(int, char, bool) { g_done = true; }
102 
SumOf4(int a,int b,int c,int d)103 int SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
104 
Concat4(const char * s1,const char * s2,const char * s3,const char * s4)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 
SumOf5(int a,int b,int c,int d,int e)110 int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
111 
112 struct SumOf5Functor {
operator ()testing::gmock_generated_actions_test::SumOf5Functor113   int operator()(int a, int b, int c, int d, int e) {
114     return a + b + c + d + e;
115   }
116 };
117 
Concat5(const char * s1,const char * s2,const char * s3,const char * s4,const char * s5)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 
SumOf6(int a,int b,int c,int d,int e,int f)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 
127 struct SumOf6Functor {
operator ()testing::gmock_generated_actions_test::SumOf6Functor128   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 
Concat6(const char * s1,const char * s2,const char * s3,const char * s4,const char * s5,const char * s6)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 
Concat7(const char * s1,const char * s2,const char * s3,const char * s4,const char * s5,const char * s6,const char * s7)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 
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)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 
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)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 
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)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*.
CharPtr(const char * s)165 inline const char* CharPtr(const char* s) { return s; }
166 
167 // Tests InvokeArgument<N>(...).
168 
169 // Tests using InvokeArgument with a nullary function.
TEST(InvokeArgumentTest,Function0)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.
TEST(InvokeArgumentTest,Functor1)176 TEST(InvokeArgumentTest, Functor1) {
177   Action<int(UnaryFunctor)> a = InvokeArgument<0>(true);  // NOLINT
178   EXPECT_EQ(1, a.Perform(make_tuple(UnaryFunctor())));
179 }
180 
181 // Tests using InvokeArgument with a 5-ary function.
TEST(InvokeArgumentTest,Function5)182 TEST(InvokeArgumentTest, Function5) {
183   Action<int(int(*)(int, int, int, int, int))> a =  // NOLINT
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.
TEST(InvokeArgumentTest,Functor5)189 TEST(InvokeArgumentTest, Functor5) {
190   Action<int(SumOf5Functor)> a =  // NOLINT
191       InvokeArgument<0>(10000, 2000, 300, 40, 5);
192   EXPECT_EQ(12345, a.Perform(make_tuple(SumOf5Functor())));
193 }
194 
195 // Tests using InvokeArgument with a 6-ary function.
TEST(InvokeArgumentTest,Function6)196 TEST(InvokeArgumentTest, Function6) {
197   Action<int(int(*)(int, int, int, int, int, int))> a =  // NOLINT
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.
TEST(InvokeArgumentTest,Functor6)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.
TEST(InvokeArgumentTest,Function7)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.
TEST(InvokeArgumentTest,Function8)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.
TEST(InvokeArgumentTest,Function9)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.
TEST(InvokeArgumentTest,Function10)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.
TEST(InvokeArgumentTest,ByPointerFunction)247 TEST(InvokeArgumentTest, ByPointerFunction) {
248   Action<const char*(const char*(*)(const char* input, short n))> a =  // NOLINT
249       InvokeArgument<0>(static_cast<const char*>("Hi"), Short(1));
250   EXPECT_STREQ("i", a.Perform(make_tuple(&Binary)));
251 }
252 
253 // Tests using InvokeArgument with a function that takes a const char*
254 // by passing it a C-string literal.
TEST(InvokeArgumentTest,FunctionWithCStringLiteral)255 TEST(InvokeArgumentTest, FunctionWithCStringLiteral) {
256   Action<const char*(const char*(*)(const char* input, short n))> a =  // NOLINT
257       InvokeArgument<0>("Hi", Short(1));
258   EXPECT_STREQ("i", a.Perform(make_tuple(&Binary)));
259 }
260 
261 // Tests using InvokeArgument with a function that takes a const reference.
TEST(InvokeArgumentTest,ByConstReferenceFunction)262 TEST(InvokeArgumentTest, ByConstReferenceFunction) {
263   Action<bool(bool(*function)(const string& s))> a =  // NOLINT
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.
268   EXPECT_TRUE(a.Perform(make_tuple(&ByConstRef)));
269 }
270 
271 // Tests using InvokeArgument with ByRef() and a function that takes a
272 // const reference.
TEST(InvokeArgumentTest,ByExplicitConstReferenceFunction)273 TEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) {
274   Action<bool(bool(*)(const double& x))> a =  // NOLINT
275       InvokeArgument<0>(ByRef(g_double));
276   // The above line calls ByRef() on a const value.
277   EXPECT_TRUE(a.Perform(make_tuple(&ReferencesGlobalDouble)));
278 
279   double x = 0;
280   a = InvokeArgument<0>(ByRef(x));  // This calls ByRef() on a non-const.
281   EXPECT_FALSE(a.Perform(make_tuple(&ReferencesGlobalDouble)));
282 }
283 
284 // Tests using WithArgs and with an action that takes 1 argument.
TEST(WithArgsTest,OneArg)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.
TEST(WithArgsTest,TwoArgs)292 TEST(WithArgsTest, TwoArgs) {
293   Action<const char*(const char* s, double x, short n)> a =
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.
TEST(WithArgsTest,ThreeArgs)300 TEST(WithArgsTest, ThreeArgs) {
301   Action<int(int, double, char, short)> a =  // NOLINT
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.
TEST(WithArgsTest,FourArgs)307 TEST(WithArgsTest, FourArgs) {
308   Action<string(const char*, const char*, double, const char*, const char*)> a =
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.
TEST(WithArgsTest,FiveArgs)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.
TEST(WithArgsTest,SixArgs)325 TEST(WithArgsTest, SixArgs) {
326   Action<string(const char*, const char*, const char*)> a =
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.
TEST(WithArgsTest,SevenArgs)333 TEST(WithArgsTest, SevenArgs) {
334   Action<string(const char*, const char*, const char*, const char*)> a =
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.
TEST(WithArgsTest,EightArgs)342 TEST(WithArgsTest, EightArgs) {
343   Action<string(const char*, const char*, const char*, const char*)> a =
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.
TEST(WithArgsTest,NineArgs)351 TEST(WithArgsTest, NineArgs) {
352   Action<string(const char*, const char*, const char*, const char*)> a =
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.
TEST(WithArgsTest,TenArgs)360 TEST(WithArgsTest, TenArgs) {
361   Action<string(const char*, const char*, const char*, const char*)> a =
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:
Perform(const tuple<int,int> & args)371   virtual int Perform(const tuple<int, int>& args) {
372     return get<0>(args) - get<1>(args);
373   }
374 };
375 
TEST(WithArgsTest,NonInvokeAction)376 TEST(WithArgsTest, NonInvokeAction) {
377   Action<int(const string&, int, int)> a =  // NOLINT
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.
TEST(WithArgsTest,Identity)383 TEST(WithArgsTest, Identity) {
384   Action<int(int x, char y, short z)> a =  // NOLINT
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.
TEST(WithArgsTest,RepeatedArguments)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.
TEST(WithArgsTest,ReversedArgumentOrder)397 TEST(WithArgsTest, ReversedArgumentOrder) {
398   Action<const char*(short n, const char* input)> a =  // NOLINT
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.
TEST(WithArgsTest,ArgsOfCompatibleTypes)405 TEST(WithArgsTest, ArgsOfCompatibleTypes) {
406   Action<long(short x, char y, double z, char c)> a =  // NOLINT
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.
TEST(WithArgsTest,VoidAction)412 TEST(WithArgsTest, VoidAction) {
413   Action<void(double x, char c, int n)> a = WithArgs<2, 1>(Invoke(VoidBinary));
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).
TEST(DoAllTest,TwoActions)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).
TEST(DoAllTest,ThreeActions)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).
TEST(DoAllTest,FourActions)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).
TEST(DoAllTest,FiveActions)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).
TEST(DoAllTest,SixActions)472 TEST(DoAllTest, SixActions) {
473   int m = 0, n = 0;
474   char a = '\0', b = '\0', c = '\0';
475   Action<int(int*, int*, char*, char*, char*)> action =  // NOLINT
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).
TEST(DoAllTest,SevenActions)491 TEST(DoAllTest, SevenActions) {
492   int m = 0, n = 0;
493   char a = '\0', b = '\0', c = '\0', d = '\0';
494   Action<int(int*, int*, char*, char*, char*, char*)> action =  // NOLINT
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).
TEST(DoAllTest,EightActions)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).
TEST(DoAllTest,NineActions)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).
TEST(DoAllTest,TenActions)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.
ACTION(Return5)604 ACTION(Return5) { return 5; }
605 
TEST(ActionMacroTest,WorksWhenNotReferencingArguments)606 TEST(ActionMacroTest, WorksWhenNotReferencingArguments) {
607   Action<double()> a1 = Return5();
608   EXPECT_DOUBLE_EQ(5, a1.Perform(make_tuple()));
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.
ACTION(IncrementArg1)615 ACTION(IncrementArg1) { (*arg1)++; }
616 
TEST(ActionMacroTest,WorksWhenReturningVoid)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.
ACTION(IncrementArg2)626 ACTION(IncrementArg2) {
627   StaticAssertTypeEq<int*, arg2_type>();
628   arg2_type temp = arg2;
629   (*temp)++;
630 }
631 
TEST(ActionMacroTest,CanReferenceArgumentType)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.
ACTION(Sum2)641 ACTION(Sum2) {
642   StaticAssertTypeEq<tuple<int, char, int*>, args_type>();
643   args_type args_copy = args;
644   return get<0>(args_copy) + get<1>(args_copy);
645 }
646 
TEST(ActionMacroTest,CanReferenceArgumentTuple)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.
Dummy(bool flag)655 int Dummy(bool flag) { return flag? 1 : 0; }
656 
ACTION(InvokeDummy)657 ACTION(InvokeDummy) {
658   StaticAssertTypeEq<int(bool), function_type>();
659   function_type* fp = &Dummy;
660   return (*fp)(true);
661 }
662 
TEST(ActionMacroTest,CanReferenceMockFunctionType)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.
ACTION(InvokeDummy2)671 ACTION(InvokeDummy2) {
672   StaticAssertTypeEq<int, return_type>();
673   return_type result = Dummy(true);
674   return result;
675 }
676 
TEST(ActionMacroTest,CanReferenceMockFunctionReturnType)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.
ACTION(ReturnAddrOfConstBoolReferenceArg)684 ACTION(ReturnAddrOfConstBoolReferenceArg) {
685   StaticAssertTypeEq<const bool&, arg1_type>();
686   return &arg1;
687 }
688 
TEST(ActionMacroTest,WorksForConstReferenceArg)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.
ACTION(ReturnAddrOfIntReferenceArg)696 ACTION(ReturnAddrOfIntReferenceArg) {
697   StaticAssertTypeEq<int&, arg0_type>();
698   return &arg0;
699 }
700 
TEST(ActionMacroTest,WorksForNonConstReferenceArg)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 {
ACTION(Sum)709 ACTION(Sum) { return arg0 + arg1; }
710 }  // namespace action_test
711 
TEST(ActionMacroTest,WorksInNamespace)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.
ACTION(PlusTwo)719 ACTION(PlusTwo) { return arg0 + 2; }
720 
TEST(ActionMacroTest,WorksForDifferentArgumentNumbers)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.
ACTION_P(Plus,n)731 ACTION_P(Plus, n) { return arg0 + n; }
732 
TEST(ActionPMacroTest,DefinesParameterizedAction)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.
ACTION_P(TypedPlus,n)740 ACTION_P(TypedPlus, n) {
741   arg0_type t1 = arg0;
742   n_type t2 = n;
743   return t1 + t2;
744 }
745 
TEST(ActionPMacroTest,CanReferenceArgumentAndParameterTypes)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.
TEST(ActionPMacroTest,WorksInCompatibleMockFunction)753 TEST(ActionPMacroTest, WorksInCompatibleMockFunction) {
754   Action<std::string(const std::string& s)> a1 = Plus("tail");
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 
ACTION(OverloadedAction)762 ACTION(OverloadedAction) { return arg0 ? arg1 : "hello"; }
763 
ACTION_P(OverloadedAction,default_value)764 ACTION_P(OverloadedAction, default_value) {
765   return arg0 ? arg1 : default_value;
766 }
767 
ACTION_P2(OverloadedAction,true_value,false_value)768 ACTION_P2(OverloadedAction, true_value, false_value) {
769   return arg0 ? true_value : false_value;
770 }
771 
TEST(ActionMacroTest,CanDefineOverloadedActions)772 TEST(ActionMacroTest, CanDefineOverloadedActions) {
773   typedef Action<const char*(bool, const char*)> MyAction;
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 
ACTION_P3(Plus,m,n,k)790 ACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; }
791 
TEST(ActionPnMacroTest,WorksFor3Parameters)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 
ACTION_P4(Plus,p0,p1,p2,p3)801 ACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; }
802 
TEST(ActionPnMacroTest,WorksFor4Parameters)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 
ACTION_P5(Plus,p0,p1,p2,p3,p4)808 ACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; }
809 
TEST(ActionPnMacroTest,WorksFor5Parameters)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 
ACTION_P6(Plus,p0,p1,p2,p3,p4,p5)815 ACTION_P6(Plus, p0, p1, p2, p3, p4, p5) {
816   return arg0 + p0 + p1 + p2 + p3 + p4 + p5;
817 }
818 
TEST(ActionPnMacroTest,WorksFor6Parameters)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 
ACTION_P7(Plus,p0,p1,p2,p3,p4,p5,p6)824 ACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) {
825   return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6;
826 }
827 
TEST(ActionPnMacroTest,WorksFor7Parameters)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 
ACTION_P8(Plus,p0,p1,p2,p3,p4,p5,p6,p7)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 
TEST(ActionPnMacroTest,WorksFor8Parameters)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 
ACTION_P9(Plus,p0,p1,p2,p3,p4,p5,p6,p7,p8)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 
TEST(ActionPnMacroTest,WorksFor9Parameters)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 
ACTION_P10(Plus,p0,p1,p2,p3,p4,p5,p6,p7,p8,last_param)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 
TEST(ActionPnMacroTest,WorksFor10Parameters)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 
ACTION_P2(PadArgument,prefix,suffix)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 
TEST(ActionPnMacroTest,SimpleTypePromotion)872 TEST(ActionPnMacroTest, SimpleTypePromotion) {
873   Action<std::string(const char*)> no_promo =
874       PadArgument(std::string("foo"), 'r');
875   Action<std::string(const char*)> promo =
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.
ACTION_P3(ConcatImpl,a,b,c)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>
Concat(const std::string & a,T1 b,T2 c)902 Concat(const std::string& a, T1 b, T2 c) {
903   GTEST_INTENTIONAL_CONST_COND_PUSH_()
904   if (true) {
905   GTEST_INTENTIONAL_CONST_COND_POP_()
906     // This branch verifies that ConcatImpl() can be invoked without
907     // explicit template arguments.
908     return ConcatImpl(a, b, c);
909   } else {
910     // This branch verifies that ConcatImpl() can also be invoked with
911     // explicit template arguments.  It doesn't really need to be
912     // executed as this is a compile-time verification.
913     return ConcatImpl<std::string, T1, T2>(a, b, c);
914   }
915 }
916 
917 // Defines another partially specialized wrapper that restricts the
918 // second parameter to int.
919 template <typename T1, typename T2>
920 ConcatImplActionP3<T1, int, T2>
Concat(T1 a,int b,T2 c)921 Concat(T1 a, int b, T2 c) {
922   return ConcatImpl(a, b, c);
923 }
924 
TEST(ActionPnMacroTest,CanPartiallyRestrictParameterTypes)925 TEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) {
926   Action<const std::string()> a1 = Concat("Hello", "1", 2);
927   EXPECT_EQ("Hello12", a1.Perform(make_tuple()));
928 
929   a1 = Concat(1, 2, 3);
930   EXPECT_EQ("123", a1.Perform(make_tuple()));
931 }
932 
933 // Verifies the type of an ACTION*.
934 
ACTION(DoFoo)935 ACTION(DoFoo) {}
ACTION_P(DoFoo,p)936 ACTION_P(DoFoo, p) {}
ACTION_P2(DoFoo,p0,p1)937 ACTION_P2(DoFoo, p0, p1) {}
938 
TEST(ActionPnMacroTest,TypesAreCorrect)939 TEST(ActionPnMacroTest, TypesAreCorrect) {
940   // DoFoo() must be assignable to a DoFooAction variable.
941   DoFooAction a0 = DoFoo();
942 
943   // DoFoo(1) must be assignable to a DoFooActionP variable.
944   DoFooActionP<int> a1 = DoFoo(1);
945 
946   // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk
947   // variable, and so on.
948   DoFooActionP2<int, char> a2 = DoFoo(1, '2');
949   PlusActionP3<int, int, char> a3 = Plus(1, 2, '3');
950   PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4');
951   PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5');
952   PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6');
953   PlusActionP7<int, int, int, int, int, int, char> a7 =
954       Plus(1, 2, 3, 4, 5, 6, '7');
955   PlusActionP8<int, int, int, int, int, int, int, char> a8 =
956       Plus(1, 2, 3, 4, 5, 6, 7, '8');
957   PlusActionP9<int, int, int, int, int, int, int, int, char> a9 =
958       Plus(1, 2, 3, 4, 5, 6, 7, 8, '9');
959   PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 =
960       Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0');
961 
962   // Avoid "unused variable" warnings.
963   (void)a0;
964   (void)a1;
965   (void)a2;
966   (void)a3;
967   (void)a4;
968   (void)a5;
969   (void)a6;
970   (void)a7;
971   (void)a8;
972   (void)a9;
973   (void)a10;
974 }
975 
976 // Tests that an ACTION_P*() action can be explicitly instantiated
977 // with reference-typed parameters.
978 
ACTION_P(Plus1,x)979 ACTION_P(Plus1, x) { return x; }
ACTION_P2(Plus2,x,y)980 ACTION_P2(Plus2, x, y) { return x + y; }
ACTION_P3(Plus3,x,y,z)981 ACTION_P3(Plus3, x, y, z) { return x + y + z; }
ACTION_P10(Plus10,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)982 ACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
983   return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
984 }
985 
TEST(ActionPnMacroTest,CanExplicitlyInstantiateWithReferenceTypes)986 TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
987   int x = 1, y = 2, z = 3;
988   const tuple<> empty = make_tuple();
989 
990   Action<int()> a = Plus1<int&>(x);
991   EXPECT_EQ(1, a.Perform(empty));
992 
993   a = Plus2<const int&, int&>(x, y);
994   EXPECT_EQ(3, a.Perform(empty));
995 
996   a = Plus3<int&, const int&, int&>(x, y, z);
997   EXPECT_EQ(6, a.Perform(empty));
998 
999   int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
1000   a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&,
1001       int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7],
1002                               n[8], n[9]);
1003   EXPECT_EQ(55, a.Perform(empty));
1004 }
1005 
1006 class NullaryConstructorClass {
1007  public:
NullaryConstructorClass()1008   NullaryConstructorClass() : value_(123) {}
1009   int value_;
1010 };
1011 
1012 // Tests using ReturnNew() with a nullary constructor.
TEST(ReturnNewTest,NoArgs)1013 TEST(ReturnNewTest, NoArgs) {
1014   Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>();
1015   NullaryConstructorClass* c = a.Perform(make_tuple());
1016   EXPECT_EQ(123, c->value_);
1017   delete c;
1018 }
1019 
1020 class UnaryConstructorClass {
1021  public:
UnaryConstructorClass(int value)1022   explicit UnaryConstructorClass(int value) : value_(value) {}
1023   int value_;
1024 };
1025 
1026 // Tests using ReturnNew() with a unary constructor.
TEST(ReturnNewTest,Unary)1027 TEST(ReturnNewTest, Unary) {
1028   Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
1029   UnaryConstructorClass* c = a.Perform(make_tuple());
1030   EXPECT_EQ(4000, c->value_);
1031   delete c;
1032 }
1033 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodHasArgs)1034 TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
1035   Action<UnaryConstructorClass*(bool, int)> a =
1036       ReturnNew<UnaryConstructorClass>(4000);
1037   UnaryConstructorClass* c = a.Perform(make_tuple(false, 5));
1038   EXPECT_EQ(4000, c->value_);
1039   delete c;
1040 }
1041 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodReturnsPointerToConst)1042 TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
1043   Action<const UnaryConstructorClass*()> a =
1044       ReturnNew<UnaryConstructorClass>(4000);
1045   const UnaryConstructorClass* c = a.Perform(make_tuple());
1046   EXPECT_EQ(4000, c->value_);
1047   delete c;
1048 }
1049 
1050 class TenArgConstructorClass {
1051  public:
TenArgConstructorClass(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)1052   TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5,
1053                          int a6, int a7, int a8, int a9, int a10)
1054     : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {
1055   }
1056   int value_;
1057 };
1058 
1059 // Tests using ReturnNew() with a 10-argument constructor.
TEST(ReturnNewTest,ConstructorThatTakes10Arguments)1060 TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
1061   Action<TenArgConstructorClass*()> a =
1062       ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000,
1063                                         4000000, 500000, 60000,
1064                                         7000, 800, 90, 0);
1065   TenArgConstructorClass* c = a.Perform(make_tuple());
1066   EXPECT_EQ(1234567890, c->value_);
1067   delete c;
1068 }
1069 
1070 // Tests that ACTION_TEMPLATE works when there is no value parameter.
ACTION_TEMPLATE(CreateNew,HAS_1_TEMPLATE_PARAMS (typename,T),AND_0_VALUE_PARAMS ())1071 ACTION_TEMPLATE(CreateNew,
1072                 HAS_1_TEMPLATE_PARAMS(typename, T),
1073                 AND_0_VALUE_PARAMS()) {
1074   return new T;
1075 }
1076 
TEST(ActionTemplateTest,WorksWithoutValueParam)1077 TEST(ActionTemplateTest, WorksWithoutValueParam) {
1078   const Action<int*()> a = CreateNew<int>();
1079   int* p = a.Perform(make_tuple());
1080   delete p;
1081 }
1082 
1083 // Tests that ACTION_TEMPLATE works when there are value parameters.
ACTION_TEMPLATE(CreateNew,HAS_1_TEMPLATE_PARAMS (typename,T),AND_1_VALUE_PARAMS (a0))1084 ACTION_TEMPLATE(CreateNew,
1085                 HAS_1_TEMPLATE_PARAMS(typename, T),
1086                 AND_1_VALUE_PARAMS(a0)) {
1087   return new T(a0);
1088 }
1089 
TEST(ActionTemplateTest,WorksWithValueParams)1090 TEST(ActionTemplateTest, WorksWithValueParams) {
1091   const Action<int*()> a = CreateNew<int>(42);
1092   int* p = a.Perform(make_tuple());
1093   EXPECT_EQ(42, *p);
1094   delete p;
1095 }
1096 
1097 // Tests that ACTION_TEMPLATE works for integral template parameters.
ACTION_TEMPLATE(MyDeleteArg,HAS_1_TEMPLATE_PARAMS (int,k),AND_0_VALUE_PARAMS ())1098 ACTION_TEMPLATE(MyDeleteArg,
1099                 HAS_1_TEMPLATE_PARAMS(int, k),
1100                 AND_0_VALUE_PARAMS()) {
1101   delete get<k>(args);
1102 }
1103 
1104 // Resets a bool variable in the destructor.
1105 class BoolResetter {
1106  public:
BoolResetter(bool * value)1107   explicit BoolResetter(bool* value) : value_(value) {}
~BoolResetter()1108   ~BoolResetter() { *value_ = false; }
1109  private:
1110   bool* value_;
1111 };
1112 
TEST(ActionTemplateTest,WorksForIntegralTemplateParams)1113 TEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
1114   const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();
1115   int n = 0;
1116   bool b = true;
1117   BoolResetter* resetter = new BoolResetter(&b);
1118   a.Perform(make_tuple(&n, resetter));
1119   EXPECT_FALSE(b);  // Verifies that resetter is deleted.
1120 }
1121 
1122 // Tests that ACTION_TEMPLATES works for template template parameters.
ACTION_TEMPLATE(ReturnSmartPointer,HAS_1_TEMPLATE_PARAMS (template<typename Pointee> class,Pointer),AND_1_VALUE_PARAMS (pointee))1123 ACTION_TEMPLATE(ReturnSmartPointer,
1124                 HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,
1125                                       Pointer),
1126                 AND_1_VALUE_PARAMS(pointee)) {
1127   return Pointer<pointee_type>(new pointee_type(pointee));
1128 }
1129 
TEST(ActionTemplateTest,WorksForTemplateTemplateParameters)1130 TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
1131   using ::testing::internal::linked_ptr;
1132   const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42);
1133   linked_ptr<int> p = a.Perform(make_tuple());
1134   EXPECT_EQ(42, *p);
1135 }
1136 
1137 // Tests that ACTION_TEMPLATE works for 10 template parameters.
1138 template <typename T1, typename T2, typename T3, int k4, bool k5,
1139           unsigned int k6, typename T7, typename T8, typename T9>
1140 struct GiantTemplate {
1141  public:
GiantTemplatetesting::gmock_generated_actions_test::GiantTemplate1142   explicit GiantTemplate(int a_value) : value(a_value) {}
1143   int value;
1144 };
1145 
ACTION_TEMPLATE(ReturnGiant,HAS_10_TEMPLATE_PARAMS (typename,T1,typename,T2,typename,T3,int,k4,bool,k5,unsigned int,k6,class,T7,class,T8,class,T9,template<typename T> class,T10),AND_1_VALUE_PARAMS (value))1146 ACTION_TEMPLATE(ReturnGiant,
1147                 HAS_10_TEMPLATE_PARAMS(
1148                     typename, T1,
1149                     typename, T2,
1150                     typename, T3,
1151                     int, k4,
1152                     bool, k5,
1153                     unsigned int, k6,
1154                     class, T7,
1155                     class, T8,
1156                     class, T9,
1157                     template <typename T> class, T10),
1158                 AND_1_VALUE_PARAMS(value)) {
1159   return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);
1160 }
1161 
TEST(ActionTemplateTest,WorksFor10TemplateParameters)1162 TEST(ActionTemplateTest, WorksFor10TemplateParameters) {
1163   using ::testing::internal::linked_ptr;
1164   typedef GiantTemplate<linked_ptr<int>, bool, double, 5,
1165       true, 6, char, unsigned, int> Giant;
1166   const Action<Giant()> a = ReturnGiant<
1167       int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42);
1168   Giant giant = a.Perform(make_tuple());
1169   EXPECT_EQ(42, giant.value);
1170 }
1171 
1172 // Tests that ACTION_TEMPLATE works for 10 value parameters.
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_10_VALUE_PARAMS (v1,v2,v3,v4,v5,v6,v7,v8,v9,v10))1173 ACTION_TEMPLATE(ReturnSum,
1174                 HAS_1_TEMPLATE_PARAMS(typename, Number),
1175                 AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
1176   return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
1177 }
1178 
TEST(ActionTemplateTest,WorksFor10ValueParameters)1179 TEST(ActionTemplateTest, WorksFor10ValueParameters) {
1180   const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
1181   EXPECT_EQ(55, a.Perform(make_tuple()));
1182 }
1183 
1184 // Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded
1185 // on the number of value parameters.
1186 
ACTION(ReturnSum)1187 ACTION(ReturnSum) { return 0; }
1188 
ACTION_P(ReturnSum,x)1189 ACTION_P(ReturnSum, x) { return x; }
1190 
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_2_VALUE_PARAMS (v1,v2))1191 ACTION_TEMPLATE(ReturnSum,
1192                 HAS_1_TEMPLATE_PARAMS(typename, Number),
1193                 AND_2_VALUE_PARAMS(v1, v2)) {
1194   return static_cast<Number>(v1) + v2;
1195 }
1196 
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_3_VALUE_PARAMS (v1,v2,v3))1197 ACTION_TEMPLATE(ReturnSum,
1198                 HAS_1_TEMPLATE_PARAMS(typename, Number),
1199                 AND_3_VALUE_PARAMS(v1, v2, v3)) {
1200   return static_cast<Number>(v1) + v2 + v3;
1201 }
1202 
ACTION_TEMPLATE(ReturnSum,HAS_2_TEMPLATE_PARAMS (typename,Number,int,k),AND_4_VALUE_PARAMS (v1,v2,v3,v4))1203 ACTION_TEMPLATE(ReturnSum,
1204                 HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),
1205                 AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
1206   return static_cast<Number>(v1) + v2 + v3 + v4 + k;
1207 }
1208 
TEST(ActionTemplateTest,CanBeOverloadedOnNumberOfValueParameters)1209 TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
1210   const Action<int()> a0 = ReturnSum();
1211   const Action<int()> a1 = ReturnSum(1);
1212   const Action<int()> a2 = ReturnSum<int>(1, 2);
1213   const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
1214   const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
1215   EXPECT_EQ(0, a0.Perform(make_tuple()));
1216   EXPECT_EQ(1, a1.Perform(make_tuple()));
1217   EXPECT_EQ(3, a2.Perform(make_tuple()));
1218   EXPECT_EQ(6, a3.Perform(make_tuple()));
1219   EXPECT_EQ(12345, a4.Perform(make_tuple()));
1220 }
1221 
1222 #ifdef _MSC_VER
1223 # pragma warning(pop)
1224 #endif
1225 
1226 }  // namespace gmock_generated_actions_test
1227 }  // namespace testing
1228