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