• 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 ::std::tr1::get;
50 using ::std::tr1::make_tuple;
51 using ::std::tr1::tuple;
52 using ::std::tr1::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(CharPtr("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< ::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 
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   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>
Concat(T1 a,int b,T2 c)919 Concat(T1 a, int b, T2 c) {
920   return ConcatImpl(a, b, c);
921 }
922 
TEST(ActionPnMacroTest,CanPartiallyRestrictParameterTypes)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 
ACTION(DoFoo)933 ACTION(DoFoo) {}
ACTION_P(DoFoo,p)934 ACTION_P(DoFoo, p) {}
ACTION_P2(DoFoo,p0,p1)935 ACTION_P2(DoFoo, p0, p1) {}
936 
TEST(ActionPnMacroTest,TypesAreCorrect)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 
961 // Tests that an ACTION_P*() action can be explicitly instantiated
962 // with reference-typed parameters.
963 
ACTION_P(Plus1,x)964 ACTION_P(Plus1, x) { return x; }
ACTION_P2(Plus2,x,y)965 ACTION_P2(Plus2, x, y) { return x + y; }
ACTION_P3(Plus3,x,y,z)966 ACTION_P3(Plus3, x, y, z) { return x + y + z; }
ACTION_P10(Plus10,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)967 ACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
968   return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
969 }
970 
TEST(ActionPnMacroTest,CanExplicitlyInstantiateWithReferenceTypes)971 TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
972   int x = 1, y = 2, z = 3;
973   const tuple<> empty = make_tuple();
974 
975   Action<int()> a = Plus1<int&>(x);
976   EXPECT_EQ(1, a.Perform(empty));
977 
978   a = Plus2<const int&, int&>(x, y);
979   EXPECT_EQ(3, a.Perform(empty));
980 
981   a = Plus3<int&, const int&, int&>(x, y, z);
982   EXPECT_EQ(6, a.Perform(empty));
983 
984   int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
985   a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&,
986       int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7],
987                               n[8], n[9]);
988   EXPECT_EQ(55, a.Perform(empty));
989 }
990 
991 class NullaryConstructorClass {
992  public:
NullaryConstructorClass()993   NullaryConstructorClass() : value_(123) {}
994   int value_;
995 };
996 
997 // Tests using ReturnNew() with a nullary constructor.
TEST(ReturnNewTest,NoArgs)998 TEST(ReturnNewTest, NoArgs) {
999   Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>();
1000   NullaryConstructorClass* c = a.Perform(make_tuple());
1001   EXPECT_EQ(123, c->value_);
1002   delete c;
1003 }
1004 
1005 class UnaryConstructorClass {
1006  public:
UnaryConstructorClass(int value)1007   explicit UnaryConstructorClass(int value) : value_(value) {}
1008   int value_;
1009 };
1010 
1011 // Tests using ReturnNew() with a unary constructor.
TEST(ReturnNewTest,Unary)1012 TEST(ReturnNewTest, Unary) {
1013   Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
1014   UnaryConstructorClass* c = a.Perform(make_tuple());
1015   EXPECT_EQ(4000, c->value_);
1016   delete c;
1017 }
1018 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodHasArgs)1019 TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
1020   Action<UnaryConstructorClass*(bool, int)> a =
1021       ReturnNew<UnaryConstructorClass>(4000);
1022   UnaryConstructorClass* c = a.Perform(make_tuple(false, 5));
1023   EXPECT_EQ(4000, c->value_);
1024   delete c;
1025 }
1026 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodReturnsPointerToConst)1027 TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
1028   Action<const UnaryConstructorClass*()> a =
1029       ReturnNew<UnaryConstructorClass>(4000);
1030   const UnaryConstructorClass* c = a.Perform(make_tuple());
1031   EXPECT_EQ(4000, c->value_);
1032   delete c;
1033 }
1034 
1035 class TenArgConstructorClass {
1036  public:
TenArgConstructorClass(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)1037   TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5,
1038                          int a6, int a7, int a8, int a9, int a10)
1039     : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {
1040   }
1041   int value_;
1042 };
1043 
1044 // Tests using ReturnNew() with a 10-argument constructor.
TEST(ReturnNewTest,ConstructorThatTakes10Arguments)1045 TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
1046   Action<TenArgConstructorClass*()> a =
1047       ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000,
1048                                         4000000, 500000, 60000,
1049                                         7000, 800, 90, 0);
1050   TenArgConstructorClass* c = a.Perform(make_tuple());
1051   EXPECT_EQ(1234567890, c->value_);
1052   delete c;
1053 }
1054 
1055 // Tests that ACTION_TEMPLATE works when there is no value parameter.
ACTION_TEMPLATE(CreateNew,HAS_1_TEMPLATE_PARAMS (typename,T),AND_0_VALUE_PARAMS ())1056 ACTION_TEMPLATE(CreateNew,
1057                 HAS_1_TEMPLATE_PARAMS(typename, T),
1058                 AND_0_VALUE_PARAMS()) {
1059   return new T;
1060 }
1061 
TEST(ActionTemplateTest,WorksWithoutValueParam)1062 TEST(ActionTemplateTest, WorksWithoutValueParam) {
1063   const Action<int*()> a = CreateNew<int>();
1064   int* p = a.Perform(make_tuple());
1065   delete p;
1066 }
1067 
1068 // Tests that ACTION_TEMPLATE works when there are value parameters.
ACTION_TEMPLATE(CreateNew,HAS_1_TEMPLATE_PARAMS (typename,T),AND_1_VALUE_PARAMS (a0))1069 ACTION_TEMPLATE(CreateNew,
1070                 HAS_1_TEMPLATE_PARAMS(typename, T),
1071                 AND_1_VALUE_PARAMS(a0)) {
1072   return new T(a0);
1073 }
1074 
TEST(ActionTemplateTest,WorksWithValueParams)1075 TEST(ActionTemplateTest, WorksWithValueParams) {
1076   const Action<int*()> a = CreateNew<int>(42);
1077   int* p = a.Perform(make_tuple());
1078   EXPECT_EQ(42, *p);
1079   delete p;
1080 }
1081 
1082 // Tests that ACTION_TEMPLATE works for integral template parameters.
ACTION_TEMPLATE(MyDeleteArg,HAS_1_TEMPLATE_PARAMS (int,k),AND_0_VALUE_PARAMS ())1083 ACTION_TEMPLATE(MyDeleteArg,
1084                 HAS_1_TEMPLATE_PARAMS(int, k),
1085                 AND_0_VALUE_PARAMS()) {
1086   delete std::tr1::get<k>(args);
1087 }
1088 
1089 // Resets a bool variable in the destructor.
1090 class BoolResetter {
1091  public:
BoolResetter(bool * value)1092   explicit BoolResetter(bool* value) : value_(value) {}
~BoolResetter()1093   ~BoolResetter() { *value_ = false; }
1094  private:
1095   bool* value_;
1096 };
1097 
TEST(ActionTemplateTest,WorksForIntegralTemplateParams)1098 TEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
1099   const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();
1100   int n = 0;
1101   bool b = true;
1102   BoolResetter* resetter = new BoolResetter(&b);
1103   a.Perform(make_tuple(&n, resetter));
1104   EXPECT_FALSE(b);  // Verifies that resetter is deleted.
1105 }
1106 
1107 // 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))1108 ACTION_TEMPLATE(ReturnSmartPointer,
1109                 HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,
1110                                       Pointer),
1111                 AND_1_VALUE_PARAMS(pointee)) {
1112   return Pointer<pointee_type>(new pointee_type(pointee));
1113 }
1114 
TEST(ActionTemplateTest,WorksForTemplateTemplateParameters)1115 TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
1116   using ::testing::internal::linked_ptr;
1117   const Action<linked_ptr<int>()> a = ReturnSmartPointer<linked_ptr>(42);
1118   linked_ptr<int> p = a.Perform(make_tuple());
1119   EXPECT_EQ(42, *p);
1120 }
1121 
1122 // Tests that ACTION_TEMPLATE works for 10 template parameters.
1123 template <typename T1, typename T2, typename T3, int k4, bool k5,
1124           unsigned int k6, typename T7, typename T8, typename T9>
1125 struct GiantTemplate {
1126  public:
GiantTemplatetesting::gmock_generated_actions_test::GiantTemplate1127   explicit GiantTemplate(int a_value) : value(a_value) {}
1128   int value;
1129 };
1130 
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))1131 ACTION_TEMPLATE(ReturnGiant,
1132                 HAS_10_TEMPLATE_PARAMS(
1133                     typename, T1,
1134                     typename, T2,
1135                     typename, T3,
1136                     int, k4,
1137                     bool, k5,
1138                     unsigned int, k6,
1139                     class, T7,
1140                     class, T8,
1141                     class, T9,
1142                     template <typename T> class, T10),
1143                 AND_1_VALUE_PARAMS(value)) {
1144   return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);
1145 }
1146 
TEST(ActionTemplateTest,WorksFor10TemplateParameters)1147 TEST(ActionTemplateTest, WorksFor10TemplateParameters) {
1148   using ::testing::internal::linked_ptr;
1149   typedef GiantTemplate<linked_ptr<int>, bool, double, 5,
1150       true, 6, char, unsigned, int> Giant;
1151   const Action<Giant()> a = ReturnGiant<
1152       int, bool, double, 5, true, 6, char, unsigned, int, linked_ptr>(42);
1153   Giant giant = a.Perform(make_tuple());
1154   EXPECT_EQ(42, giant.value);
1155 }
1156 
1157 // 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))1158 ACTION_TEMPLATE(ReturnSum,
1159                 HAS_1_TEMPLATE_PARAMS(typename, Number),
1160                 AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
1161   return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
1162 }
1163 
TEST(ActionTemplateTest,WorksFor10ValueParameters)1164 TEST(ActionTemplateTest, WorksFor10ValueParameters) {
1165   const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
1166   EXPECT_EQ(55, a.Perform(make_tuple()));
1167 }
1168 
1169 // Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded
1170 // on the number of value parameters.
1171 
ACTION(ReturnSum)1172 ACTION(ReturnSum) { return 0; }
1173 
ACTION_P(ReturnSum,x)1174 ACTION_P(ReturnSum, x) { return x; }
1175 
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_2_VALUE_PARAMS (v1,v2))1176 ACTION_TEMPLATE(ReturnSum,
1177                 HAS_1_TEMPLATE_PARAMS(typename, Number),
1178                 AND_2_VALUE_PARAMS(v1, v2)) {
1179   return static_cast<Number>(v1) + v2;
1180 }
1181 
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_3_VALUE_PARAMS (v1,v2,v3))1182 ACTION_TEMPLATE(ReturnSum,
1183                 HAS_1_TEMPLATE_PARAMS(typename, Number),
1184                 AND_3_VALUE_PARAMS(v1, v2, v3)) {
1185   return static_cast<Number>(v1) + v2 + v3;
1186 }
1187 
ACTION_TEMPLATE(ReturnSum,HAS_2_TEMPLATE_PARAMS (typename,Number,int,k),AND_4_VALUE_PARAMS (v1,v2,v3,v4))1188 ACTION_TEMPLATE(ReturnSum,
1189                 HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),
1190                 AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
1191   return static_cast<Number>(v1) + v2 + v3 + v4 + k;
1192 }
1193 
TEST(ActionTemplateTest,CanBeOverloadedOnNumberOfValueParameters)1194 TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
1195   const Action<int()> a0 = ReturnSum();
1196   const Action<int()> a1 = ReturnSum(1);
1197   const Action<int()> a2 = ReturnSum<int>(1, 2);
1198   const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
1199   const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
1200   EXPECT_EQ(0, a0.Perform(make_tuple()));
1201   EXPECT_EQ(1, a1.Perform(make_tuple()));
1202   EXPECT_EQ(3, a2.Perform(make_tuple()));
1203   EXPECT_EQ(6, a3.Perform(make_tuple()));
1204   EXPECT_EQ(12345, a4.Perform(make_tuple()));
1205 }
1206 
1207 #ifdef _MSC_VER
1208 # pragma warning(pop)
1209 #endif
1210 
1211 }  // namespace gmock_generated_actions_test
1212 }  // namespace testing
1213