xref: /freebsd/contrib/googletest/googlemock/test/gmock-more-actions_test.cc (revision 46333229c6a0187ebf231805682ee0bceed704d1)
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 // Google Mock - a framework for writing C++ mock classes.
31 //
32 // This file tests the built-in actions in gmock-actions.h.
33 
34 #include "gmock/gmock-more-actions.h"
35 
36 #include <algorithm>
37 #include <functional>
38 #include <iterator>
39 #include <memory>
40 #include <sstream>
41 #include <string>
42 #include <tuple>
43 #include <vector>
44 
45 #include "gmock/gmock.h"
46 #include "gtest/gtest-spi.h"
47 #include "gtest/gtest.h"
48 
49 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4577)
50 
51 namespace testing {
52 namespace gmock_more_actions_test {
53 
54 using ::std::plus;
55 using ::std::string;
56 using testing::Action;
57 using testing::DeleteArg;
58 using testing::Invoke;
59 using testing::ReturnArg;
60 using testing::ReturnPointee;
61 using testing::SaveArg;
62 using testing::SaveArgByMove;
63 using testing::SaveArgPointee;
64 using testing::SetArgReferee;
65 using testing::Unused;
66 using testing::WithArg;
67 using testing::WithoutArgs;
68 
69 // For suppressing compiler warnings on conversion possibly losing precision.
Short(short n)70 inline short Short(short n) { return n; }  // NOLINT
Char(char ch)71 inline char Char(char ch) { return ch; }
72 
73 // Sample functions and functors for testing Invoke() and etc.
Nullary()74 int Nullary() { return 1; }
75 
76 bool g_done = false;
77 
Unary(int x)78 bool Unary(int x) { return x < 0; }
79 
ByConstRef(const std::string & s)80 bool ByConstRef(const std::string& s) { return s == "Hi"; }
81 
82 const double g_double = 0;
ReferencesGlobalDouble(const double & x)83 bool ReferencesGlobalDouble(const double& x) { return &x == &g_double; }
84 
85 struct UnaryFunctor {
operator ()testing::gmock_more_actions_test::UnaryFunctor86   int operator()(bool x) { return x ? 1 : -1; }
87 };
88 
89 struct UnaryMoveOnlyFunctor : UnaryFunctor {
90   UnaryMoveOnlyFunctor() = default;
91   UnaryMoveOnlyFunctor(const UnaryMoveOnlyFunctor&) = delete;
92   UnaryMoveOnlyFunctor(UnaryMoveOnlyFunctor&&) = default;
93 };
94 
95 struct OneShotUnaryFunctor {
operator ()testing::gmock_more_actions_test::OneShotUnaryFunctor96   int operator()(bool x) && { return x ? 1 : -1; }
97 };
98 
Binary(const char * input,short n)99 const char* Binary(const char* input, short n) { return input + n; }  // NOLINT
100 
Ternary(int x,char y,short z)101 int Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
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 
SumOfFirst2(int a,int b,Unused,Unused)105 int SumOfFirst2(int a, int b, Unused, Unused) { return a + b; }
106 
SumOf5(int a,int b,int c,int d,int e)107 int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
108 
109 struct SumOf5Functor {
operator ()testing::gmock_more_actions_test::SumOf5Functor110   int operator()(int a, int b, int c, int d, int e) {
111     return a + b + c + d + e;
112   }
113 };
114 
SumOf6(int a,int b,int c,int d,int e,int f)115 int SumOf6(int a, int b, int c, int d, int e, int f) {
116   return a + b + c + d + e + f;
117 }
118 
119 struct SumOf6Functor {
operator ()testing::gmock_more_actions_test::SumOf6Functor120   int operator()(int a, int b, int c, int d, int e, int f) {
121     return a + b + c + d + e + f;
122   }
123 };
124 
Concat7(const char * s1,const char * s2,const char * s3,const char * s4,const char * s5,const char * s6,const char * s7)125 std::string Concat7(const char* s1, const char* s2, const char* s3,
126                     const char* s4, const char* s5, const char* s6,
127                     const char* s7) {
128   return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
129 }
130 
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)131 std::string Concat8(const char* s1, const char* s2, const char* s3,
132                     const char* s4, const char* s5, const char* s6,
133                     const char* s7, const char* s8) {
134   return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
135 }
136 
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)137 std::string Concat9(const char* s1, const char* s2, const char* s3,
138                     const char* s4, const char* s5, const char* s6,
139                     const char* s7, const char* s8, const char* s9) {
140   return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
141 }
142 
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)143 std::string Concat10(const char* s1, const char* s2, const char* s3,
144                      const char* s4, const char* s5, const char* s6,
145                      const char* s7, const char* s8, const char* s9,
146                      const char* s10) {
147   return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
148 }
149 
150 class Foo {
151  public:
Foo()152   Foo() : value_(123) {}
153 
Nullary() const154   int Nullary() const { return value_; }
155 
Unary(long x)156   short Unary(long x) { return static_cast<short>(value_ + x); }  // NOLINT
157 
Binary(const std::string & str,char c) const158   std::string Binary(const std::string& str, char c) const { return str + c; }
159 
Ternary(int x,bool y,char z)160   int Ternary(int x, bool y, char z) { return value_ + x + y * z; }
161 
SumOf4(int a,int b,int c,int d) const162   int SumOf4(int a, int b, int c, int d) const {
163     return a + b + c + d + value_;
164   }
165 
SumOfLast2(Unused,Unused,int a,int b) const166   int SumOfLast2(Unused, Unused, int a, int b) const { return a + b; }
167 
SumOf5(int a,int b,int c,int d,int e)168   int SumOf5(int a, int b, int c, int d, int e) { return a + b + c + d + e; }
169 
SumOf6(int a,int b,int c,int d,int e,int f)170   int SumOf6(int a, int b, int c, int d, int e, int f) {
171     return a + b + c + d + e + f;
172   }
173 
Concat7(const char * s1,const char * s2,const char * s3,const char * s4,const char * s5,const char * s6,const char * s7)174   std::string Concat7(const char* s1, const char* s2, const char* s3,
175                       const char* s4, const char* s5, const char* s6,
176                       const char* s7) {
177     return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7;
178   }
179 
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)180   std::string Concat8(const char* s1, const char* s2, const char* s3,
181                       const char* s4, const char* s5, const char* s6,
182                       const char* s7, const char* s8) {
183     return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8;
184   }
185 
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)186   std::string Concat9(const char* s1, const char* s2, const char* s3,
187                       const char* s4, const char* s5, const char* s6,
188                       const char* s7, const char* s8, const char* s9) {
189     return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9;
190   }
191 
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)192   std::string Concat10(const char* s1, const char* s2, const char* s3,
193                        const char* s4, const char* s5, const char* s6,
194                        const char* s7, const char* s8, const char* s9,
195                        const char* s10) {
196     return std::string(s1) + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
197   }
198 
199  private:
200   int value_;
201 };
202 
203 // Tests using Invoke() with a nullary function.
TEST(InvokeTest,Nullary)204 TEST(InvokeTest, Nullary) {
205   Action<int()> a = Invoke(Nullary);  // NOLINT
206   EXPECT_EQ(1, a.Perform(std::make_tuple()));
207 }
208 
209 // Tests using Invoke() with a unary function.
TEST(InvokeTest,Unary)210 TEST(InvokeTest, Unary) {
211   Action<bool(int)> a = Invoke(Unary);  // NOLINT
212   EXPECT_FALSE(a.Perform(std::make_tuple(1)));
213   EXPECT_TRUE(a.Perform(std::make_tuple(-1)));
214 }
215 
216 // Tests using Invoke() with a binary function.
TEST(InvokeTest,Binary)217 TEST(InvokeTest, Binary) {
218   Action<const char*(const char*, short)> a = Invoke(Binary);  // NOLINT
219   const char* p = "Hello";
220   EXPECT_EQ(p + 2, a.Perform(std::make_tuple(p, Short(2))));
221 }
222 
223 // Tests using Invoke() with a ternary function.
TEST(InvokeTest,Ternary)224 TEST(InvokeTest, Ternary) {
225   Action<int(int, char, short)> a = Invoke(Ternary);  // NOLINT
226   EXPECT_EQ(6, a.Perform(std::make_tuple(1, '\2', Short(3))));
227 }
228 
229 // Tests using Invoke() with a 4-argument function.
TEST(InvokeTest,FunctionThatTakes4Arguments)230 TEST(InvokeTest, FunctionThatTakes4Arguments) {
231   Action<int(int, int, int, int)> a = Invoke(SumOf4);  // NOLINT
232   EXPECT_EQ(1234, a.Perform(std::make_tuple(1000, 200, 30, 4)));
233 }
234 
235 // Tests using Invoke() with a 5-argument function.
TEST(InvokeTest,FunctionThatTakes5Arguments)236 TEST(InvokeTest, FunctionThatTakes5Arguments) {
237   Action<int(int, int, int, int, int)> a = Invoke(SumOf5);  // NOLINT
238   EXPECT_EQ(12345, a.Perform(std::make_tuple(10000, 2000, 300, 40, 5)));
239 }
240 
241 // Tests using Invoke() with a 6-argument function.
TEST(InvokeTest,FunctionThatTakes6Arguments)242 TEST(InvokeTest, FunctionThatTakes6Arguments) {
243   Action<int(int, int, int, int, int, int)> a = Invoke(SumOf6);  // NOLINT
244   EXPECT_EQ(123456,
245             a.Perform(std::make_tuple(100000, 20000, 3000, 400, 50, 6)));
246 }
247 
248 // A helper that turns the type of a C-string literal from const
249 // char[N] to const char*.
CharPtr(const char * s)250 inline const char* CharPtr(const char* s) { return s; }
251 
252 // Tests using Invoke() with a 7-argument function.
TEST(InvokeTest,FunctionThatTakes7Arguments)253 TEST(InvokeTest, FunctionThatTakes7Arguments) {
254   Action<std::string(const char*, const char*, const char*, const char*,
255                      const char*, const char*, const char*)>
256       a = Invoke(Concat7);
257   EXPECT_EQ("1234567",
258             a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
259                                       CharPtr("4"), CharPtr("5"), CharPtr("6"),
260                                       CharPtr("7"))));
261 }
262 
263 // Tests using Invoke() with a 8-argument function.
TEST(InvokeTest,FunctionThatTakes8Arguments)264 TEST(InvokeTest, FunctionThatTakes8Arguments) {
265   Action<std::string(const char*, const char*, const char*, const char*,
266                      const char*, const char*, const char*, const char*)>
267       a = Invoke(Concat8);
268   EXPECT_EQ("12345678",
269             a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
270                                       CharPtr("4"), CharPtr("5"), CharPtr("6"),
271                                       CharPtr("7"), CharPtr("8"))));
272 }
273 
274 // Tests using Invoke() with a 9-argument function.
TEST(InvokeTest,FunctionThatTakes9Arguments)275 TEST(InvokeTest, FunctionThatTakes9Arguments) {
276   Action<std::string(const char*, const char*, const char*, const char*,
277                      const char*, const char*, const char*, const char*,
278                      const char*)>
279       a = Invoke(Concat9);
280   EXPECT_EQ("123456789", a.Perform(std::make_tuple(
281                              CharPtr("1"), CharPtr("2"), CharPtr("3"),
282                              CharPtr("4"), CharPtr("5"), CharPtr("6"),
283                              CharPtr("7"), CharPtr("8"), CharPtr("9"))));
284 }
285 
286 // Tests using Invoke() with a 10-argument function.
TEST(InvokeTest,FunctionThatTakes10Arguments)287 TEST(InvokeTest, FunctionThatTakes10Arguments) {
288   Action<std::string(const char*, const char*, const char*, const char*,
289                      const char*, const char*, const char*, const char*,
290                      const char*, const char*)>
291       a = Invoke(Concat10);
292   EXPECT_EQ("1234567890",
293             a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
294                                       CharPtr("4"), CharPtr("5"), CharPtr("6"),
295                                       CharPtr("7"), CharPtr("8"), CharPtr("9"),
296                                       CharPtr("0"))));
297 }
298 
299 // Tests using Invoke() with functions with parameters declared as Unused.
TEST(InvokeTest,FunctionWithUnusedParameters)300 TEST(InvokeTest, FunctionWithUnusedParameters) {
301   Action<int(int, int, double, const std::string&)> a1 = Invoke(SumOfFirst2);
302   std::tuple<int, int, double, std::string> dummy =
303       std::make_tuple(10, 2, 5.6, std::string("hi"));
304   EXPECT_EQ(12, a1.Perform(dummy));
305 
306   Action<int(int, int, bool, int*)> a2 = Invoke(SumOfFirst2);
307   EXPECT_EQ(
308       23, a2.Perform(std::make_tuple(20, 3, true, static_cast<int*>(nullptr))));
309 }
310 
311 // Tests using Invoke() with methods with parameters declared as Unused.
TEST(InvokeTest,MethodWithUnusedParameters)312 TEST(InvokeTest, MethodWithUnusedParameters) {
313   Foo foo;
314   Action<int(std::string, bool, int, int)> a1 = Invoke(&foo, &Foo::SumOfLast2);
315   EXPECT_EQ(12, a1.Perform(std::make_tuple(CharPtr("hi"), true, 10, 2)));
316 
317   Action<int(char, double, int, int)> a2 = Invoke(&foo, &Foo::SumOfLast2);
318   EXPECT_EQ(23, a2.Perform(std::make_tuple('a', 2.5, 20, 3)));
319 }
320 
321 // Tests using Invoke() with a functor.
TEST(InvokeTest,Functor)322 TEST(InvokeTest, Functor) {
323   Action<long(long, int)> a = Invoke(plus<long>());  // NOLINT
324   EXPECT_EQ(3L, a.Perform(std::make_tuple(1, 2)));
325 }
326 
327 // Tests using Invoke(f) as an action of a compatible type.
TEST(InvokeTest,FunctionWithCompatibleType)328 TEST(InvokeTest, FunctionWithCompatibleType) {
329   Action<long(int, short, char, bool)> a = Invoke(SumOf4);  // NOLINT
330   EXPECT_EQ(4321, a.Perform(std::make_tuple(4000, Short(300), Char(20), true)));
331 }
332 
333 // Tests using Invoke() with an object pointer and a method pointer.
334 
335 // Tests using Invoke() with a nullary method.
TEST(InvokeMethodTest,Nullary)336 TEST(InvokeMethodTest, Nullary) {
337   Foo foo;
338   Action<int()> a = Invoke(&foo, &Foo::Nullary);  // NOLINT
339   EXPECT_EQ(123, a.Perform(std::make_tuple()));
340 }
341 
342 // Tests using Invoke() with a unary method.
TEST(InvokeMethodTest,Unary)343 TEST(InvokeMethodTest, Unary) {
344   Foo foo;
345   Action<short(long)> a = Invoke(&foo, &Foo::Unary);  // NOLINT
346   EXPECT_EQ(4123, a.Perform(std::make_tuple(4000)));
347 }
348 
349 // Tests using Invoke() with a binary method.
TEST(InvokeMethodTest,Binary)350 TEST(InvokeMethodTest, Binary) {
351   Foo foo;
352   Action<std::string(const std::string&, char)> a = Invoke(&foo, &Foo::Binary);
353   std::string s("Hell");
354   std::tuple<std::string, char> dummy = std::make_tuple(s, 'o');
355   EXPECT_EQ("Hello", a.Perform(dummy));
356 }
357 
358 // Tests using Invoke() with a ternary method.
TEST(InvokeMethodTest,Ternary)359 TEST(InvokeMethodTest, Ternary) {
360   Foo foo;
361   Action<int(int, bool, char)> a = Invoke(&foo, &Foo::Ternary);  // NOLINT
362   EXPECT_EQ(1124, a.Perform(std::make_tuple(1000, true, Char(1))));
363 }
364 
365 // Tests using Invoke() with a 4-argument method.
TEST(InvokeMethodTest,MethodThatTakes4Arguments)366 TEST(InvokeMethodTest, MethodThatTakes4Arguments) {
367   Foo foo;
368   Action<int(int, int, int, int)> a = Invoke(&foo, &Foo::SumOf4);  // NOLINT
369   EXPECT_EQ(1357, a.Perform(std::make_tuple(1000, 200, 30, 4)));
370 }
371 
372 // Tests using Invoke() with a 5-argument method.
TEST(InvokeMethodTest,MethodThatTakes5Arguments)373 TEST(InvokeMethodTest, MethodThatTakes5Arguments) {
374   Foo foo;
375   Action<int(int, int, int, int, int)> a =
376       Invoke(&foo, &Foo::SumOf5);  // NOLINT
377   EXPECT_EQ(12345, a.Perform(std::make_tuple(10000, 2000, 300, 40, 5)));
378 }
379 
380 // Tests using Invoke() with a 6-argument method.
TEST(InvokeMethodTest,MethodThatTakes6Arguments)381 TEST(InvokeMethodTest, MethodThatTakes6Arguments) {
382   Foo foo;
383   Action<int(int, int, int, int, int, int)> a =  // NOLINT
384       Invoke(&foo, &Foo::SumOf6);
385   EXPECT_EQ(123456,
386             a.Perform(std::make_tuple(100000, 20000, 3000, 400, 50, 6)));
387 }
388 
389 // Tests using Invoke() with a 7-argument method.
TEST(InvokeMethodTest,MethodThatTakes7Arguments)390 TEST(InvokeMethodTest, MethodThatTakes7Arguments) {
391   Foo foo;
392   Action<std::string(const char*, const char*, const char*, const char*,
393                      const char*, const char*, const char*)>
394       a = Invoke(&foo, &Foo::Concat7);
395   EXPECT_EQ("1234567",
396             a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
397                                       CharPtr("4"), CharPtr("5"), CharPtr("6"),
398                                       CharPtr("7"))));
399 }
400 
401 // Tests using Invoke() with a 8-argument method.
TEST(InvokeMethodTest,MethodThatTakes8Arguments)402 TEST(InvokeMethodTest, MethodThatTakes8Arguments) {
403   Foo foo;
404   Action<std::string(const char*, const char*, const char*, const char*,
405                      const char*, const char*, const char*, const char*)>
406       a = Invoke(&foo, &Foo::Concat8);
407   EXPECT_EQ("12345678",
408             a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
409                                       CharPtr("4"), CharPtr("5"), CharPtr("6"),
410                                       CharPtr("7"), CharPtr("8"))));
411 }
412 
413 // Tests using Invoke() with a 9-argument method.
TEST(InvokeMethodTest,MethodThatTakes9Arguments)414 TEST(InvokeMethodTest, MethodThatTakes9Arguments) {
415   Foo foo;
416   Action<std::string(const char*, const char*, const char*, const char*,
417                      const char*, const char*, const char*, const char*,
418                      const char*)>
419       a = Invoke(&foo, &Foo::Concat9);
420   EXPECT_EQ("123456789", a.Perform(std::make_tuple(
421                              CharPtr("1"), CharPtr("2"), CharPtr("3"),
422                              CharPtr("4"), CharPtr("5"), CharPtr("6"),
423                              CharPtr("7"), CharPtr("8"), CharPtr("9"))));
424 }
425 
426 // Tests using Invoke() with a 10-argument method.
TEST(InvokeMethodTest,MethodThatTakes10Arguments)427 TEST(InvokeMethodTest, MethodThatTakes10Arguments) {
428   Foo foo;
429   Action<std::string(const char*, const char*, const char*, const char*,
430                      const char*, const char*, const char*, const char*,
431                      const char*, const char*)>
432       a = Invoke(&foo, &Foo::Concat10);
433   EXPECT_EQ("1234567890",
434             a.Perform(std::make_tuple(CharPtr("1"), CharPtr("2"), CharPtr("3"),
435                                       CharPtr("4"), CharPtr("5"), CharPtr("6"),
436                                       CharPtr("7"), CharPtr("8"), CharPtr("9"),
437                                       CharPtr("0"))));
438 }
439 
440 // Tests using Invoke(f) as an action of a compatible type.
TEST(InvokeMethodTest,MethodWithCompatibleType)441 TEST(InvokeMethodTest, MethodWithCompatibleType) {
442   Foo foo;
443   Action<long(int, short, char, bool)> a =  // NOLINT
444       Invoke(&foo, &Foo::SumOf4);
445   EXPECT_EQ(4444, a.Perform(std::make_tuple(4000, Short(300), Char(20), true)));
446 }
447 
448 // Tests using WithoutArgs with an action that takes no argument.
TEST(WithoutArgsTest,NoArg)449 TEST(WithoutArgsTest, NoArg) {
450   Action<int(int n)> a = WithoutArgs(Invoke(Nullary));  // NOLINT
451   EXPECT_EQ(1, a.Perform(std::make_tuple(2)));
452 }
453 
454 // Tests using WithArg with an action that takes 1 argument.
TEST(WithArgTest,OneArg)455 TEST(WithArgTest, OneArg) {
456   Action<bool(double x, int n)> b = WithArg<1>(Invoke(Unary));  // NOLINT
457   EXPECT_TRUE(b.Perform(std::make_tuple(1.5, -1)));
458   EXPECT_FALSE(b.Perform(std::make_tuple(1.5, 1)));
459 }
460 
TEST(ReturnArgActionTest,WorksForOneArgIntArg0)461 TEST(ReturnArgActionTest, WorksForOneArgIntArg0) {
462   const Action<int(int)> a = ReturnArg<0>();
463   EXPECT_EQ(5, a.Perform(std::make_tuple(5)));
464 }
465 
TEST(ReturnArgActionTest,WorksForMultiArgBoolArg0)466 TEST(ReturnArgActionTest, WorksForMultiArgBoolArg0) {
467   const Action<bool(bool, bool, bool)> a = ReturnArg<0>();
468   EXPECT_TRUE(a.Perform(std::make_tuple(true, false, false)));
469 }
470 
TEST(ReturnArgActionTest,WorksForMultiArgStringArg2)471 TEST(ReturnArgActionTest, WorksForMultiArgStringArg2) {
472   const Action<std::string(int, int, std::string, int)> a = ReturnArg<2>();
473   EXPECT_EQ("seven", a.Perform(std::make_tuple(5, 6, std::string("seven"), 8)));
474 }
475 
TEST(ReturnArgActionTest,WorksForNonConstRefArg0)476 TEST(ReturnArgActionTest, WorksForNonConstRefArg0) {
477   const Action<std::string&(std::string&)> a = ReturnArg<0>();
478   std::string s = "12345";
479   EXPECT_EQ(&s, &a.Perform(std::forward_as_tuple(s)));
480 }
481 
TEST(SaveArgActionTest,WorksForSameType)482 TEST(SaveArgActionTest, WorksForSameType) {
483   int result = 0;
484   const Action<void(int n)> a1 = SaveArg<0>(&result);
485   a1.Perform(std::make_tuple(5));
486   EXPECT_EQ(5, result);
487 }
488 
TEST(SaveArgActionTest,WorksForCompatibleType)489 TEST(SaveArgActionTest, WorksForCompatibleType) {
490   int result = 0;
491   const Action<void(bool, char)> a1 = SaveArg<1>(&result);
492   a1.Perform(std::make_tuple(true, 'a'));
493   EXPECT_EQ('a', result);
494 }
495 
496 struct MoveOnly {
MoveOnlytesting::gmock_more_actions_test::MoveOnly497   explicit MoveOnly(int v) : i(v) {}
MoveOnlytesting::gmock_more_actions_test::MoveOnly498   MoveOnly(MoveOnly&& o) {
499     i = o.i;
500     o.i = -1;
501   }
operator =testing::gmock_more_actions_test::MoveOnly502   MoveOnly& operator=(MoveOnly&& o) {
503     i = o.i;
504     o.i = -1;
505     return *this;
506   }
507   int i;
508 };
509 
TEST(SaveArgByMoveActionTest,WorksForSameType)510 TEST(SaveArgByMoveActionTest, WorksForSameType) {
511   MoveOnly result{0};
512   const Action<void(MoveOnly v)> a1 = SaveArgByMove<0>(&result);
513   a1.Perform(std::make_tuple(MoveOnly{5}));
514   EXPECT_EQ(5, result.i);
515 }
516 
TEST(SaveArgByMoveActionTest,WorksForCompatibleType)517 TEST(SaveArgByMoveActionTest, WorksForCompatibleType) {
518   MoveOnly result{0};
519   const Action<void(bool, MoveOnly)> a1 = SaveArgByMove<1>(&result);
520   a1.Perform(std::make_tuple(true, MoveOnly{7}));
521   EXPECT_EQ(7, result.i);
522 }
523 
TEST(SaveArgPointeeActionTest,WorksForSameType)524 TEST(SaveArgPointeeActionTest, WorksForSameType) {
525   int result = 0;
526   const int value = 5;
527   const Action<void(const int*)> a1 = SaveArgPointee<0>(&result);
528   a1.Perform(std::make_tuple(&value));
529   EXPECT_EQ(5, result);
530 }
531 
TEST(SaveArgPointeeActionTest,WorksForCompatibleType)532 TEST(SaveArgPointeeActionTest, WorksForCompatibleType) {
533   int result = 0;
534   char value = 'a';
535   const Action<void(bool, char*)> a1 = SaveArgPointee<1>(&result);
536   a1.Perform(std::make_tuple(true, &value));
537   EXPECT_EQ('a', result);
538 }
539 
TEST(SetArgRefereeActionTest,WorksForSameType)540 TEST(SetArgRefereeActionTest, WorksForSameType) {
541   int value = 0;
542   const Action<void(int&)> a1 = SetArgReferee<0>(1);
543   a1.Perform(std::tuple<int&>(value));
544   EXPECT_EQ(1, value);
545 }
546 
TEST(SetArgRefereeActionTest,WorksForCompatibleType)547 TEST(SetArgRefereeActionTest, WorksForCompatibleType) {
548   int value = 0;
549   const Action<void(int, int&)> a1 = SetArgReferee<1>('a');
550   a1.Perform(std::tuple<int, int&>(0, value));
551   EXPECT_EQ('a', value);
552 }
553 
TEST(SetArgRefereeActionTest,WorksWithExtraArguments)554 TEST(SetArgRefereeActionTest, WorksWithExtraArguments) {
555   int value = 0;
556   const Action<void(bool, int, int&, const char*)> a1 = SetArgReferee<2>('a');
557   a1.Perform(std::tuple<bool, int, int&, const char*>(true, 0, value, "hi"));
558   EXPECT_EQ('a', value);
559 }
560 
561 // A class that can be used to verify that its destructor is called: it will set
562 // the bool provided to the constructor to true when destroyed.
563 class DeletionTester {
564  public:
DeletionTester(bool * is_deleted)565   explicit DeletionTester(bool* is_deleted) : is_deleted_(is_deleted) {
566     // Make sure the bit is set to false.
567     *is_deleted_ = false;
568   }
569 
~DeletionTester()570   ~DeletionTester() { *is_deleted_ = true; }
571 
572  private:
573   bool* is_deleted_;
574 };
575 
TEST(DeleteArgActionTest,OneArg)576 TEST(DeleteArgActionTest, OneArg) {
577   bool is_deleted = false;
578   DeletionTester* t = new DeletionTester(&is_deleted);
579   const Action<void(DeletionTester*)> a1 = DeleteArg<0>();  // NOLINT
580   EXPECT_FALSE(is_deleted);
581   a1.Perform(std::make_tuple(t));
582   EXPECT_TRUE(is_deleted);
583 }
584 
TEST(DeleteArgActionTest,TenArgs)585 TEST(DeleteArgActionTest, TenArgs) {
586   bool is_deleted = false;
587   DeletionTester* t = new DeletionTester(&is_deleted);
588   const Action<void(bool, int, int, const char*, bool, int, int, int, int,
589                     DeletionTester*)>
590       a1 = DeleteArg<9>();
591   EXPECT_FALSE(is_deleted);
592   a1.Perform(std::make_tuple(true, 5, 6, CharPtr("hi"), false, 7, 8, 9, 10, t));
593   EXPECT_TRUE(is_deleted);
594 }
595 
596 #if GTEST_HAS_EXCEPTIONS
597 
TEST(ThrowActionTest,ThrowsGivenExceptionInVoidFunction)598 TEST(ThrowActionTest, ThrowsGivenExceptionInVoidFunction) {
599   const Action<void(int n)> a = Throw('a');
600   EXPECT_THROW(a.Perform(std::make_tuple(0)), char);
601 }
602 
603 class MyException {};
604 
TEST(ThrowActionTest,ThrowsGivenExceptionInNonVoidFunction)605 TEST(ThrowActionTest, ThrowsGivenExceptionInNonVoidFunction) {
606   const Action<double(char ch)> a = Throw(MyException());
607   EXPECT_THROW(a.Perform(std::make_tuple('0')), MyException);
608 }
609 
TEST(ThrowActionTest,ThrowsGivenExceptionInNullaryFunction)610 TEST(ThrowActionTest, ThrowsGivenExceptionInNullaryFunction) {
611   const Action<double()> a = Throw(MyException());
612   EXPECT_THROW(a.Perform(std::make_tuple()), MyException);
613 }
614 
615 class Object {
616  public:
~Object()617   virtual ~Object() {}
Func()618   virtual void Func() {}
619 };
620 
621 class MockObject : public Object {
622  public:
~MockObject()623   ~MockObject() override {}
624   MOCK_METHOD(void, Func, (), (override));
625 };
626 
TEST(ThrowActionTest,Times0)627 TEST(ThrowActionTest, Times0) {
628   EXPECT_NONFATAL_FAILURE(
629       [] {
630         try {
631           MockObject m;
632           ON_CALL(m, Func()).WillByDefault([] { throw "something"; });
633           EXPECT_CALL(m, Func()).Times(0);
634           m.Func();
635         } catch (...) {
636           // Exception is caught but Times(0) still triggers a failure.
637         }
638       }(),
639       "");
640 }
641 
642 #endif  // GTEST_HAS_EXCEPTIONS
643 
644 // Tests that SetArrayArgument<N>(first, last) sets the elements of the array
645 // pointed to by the N-th (0-based) argument to values in range [first, last).
TEST(SetArrayArgumentTest,SetsTheNthArray)646 TEST(SetArrayArgumentTest, SetsTheNthArray) {
647   using MyFunction = void(bool, int*, char*);
648   int numbers[] = {1, 2, 3};
649   Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers + 3);
650 
651   int n[4] = {};
652   int* pn = n;
653   char ch[4] = {};
654   char* pch = ch;
655   a.Perform(std::make_tuple(true, pn, pch));
656   EXPECT_EQ(1, n[0]);
657   EXPECT_EQ(2, n[1]);
658   EXPECT_EQ(3, n[2]);
659   EXPECT_EQ(0, n[3]);
660   EXPECT_EQ('\0', ch[0]);
661   EXPECT_EQ('\0', ch[1]);
662   EXPECT_EQ('\0', ch[2]);
663   EXPECT_EQ('\0', ch[3]);
664 
665   // Tests first and last are iterators.
666   std::string letters = "abc";
667   a = SetArrayArgument<2>(letters.begin(), letters.end());
668   std::fill_n(n, 4, 0);
669   std::fill_n(ch, 4, '\0');
670   a.Perform(std::make_tuple(true, pn, pch));
671   EXPECT_EQ(0, n[0]);
672   EXPECT_EQ(0, n[1]);
673   EXPECT_EQ(0, n[2]);
674   EXPECT_EQ(0, n[3]);
675   EXPECT_EQ('a', ch[0]);
676   EXPECT_EQ('b', ch[1]);
677   EXPECT_EQ('c', ch[2]);
678   EXPECT_EQ('\0', ch[3]);
679 }
680 
681 // Tests SetArrayArgument<N>(first, last) where first == last.
TEST(SetArrayArgumentTest,SetsTheNthArrayWithEmptyRange)682 TEST(SetArrayArgumentTest, SetsTheNthArrayWithEmptyRange) {
683   using MyFunction = void(bool, int*);
684   int numbers[] = {1, 2, 3};
685   Action<MyFunction> a = SetArrayArgument<1>(numbers, numbers);
686 
687   int n[4] = {};
688   int* pn = n;
689   a.Perform(std::make_tuple(true, pn));
690   EXPECT_EQ(0, n[0]);
691   EXPECT_EQ(0, n[1]);
692   EXPECT_EQ(0, n[2]);
693   EXPECT_EQ(0, n[3]);
694 }
695 
696 // Tests SetArrayArgument<N>(first, last) where *first is convertible
697 // (but not equal) to the argument type.
TEST(SetArrayArgumentTest,SetsTheNthArrayWithConvertibleType)698 TEST(SetArrayArgumentTest, SetsTheNthArrayWithConvertibleType) {
699   using MyFunction = void(bool, int*);
700   char chars[] = {97, 98, 99};
701   Action<MyFunction> a = SetArrayArgument<1>(chars, chars + 3);
702 
703   int codes[4] = {111, 222, 333, 444};
704   int* pcodes = codes;
705   a.Perform(std::make_tuple(true, pcodes));
706   EXPECT_EQ(97, codes[0]);
707   EXPECT_EQ(98, codes[1]);
708   EXPECT_EQ(99, codes[2]);
709   EXPECT_EQ(444, codes[3]);
710 }
711 
712 // Test SetArrayArgument<N>(first, last) with iterator as argument.
TEST(SetArrayArgumentTest,SetsTheNthArrayWithIteratorArgument)713 TEST(SetArrayArgumentTest, SetsTheNthArrayWithIteratorArgument) {
714   using MyFunction = void(bool, std::back_insert_iterator<std::string>);
715   std::string letters = "abc";
716   Action<MyFunction> a = SetArrayArgument<1>(letters.begin(), letters.end());
717 
718   std::string s;
719   a.Perform(std::make_tuple(true, std::back_inserter(s)));
720   EXPECT_EQ(letters, s);
721 }
722 
TEST(ReturnPointeeTest,Works)723 TEST(ReturnPointeeTest, Works) {
724   int n = 42;
725   const Action<int()> a = ReturnPointee(&n);
726   EXPECT_EQ(42, a.Perform(std::make_tuple()));
727 
728   n = 43;
729   EXPECT_EQ(43, a.Perform(std::make_tuple()));
730 }
731 
732 // Tests InvokeArgument<N>(...).
733 
734 // Tests using InvokeArgument with a nullary function.
TEST(InvokeArgumentTest,Function0)735 TEST(InvokeArgumentTest, Function0) {
736   Action<int(int, int (*)())> a = InvokeArgument<1>();  // NOLINT
737   EXPECT_EQ(1, a.Perform(std::make_tuple(2, &Nullary)));
738 }
739 
740 // Tests using InvokeArgument with a unary functor.
TEST(InvokeArgumentTest,Functor1)741 TEST(InvokeArgumentTest, Functor1) {
742   Action<int(UnaryFunctor)> a = InvokeArgument<0>(true);  // NOLINT
743   EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryFunctor())));
744 }
745 
746 // Tests using InvokeArgument with a unary move-only functor.
TEST(InvokeArgumentTest,Functor1MoveOnly)747 TEST(InvokeArgumentTest, Functor1MoveOnly) {
748   Action<int(UnaryMoveOnlyFunctor)> a = InvokeArgument<0>(true);  // NOLINT
749   EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryMoveOnlyFunctor())));
750 }
751 
752 // Tests using InvokeArgument with a one-shot unary functor.
TEST(InvokeArgumentTest,OneShotFunctor1)753 TEST(InvokeArgumentTest, OneShotFunctor1) {
754   Action<int(OneShotUnaryFunctor)> a = InvokeArgument<0>(true);  // NOLINT
755   EXPECT_EQ(1, a.Perform(std::make_tuple(OneShotUnaryFunctor())));
756 }
757 
758 // Tests using InvokeArgument with a 5-ary function.
TEST(InvokeArgumentTest,Function5)759 TEST(InvokeArgumentTest, Function5) {
760   Action<int(int (*)(int, int, int, int, int))> a =  // NOLINT
761       InvokeArgument<0>(10000, 2000, 300, 40, 5);
762   EXPECT_EQ(12345, a.Perform(std::make_tuple(&SumOf5)));
763 }
764 
765 // Tests using InvokeArgument with a 5-ary functor.
TEST(InvokeArgumentTest,Functor5)766 TEST(InvokeArgumentTest, Functor5) {
767   Action<int(SumOf5Functor)> a =  // NOLINT
768       InvokeArgument<0>(10000, 2000, 300, 40, 5);
769   EXPECT_EQ(12345, a.Perform(std::make_tuple(SumOf5Functor())));
770 }
771 
772 // Tests using InvokeArgument with a 6-ary function.
TEST(InvokeArgumentTest,Function6)773 TEST(InvokeArgumentTest, Function6) {
774   Action<int(int (*)(int, int, int, int, int, int))> a =  // NOLINT
775       InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
776   EXPECT_EQ(123456, a.Perform(std::make_tuple(&SumOf6)));
777 }
778 
779 // Tests using InvokeArgument with a 6-ary functor.
TEST(InvokeArgumentTest,Functor6)780 TEST(InvokeArgumentTest, Functor6) {
781   Action<int(SumOf6Functor)> a =  // NOLINT
782       InvokeArgument<0>(100000, 20000, 3000, 400, 50, 6);
783   EXPECT_EQ(123456, a.Perform(std::make_tuple(SumOf6Functor())));
784 }
785 
786 // Tests using InvokeArgument with a 7-ary function.
TEST(InvokeArgumentTest,Function7)787 TEST(InvokeArgumentTest, Function7) {
788   Action<std::string(std::string (*)(const char*, const char*, const char*,
789                                      const char*, const char*, const char*,
790                                      const char*))>
791       a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7");
792   EXPECT_EQ("1234567", a.Perform(std::make_tuple(&Concat7)));
793 }
794 
795 // Tests using InvokeArgument with a 8-ary function.
TEST(InvokeArgumentTest,Function8)796 TEST(InvokeArgumentTest, Function8) {
797   Action<std::string(std::string (*)(const char*, const char*, const char*,
798                                      const char*, const char*, const char*,
799                                      const char*, const char*))>
800       a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8");
801   EXPECT_EQ("12345678", a.Perform(std::make_tuple(&Concat8)));
802 }
803 
804 // Tests using InvokeArgument with a 9-ary function.
TEST(InvokeArgumentTest,Function9)805 TEST(InvokeArgumentTest, Function9) {
806   Action<std::string(std::string (*)(const char*, const char*, const char*,
807                                      const char*, const char*, const char*,
808                                      const char*, const char*, const char*))>
809       a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9");
810   EXPECT_EQ("123456789", a.Perform(std::make_tuple(&Concat9)));
811 }
812 
813 // Tests using InvokeArgument with a 10-ary function.
TEST(InvokeArgumentTest,Function10)814 TEST(InvokeArgumentTest, Function10) {
815   Action<std::string(std::string (*)(
816       const char*, const char*, const char*, const char*, const char*,
817       const char*, const char*, const char*, const char*, const char*))>
818       a = InvokeArgument<0>("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
819   EXPECT_EQ("1234567890", a.Perform(std::make_tuple(&Concat10)));
820 }
821 
822 // Tests using InvokeArgument with a function that takes a pointer argument.
TEST(InvokeArgumentTest,ByPointerFunction)823 TEST(InvokeArgumentTest, ByPointerFunction) {
824   Action<const char*(const char* (*)(const char* input, short n))>  // NOLINT
825       a = InvokeArgument<0>(static_cast<const char*>("Hi"), Short(1));
826   EXPECT_STREQ("i", a.Perform(std::make_tuple(&Binary)));
827 }
828 
829 // Tests using InvokeArgument with a function that takes a const char*
830 // by passing it a C-string literal.
TEST(InvokeArgumentTest,FunctionWithCStringLiteral)831 TEST(InvokeArgumentTest, FunctionWithCStringLiteral) {
832   Action<const char*(const char* (*)(const char* input, short n))>  // NOLINT
833       a = InvokeArgument<0>("Hi", Short(1));
834   EXPECT_STREQ("i", a.Perform(std::make_tuple(&Binary)));
835 }
836 
837 // Tests using InvokeArgument with a function that takes a const reference.
TEST(InvokeArgumentTest,ByConstReferenceFunction)838 TEST(InvokeArgumentTest, ByConstReferenceFunction) {
839   Action<bool(bool (*function)(const std::string& s))> a =  // NOLINT
840       InvokeArgument<0>(std::string("Hi"));
841   // When action 'a' is constructed, it makes a copy of the temporary
842   // string object passed to it, so it's OK to use 'a' later, when the
843   // temporary object has already died.
844   EXPECT_TRUE(a.Perform(std::make_tuple(&ByConstRef)));
845 }
846 
847 // Tests using InvokeArgument with ByRef() and a function that takes a
848 // const reference.
TEST(InvokeArgumentTest,ByExplicitConstReferenceFunction)849 TEST(InvokeArgumentTest, ByExplicitConstReferenceFunction) {
850   Action<bool(bool (*)(const double& x))> a =  // NOLINT
851       InvokeArgument<0>(ByRef(g_double));
852   // The above line calls ByRef() on a const value.
853   EXPECT_TRUE(a.Perform(std::make_tuple(&ReferencesGlobalDouble)));
854 
855   double x = 0;
856   a = InvokeArgument<0>(ByRef(x));  // This calls ByRef() on a non-const.
857   EXPECT_FALSE(a.Perform(std::make_tuple(&ReferencesGlobalDouble)));
858 }
859 
TEST(InvokeArgumentTest,MoveOnlyType)860 TEST(InvokeArgumentTest, MoveOnlyType) {
861   struct Marker {};
862   struct {
863     // Method takes a unique_ptr (to a type we don't care about), and an
864     // invocable type.
865     MOCK_METHOD(bool, MockMethod,
866                 (std::unique_ptr<Marker>, std::function<int()>), ());
867   } mock;
868 
869   ON_CALL(mock, MockMethod(_, _)).WillByDefault(InvokeArgument<1>());
870 
871   // This compiles, but is a little opaque as a workaround:
872   ON_CALL(mock, MockMethod(_, _))
873       .WillByDefault(WithArg<1>(InvokeArgument<0>()));
874 }
875 
876 // Tests DoAll(a1, a2).
TEST(DoAllTest,TwoActions)877 TEST(DoAllTest, TwoActions) {
878   int n = 0;
879   Action<int(int*)> a = DoAll(SetArgPointee<0>(1),  // NOLINT
880                               Return(2));
881   EXPECT_EQ(2, a.Perform(std::make_tuple(&n)));
882   EXPECT_EQ(1, n);
883 }
884 
885 // Tests DoAll(a1, a2, a3).
TEST(DoAllTest,ThreeActions)886 TEST(DoAllTest, ThreeActions) {
887   int m = 0, n = 0;
888   Action<int(int*, int*)> a = DoAll(SetArgPointee<0>(1),  // NOLINT
889                                     SetArgPointee<1>(2), Return(3));
890   EXPECT_EQ(3, a.Perform(std::make_tuple(&m, &n)));
891   EXPECT_EQ(1, m);
892   EXPECT_EQ(2, n);
893 }
894 
895 // Tests DoAll(a1, a2, a3, a4).
TEST(DoAllTest,FourActions)896 TEST(DoAllTest, FourActions) {
897   int m = 0, n = 0;
898   char ch = '\0';
899   Action<int(int*, int*, char*)> a =  // NOLINT
900       DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'),
901             Return(3));
902   EXPECT_EQ(3, a.Perform(std::make_tuple(&m, &n, &ch)));
903   EXPECT_EQ(1, m);
904   EXPECT_EQ(2, n);
905   EXPECT_EQ('a', ch);
906 }
907 
908 // Tests DoAll(a1, a2, a3, a4, a5).
TEST(DoAllTest,FiveActions)909 TEST(DoAllTest, FiveActions) {
910   int m = 0, n = 0;
911   char a = '\0', b = '\0';
912   Action<int(int*, int*, char*, char*)> action =  // NOLINT
913       DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'),
914             SetArgPointee<3>('b'), Return(3));
915   EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b)));
916   EXPECT_EQ(1, m);
917   EXPECT_EQ(2, n);
918   EXPECT_EQ('a', a);
919   EXPECT_EQ('b', b);
920 }
921 
922 // Tests DoAll(a1, a2, ..., a6).
TEST(DoAllTest,SixActions)923 TEST(DoAllTest, SixActions) {
924   int m = 0, n = 0;
925   char a = '\0', b = '\0', c = '\0';
926   Action<int(int*, int*, char*, char*, char*)> action =  // NOLINT
927       DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'),
928             SetArgPointee<3>('b'), SetArgPointee<4>('c'), Return(3));
929   EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c)));
930   EXPECT_EQ(1, m);
931   EXPECT_EQ(2, n);
932   EXPECT_EQ('a', a);
933   EXPECT_EQ('b', b);
934   EXPECT_EQ('c', c);
935 }
936 
937 // Tests DoAll(a1, a2, ..., a7).
TEST(DoAllTest,SevenActions)938 TEST(DoAllTest, SevenActions) {
939   int m = 0, n = 0;
940   char a = '\0', b = '\0', c = '\0', d = '\0';
941   Action<int(int*, int*, char*, char*, char*, char*)> action =  // NOLINT
942       DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'),
943             SetArgPointee<3>('b'), SetArgPointee<4>('c'), SetArgPointee<5>('d'),
944             Return(3));
945   EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d)));
946   EXPECT_EQ(1, m);
947   EXPECT_EQ(2, n);
948   EXPECT_EQ('a', a);
949   EXPECT_EQ('b', b);
950   EXPECT_EQ('c', c);
951   EXPECT_EQ('d', d);
952 }
953 
954 // Tests DoAll(a1, a2, ..., a8).
TEST(DoAllTest,EightActions)955 TEST(DoAllTest, EightActions) {
956   int m = 0, n = 0;
957   char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0';
958   Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT
959              char*)>
960       action =
961           DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'),
962                 SetArgPointee<3>('b'), SetArgPointee<4>('c'),
963                 SetArgPointee<5>('d'), SetArgPointee<6>('e'), Return(3));
964   EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d, &e)));
965   EXPECT_EQ(1, m);
966   EXPECT_EQ(2, n);
967   EXPECT_EQ('a', a);
968   EXPECT_EQ('b', b);
969   EXPECT_EQ('c', c);
970   EXPECT_EQ('d', d);
971   EXPECT_EQ('e', e);
972 }
973 
974 // Tests DoAll(a1, a2, ..., a9).
TEST(DoAllTest,NineActions)975 TEST(DoAllTest, NineActions) {
976   int m = 0, n = 0;
977   char a = '\0', b = '\0', c = '\0', d = '\0', e = '\0', f = '\0';
978   Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT
979              char*, char*)>
980       action = DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2),
981                      SetArgPointee<2>('a'), SetArgPointee<3>('b'),
982                      SetArgPointee<4>('c'), SetArgPointee<5>('d'),
983                      SetArgPointee<6>('e'), SetArgPointee<7>('f'), Return(3));
984   EXPECT_EQ(3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d, &e, &f)));
985   EXPECT_EQ(1, m);
986   EXPECT_EQ(2, n);
987   EXPECT_EQ('a', a);
988   EXPECT_EQ('b', b);
989   EXPECT_EQ('c', c);
990   EXPECT_EQ('d', d);
991   EXPECT_EQ('e', e);
992   EXPECT_EQ('f', f);
993 }
994 
995 // Tests DoAll(a1, a2, ..., a10).
TEST(DoAllTest,TenActions)996 TEST(DoAllTest, TenActions) {
997   int m = 0, n = 0;
998   char a = '\0', b = '\0', c = '\0', d = '\0';
999   char e = '\0', f = '\0', g = '\0';
1000   Action<int(int*, int*, char*, char*, char*, char*,  // NOLINT
1001              char*, char*, char*)>
1002       action =
1003           DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2), SetArgPointee<2>('a'),
1004                 SetArgPointee<3>('b'), SetArgPointee<4>('c'),
1005                 SetArgPointee<5>('d'), SetArgPointee<6>('e'),
1006                 SetArgPointee<7>('f'), SetArgPointee<8>('g'), Return(3));
1007   EXPECT_EQ(
1008       3, action.Perform(std::make_tuple(&m, &n, &a, &b, &c, &d, &e, &f, &g)));
1009   EXPECT_EQ(1, m);
1010   EXPECT_EQ(2, n);
1011   EXPECT_EQ('a', a);
1012   EXPECT_EQ('b', b);
1013   EXPECT_EQ('c', c);
1014   EXPECT_EQ('d', d);
1015   EXPECT_EQ('e', e);
1016   EXPECT_EQ('f', f);
1017   EXPECT_EQ('g', g);
1018 }
1019 
TEST(DoAllTest,NoArgs)1020 TEST(DoAllTest, NoArgs) {
1021   bool ran_first = false;
1022   Action<bool()> a =
1023       DoAll([&] { ran_first = true; }, [&] { return ran_first; });
1024   EXPECT_TRUE(a.Perform({}));
1025 }
1026 
TEST(DoAllTest,MoveOnlyArgs)1027 TEST(DoAllTest, MoveOnlyArgs) {
1028   bool ran_first = false;
1029   Action<int(std::unique_ptr<int>)> a =
1030       DoAll(InvokeWithoutArgs([&] { ran_first = true; }),
1031             [](std::unique_ptr<int> p) { return *p; });
1032   EXPECT_EQ(7, a.Perform(std::make_tuple(std::unique_ptr<int>(new int(7)))));
1033   EXPECT_TRUE(ran_first);
1034 }
1035 
TEST(DoAllTest,ImplicitlyConvertsActionArguments)1036 TEST(DoAllTest, ImplicitlyConvertsActionArguments) {
1037   bool ran_first = false;
1038   // Action<void(std::vector<int>)> isn't an
1039   // Action<void(const std::vector<int>&) but can be converted.
1040   Action<void(std::vector<int>)> first = [&] { ran_first = true; };
1041   Action<int(std::vector<int>)> a =
1042       DoAll(first, [](std::vector<int> arg) { return arg.front(); });
1043   EXPECT_EQ(7, a.Perform(std::make_tuple(std::vector<int>{7})));
1044   EXPECT_TRUE(ran_first);
1045 }
1046 
1047 // The ACTION*() macros trigger warning C4100 (unreferenced formal
1048 // parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
1049 // the macro definition, as the warnings are generated when the macro
1050 // is expanded and macro expansion cannot contain #pragma.  Therefore
1051 // we suppress them here.
1052 // Also suppress C4503 decorated name length exceeded, name was truncated
1053 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100 4503)
1054 // Tests the ACTION*() macro family.
1055 
1056 // Tests that ACTION() can define an action that doesn't reference the
1057 // mock function arguments.
ACTION(Return5)1058 ACTION(Return5) { return 5; }
1059 
TEST(ActionMacroTest,WorksWhenNotReferencingArguments)1060 TEST(ActionMacroTest, WorksWhenNotReferencingArguments) {
1061   Action<double()> a1 = Return5();
1062   EXPECT_DOUBLE_EQ(5, a1.Perform(std::make_tuple()));
1063 
1064   Action<int(double, bool)> a2 = Return5();
1065   EXPECT_EQ(5, a2.Perform(std::make_tuple(1, true)));
1066 }
1067 
1068 // Tests that ACTION() can define an action that returns void.
ACTION(IncrementArg1)1069 ACTION(IncrementArg1) { (*arg1)++; }
1070 
TEST(ActionMacroTest,WorksWhenReturningVoid)1071 TEST(ActionMacroTest, WorksWhenReturningVoid) {
1072   Action<void(int, int*)> a1 = IncrementArg1();
1073   int n = 0;
1074   a1.Perform(std::make_tuple(5, &n));
1075   EXPECT_EQ(1, n);
1076 }
1077 
1078 // Tests that the body of ACTION() can reference the type of the
1079 // argument.
ACTION(IncrementArg2)1080 ACTION(IncrementArg2) {
1081   StaticAssertTypeEq<int*, arg2_type>();
1082   arg2_type temp = arg2;
1083   (*temp)++;
1084 }
1085 
TEST(ActionMacroTest,CanReferenceArgumentType)1086 TEST(ActionMacroTest, CanReferenceArgumentType) {
1087   Action<void(int, bool, int*)> a1 = IncrementArg2();
1088   int n = 0;
1089   a1.Perform(std::make_tuple(5, false, &n));
1090   EXPECT_EQ(1, n);
1091 }
1092 
1093 // Tests that the body of ACTION() can reference the argument tuple
1094 // via args_type and args.
ACTION(Sum2)1095 ACTION(Sum2) {
1096   StaticAssertTypeEq<std::tuple<int, char, int*>, args_type>();
1097   args_type args_copy = args;
1098   return std::get<0>(args_copy) + std::get<1>(args_copy);
1099 }
1100 
TEST(ActionMacroTest,CanReferenceArgumentTuple)1101 TEST(ActionMacroTest, CanReferenceArgumentTuple) {
1102   Action<int(int, char, int*)> a1 = Sum2();
1103   int dummy = 0;
1104   EXPECT_EQ(11, a1.Perform(std::make_tuple(5, Char(6), &dummy)));
1105 }
1106 
1107 namespace {
1108 
1109 // Tests that the body of ACTION() can reference the mock function
1110 // type.
Dummy(bool flag)1111 int Dummy(bool flag) { return flag ? 1 : 0; }
1112 
1113 }  // namespace
1114 
ACTION(InvokeDummy)1115 ACTION(InvokeDummy) {
1116   StaticAssertTypeEq<int(bool), function_type>();
1117   function_type* fp = &Dummy;
1118   return (*fp)(true);
1119 }
1120 
TEST(ActionMacroTest,CanReferenceMockFunctionType)1121 TEST(ActionMacroTest, CanReferenceMockFunctionType) {
1122   Action<int(bool)> a1 = InvokeDummy();
1123   EXPECT_EQ(1, a1.Perform(std::make_tuple(true)));
1124   EXPECT_EQ(1, a1.Perform(std::make_tuple(false)));
1125 }
1126 
1127 // Tests that the body of ACTION() can reference the mock function's
1128 // return type.
ACTION(InvokeDummy2)1129 ACTION(InvokeDummy2) {
1130   StaticAssertTypeEq<int, return_type>();
1131   return_type result = Dummy(true);
1132   return result;
1133 }
1134 
TEST(ActionMacroTest,CanReferenceMockFunctionReturnType)1135 TEST(ActionMacroTest, CanReferenceMockFunctionReturnType) {
1136   Action<int(bool)> a1 = InvokeDummy2();
1137   EXPECT_EQ(1, a1.Perform(std::make_tuple(true)));
1138   EXPECT_EQ(1, a1.Perform(std::make_tuple(false)));
1139 }
1140 
1141 // Tests that ACTION() works for arguments passed by const reference.
ACTION(ReturnAddrOfConstBoolReferenceArg)1142 ACTION(ReturnAddrOfConstBoolReferenceArg) {
1143   StaticAssertTypeEq<const bool&, arg1_type>();
1144   return &arg1;
1145 }
1146 
TEST(ActionMacroTest,WorksForConstReferenceArg)1147 TEST(ActionMacroTest, WorksForConstReferenceArg) {
1148   Action<const bool*(int, const bool&)> a = ReturnAddrOfConstBoolReferenceArg();
1149   const bool b = false;
1150   EXPECT_EQ(&b, a.Perform(std::tuple<int, const bool&>(0, b)));
1151 }
1152 
1153 // Tests that ACTION() works for arguments passed by non-const reference.
ACTION(ReturnAddrOfIntReferenceArg)1154 ACTION(ReturnAddrOfIntReferenceArg) {
1155   StaticAssertTypeEq<int&, arg0_type>();
1156   return &arg0;
1157 }
1158 
TEST(ActionMacroTest,WorksForNonConstReferenceArg)1159 TEST(ActionMacroTest, WorksForNonConstReferenceArg) {
1160   Action<int*(int&, bool, int)> a = ReturnAddrOfIntReferenceArg();
1161   int n = 0;
1162   EXPECT_EQ(&n, a.Perform(std::tuple<int&, bool, int>(n, true, 1)));
1163 }
1164 
1165 // Tests that ACTION() can be used in a namespace.
1166 namespace action_test {
ACTION(Sum)1167 ACTION(Sum) { return arg0 + arg1; }
1168 }  // namespace action_test
1169 
TEST(ActionMacroTest,WorksInNamespace)1170 TEST(ActionMacroTest, WorksInNamespace) {
1171   Action<int(int, int)> a1 = action_test::Sum();
1172   EXPECT_EQ(3, a1.Perform(std::make_tuple(1, 2)));
1173 }
1174 
1175 // Tests that the same ACTION definition works for mock functions with
1176 // different argument numbers.
ACTION(PlusTwo)1177 ACTION(PlusTwo) { return arg0 + 2; }
1178 
TEST(ActionMacroTest,WorksForDifferentArgumentNumbers)1179 TEST(ActionMacroTest, WorksForDifferentArgumentNumbers) {
1180   Action<int(int)> a1 = PlusTwo();
1181   EXPECT_EQ(4, a1.Perform(std::make_tuple(2)));
1182 
1183   Action<double(float, void*)> a2 = PlusTwo();
1184   int dummy;
1185   EXPECT_DOUBLE_EQ(6, a2.Perform(std::make_tuple(4.0f, &dummy)));
1186 }
1187 
1188 // Tests that ACTION_P can define a parameterized action.
ACTION_P(Plus,n)1189 ACTION_P(Plus, n) { return arg0 + n; }
1190 
TEST(ActionPMacroTest,DefinesParameterizedAction)1191 TEST(ActionPMacroTest, DefinesParameterizedAction) {
1192   Action<int(int m, bool t)> a1 = Plus(9);
1193   EXPECT_EQ(10, a1.Perform(std::make_tuple(1, true)));
1194 }
1195 
1196 // Tests that the body of ACTION_P can reference the argument types
1197 // and the parameter type.
ACTION_P(TypedPlus,n)1198 ACTION_P(TypedPlus, n) {
1199   arg0_type t1 = arg0;
1200   n_type t2 = n;
1201   return t1 + t2;
1202 }
1203 
TEST(ActionPMacroTest,CanReferenceArgumentAndParameterTypes)1204 TEST(ActionPMacroTest, CanReferenceArgumentAndParameterTypes) {
1205   Action<int(char m, bool t)> a1 = TypedPlus(9);
1206   EXPECT_EQ(10, a1.Perform(std::make_tuple(Char(1), true)));
1207 }
1208 
1209 // Tests that a parameterized action can be used in any mock function
1210 // whose type is compatible.
TEST(ActionPMacroTest,WorksInCompatibleMockFunction)1211 TEST(ActionPMacroTest, WorksInCompatibleMockFunction) {
1212   Action<std::string(const std::string& s)> a1 = Plus("tail");
1213   const std::string re = "re";
1214   std::tuple<const std::string> dummy = std::make_tuple(re);
1215   EXPECT_EQ("retail", a1.Perform(dummy));
1216 }
1217 
1218 // Tests that we can use ACTION*() to define actions overloaded on the
1219 // number of parameters.
1220 
ACTION(OverloadedAction)1221 ACTION(OverloadedAction) { return arg0 ? arg1 : "hello"; }
1222 
ACTION_P(OverloadedAction,default_value)1223 ACTION_P(OverloadedAction, default_value) {
1224   return arg0 ? arg1 : default_value;
1225 }
1226 
ACTION_P2(OverloadedAction,true_value,false_value)1227 ACTION_P2(OverloadedAction, true_value, false_value) {
1228   return arg0 ? true_value : false_value;
1229 }
1230 
TEST(ActionMacroTest,CanDefineOverloadedActions)1231 TEST(ActionMacroTest, CanDefineOverloadedActions) {
1232   using MyAction = Action<const char*(bool, const char*)>;
1233 
1234   const MyAction a1 = OverloadedAction();
1235   EXPECT_STREQ("hello", a1.Perform(std::make_tuple(false, CharPtr("world"))));
1236   EXPECT_STREQ("world", a1.Perform(std::make_tuple(true, CharPtr("world"))));
1237 
1238   const MyAction a2 = OverloadedAction("hi");
1239   EXPECT_STREQ("hi", a2.Perform(std::make_tuple(false, CharPtr("world"))));
1240   EXPECT_STREQ("world", a2.Perform(std::make_tuple(true, CharPtr("world"))));
1241 
1242   const MyAction a3 = OverloadedAction("hi", "you");
1243   EXPECT_STREQ("hi", a3.Perform(std::make_tuple(true, CharPtr("world"))));
1244   EXPECT_STREQ("you", a3.Perform(std::make_tuple(false, CharPtr("world"))));
1245 }
1246 
1247 // Tests ACTION_Pn where n >= 3.
1248 
ACTION_P3(Plus,m,n,k)1249 ACTION_P3(Plus, m, n, k) { return arg0 + m + n + k; }
1250 
TEST(ActionPnMacroTest,WorksFor3Parameters)1251 TEST(ActionPnMacroTest, WorksFor3Parameters) {
1252   Action<double(int m, bool t)> a1 = Plus(100, 20, 3.4);
1253   EXPECT_DOUBLE_EQ(3123.4, a1.Perform(std::make_tuple(3000, true)));
1254 
1255   Action<std::string(const std::string& s)> a2 = Plus("tail", "-", ">");
1256   const std::string re = "re";
1257   std::tuple<const std::string> dummy = std::make_tuple(re);
1258   EXPECT_EQ("retail->", a2.Perform(dummy));
1259 }
1260 
ACTION_P4(Plus,p0,p1,p2,p3)1261 ACTION_P4(Plus, p0, p1, p2, p3) { return arg0 + p0 + p1 + p2 + p3; }
1262 
TEST(ActionPnMacroTest,WorksFor4Parameters)1263 TEST(ActionPnMacroTest, WorksFor4Parameters) {
1264   Action<int(int)> a1 = Plus(1, 2, 3, 4);
1265   EXPECT_EQ(10 + 1 + 2 + 3 + 4, a1.Perform(std::make_tuple(10)));
1266 }
1267 
ACTION_P5(Plus,p0,p1,p2,p3,p4)1268 ACTION_P5(Plus, p0, p1, p2, p3, p4) { return arg0 + p0 + p1 + p2 + p3 + p4; }
1269 
TEST(ActionPnMacroTest,WorksFor5Parameters)1270 TEST(ActionPnMacroTest, WorksFor5Parameters) {
1271   Action<int(int)> a1 = Plus(1, 2, 3, 4, 5);
1272   EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5, a1.Perform(std::make_tuple(10)));
1273 }
1274 
ACTION_P6(Plus,p0,p1,p2,p3,p4,p5)1275 ACTION_P6(Plus, p0, p1, p2, p3, p4, p5) {
1276   return arg0 + p0 + p1 + p2 + p3 + p4 + p5;
1277 }
1278 
TEST(ActionPnMacroTest,WorksFor6Parameters)1279 TEST(ActionPnMacroTest, WorksFor6Parameters) {
1280   Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6);
1281   EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6, a1.Perform(std::make_tuple(10)));
1282 }
1283 
ACTION_P7(Plus,p0,p1,p2,p3,p4,p5,p6)1284 ACTION_P7(Plus, p0, p1, p2, p3, p4, p5, p6) {
1285   return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6;
1286 }
1287 
TEST(ActionPnMacroTest,WorksFor7Parameters)1288 TEST(ActionPnMacroTest, WorksFor7Parameters) {
1289   Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7);
1290   EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7, a1.Perform(std::make_tuple(10)));
1291 }
1292 
ACTION_P8(Plus,p0,p1,p2,p3,p4,p5,p6,p7)1293 ACTION_P8(Plus, p0, p1, p2, p3, p4, p5, p6, p7) {
1294   return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
1295 }
1296 
TEST(ActionPnMacroTest,WorksFor8Parameters)1297 TEST(ActionPnMacroTest, WorksFor8Parameters) {
1298   Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8);
1299   EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8,
1300             a1.Perform(std::make_tuple(10)));
1301 }
1302 
ACTION_P9(Plus,p0,p1,p2,p3,p4,p5,p6,p7,p8)1303 ACTION_P9(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8) {
1304   return arg0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8;
1305 }
1306 
TEST(ActionPnMacroTest,WorksFor9Parameters)1307 TEST(ActionPnMacroTest, WorksFor9Parameters) {
1308   Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9);
1309   EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9,
1310             a1.Perform(std::make_tuple(10)));
1311 }
1312 
ACTION_P10(Plus,p0,p1,p2,p3,p4,p5,p6,p7,p8,last_param)1313 ACTION_P10(Plus, p0, p1, p2, p3, p4, p5, p6, p7, p8, last_param) {
1314   arg0_type t0 = arg0;
1315   last_param_type t9 = last_param;
1316   return t0 + p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + t9;
1317 }
1318 
TEST(ActionPnMacroTest,WorksFor10Parameters)1319 TEST(ActionPnMacroTest, WorksFor10Parameters) {
1320   Action<int(int)> a1 = Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
1321   EXPECT_EQ(10 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10,
1322             a1.Perform(std::make_tuple(10)));
1323 }
1324 
1325 // Tests that the action body can promote the parameter types.
1326 
ACTION_P2(PadArgument,prefix,suffix)1327 ACTION_P2(PadArgument, prefix, suffix) {
1328   // The following lines promote the two parameters to desired types.
1329   std::string prefix_str(prefix);
1330   char suffix_char = static_cast<char>(suffix);
1331   return prefix_str + arg0 + suffix_char;
1332 }
1333 
TEST(ActionPnMacroTest,SimpleTypePromotion)1334 TEST(ActionPnMacroTest, SimpleTypePromotion) {
1335   Action<std::string(const char*)> no_promo =
1336       PadArgument(std::string("foo"), 'r');
1337   Action<std::string(const char*)> promo =
1338       PadArgument("foo", static_cast<int>('r'));
1339   EXPECT_EQ("foobar", no_promo.Perform(std::make_tuple(CharPtr("ba"))));
1340   EXPECT_EQ("foobar", promo.Perform(std::make_tuple(CharPtr("ba"))));
1341 }
1342 
1343 // Tests that we can partially restrict parameter types using a
1344 // straight-forward pattern.
1345 
1346 // Defines a generic action that doesn't restrict the types of its
1347 // parameters.
ACTION_P3(ConcatImpl,a,b,c)1348 ACTION_P3(ConcatImpl, a, b, c) {
1349   std::stringstream ss;
1350   ss << a << b << c;
1351   return ss.str();
1352 }
1353 
1354 // Next, we try to restrict that either the first parameter is a
1355 // string, or the second parameter is an int.
1356 
1357 // Defines a partially specialized wrapper that restricts the first
1358 // parameter to std::string.
1359 template <typename T1, typename T2>
1360 // ConcatImplActionP3 is the class template ACTION_P3 uses to
1361 // implement ConcatImpl.  We shouldn't change the name as this
1362 // pattern requires the user to use it directly.
Concat(const std::string & a,T1 b,T2 c)1363 ConcatImplActionP3<std::string, T1, T2> Concat(const std::string& a, T1 b,
1364                                                T2 c) {
1365   GTEST_INTENTIONAL_CONST_COND_PUSH_()
1366   if (true) {
1367     GTEST_INTENTIONAL_CONST_COND_POP_()
1368     // This branch verifies that ConcatImpl() can be invoked without
1369     // explicit template arguments.
1370     return ConcatImpl(a, b, c);
1371   } else {
1372     // This branch verifies that ConcatImpl() can also be invoked with
1373     // explicit template arguments.  It doesn't really need to be
1374     // executed as this is a compile-time verification.
1375     return ConcatImpl<std::string, T1, T2>(a, b, c);
1376   }
1377 }
1378 
1379 // Defines another partially specialized wrapper that restricts the
1380 // second parameter to int.
1381 template <typename T1, typename T2>
Concat(T1 a,int b,T2 c)1382 ConcatImplActionP3<T1, int, T2> Concat(T1 a, int b, T2 c) {
1383   return ConcatImpl(a, b, c);
1384 }
1385 
TEST(ActionPnMacroTest,CanPartiallyRestrictParameterTypes)1386 TEST(ActionPnMacroTest, CanPartiallyRestrictParameterTypes) {
1387   Action<const std::string()> a1 = Concat("Hello", "1", 2);
1388   EXPECT_EQ("Hello12", a1.Perform(std::make_tuple()));
1389 
1390   a1 = Concat(1, 2, 3);
1391   EXPECT_EQ("123", a1.Perform(std::make_tuple()));
1392 }
1393 
1394 // Verifies the type of an ACTION*.
1395 
ACTION(DoFoo)1396 ACTION(DoFoo) {}
ACTION_P(DoFoo,p)1397 ACTION_P(DoFoo, p) {}
ACTION_P2(DoFoo,p0,p1)1398 ACTION_P2(DoFoo, p0, p1) {}
1399 
TEST(ActionPnMacroTest,TypesAreCorrect)1400 TEST(ActionPnMacroTest, TypesAreCorrect) {
1401   // DoFoo() must be assignable to a DoFooAction variable.
1402   DoFooAction a0 = DoFoo();
1403 
1404   // DoFoo(1) must be assignable to a DoFooActionP variable.
1405   DoFooActionP<int> a1 = DoFoo(1);
1406 
1407   // DoFoo(p1, ..., pk) must be assignable to a DoFooActionPk
1408   // variable, and so on.
1409   DoFooActionP2<int, char> a2 = DoFoo(1, '2');
1410   PlusActionP3<int, int, char> a3 = Plus(1, 2, '3');
1411   PlusActionP4<int, int, int, char> a4 = Plus(1, 2, 3, '4');
1412   PlusActionP5<int, int, int, int, char> a5 = Plus(1, 2, 3, 4, '5');
1413   PlusActionP6<int, int, int, int, int, char> a6 = Plus(1, 2, 3, 4, 5, '6');
1414   PlusActionP7<int, int, int, int, int, int, char> a7 =
1415       Plus(1, 2, 3, 4, 5, 6, '7');
1416   PlusActionP8<int, int, int, int, int, int, int, char> a8 =
1417       Plus(1, 2, 3, 4, 5, 6, 7, '8');
1418   PlusActionP9<int, int, int, int, int, int, int, int, char> a9 =
1419       Plus(1, 2, 3, 4, 5, 6, 7, 8, '9');
1420   PlusActionP10<int, int, int, int, int, int, int, int, int, char> a10 =
1421       Plus(1, 2, 3, 4, 5, 6, 7, 8, 9, '0');
1422 
1423   // Avoid "unused variable" warnings.
1424   (void)a0;
1425   (void)a1;
1426   (void)a2;
1427   (void)a3;
1428   (void)a4;
1429   (void)a5;
1430   (void)a6;
1431   (void)a7;
1432   (void)a8;
1433   (void)a9;
1434   (void)a10;
1435 }
1436 
1437 // Tests that an ACTION_P*() action can be explicitly instantiated
1438 // with reference-typed parameters.
1439 
ACTION_P(Plus1,x)1440 ACTION_P(Plus1, x) { return x; }
ACTION_P2(Plus2,x,y)1441 ACTION_P2(Plus2, x, y) { return x + y; }
ACTION_P3(Plus3,x,y,z)1442 ACTION_P3(Plus3, x, y, z) { return x + y + z; }
ACTION_P10(Plus10,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)1443 ACTION_P10(Plus10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
1444   return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
1445 }
1446 
TEST(ActionPnMacroTest,CanExplicitlyInstantiateWithReferenceTypes)1447 TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
1448   int x = 1, y = 2, z = 3;
1449   const std::tuple<> empty = std::make_tuple();
1450 
1451   Action<int()> a = Plus1<int&>(x);
1452   EXPECT_EQ(1, a.Perform(empty));
1453 
1454   a = Plus2<const int&, int&>(x, y);
1455   EXPECT_EQ(3, a.Perform(empty));
1456 
1457   a = Plus3<int&, const int&, int&>(x, y, z);
1458   EXPECT_EQ(6, a.Perform(empty));
1459 
1460   int n[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
1461   a = Plus10<const int&, int&, const int&, int&, const int&, int&, const int&,
1462              int&, const int&, int&>(n[0], n[1], n[2], n[3], n[4], n[5], n[6],
1463                                      n[7], n[8], n[9]);
1464   EXPECT_EQ(55, a.Perform(empty));
1465 }
1466 
1467 class TenArgConstructorClass {
1468  public:
TenArgConstructorClass(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)1469   TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
1470                          int a8, int a9, int a10)
1471       : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {}
1472   int value_;
1473 };
1474 
1475 // Tests that ACTION_TEMPLATE works when there is no value parameter.
ACTION_TEMPLATE(CreateNew,HAS_1_TEMPLATE_PARAMS (typename,T),AND_0_VALUE_PARAMS ())1476 ACTION_TEMPLATE(CreateNew, HAS_1_TEMPLATE_PARAMS(typename, T),
1477                 AND_0_VALUE_PARAMS()) {
1478   return new T;
1479 }
1480 
TEST(ActionTemplateTest,WorksWithoutValueParam)1481 TEST(ActionTemplateTest, WorksWithoutValueParam) {
1482   const Action<int*()> a = CreateNew<int>();
1483   int* p = a.Perform(std::make_tuple());
1484   delete p;
1485 }
1486 
1487 // Tests that ACTION_TEMPLATE works when there are value parameters.
ACTION_TEMPLATE(CreateNew,HAS_1_TEMPLATE_PARAMS (typename,T),AND_1_VALUE_PARAMS (a0))1488 ACTION_TEMPLATE(CreateNew, HAS_1_TEMPLATE_PARAMS(typename, T),
1489                 AND_1_VALUE_PARAMS(a0)) {
1490   return new T(a0);
1491 }
1492 
TEST(ActionTemplateTest,WorksWithValueParams)1493 TEST(ActionTemplateTest, WorksWithValueParams) {
1494   const Action<int*()> a = CreateNew<int>(42);
1495   int* p = a.Perform(std::make_tuple());
1496   EXPECT_EQ(42, *p);
1497   delete p;
1498 }
1499 
1500 // Tests that ACTION_TEMPLATE works for integral template parameters.
ACTION_TEMPLATE(MyDeleteArg,HAS_1_TEMPLATE_PARAMS (int,k),AND_0_VALUE_PARAMS ())1501 ACTION_TEMPLATE(MyDeleteArg, HAS_1_TEMPLATE_PARAMS(int, k),
1502                 AND_0_VALUE_PARAMS()) {
1503   delete std::get<k>(args);
1504 }
1505 
1506 // Resets a bool variable in the destructor.
1507 class BoolResetter {
1508  public:
BoolResetter(bool * value)1509   explicit BoolResetter(bool* value) : value_(value) {}
~BoolResetter()1510   ~BoolResetter() { *value_ = false; }
1511 
1512  private:
1513   bool* value_;
1514 };
1515 
TEST(ActionTemplateTest,WorksForIntegralTemplateParams)1516 TEST(ActionTemplateTest, WorksForIntegralTemplateParams) {
1517   const Action<void(int*, BoolResetter*)> a = MyDeleteArg<1>();
1518   int n = 0;
1519   bool b = true;
1520   auto* resetter = new BoolResetter(&b);
1521   a.Perform(std::make_tuple(&n, resetter));
1522   EXPECT_FALSE(b);  // Verifies that resetter is deleted.
1523 }
1524 
1525 // 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))1526 ACTION_TEMPLATE(ReturnSmartPointer,
1527                 HAS_1_TEMPLATE_PARAMS(template <typename Pointee> class,
1528                                       Pointer),
1529                 AND_1_VALUE_PARAMS(pointee)) {
1530   return Pointer<pointee_type>(new pointee_type(pointee));
1531 }
1532 
TEST(ActionTemplateTest,WorksForTemplateTemplateParameters)1533 TEST(ActionTemplateTest, WorksForTemplateTemplateParameters) {
1534   const Action<std::shared_ptr<int>()> a =
1535       ReturnSmartPointer<std::shared_ptr>(42);
1536   std::shared_ptr<int> p = a.Perform(std::make_tuple());
1537   EXPECT_EQ(42, *p);
1538 }
1539 
1540 // Tests that ACTION_TEMPLATE works for 10 template parameters.
1541 template <typename T1, typename T2, typename T3, int k4, bool k5,
1542           unsigned int k6, typename T7, typename T8, typename T9>
1543 struct GiantTemplate {
1544  public:
GiantTemplatetesting::gmock_more_actions_test::GiantTemplate1545   explicit GiantTemplate(int a_value) : value(a_value) {}
1546   int value;
1547 };
1548 
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))1549 ACTION_TEMPLATE(ReturnGiant,
1550                 HAS_10_TEMPLATE_PARAMS(typename, T1, typename, T2, typename, T3,
1551                                        int, k4, bool, k5, unsigned int, k6,
1552                                        class, T7, class, T8, class, T9,
1553                                        template <typename T> class, T10),
1554                 AND_1_VALUE_PARAMS(value)) {
1555   return GiantTemplate<T10<T1>, T2, T3, k4, k5, k6, T7, T8, T9>(value);
1556 }
1557 
TEST(ActionTemplateTest,WorksFor10TemplateParameters)1558 TEST(ActionTemplateTest, WorksFor10TemplateParameters) {
1559   using Giant = GiantTemplate<std::shared_ptr<int>, bool, double, 5, true, 6,
1560                               char, unsigned, int>;
1561   const Action<Giant()> a = ReturnGiant<int, bool, double, 5, true, 6, char,
1562                                         unsigned, int, std::shared_ptr>(42);
1563   Giant giant = a.Perform(std::make_tuple());
1564   EXPECT_EQ(42, giant.value);
1565 }
1566 
1567 // 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))1568 ACTION_TEMPLATE(ReturnSum, HAS_1_TEMPLATE_PARAMS(typename, Number),
1569                 AND_10_VALUE_PARAMS(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)) {
1570   return static_cast<Number>(v1) + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10;
1571 }
1572 
TEST(ActionTemplateTest,WorksFor10ValueParameters)1573 TEST(ActionTemplateTest, WorksFor10ValueParameters) {
1574   const Action<int()> a = ReturnSum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
1575   EXPECT_EQ(55, a.Perform(std::make_tuple()));
1576 }
1577 
1578 // Tests that ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded
1579 // on the number of value parameters.
1580 
ACTION(ReturnSum)1581 ACTION(ReturnSum) { return 0; }
1582 
ACTION_P(ReturnSum,x)1583 ACTION_P(ReturnSum, x) { return x; }
1584 
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_2_VALUE_PARAMS (v1,v2))1585 ACTION_TEMPLATE(ReturnSum, HAS_1_TEMPLATE_PARAMS(typename, Number),
1586                 AND_2_VALUE_PARAMS(v1, v2)) {
1587   return static_cast<Number>(v1) + v2;
1588 }
1589 
ACTION_TEMPLATE(ReturnSum,HAS_1_TEMPLATE_PARAMS (typename,Number),AND_3_VALUE_PARAMS (v1,v2,v3))1590 ACTION_TEMPLATE(ReturnSum, HAS_1_TEMPLATE_PARAMS(typename, Number),
1591                 AND_3_VALUE_PARAMS(v1, v2, v3)) {
1592   return static_cast<Number>(v1) + v2 + v3;
1593 }
1594 
ACTION_TEMPLATE(ReturnSum,HAS_2_TEMPLATE_PARAMS (typename,Number,int,k),AND_4_VALUE_PARAMS (v1,v2,v3,v4))1595 ACTION_TEMPLATE(ReturnSum, HAS_2_TEMPLATE_PARAMS(typename, Number, int, k),
1596                 AND_4_VALUE_PARAMS(v1, v2, v3, v4)) {
1597   return static_cast<Number>(v1) + v2 + v3 + v4 + k;
1598 }
1599 
TEST(ActionTemplateTest,CanBeOverloadedOnNumberOfValueParameters)1600 TEST(ActionTemplateTest, CanBeOverloadedOnNumberOfValueParameters) {
1601   const Action<int()> a0 = ReturnSum();
1602   const Action<int()> a1 = ReturnSum(1);
1603   const Action<int()> a2 = ReturnSum<int>(1, 2);
1604   const Action<int()> a3 = ReturnSum<int>(1, 2, 3);
1605   const Action<int()> a4 = ReturnSum<int, 10000>(2000, 300, 40, 5);
1606   EXPECT_EQ(0, a0.Perform(std::make_tuple()));
1607   EXPECT_EQ(1, a1.Perform(std::make_tuple()));
1608   EXPECT_EQ(3, a2.Perform(std::make_tuple()));
1609   EXPECT_EQ(6, a3.Perform(std::make_tuple()));
1610   EXPECT_EQ(12345, a4.Perform(std::make_tuple()));
1611 }
1612 
1613 }  // namespace gmock_more_actions_test
1614 }  // namespace testing
1615 
1616 GTEST_DISABLE_MSC_WARNINGS_POP_()  // 4100 4503
1617 GTEST_DISABLE_MSC_WARNINGS_POP_()  // 4577
1618