xref: /freebsd/contrib/googletest/googlemock/test/gmock-actions_test.cc (revision 28f6c2f292806bf31230a959bc4b19d7081669a7)
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.
33 
34 #include "gmock/gmock-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 <type_traits>
44 #include <utility>
45 #include <vector>
46 
47 #include "gmock/gmock.h"
48 #include "gmock/internal/gmock-port.h"
49 #include "gtest/gtest-spi.h"
50 #include "gtest/gtest.h"
51 #include "gtest/internal/gtest-port.h"
52 
53 // Silence C4100 (unreferenced formal parameter) and C4503 (decorated name
54 // length exceeded) for MSVC.
55 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100 4503)
56 #if defined(_MSC_VER) && (_MSC_VER == 1900)
57 // and silence C4800 (C4800: 'int *const ': forcing value
58 // to bool 'true' or 'false') for MSVC 15
59 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800)
60 #endif
61 
62 namespace testing {
63 namespace {
64 
65 using ::testing::internal::BuiltInDefaultValue;
66 
TEST(TypeTraits,Negation)67 TEST(TypeTraits, Negation) {
68   // Direct use with std types.
69   static_assert(std::is_base_of<std::false_type,
70                                 internal::negation<std::true_type>>::value,
71                 "");
72 
73   static_assert(std::is_base_of<std::true_type,
74                                 internal::negation<std::false_type>>::value,
75                 "");
76 
77   // With other types that fit the requirement of a value member that is
78   // convertible to bool.
79   static_assert(std::is_base_of<
80                     std::true_type,
81                     internal::negation<std::integral_constant<int, 0>>>::value,
82                 "");
83 
84   static_assert(std::is_base_of<
85                     std::false_type,
86                     internal::negation<std::integral_constant<int, 1>>>::value,
87                 "");
88 
89   static_assert(std::is_base_of<
90                     std::false_type,
91                     internal::negation<std::integral_constant<int, -1>>>::value,
92                 "");
93 }
94 
95 // Weird false/true types that aren't actually bool constants (but should still
96 // be legal according to [meta.logical] because `bool(T::value)` is valid), are
97 // distinct from std::false_type and std::true_type, and are distinct from other
98 // instantiations of the same template.
99 //
100 // These let us check finicky details mandated by the standard like
101 // "std::conjunction should evaluate to a type that inherits from the first
102 // false-y input".
103 template <int>
104 struct MyFalse : std::integral_constant<int, 0> {};
105 
106 template <int>
107 struct MyTrue : std::integral_constant<int, -1> {};
108 
TEST(TypeTraits,Conjunction)109 TEST(TypeTraits, Conjunction) {
110   // Base case: always true.
111   static_assert(std::is_base_of<std::true_type, internal::conjunction<>>::value,
112                 "");
113 
114   // One predicate: inherits from that predicate, regardless of value.
115   static_assert(
116       std::is_base_of<MyFalse<0>, internal::conjunction<MyFalse<0>>>::value,
117       "");
118 
119   static_assert(
120       std::is_base_of<MyTrue<0>, internal::conjunction<MyTrue<0>>>::value, "");
121 
122   // Multiple predicates, with at least one false: inherits from that one.
123   static_assert(
124       std::is_base_of<MyFalse<1>, internal::conjunction<MyTrue<0>, MyFalse<1>,
125                                                         MyTrue<2>>>::value,
126       "");
127 
128   static_assert(
129       std::is_base_of<MyFalse<1>, internal::conjunction<MyTrue<0>, MyFalse<1>,
130                                                         MyFalse<2>>>::value,
131       "");
132 
133   // Short circuiting: in the case above, additional predicates need not even
134   // define a value member.
135   struct Empty {};
136   static_assert(
137       std::is_base_of<MyFalse<1>, internal::conjunction<MyTrue<0>, MyFalse<1>,
138                                                         Empty>>::value,
139       "");
140 
141   // All predicates true: inherits from the last.
142   static_assert(
143       std::is_base_of<MyTrue<2>, internal::conjunction<MyTrue<0>, MyTrue<1>,
144                                                        MyTrue<2>>>::value,
145       "");
146 }
147 
TEST(TypeTraits,Disjunction)148 TEST(TypeTraits, Disjunction) {
149   // Base case: always false.
150   static_assert(
151       std::is_base_of<std::false_type, internal::disjunction<>>::value, "");
152 
153   // One predicate: inherits from that predicate, regardless of value.
154   static_assert(
155       std::is_base_of<MyFalse<0>, internal::disjunction<MyFalse<0>>>::value,
156       "");
157 
158   static_assert(
159       std::is_base_of<MyTrue<0>, internal::disjunction<MyTrue<0>>>::value, "");
160 
161   // Multiple predicates, with at least one true: inherits from that one.
162   static_assert(
163       std::is_base_of<MyTrue<1>, internal::disjunction<MyFalse<0>, MyTrue<1>,
164                                                        MyFalse<2>>>::value,
165       "");
166 
167   static_assert(
168       std::is_base_of<MyTrue<1>, internal::disjunction<MyFalse<0>, MyTrue<1>,
169                                                        MyTrue<2>>>::value,
170       "");
171 
172   // Short circuiting: in the case above, additional predicates need not even
173   // define a value member.
174   struct Empty {};
175   static_assert(
176       std::is_base_of<MyTrue<1>, internal::disjunction<MyFalse<0>, MyTrue<1>,
177                                                        Empty>>::value,
178       "");
179 
180   // All predicates false: inherits from the last.
181   static_assert(
182       std::is_base_of<MyFalse<2>, internal::disjunction<MyFalse<0>, MyFalse<1>,
183                                                         MyFalse<2>>>::value,
184       "");
185 }
186 
TEST(TypeTraits,IsInvocableRV)187 TEST(TypeTraits, IsInvocableRV) {
188   struct C {
189     int operator()() const { return 0; }
190     void operator()(int) & {}
191     std::string operator()(int) && { return ""; };
192   };
193 
194   // The first overload is callable for const and non-const rvalues and lvalues.
195   // It can be used to obtain an int, cv void, or anything int is convertible
196   // to.
197   static_assert(internal::is_callable_r<int, C>::value, "");
198   static_assert(internal::is_callable_r<int, C&>::value, "");
199   static_assert(internal::is_callable_r<int, const C>::value, "");
200   static_assert(internal::is_callable_r<int, const C&>::value, "");
201 
202   static_assert(internal::is_callable_r<void, C>::value, "");
203   static_assert(internal::is_callable_r<const volatile void, C>::value, "");
204   static_assert(internal::is_callable_r<char, C>::value, "");
205 
206   // It's possible to provide an int. If it's given to an lvalue, the result is
207   // void. Otherwise it is std::string (which is also treated as allowed for a
208   // void result type).
209   static_assert(internal::is_callable_r<void, C&, int>::value, "");
210   static_assert(!internal::is_callable_r<int, C&, int>::value, "");
211   static_assert(!internal::is_callable_r<std::string, C&, int>::value, "");
212   static_assert(!internal::is_callable_r<void, const C&, int>::value, "");
213 
214   static_assert(internal::is_callable_r<std::string, C, int>::value, "");
215   static_assert(internal::is_callable_r<void, C, int>::value, "");
216   static_assert(!internal::is_callable_r<int, C, int>::value, "");
217 
218   // It's not possible to provide other arguments.
219   static_assert(!internal::is_callable_r<void, C, std::string>::value, "");
220   static_assert(!internal::is_callable_r<void, C, int, int>::value, "");
221 
222   // In C++17 and above, where it's guaranteed that functions can return
223   // non-moveable objects, everything should work fine for non-moveable rsult
224   // types too.
225 #if defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \
226     GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
227   {
228     struct NonMoveable {
229       NonMoveable() = default;
230       NonMoveable(NonMoveable&&) = delete;
231     };
232 
233     static_assert(!std::is_move_constructible_v<NonMoveable>);
234 
235     struct Callable {
236       NonMoveable operator()() { return NonMoveable(); }
237     };
238 
239     static_assert(internal::is_callable_r<NonMoveable, Callable>::value);
240     static_assert(internal::is_callable_r<void, Callable>::value);
241     static_assert(
242         internal::is_callable_r<const volatile void, Callable>::value);
243 
244     static_assert(!internal::is_callable_r<int, Callable>::value);
245     static_assert(!internal::is_callable_r<NonMoveable, Callable, int>::value);
246   }
247 #endif  // C++17 and above
248 
249   // Nothing should choke when we try to call other arguments besides directly
250   // callable objects, but they should not show up as callable.
251   static_assert(!internal::is_callable_r<void, int>::value, "");
252   static_assert(!internal::is_callable_r<void, void (C::*)()>::value, "");
253   static_assert(!internal::is_callable_r<void, void (C::*)(), C*>::value, "");
254 }
255 
256 // Tests that BuiltInDefaultValue<T*>::Get() returns NULL.
TEST(BuiltInDefaultValueTest,IsNullForPointerTypes)257 TEST(BuiltInDefaultValueTest, IsNullForPointerTypes) {
258   EXPECT_TRUE(BuiltInDefaultValue<int*>::Get() == nullptr);
259   EXPECT_TRUE(BuiltInDefaultValue<const char*>::Get() == nullptr);
260   EXPECT_TRUE(BuiltInDefaultValue<void*>::Get() == nullptr);
261 }
262 
263 // Tests that BuiltInDefaultValue<T*>::Exists() return true.
TEST(BuiltInDefaultValueTest,ExistsForPointerTypes)264 TEST(BuiltInDefaultValueTest, ExistsForPointerTypes) {
265   EXPECT_TRUE(BuiltInDefaultValue<int*>::Exists());
266   EXPECT_TRUE(BuiltInDefaultValue<const char*>::Exists());
267   EXPECT_TRUE(BuiltInDefaultValue<void*>::Exists());
268 }
269 
270 // Tests that BuiltInDefaultValue<T>::Get() returns 0 when T is a
271 // built-in numeric type.
TEST(BuiltInDefaultValueTest,IsZeroForNumericTypes)272 TEST(BuiltInDefaultValueTest, IsZeroForNumericTypes) {
273   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned char>::Get());
274   EXPECT_EQ(0, BuiltInDefaultValue<signed char>::Get());
275   EXPECT_EQ(0, BuiltInDefaultValue<char>::Get());
276 #if GMOCK_WCHAR_T_IS_NATIVE_
277 #if !defined(__WCHAR_UNSIGNED__)
278   EXPECT_EQ(0, BuiltInDefaultValue<wchar_t>::Get());
279 #else
280   EXPECT_EQ(0U, BuiltInDefaultValue<wchar_t>::Get());
281 #endif
282 #endif
283   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned short>::Get());  // NOLINT
284   EXPECT_EQ(0, BuiltInDefaultValue<signed short>::Get());     // NOLINT
285   EXPECT_EQ(0, BuiltInDefaultValue<short>::Get());            // NOLINT
286   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned int>::Get());
287   EXPECT_EQ(0, BuiltInDefaultValue<signed int>::Get());
288   EXPECT_EQ(0, BuiltInDefaultValue<int>::Get());
289   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long>::Get());       // NOLINT
290   EXPECT_EQ(0, BuiltInDefaultValue<signed long>::Get());          // NOLINT
291   EXPECT_EQ(0, BuiltInDefaultValue<long>::Get());                 // NOLINT
292   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long long>::Get());  // NOLINT
293   EXPECT_EQ(0, BuiltInDefaultValue<signed long long>::Get());     // NOLINT
294   EXPECT_EQ(0, BuiltInDefaultValue<long long>::Get());            // NOLINT
295   EXPECT_EQ(0, BuiltInDefaultValue<float>::Get());
296   EXPECT_EQ(0, BuiltInDefaultValue<double>::Get());
297 }
298 
299 // Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a
300 // built-in numeric type.
TEST(BuiltInDefaultValueTest,ExistsForNumericTypes)301 TEST(BuiltInDefaultValueTest, ExistsForNumericTypes) {
302   EXPECT_TRUE(BuiltInDefaultValue<unsigned char>::Exists());
303   EXPECT_TRUE(BuiltInDefaultValue<signed char>::Exists());
304   EXPECT_TRUE(BuiltInDefaultValue<char>::Exists());
305 #if GMOCK_WCHAR_T_IS_NATIVE_
306   EXPECT_TRUE(BuiltInDefaultValue<wchar_t>::Exists());
307 #endif
308   EXPECT_TRUE(BuiltInDefaultValue<unsigned short>::Exists());  // NOLINT
309   EXPECT_TRUE(BuiltInDefaultValue<signed short>::Exists());    // NOLINT
310   EXPECT_TRUE(BuiltInDefaultValue<short>::Exists());           // NOLINT
311   EXPECT_TRUE(BuiltInDefaultValue<unsigned int>::Exists());
312   EXPECT_TRUE(BuiltInDefaultValue<signed int>::Exists());
313   EXPECT_TRUE(BuiltInDefaultValue<int>::Exists());
314   EXPECT_TRUE(BuiltInDefaultValue<unsigned long>::Exists());       // NOLINT
315   EXPECT_TRUE(BuiltInDefaultValue<signed long>::Exists());         // NOLINT
316   EXPECT_TRUE(BuiltInDefaultValue<long>::Exists());                // NOLINT
317   EXPECT_TRUE(BuiltInDefaultValue<unsigned long long>::Exists());  // NOLINT
318   EXPECT_TRUE(BuiltInDefaultValue<signed long long>::Exists());    // NOLINT
319   EXPECT_TRUE(BuiltInDefaultValue<long long>::Exists());           // NOLINT
320   EXPECT_TRUE(BuiltInDefaultValue<float>::Exists());
321   EXPECT_TRUE(BuiltInDefaultValue<double>::Exists());
322 }
323 
324 // Tests that BuiltInDefaultValue<bool>::Get() returns false.
TEST(BuiltInDefaultValueTest,IsFalseForBool)325 TEST(BuiltInDefaultValueTest, IsFalseForBool) {
326   EXPECT_FALSE(BuiltInDefaultValue<bool>::Get());
327 }
328 
329 // Tests that BuiltInDefaultValue<bool>::Exists() returns true.
TEST(BuiltInDefaultValueTest,BoolExists)330 TEST(BuiltInDefaultValueTest, BoolExists) {
331   EXPECT_TRUE(BuiltInDefaultValue<bool>::Exists());
332 }
333 
334 // Tests that BuiltInDefaultValue<T>::Get() returns "" when T is a
335 // string type.
TEST(BuiltInDefaultValueTest,IsEmptyStringForString)336 TEST(BuiltInDefaultValueTest, IsEmptyStringForString) {
337   EXPECT_EQ("", BuiltInDefaultValue<::std::string>::Get());
338 }
339 
340 // Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a
341 // string type.
TEST(BuiltInDefaultValueTest,ExistsForString)342 TEST(BuiltInDefaultValueTest, ExistsForString) {
343   EXPECT_TRUE(BuiltInDefaultValue<::std::string>::Exists());
344 }
345 
346 // Tests that BuiltInDefaultValue<const T>::Get() returns the same
347 // value as BuiltInDefaultValue<T>::Get() does.
TEST(BuiltInDefaultValueTest,WorksForConstTypes)348 TEST(BuiltInDefaultValueTest, WorksForConstTypes) {
349   EXPECT_EQ("", BuiltInDefaultValue<const std::string>::Get());
350   EXPECT_EQ(0, BuiltInDefaultValue<const int>::Get());
351   EXPECT_TRUE(BuiltInDefaultValue<char* const>::Get() == nullptr);
352   EXPECT_FALSE(BuiltInDefaultValue<const bool>::Get());
353 }
354 
355 // A type that's default constructible.
356 class MyDefaultConstructible {
357  public:
MyDefaultConstructible()358   MyDefaultConstructible() : value_(42) {}
359 
value() const360   int value() const { return value_; }
361 
362  private:
363   int value_;
364 };
365 
366 // A type that's not default constructible.
367 class MyNonDefaultConstructible {
368  public:
369   // Does not have a default ctor.
MyNonDefaultConstructible(int a_value)370   explicit MyNonDefaultConstructible(int a_value) : value_(a_value) {}
371 
value() const372   int value() const { return value_; }
373 
374  private:
375   int value_;
376 };
377 
TEST(BuiltInDefaultValueTest,ExistsForDefaultConstructibleType)378 TEST(BuiltInDefaultValueTest, ExistsForDefaultConstructibleType) {
379   EXPECT_TRUE(BuiltInDefaultValue<MyDefaultConstructible>::Exists());
380 }
381 
TEST(BuiltInDefaultValueTest,IsDefaultConstructedForDefaultConstructibleType)382 TEST(BuiltInDefaultValueTest, IsDefaultConstructedForDefaultConstructibleType) {
383   EXPECT_EQ(42, BuiltInDefaultValue<MyDefaultConstructible>::Get().value());
384 }
385 
TEST(BuiltInDefaultValueTest,DoesNotExistForNonDefaultConstructibleType)386 TEST(BuiltInDefaultValueTest, DoesNotExistForNonDefaultConstructibleType) {
387   EXPECT_FALSE(BuiltInDefaultValue<MyNonDefaultConstructible>::Exists());
388 }
389 
390 // Tests that BuiltInDefaultValue<T&>::Get() aborts the program.
TEST(BuiltInDefaultValueDeathTest,IsUndefinedForReferences)391 TEST(BuiltInDefaultValueDeathTest, IsUndefinedForReferences) {
392   EXPECT_DEATH_IF_SUPPORTED({ BuiltInDefaultValue<int&>::Get(); }, "");
393   EXPECT_DEATH_IF_SUPPORTED({ BuiltInDefaultValue<const char&>::Get(); }, "");
394 }
395 
TEST(BuiltInDefaultValueDeathTest,IsUndefinedForNonDefaultConstructibleType)396 TEST(BuiltInDefaultValueDeathTest, IsUndefinedForNonDefaultConstructibleType) {
397   EXPECT_DEATH_IF_SUPPORTED(
398       { BuiltInDefaultValue<MyNonDefaultConstructible>::Get(); }, "");
399 }
400 
401 // Tests that DefaultValue<T>::IsSet() is false initially.
TEST(DefaultValueTest,IsInitiallyUnset)402 TEST(DefaultValueTest, IsInitiallyUnset) {
403   EXPECT_FALSE(DefaultValue<int>::IsSet());
404   EXPECT_FALSE(DefaultValue<MyDefaultConstructible>::IsSet());
405   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet());
406 }
407 
408 // Tests that DefaultValue<T> can be set and then unset.
TEST(DefaultValueTest,CanBeSetAndUnset)409 TEST(DefaultValueTest, CanBeSetAndUnset) {
410   EXPECT_TRUE(DefaultValue<int>::Exists());
411   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists());
412 
413   DefaultValue<int>::Set(1);
414   DefaultValue<const MyNonDefaultConstructible>::Set(
415       MyNonDefaultConstructible(42));
416 
417   EXPECT_EQ(1, DefaultValue<int>::Get());
418   EXPECT_EQ(42, DefaultValue<const MyNonDefaultConstructible>::Get().value());
419 
420   EXPECT_TRUE(DefaultValue<int>::Exists());
421   EXPECT_TRUE(DefaultValue<const MyNonDefaultConstructible>::Exists());
422 
423   DefaultValue<int>::Clear();
424   DefaultValue<const MyNonDefaultConstructible>::Clear();
425 
426   EXPECT_FALSE(DefaultValue<int>::IsSet());
427   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet());
428 
429   EXPECT_TRUE(DefaultValue<int>::Exists());
430   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists());
431 }
432 
433 // Tests that DefaultValue<T>::Get() returns the
434 // BuiltInDefaultValue<T>::Get() when DefaultValue<T>::IsSet() is
435 // false.
TEST(DefaultValueDeathTest,GetReturnsBuiltInDefaultValueWhenUnset)436 TEST(DefaultValueDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) {
437   EXPECT_FALSE(DefaultValue<int>::IsSet());
438   EXPECT_TRUE(DefaultValue<int>::Exists());
439   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::IsSet());
440   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::Exists());
441 
442   EXPECT_EQ(0, DefaultValue<int>::Get());
443 
444   EXPECT_DEATH_IF_SUPPORTED({ DefaultValue<MyNonDefaultConstructible>::Get(); },
445                             "");
446 }
447 
TEST(DefaultValueTest,GetWorksForMoveOnlyIfSet)448 TEST(DefaultValueTest, GetWorksForMoveOnlyIfSet) {
449   EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());
450   EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Get() == nullptr);
451   DefaultValue<std::unique_ptr<int>>::SetFactory(
452       [] { return std::make_unique<int>(42); });
453   EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());
454   std::unique_ptr<int> i = DefaultValue<std::unique_ptr<int>>::Get();
455   EXPECT_EQ(42, *i);
456 }
457 
458 // Tests that DefaultValue<void>::Get() returns void.
TEST(DefaultValueTest,GetWorksForVoid)459 TEST(DefaultValueTest, GetWorksForVoid) { return DefaultValue<void>::Get(); }
460 
461 // Tests using DefaultValue with a reference type.
462 
463 // Tests that DefaultValue<T&>::IsSet() is false initially.
TEST(DefaultValueOfReferenceTest,IsInitiallyUnset)464 TEST(DefaultValueOfReferenceTest, IsInitiallyUnset) {
465   EXPECT_FALSE(DefaultValue<int&>::IsSet());
466   EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::IsSet());
467   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());
468 }
469 
470 // Tests that DefaultValue<T&>::Exists is false initially.
TEST(DefaultValueOfReferenceTest,IsInitiallyNotExisting)471 TEST(DefaultValueOfReferenceTest, IsInitiallyNotExisting) {
472   EXPECT_FALSE(DefaultValue<int&>::Exists());
473   EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::Exists());
474   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists());
475 }
476 
477 // Tests that DefaultValue<T&> can be set and then unset.
TEST(DefaultValueOfReferenceTest,CanBeSetAndUnset)478 TEST(DefaultValueOfReferenceTest, CanBeSetAndUnset) {
479   int n = 1;
480   DefaultValue<const int&>::Set(n);
481   MyNonDefaultConstructible x(42);
482   DefaultValue<MyNonDefaultConstructible&>::Set(x);
483 
484   EXPECT_TRUE(DefaultValue<const int&>::Exists());
485   EXPECT_TRUE(DefaultValue<MyNonDefaultConstructible&>::Exists());
486 
487   EXPECT_EQ(&n, &(DefaultValue<const int&>::Get()));
488   EXPECT_EQ(&x, &(DefaultValue<MyNonDefaultConstructible&>::Get()));
489 
490   DefaultValue<const int&>::Clear();
491   DefaultValue<MyNonDefaultConstructible&>::Clear();
492 
493   EXPECT_FALSE(DefaultValue<const int&>::Exists());
494   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists());
495 
496   EXPECT_FALSE(DefaultValue<const int&>::IsSet());
497   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());
498 }
499 
500 // Tests that DefaultValue<T&>::Get() returns the
501 // BuiltInDefaultValue<T&>::Get() when DefaultValue<T&>::IsSet() is
502 // false.
TEST(DefaultValueOfReferenceDeathTest,GetReturnsBuiltInDefaultValueWhenUnset)503 TEST(DefaultValueOfReferenceDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) {
504   EXPECT_FALSE(DefaultValue<int&>::IsSet());
505   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());
506 
507   EXPECT_DEATH_IF_SUPPORTED({ DefaultValue<int&>::Get(); }, "");
508   EXPECT_DEATH_IF_SUPPORTED({ DefaultValue<MyNonDefaultConstructible>::Get(); },
509                             "");
510 }
511 
512 // Tests that ActionInterface can be implemented by defining the
513 // Perform method.
514 
515 typedef int MyGlobalFunction(bool, int);
516 
517 class MyActionImpl : public ActionInterface<MyGlobalFunction> {
518  public:
Perform(const std::tuple<bool,int> & args)519   int Perform(const std::tuple<bool, int>& args) override {
520     return std::get<0>(args) ? std::get<1>(args) : 0;
521   }
522 };
523 
TEST(ActionInterfaceTest,CanBeImplementedByDefiningPerform)524 TEST(ActionInterfaceTest, CanBeImplementedByDefiningPerform) {
525   MyActionImpl my_action_impl;
526   (void)my_action_impl;
527 }
528 
TEST(ActionInterfaceTest,MakeAction)529 TEST(ActionInterfaceTest, MakeAction) {
530   Action<MyGlobalFunction> action = MakeAction(new MyActionImpl);
531 
532   // When exercising the Perform() method of Action<F>, we must pass
533   // it a tuple whose size and type are compatible with F's argument
534   // types.  For example, if F is int(), then Perform() takes a
535   // 0-tuple; if F is void(bool, int), then Perform() takes a
536   // std::tuple<bool, int>, and so on.
537   EXPECT_EQ(5, action.Perform(std::make_tuple(true, 5)));
538 }
539 
540 // Tests that Action<F> can be constructed from a pointer to
541 // ActionInterface<F>.
TEST(ActionTest,CanBeConstructedFromActionInterface)542 TEST(ActionTest, CanBeConstructedFromActionInterface) {
543   Action<MyGlobalFunction> action(new MyActionImpl);
544 }
545 
546 // Tests that Action<F> delegates actual work to ActionInterface<F>.
TEST(ActionTest,DelegatesWorkToActionInterface)547 TEST(ActionTest, DelegatesWorkToActionInterface) {
548   const Action<MyGlobalFunction> action(new MyActionImpl);
549 
550   EXPECT_EQ(5, action.Perform(std::make_tuple(true, 5)));
551   EXPECT_EQ(0, action.Perform(std::make_tuple(false, 1)));
552 }
553 
554 // Tests that Action<F> can be copied.
TEST(ActionTest,IsCopyable)555 TEST(ActionTest, IsCopyable) {
556   Action<MyGlobalFunction> a1(new MyActionImpl);
557   Action<MyGlobalFunction> a2(a1);  // Tests the copy constructor.
558 
559   // a1 should continue to work after being copied from.
560   EXPECT_EQ(5, a1.Perform(std::make_tuple(true, 5)));
561   EXPECT_EQ(0, a1.Perform(std::make_tuple(false, 1)));
562 
563   // a2 should work like the action it was copied from.
564   EXPECT_EQ(5, a2.Perform(std::make_tuple(true, 5)));
565   EXPECT_EQ(0, a2.Perform(std::make_tuple(false, 1)));
566 
567   a2 = a1;  // Tests the assignment operator.
568 
569   // a1 should continue to work after being copied from.
570   EXPECT_EQ(5, a1.Perform(std::make_tuple(true, 5)));
571   EXPECT_EQ(0, a1.Perform(std::make_tuple(false, 1)));
572 
573   // a2 should work like the action it was copied from.
574   EXPECT_EQ(5, a2.Perform(std::make_tuple(true, 5)));
575   EXPECT_EQ(0, a2.Perform(std::make_tuple(false, 1)));
576 }
577 
578 // Tests that an Action<From> object can be converted to a
579 // compatible Action<To> object.
580 
581 class IsNotZero : public ActionInterface<bool(int)> {  // NOLINT
582  public:
Perform(const std::tuple<int> & arg)583   bool Perform(const std::tuple<int>& arg) override {
584     return std::get<0>(arg) != 0;
585   }
586 };
587 
TEST(ActionTest,CanBeConvertedToOtherActionType)588 TEST(ActionTest, CanBeConvertedToOtherActionType) {
589   const Action<bool(int)> a1(new IsNotZero);           // NOLINT
590   const Action<int(char)> a2 = Action<int(char)>(a1);  // NOLINT
591   EXPECT_EQ(1, a2.Perform(std::make_tuple('a')));
592   EXPECT_EQ(0, a2.Perform(std::make_tuple('\0')));
593 }
594 
595 // The following two classes are for testing MakePolymorphicAction().
596 
597 // Implements a polymorphic action that returns the second of the
598 // arguments it receives.
599 class ReturnSecondArgumentAction {
600  public:
601   // We want to verify that MakePolymorphicAction() can work with a
602   // polymorphic action whose Perform() method template is either
603   // const or not.  This lets us verify the non-const case.
604   template <typename Result, typename ArgumentTuple>
Perform(const ArgumentTuple & args)605   Result Perform(const ArgumentTuple& args) {
606     return std::get<1>(args);
607   }
608 };
609 
610 // Implements a polymorphic action that can be used in a nullary
611 // function to return 0.
612 class ReturnZeroFromNullaryFunctionAction {
613  public:
614   // For testing that MakePolymorphicAction() works when the
615   // implementation class' Perform() method template takes only one
616   // template parameter.
617   //
618   // We want to verify that MakePolymorphicAction() can work with a
619   // polymorphic action whose Perform() method template is either
620   // const or not.  This lets us verify the const case.
621   template <typename Result>
Perform(const std::tuple<> &) const622   Result Perform(const std::tuple<>&) const {
623     return 0;
624   }
625 };
626 
627 // These functions verify that MakePolymorphicAction() returns a
628 // PolymorphicAction<T> where T is the argument's type.
629 
ReturnSecondArgument()630 PolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() {
631   return MakePolymorphicAction(ReturnSecondArgumentAction());
632 }
633 
634 PolymorphicAction<ReturnZeroFromNullaryFunctionAction>
ReturnZeroFromNullaryFunction()635 ReturnZeroFromNullaryFunction() {
636   return MakePolymorphicAction(ReturnZeroFromNullaryFunctionAction());
637 }
638 
639 // Tests that MakePolymorphicAction() turns a polymorphic action
640 // implementation class into a polymorphic action.
TEST(MakePolymorphicActionTest,ConstructsActionFromImpl)641 TEST(MakePolymorphicActionTest, ConstructsActionFromImpl) {
642   Action<int(bool, int, double)> a1 = ReturnSecondArgument();  // NOLINT
643   EXPECT_EQ(5, a1.Perform(std::make_tuple(false, 5, 2.0)));
644 }
645 
646 // Tests that MakePolymorphicAction() works when the implementation
647 // class' Perform() method template has only one template parameter.
TEST(MakePolymorphicActionTest,WorksWhenPerformHasOneTemplateParameter)648 TEST(MakePolymorphicActionTest, WorksWhenPerformHasOneTemplateParameter) {
649   Action<int()> a1 = ReturnZeroFromNullaryFunction();
650   EXPECT_EQ(0, a1.Perform(std::make_tuple()));
651 
652   Action<void*()> a2 = ReturnZeroFromNullaryFunction();
653   EXPECT_TRUE(a2.Perform(std::make_tuple()) == nullptr);
654 }
655 
656 // Tests that Return() works as an action for void-returning
657 // functions.
TEST(ReturnTest,WorksForVoid)658 TEST(ReturnTest, WorksForVoid) {
659   const Action<void(int)> ret = Return();  // NOLINT
660   return ret.Perform(std::make_tuple(1));
661 }
662 
663 // Tests that Return(v) returns v.
TEST(ReturnTest,ReturnsGivenValue)664 TEST(ReturnTest, ReturnsGivenValue) {
665   Action<int()> ret = Return(1);  // NOLINT
666   EXPECT_EQ(1, ret.Perform(std::make_tuple()));
667 
668   ret = Return(-5);
669   EXPECT_EQ(-5, ret.Perform(std::make_tuple()));
670 }
671 
672 // Tests that Return("string literal") works.
TEST(ReturnTest,AcceptsStringLiteral)673 TEST(ReturnTest, AcceptsStringLiteral) {
674   Action<const char*()> a1 = Return("Hello");
675   EXPECT_STREQ("Hello", a1.Perform(std::make_tuple()));
676 
677   Action<std::string()> a2 = Return("world");
678   EXPECT_EQ("world", a2.Perform(std::make_tuple()));
679 }
680 
681 // Return(x) should work fine when the mock function's return type is a
682 // reference-like wrapper for decltype(x), as when x is a std::string and the
683 // mock function returns std::string_view.
TEST(ReturnTest,SupportsReferenceLikeReturnType)684 TEST(ReturnTest, SupportsReferenceLikeReturnType) {
685   // A reference wrapper for std::vector<int>, implicitly convertible from it.
686   struct Result {
687     const std::vector<int>* v;
688     Result(const std::vector<int>& vec) : v(&vec) {}  // NOLINT
689   };
690 
691   // Set up an action for a mock function that returns the reference wrapper
692   // type, initializing it with an actual vector.
693   //
694   // The returned wrapper should be initialized with a copy of that vector
695   // that's embedded within the action itself (which should stay alive as long
696   // as the mock object is alive), rather than e.g. a reference to the temporary
697   // we feed to Return. This should work fine both for WillOnce and
698   // WillRepeatedly.
699   MockFunction<Result()> mock;
700   EXPECT_CALL(mock, Call)
701       .WillOnce(Return(std::vector<int>{17, 19, 23}))
702       .WillRepeatedly(Return(std::vector<int>{29, 31, 37}));
703 
704   EXPECT_THAT(mock.AsStdFunction()(),
705               Field(&Result::v, Pointee(ElementsAre(17, 19, 23))));
706 
707   EXPECT_THAT(mock.AsStdFunction()(),
708               Field(&Result::v, Pointee(ElementsAre(29, 31, 37))));
709 }
710 
TEST(ReturnTest,PrefersConversionOperator)711 TEST(ReturnTest, PrefersConversionOperator) {
712   // Define types In and Out such that:
713   //
714   //  *  In is implicitly convertible to Out.
715   //  *  Out also has an explicit constructor from In.
716   //
717   struct In;
718   struct Out {
719     int x;
720 
721     explicit Out(const int val) : x(val) {}
722     explicit Out(const In&) : x(0) {}
723   };
724 
725   struct In {
726     operator Out() const { return Out{19}; }  // NOLINT
727   };
728 
729   // Assumption check: the C++ language rules are such that a function that
730   // returns Out which uses In a return statement will use the implicit
731   // conversion path rather than the explicit constructor.
732   EXPECT_THAT([]() -> Out { return In(); }(), Field(&Out::x, 19));
733 
734   // Return should work the same way: if the mock function's return type is Out
735   // and we feed Return an In value, then the Out should be created through the
736   // implicit conversion path rather than the explicit constructor.
737   MockFunction<Out()> mock;
738   EXPECT_CALL(mock, Call).WillOnce(Return(In()));
739   EXPECT_THAT(mock.AsStdFunction()(), Field(&Out::x, 19));
740 }
741 
742 // It should be possible to use Return(R) with a mock function result type U
743 // that is convertible from const R& but *not* R (such as
744 // std::reference_wrapper). This should work for both WillOnce and
745 // WillRepeatedly.
TEST(ReturnTest,ConversionRequiresConstLvalueReference)746 TEST(ReturnTest, ConversionRequiresConstLvalueReference) {
747   using R = int;
748   using U = std::reference_wrapper<const int>;
749 
750   static_assert(std::is_convertible<const R&, U>::value, "");
751   static_assert(!std::is_convertible<R, U>::value, "");
752 
753   MockFunction<U()> mock;
754   EXPECT_CALL(mock, Call).WillOnce(Return(17)).WillRepeatedly(Return(19));
755 
756   EXPECT_EQ(17, mock.AsStdFunction()());
757   EXPECT_EQ(19, mock.AsStdFunction()());
758 }
759 
760 // Return(x) should not be usable with a mock function result type that's
761 // implicitly convertible from decltype(x) but requires a non-const lvalue
762 // reference to the input. It doesn't make sense for the conversion operator to
763 // modify the input.
TEST(ReturnTest,ConversionRequiresMutableLvalueReference)764 TEST(ReturnTest, ConversionRequiresMutableLvalueReference) {
765   // Set up a type that is implicitly convertible from std::string&, but not
766   // std::string&& or `const std::string&`.
767   //
768   // Avoid asserting about conversion from std::string on MSVC, which seems to
769   // implement std::is_convertible incorrectly in this case.
770   struct S {
771     S(std::string&) {}  // NOLINT
772   };
773 
774   static_assert(std::is_convertible<std::string&, S>::value, "");
775 #ifndef _MSC_VER
776   static_assert(!std::is_convertible<std::string&&, S>::value, "");
777 #endif
778   static_assert(!std::is_convertible<const std::string&, S>::value, "");
779 
780   // It shouldn't be possible to use the result of Return(std::string) in a
781   // context where an S is needed.
782   //
783   // Here too we disable the assertion for MSVC, since its incorrect
784   // implementation of is_convertible causes our SFINAE to be wrong.
785   using RA = decltype(Return(std::string()));
786 
787   static_assert(!std::is_convertible<RA, Action<S()>>::value, "");
788 #ifndef _MSC_VER
789   static_assert(!std::is_convertible<RA, OnceAction<S()>>::value, "");
790 #endif
791 }
792 
TEST(ReturnTest,MoveOnlyResultType)793 TEST(ReturnTest, MoveOnlyResultType) {
794   // Return should support move-only result types when used with WillOnce.
795   {
796     MockFunction<std::unique_ptr<int>()> mock;
797     EXPECT_CALL(mock, Call)
798         // NOLINTNEXTLINE
799         .WillOnce(Return(std::unique_ptr<int>(new int(17))));
800 
801     EXPECT_THAT(mock.AsStdFunction()(), Pointee(17));
802   }
803 
804   // The result of Return should not be convertible to Action (so it can't be
805   // used with WillRepeatedly).
806   static_assert(!std::is_convertible<decltype(Return(std::unique_ptr<int>())),
807                                      Action<std::unique_ptr<int>()>>::value,
808                 "");
809 }
810 
811 // Tests that Return(v) is covariant.
812 
813 struct Base {
operator ==testing::__anon10e2b6f40111::Base814   bool operator==(const Base&) { return true; }
815 };
816 
817 struct Derived : public Base {
operator ==testing::__anon10e2b6f40111::Derived818   bool operator==(const Derived&) { return true; }
819 };
820 
TEST(ReturnTest,IsCovariant)821 TEST(ReturnTest, IsCovariant) {
822   Base base;
823   Derived derived;
824   Action<Base*()> ret = Return(&base);
825   EXPECT_EQ(&base, ret.Perform(std::make_tuple()));
826 
827   ret = Return(&derived);
828   EXPECT_EQ(&derived, ret.Perform(std::make_tuple()));
829 }
830 
831 // Tests that the type of the value passed into Return is converted into T
832 // when the action is cast to Action<T(...)> rather than when the action is
833 // performed. See comments on testing::internal::ReturnAction in
834 // gmock-actions.h for more information.
835 class FromType {
836  public:
FromType(bool * is_converted)837   explicit FromType(bool* is_converted) : converted_(is_converted) {}
converted() const838   bool* converted() const { return converted_; }
839 
840  private:
841   bool* const converted_;
842 };
843 
844 class ToType {
845  public:
846   // Must allow implicit conversion due to use in ImplicitCast_<T>.
ToType(const FromType & x)847   ToType(const FromType& x) { *x.converted() = true; }  // NOLINT
848 };
849 
TEST(ReturnTest,ConvertsArgumentWhenConverted)850 TEST(ReturnTest, ConvertsArgumentWhenConverted) {
851   bool converted = false;
852   FromType x(&converted);
853   Action<ToType()> action(Return(x));
854   EXPECT_TRUE(converted) << "Return must convert its argument in its own "
855                          << "conversion operator.";
856   converted = false;
857   action.Perform(std::tuple<>());
858   EXPECT_FALSE(converted) << "Action must NOT convert its argument "
859                           << "when performed.";
860 }
861 
862 // Tests that ReturnNull() returns NULL in a pointer-returning function.
TEST(ReturnNullTest,WorksInPointerReturningFunction)863 TEST(ReturnNullTest, WorksInPointerReturningFunction) {
864   const Action<int*()> a1 = ReturnNull();
865   EXPECT_TRUE(a1.Perform(std::make_tuple()) == nullptr);
866 
867   const Action<const char*(bool)> a2 = ReturnNull();  // NOLINT
868   EXPECT_TRUE(a2.Perform(std::make_tuple(true)) == nullptr);
869 }
870 
871 // Tests that ReturnNull() returns NULL for shared_ptr and unique_ptr returning
872 // functions.
TEST(ReturnNullTest,WorksInSmartPointerReturningFunction)873 TEST(ReturnNullTest, WorksInSmartPointerReturningFunction) {
874   const Action<std::unique_ptr<const int>()> a1 = ReturnNull();
875   EXPECT_TRUE(a1.Perform(std::make_tuple()) == nullptr);
876 
877   const Action<std::shared_ptr<int>(std::string)> a2 = ReturnNull();
878   EXPECT_TRUE(a2.Perform(std::make_tuple("foo")) == nullptr);
879 }
880 
881 // Tests that ReturnRef(v) works for reference types.
TEST(ReturnRefTest,WorksForReference)882 TEST(ReturnRefTest, WorksForReference) {
883   const int n = 0;
884   const Action<const int&(bool)> ret = ReturnRef(n);  // NOLINT
885 
886   EXPECT_EQ(&n, &ret.Perform(std::make_tuple(true)));
887 }
888 
889 // Tests that ReturnRef(v) is covariant.
TEST(ReturnRefTest,IsCovariant)890 TEST(ReturnRefTest, IsCovariant) {
891   Base base;
892   Derived derived;
893   Action<Base&()> a = ReturnRef(base);
894   EXPECT_EQ(&base, &a.Perform(std::make_tuple()));
895 
896   a = ReturnRef(derived);
897   EXPECT_EQ(&derived, &a.Perform(std::make_tuple()));
898 }
899 
900 template <typename T, typename = decltype(ReturnRef(std::declval<T&&>()))>
CanCallReturnRef(T &&)901 bool CanCallReturnRef(T&&) {
902   return true;
903 }
CanCallReturnRef(Unused)904 bool CanCallReturnRef(Unused) { return false; }
905 
906 // Tests that ReturnRef(v) is working with non-temporaries (T&)
TEST(ReturnRefTest,WorksForNonTemporary)907 TEST(ReturnRefTest, WorksForNonTemporary) {
908   int scalar_value = 123;
909   EXPECT_TRUE(CanCallReturnRef(scalar_value));
910 
911   std::string non_scalar_value("ABC");
912   EXPECT_TRUE(CanCallReturnRef(non_scalar_value));
913 
914   const int const_scalar_value{321};
915   EXPECT_TRUE(CanCallReturnRef(const_scalar_value));
916 
917   const std::string const_non_scalar_value("CBA");
918   EXPECT_TRUE(CanCallReturnRef(const_non_scalar_value));
919 }
920 
921 // Tests that ReturnRef(v) is not working with temporaries (T&&)
TEST(ReturnRefTest,DoesNotWorkForTemporary)922 TEST(ReturnRefTest, DoesNotWorkForTemporary) {
923   auto scalar_value = []() -> int { return 123; };
924   EXPECT_FALSE(CanCallReturnRef(scalar_value()));
925 
926   auto non_scalar_value = []() -> std::string { return "ABC"; };
927   EXPECT_FALSE(CanCallReturnRef(non_scalar_value()));
928 
929   // cannot use here callable returning "const scalar type",
930   // because such const for scalar return type is ignored
931   EXPECT_FALSE(CanCallReturnRef(static_cast<const int>(321)));
932 
933   auto const_non_scalar_value = []() -> const std::string { return "CBA"; };
934   EXPECT_FALSE(CanCallReturnRef(const_non_scalar_value()));
935 }
936 
937 // Tests that ReturnRefOfCopy(v) works for reference types.
TEST(ReturnRefOfCopyTest,WorksForReference)938 TEST(ReturnRefOfCopyTest, WorksForReference) {
939   int n = 42;
940   const Action<const int&()> ret = ReturnRefOfCopy(n);
941 
942   EXPECT_NE(&n, &ret.Perform(std::make_tuple()));
943   EXPECT_EQ(42, ret.Perform(std::make_tuple()));
944 
945   n = 43;
946   EXPECT_NE(&n, &ret.Perform(std::make_tuple()));
947   EXPECT_EQ(42, ret.Perform(std::make_tuple()));
948 }
949 
950 // Tests that ReturnRefOfCopy(v) is covariant.
TEST(ReturnRefOfCopyTest,IsCovariant)951 TEST(ReturnRefOfCopyTest, IsCovariant) {
952   Base base;
953   Derived derived;
954   Action<Base&()> a = ReturnRefOfCopy(base);
955   EXPECT_NE(&base, &a.Perform(std::make_tuple()));
956 
957   a = ReturnRefOfCopy(derived);
958   EXPECT_NE(&derived, &a.Perform(std::make_tuple()));
959 }
960 
961 // Tests that ReturnRoundRobin(v) works with initializer lists
TEST(ReturnRoundRobinTest,WorksForInitList)962 TEST(ReturnRoundRobinTest, WorksForInitList) {
963   Action<int()> ret = ReturnRoundRobin({1, 2, 3});
964 
965   EXPECT_EQ(1, ret.Perform(std::make_tuple()));
966   EXPECT_EQ(2, ret.Perform(std::make_tuple()));
967   EXPECT_EQ(3, ret.Perform(std::make_tuple()));
968   EXPECT_EQ(1, ret.Perform(std::make_tuple()));
969   EXPECT_EQ(2, ret.Perform(std::make_tuple()));
970   EXPECT_EQ(3, ret.Perform(std::make_tuple()));
971 }
972 
973 // Tests that ReturnRoundRobin(v) works with vectors
TEST(ReturnRoundRobinTest,WorksForVector)974 TEST(ReturnRoundRobinTest, WorksForVector) {
975   std::vector<double> v = {4.4, 5.5, 6.6};
976   Action<double()> ret = ReturnRoundRobin(v);
977 
978   EXPECT_EQ(4.4, ret.Perform(std::make_tuple()));
979   EXPECT_EQ(5.5, ret.Perform(std::make_tuple()));
980   EXPECT_EQ(6.6, ret.Perform(std::make_tuple()));
981   EXPECT_EQ(4.4, ret.Perform(std::make_tuple()));
982   EXPECT_EQ(5.5, ret.Perform(std::make_tuple()));
983   EXPECT_EQ(6.6, ret.Perform(std::make_tuple()));
984 }
985 
986 // Tests that DoDefault() does the default action for the mock method.
987 
988 class MockClass {
989  public:
990   MockClass() = default;
991 
992   MOCK_METHOD1(IntFunc, int(bool flag));  // NOLINT
993   MOCK_METHOD0(Foo, MyNonDefaultConstructible());
994   MOCK_METHOD0(MakeUnique, std::unique_ptr<int>());
995   MOCK_METHOD0(MakeUniqueBase, std::unique_ptr<Base>());
996   MOCK_METHOD0(MakeVectorUnique, std::vector<std::unique_ptr<int>>());
997   MOCK_METHOD1(TakeUnique, int(std::unique_ptr<int>));
998   MOCK_METHOD2(TakeUnique,
999                int(const std::unique_ptr<int>&, std::unique_ptr<int>));
1000 
1001  private:
1002   MockClass(const MockClass&) = delete;
1003   MockClass& operator=(const MockClass&) = delete;
1004 };
1005 
1006 // Tests that DoDefault() returns the built-in default value for the
1007 // return type by default.
TEST(DoDefaultTest,ReturnsBuiltInDefaultValueByDefault)1008 TEST(DoDefaultTest, ReturnsBuiltInDefaultValueByDefault) {
1009   MockClass mock;
1010   EXPECT_CALL(mock, IntFunc(_)).WillOnce(DoDefault());
1011   EXPECT_EQ(0, mock.IntFunc(true));
1012 }
1013 
1014 // Tests that DoDefault() throws (when exceptions are enabled) or aborts
1015 // the process when there is no built-in default value for the return type.
TEST(DoDefaultDeathTest,DiesForUnknowType)1016 TEST(DoDefaultDeathTest, DiesForUnknowType) {
1017   MockClass mock;
1018   EXPECT_CALL(mock, Foo()).WillRepeatedly(DoDefault());
1019 #if GTEST_HAS_EXCEPTIONS
1020   EXPECT_ANY_THROW(mock.Foo());
1021 #else
1022   EXPECT_DEATH_IF_SUPPORTED({ mock.Foo(); }, "");
1023 #endif
1024 }
1025 
1026 // Tests that using DoDefault() inside a composite action leads to a
1027 // run-time error.
1028 
VoidFunc(bool)1029 void VoidFunc(bool /* flag */) {}
1030 
TEST(DoDefaultDeathTest,DiesIfUsedInCompositeAction)1031 TEST(DoDefaultDeathTest, DiesIfUsedInCompositeAction) {
1032   MockClass mock;
1033   EXPECT_CALL(mock, IntFunc(_))
1034       .WillRepeatedly(DoAll(Invoke(VoidFunc), DoDefault()));
1035 
1036   // Ideally we should verify the error message as well.  Sadly,
1037   // EXPECT_DEATH() can only capture stderr, while Google Mock's
1038   // errors are printed on stdout.  Therefore we have to settle for
1039   // not verifying the message.
1040   EXPECT_DEATH_IF_SUPPORTED({ mock.IntFunc(true); }, "");
1041 }
1042 
1043 // Tests that DoDefault() returns the default value set by
1044 // DefaultValue<T>::Set() when it's not overridden by an ON_CALL().
TEST(DoDefaultTest,ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne)1045 TEST(DoDefaultTest, ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne) {
1046   DefaultValue<int>::Set(1);
1047   MockClass mock;
1048   EXPECT_CALL(mock, IntFunc(_)).WillOnce(DoDefault());
1049   EXPECT_EQ(1, mock.IntFunc(false));
1050   DefaultValue<int>::Clear();
1051 }
1052 
1053 // Tests that DoDefault() does the action specified by ON_CALL().
TEST(DoDefaultTest,DoesWhatOnCallSpecifies)1054 TEST(DoDefaultTest, DoesWhatOnCallSpecifies) {
1055   MockClass mock;
1056   ON_CALL(mock, IntFunc(_)).WillByDefault(Return(2));
1057   EXPECT_CALL(mock, IntFunc(_)).WillOnce(DoDefault());
1058   EXPECT_EQ(2, mock.IntFunc(false));
1059 }
1060 
1061 // Tests that using DoDefault() in ON_CALL() leads to a run-time failure.
TEST(DoDefaultTest,CannotBeUsedInOnCall)1062 TEST(DoDefaultTest, CannotBeUsedInOnCall) {
1063   MockClass mock;
1064   EXPECT_NONFATAL_FAILURE(
1065       {  // NOLINT
1066         ON_CALL(mock, IntFunc(_)).WillByDefault(DoDefault());
1067       },
1068       "DoDefault() cannot be used in ON_CALL()");
1069 }
1070 
1071 // Tests that SetArgPointee<N>(v) sets the variable pointed to by
1072 // the N-th (0-based) argument to v.
TEST(SetArgPointeeTest,SetsTheNthPointee)1073 TEST(SetArgPointeeTest, SetsTheNthPointee) {
1074   typedef void MyFunction(bool, int*, char*);
1075   Action<MyFunction> a = SetArgPointee<1>(2);
1076 
1077   int n = 0;
1078   char ch = '\0';
1079   a.Perform(std::make_tuple(true, &n, &ch));
1080   EXPECT_EQ(2, n);
1081   EXPECT_EQ('\0', ch);
1082 
1083   a = SetArgPointee<2>('a');
1084   n = 0;
1085   ch = '\0';
1086   a.Perform(std::make_tuple(true, &n, &ch));
1087   EXPECT_EQ(0, n);
1088   EXPECT_EQ('a', ch);
1089 }
1090 
1091 // Tests that SetArgPointee<N>() accepts a string literal.
TEST(SetArgPointeeTest,AcceptsStringLiteral)1092 TEST(SetArgPointeeTest, AcceptsStringLiteral) {
1093   typedef void MyFunction(std::string*, const char**);
1094   Action<MyFunction> a = SetArgPointee<0>("hi");
1095   std::string str;
1096   const char* ptr = nullptr;
1097   a.Perform(std::make_tuple(&str, &ptr));
1098   EXPECT_EQ("hi", str);
1099   EXPECT_TRUE(ptr == nullptr);
1100 
1101   a = SetArgPointee<1>("world");
1102   str = "";
1103   a.Perform(std::make_tuple(&str, &ptr));
1104   EXPECT_EQ("", str);
1105   EXPECT_STREQ("world", ptr);
1106 }
1107 
TEST(SetArgPointeeTest,AcceptsWideStringLiteral)1108 TEST(SetArgPointeeTest, AcceptsWideStringLiteral) {
1109   typedef void MyFunction(const wchar_t**);
1110   Action<MyFunction> a = SetArgPointee<0>(L"world");
1111   const wchar_t* ptr = nullptr;
1112   a.Perform(std::make_tuple(&ptr));
1113   EXPECT_STREQ(L"world", ptr);
1114 
1115 #if GTEST_HAS_STD_WSTRING
1116 
1117   typedef void MyStringFunction(std::wstring*);
1118   Action<MyStringFunction> a2 = SetArgPointee<0>(L"world");
1119   std::wstring str = L"";
1120   a2.Perform(std::make_tuple(&str));
1121   EXPECT_EQ(L"world", str);
1122 
1123 #endif
1124 }
1125 
1126 // Tests that SetArgPointee<N>() accepts a char pointer.
TEST(SetArgPointeeTest,AcceptsCharPointer)1127 TEST(SetArgPointeeTest, AcceptsCharPointer) {
1128   typedef void MyFunction(bool, std::string*, const char**);
1129   const char* const hi = "hi";
1130   Action<MyFunction> a = SetArgPointee<1>(hi);
1131   std::string str;
1132   const char* ptr = nullptr;
1133   a.Perform(std::make_tuple(true, &str, &ptr));
1134   EXPECT_EQ("hi", str);
1135   EXPECT_TRUE(ptr == nullptr);
1136 
1137   char world_array[] = "world";
1138   char* const world = world_array;
1139   a = SetArgPointee<2>(world);
1140   str = "";
1141   a.Perform(std::make_tuple(true, &str, &ptr));
1142   EXPECT_EQ("", str);
1143   EXPECT_EQ(world, ptr);
1144 }
1145 
TEST(SetArgPointeeTest,AcceptsWideCharPointer)1146 TEST(SetArgPointeeTest, AcceptsWideCharPointer) {
1147   typedef void MyFunction(bool, const wchar_t**);
1148   const wchar_t* const hi = L"hi";
1149   Action<MyFunction> a = SetArgPointee<1>(hi);
1150   const wchar_t* ptr = nullptr;
1151   a.Perform(std::make_tuple(true, &ptr));
1152   EXPECT_EQ(hi, ptr);
1153 
1154 #if GTEST_HAS_STD_WSTRING
1155 
1156   typedef void MyStringFunction(bool, std::wstring*);
1157   wchar_t world_array[] = L"world";
1158   wchar_t* const world = world_array;
1159   Action<MyStringFunction> a2 = SetArgPointee<1>(world);
1160   std::wstring str;
1161   a2.Perform(std::make_tuple(true, &str));
1162   EXPECT_EQ(world_array, str);
1163 #endif
1164 }
1165 
1166 // Tests that SetArgumentPointee<N>(v) sets the variable pointed to by
1167 // the N-th (0-based) argument to v.
TEST(SetArgumentPointeeTest,SetsTheNthPointee)1168 TEST(SetArgumentPointeeTest, SetsTheNthPointee) {
1169   typedef void MyFunction(bool, int*, char*);
1170   Action<MyFunction> a = SetArgumentPointee<1>(2);
1171 
1172   int n = 0;
1173   char ch = '\0';
1174   a.Perform(std::make_tuple(true, &n, &ch));
1175   EXPECT_EQ(2, n);
1176   EXPECT_EQ('\0', ch);
1177 
1178   a = SetArgumentPointee<2>('a');
1179   n = 0;
1180   ch = '\0';
1181   a.Perform(std::make_tuple(true, &n, &ch));
1182   EXPECT_EQ(0, n);
1183   EXPECT_EQ('a', ch);
1184 }
1185 
1186 // Sample functions and functors for testing Invoke() and etc.
Nullary()1187 int Nullary() { return 1; }
1188 
1189 class NullaryFunctor {
1190  public:
operator ()()1191   int operator()() { return 2; }
1192 };
1193 
1194 bool g_done = false;
VoidNullary()1195 void VoidNullary() { g_done = true; }
1196 
1197 class VoidNullaryFunctor {
1198  public:
operator ()()1199   void operator()() { g_done = true; }
1200 };
1201 
Short(short n)1202 short Short(short n) { return n; }  // NOLINT
Char(char ch)1203 char Char(char ch) { return ch; }
1204 
CharPtr(const char * s)1205 const char* CharPtr(const char* s) { return s; }
1206 
Unary(int x)1207 bool Unary(int x) { return x < 0; }
1208 
Binary(const char * input,short n)1209 const char* Binary(const char* input, short n) { return input + n; }  // NOLINT
1210 
VoidBinary(int,char)1211 void VoidBinary(int, char) { g_done = true; }
1212 
Ternary(int x,char y,short z)1213 int Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
1214 
SumOf4(int a,int b,int c,int d)1215 int SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
1216 
1217 class Foo {
1218  public:
Foo()1219   Foo() : value_(123) {}
1220 
Nullary() const1221   int Nullary() const { return value_; }
1222 
1223  private:
1224   int value_;
1225 };
1226 
1227 // Tests InvokeWithoutArgs(function).
TEST(InvokeWithoutArgsTest,Function)1228 TEST(InvokeWithoutArgsTest, Function) {
1229   // As an action that takes one argument.
1230   Action<int(int)> a = InvokeWithoutArgs(Nullary);  // NOLINT
1231   EXPECT_EQ(1, a.Perform(std::make_tuple(2)));
1232 
1233   // As an action that takes two arguments.
1234   Action<int(int, double)> a2 = InvokeWithoutArgs(Nullary);  // NOLINT
1235   EXPECT_EQ(1, a2.Perform(std::make_tuple(2, 3.5)));
1236 
1237   // As an action that returns void.
1238   Action<void(int)> a3 = InvokeWithoutArgs(VoidNullary);  // NOLINT
1239   g_done = false;
1240   a3.Perform(std::make_tuple(1));
1241   EXPECT_TRUE(g_done);
1242 }
1243 
1244 // Tests InvokeWithoutArgs(functor).
TEST(InvokeWithoutArgsTest,Functor)1245 TEST(InvokeWithoutArgsTest, Functor) {
1246   // As an action that takes no argument.
1247   Action<int()> a = InvokeWithoutArgs(NullaryFunctor());  // NOLINT
1248   EXPECT_EQ(2, a.Perform(std::make_tuple()));
1249 
1250   // As an action that takes three arguments.
1251   Action<int(int, double, char)> a2 =  // NOLINT
1252       InvokeWithoutArgs(NullaryFunctor());
1253   EXPECT_EQ(2, a2.Perform(std::make_tuple(3, 3.5, 'a')));
1254 
1255   // As an action that returns void.
1256   Action<void()> a3 = InvokeWithoutArgs(VoidNullaryFunctor());
1257   g_done = false;
1258   a3.Perform(std::make_tuple());
1259   EXPECT_TRUE(g_done);
1260 }
1261 
1262 // Tests InvokeWithoutArgs(obj_ptr, method).
TEST(InvokeWithoutArgsTest,Method)1263 TEST(InvokeWithoutArgsTest, Method) {
1264   Foo foo;
1265   Action<int(bool, char)> a =  // NOLINT
1266       InvokeWithoutArgs(&foo, &Foo::Nullary);
1267   EXPECT_EQ(123, a.Perform(std::make_tuple(true, 'a')));
1268 }
1269 
1270 // Tests using IgnoreResult() on a polymorphic action.
TEST(IgnoreResultTest,PolymorphicAction)1271 TEST(IgnoreResultTest, PolymorphicAction) {
1272   Action<void(int)> a = IgnoreResult(Return(5));  // NOLINT
1273   a.Perform(std::make_tuple(1));
1274 }
1275 
1276 // Tests using IgnoreResult() on a monomorphic action.
1277 
ReturnOne()1278 int ReturnOne() {
1279   g_done = true;
1280   return 1;
1281 }
1282 
TEST(IgnoreResultTest,MonomorphicAction)1283 TEST(IgnoreResultTest, MonomorphicAction) {
1284   g_done = false;
1285   Action<void()> a = IgnoreResult(Invoke(ReturnOne));
1286   a.Perform(std::make_tuple());
1287   EXPECT_TRUE(g_done);
1288 }
1289 
1290 // Tests using IgnoreResult() on an action that returns a class type.
1291 
ReturnMyNonDefaultConstructible(double)1292 MyNonDefaultConstructible ReturnMyNonDefaultConstructible(double /* x */) {
1293   g_done = true;
1294   return MyNonDefaultConstructible(42);
1295 }
1296 
TEST(IgnoreResultTest,ActionReturningClass)1297 TEST(IgnoreResultTest, ActionReturningClass) {
1298   g_done = false;
1299   Action<void(int)> a =
1300       IgnoreResult(Invoke(ReturnMyNonDefaultConstructible));  // NOLINT
1301   a.Perform(std::make_tuple(2));
1302   EXPECT_TRUE(g_done);
1303 }
1304 
TEST(AssignTest,Int)1305 TEST(AssignTest, Int) {
1306   int x = 0;
1307   Action<void(int)> a = Assign(&x, 5);
1308   a.Perform(std::make_tuple(0));
1309   EXPECT_EQ(5, x);
1310 }
1311 
TEST(AssignTest,String)1312 TEST(AssignTest, String) {
1313   ::std::string x;
1314   Action<void(void)> a = Assign(&x, "Hello, world");
1315   a.Perform(std::make_tuple());
1316   EXPECT_EQ("Hello, world", x);
1317 }
1318 
TEST(AssignTest,CompatibleTypes)1319 TEST(AssignTest, CompatibleTypes) {
1320   double x = 0;
1321   Action<void(int)> a = Assign(&x, 5);
1322   a.Perform(std::make_tuple(0));
1323   EXPECT_DOUBLE_EQ(5, x);
1324 }
1325 
1326 // DoAll should support &&-qualified actions when used with WillOnce.
TEST(DoAll,SupportsRefQualifiedActions)1327 TEST(DoAll, SupportsRefQualifiedActions) {
1328   struct InitialAction {
1329     void operator()(const int arg) && { EXPECT_EQ(17, arg); }
1330   };
1331 
1332   struct FinalAction {
1333     int operator()() && { return 19; }
1334   };
1335 
1336   MockFunction<int(int)> mock;
1337   EXPECT_CALL(mock, Call).WillOnce(DoAll(InitialAction{}, FinalAction{}));
1338   EXPECT_EQ(19, mock.AsStdFunction()(17));
1339 }
1340 
1341 // DoAll should never provide rvalue references to the initial actions. If the
1342 // mock action itself accepts an rvalue reference or a non-scalar object by
1343 // value then the final action should receive an rvalue reference, but initial
1344 // actions should receive only lvalue references.
TEST(DoAll,ProvidesLvalueReferencesToInitialActions)1345 TEST(DoAll, ProvidesLvalueReferencesToInitialActions) {
1346   struct Obj {};
1347 
1348   // Mock action accepts by value: the initial action should be fed a const
1349   // lvalue reference, and the final action an rvalue reference.
1350   {
1351     struct InitialAction {
1352       void operator()(Obj&) const { FAIL() << "Unexpected call"; }
1353       void operator()(const Obj&) const {}
1354       void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
1355       void operator()(const Obj&&) const { FAIL() << "Unexpected call"; }
1356     };
1357 
1358     MockFunction<void(Obj)> mock;
1359     EXPECT_CALL(mock, Call)
1360         .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}))
1361         .WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
1362 
1363     mock.AsStdFunction()(Obj{});
1364     mock.AsStdFunction()(Obj{});
1365   }
1366 
1367   // Mock action accepts by const lvalue reference: both actions should receive
1368   // a const lvalue reference.
1369   {
1370     struct InitialAction {
1371       void operator()(Obj&) const { FAIL() << "Unexpected call"; }
1372       void operator()(const Obj&) const {}
1373       void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
1374       void operator()(const Obj&&) const { FAIL() << "Unexpected call"; }
1375     };
1376 
1377     MockFunction<void(const Obj&)> mock;
1378     EXPECT_CALL(mock, Call)
1379         .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](const Obj&) {}))
1380         .WillRepeatedly(
1381             DoAll(InitialAction{}, InitialAction{}, [](const Obj&) {}));
1382 
1383     mock.AsStdFunction()(Obj{});
1384     mock.AsStdFunction()(Obj{});
1385   }
1386 
1387   // Mock action accepts by non-const lvalue reference: both actions should get
1388   // a non-const lvalue reference if they want them.
1389   {
1390     struct InitialAction {
1391       void operator()(Obj&) const {}
1392       void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
1393     };
1394 
1395     MockFunction<void(Obj&)> mock;
1396     EXPECT_CALL(mock, Call)
1397         .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&) {}))
1398         .WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&) {}));
1399 
1400     Obj obj;
1401     mock.AsStdFunction()(obj);
1402     mock.AsStdFunction()(obj);
1403   }
1404 
1405   // Mock action accepts by rvalue reference: the initial actions should receive
1406   // a non-const lvalue reference if it wants it, and the final action an rvalue
1407   // reference.
1408   {
1409     struct InitialAction {
1410       void operator()(Obj&) const {}
1411       void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
1412     };
1413 
1414     MockFunction<void(Obj&&)> mock;
1415     EXPECT_CALL(mock, Call)
1416         .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}))
1417         .WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
1418 
1419     mock.AsStdFunction()(Obj{});
1420     mock.AsStdFunction()(Obj{});
1421   }
1422 
1423   // &&-qualified initial actions should also be allowed with WillOnce.
1424   {
1425     struct InitialAction {
1426       void operator()(Obj&) && {}
1427     };
1428 
1429     MockFunction<void(Obj&)> mock;
1430     EXPECT_CALL(mock, Call)
1431         .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&) {}));
1432 
1433     Obj obj;
1434     mock.AsStdFunction()(obj);
1435   }
1436 
1437   {
1438     struct InitialAction {
1439       void operator()(Obj&) && {}
1440     };
1441 
1442     MockFunction<void(Obj&&)> mock;
1443     EXPECT_CALL(mock, Call)
1444         .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
1445 
1446     mock.AsStdFunction()(Obj{});
1447   }
1448 }
1449 
1450 // DoAll should support being used with type-erased Action objects, both through
1451 // WillOnce and WillRepeatedly.
TEST(DoAll,SupportsTypeErasedActions)1452 TEST(DoAll, SupportsTypeErasedActions) {
1453   // With only type-erased actions.
1454   const Action<void()> initial_action = [] {};
1455   const Action<int()> final_action = [] { return 17; };
1456 
1457   MockFunction<int()> mock;
1458   EXPECT_CALL(mock, Call)
1459       .WillOnce(DoAll(initial_action, initial_action, final_action))
1460       .WillRepeatedly(DoAll(initial_action, initial_action, final_action));
1461 
1462   EXPECT_EQ(17, mock.AsStdFunction()());
1463 
1464   // With &&-qualified and move-only final action.
1465   {
1466     struct FinalAction {
1467       FinalAction() = default;
1468       FinalAction(FinalAction&&) = default;
1469 
1470       int operator()() && { return 17; }
1471     };
1472 
1473     EXPECT_CALL(mock, Call)
1474         .WillOnce(DoAll(initial_action, initial_action, FinalAction{}));
1475 
1476     EXPECT_EQ(17, mock.AsStdFunction()());
1477   }
1478 }
1479 
1480 // Tests using WithArgs and with an action that takes 1 argument.
TEST(WithArgsTest,OneArg)1481 TEST(WithArgsTest, OneArg) {
1482   Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary));  // NOLINT
1483   EXPECT_TRUE(a.Perform(std::make_tuple(1.5, -1)));
1484   EXPECT_FALSE(a.Perform(std::make_tuple(1.5, 1)));
1485 }
1486 
1487 // Tests using WithArgs with an action that takes 2 arguments.
TEST(WithArgsTest,TwoArgs)1488 TEST(WithArgsTest, TwoArgs) {
1489   Action<const char*(const char* s, double x, short n)> a =  // NOLINT
1490       WithArgs<0, 2>(Invoke(Binary));
1491   const char s[] = "Hello";
1492   EXPECT_EQ(s + 2, a.Perform(std::make_tuple(CharPtr(s), 0.5, Short(2))));
1493 }
1494 
1495 struct ConcatAll {
operator ()testing::__anon10e2b6f40111::ConcatAll1496   std::string operator()() const { return {}; }
1497   template <typename... I>
operator ()testing::__anon10e2b6f40111::ConcatAll1498   std::string operator()(const char* a, I... i) const {
1499     return a + ConcatAll()(i...);
1500   }
1501 };
1502 
1503 // Tests using WithArgs with an action that takes 10 arguments.
TEST(WithArgsTest,TenArgs)1504 TEST(WithArgsTest, TenArgs) {
1505   Action<std::string(const char*, const char*, const char*, const char*)> a =
1506       WithArgs<0, 1, 2, 3, 2, 1, 0, 1, 2, 3>(Invoke(ConcatAll{}));
1507   EXPECT_EQ("0123210123",
1508             a.Perform(std::make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
1509                                       CharPtr("3"))));
1510 }
1511 
1512 // Tests using WithArgs with an action that is not Invoke().
1513 class SubtractAction : public ActionInterface<int(int, int)> {
1514  public:
Perform(const std::tuple<int,int> & args)1515   int Perform(const std::tuple<int, int>& args) override {
1516     return std::get<0>(args) - std::get<1>(args);
1517   }
1518 };
1519 
TEST(WithArgsTest,NonInvokeAction)1520 TEST(WithArgsTest, NonInvokeAction) {
1521   Action<int(const std::string&, int, int)> a =
1522       WithArgs<2, 1>(MakeAction(new SubtractAction));
1523   std::tuple<std::string, int, int> dummy =
1524       std::make_tuple(std::string("hi"), 2, 10);
1525   EXPECT_EQ(8, a.Perform(dummy));
1526 }
1527 
1528 // Tests using WithArgs to pass all original arguments in the original order.
TEST(WithArgsTest,Identity)1529 TEST(WithArgsTest, Identity) {
1530   Action<int(int x, char y, short z)> a =  // NOLINT
1531       WithArgs<0, 1, 2>(Invoke(Ternary));
1532   EXPECT_EQ(123, a.Perform(std::make_tuple(100, Char(20), Short(3))));
1533 }
1534 
1535 // Tests using WithArgs with repeated arguments.
TEST(WithArgsTest,RepeatedArguments)1536 TEST(WithArgsTest, RepeatedArguments) {
1537   Action<int(bool, int m, int n)> a =  // NOLINT
1538       WithArgs<1, 1, 1, 1>(Invoke(SumOf4));
1539   EXPECT_EQ(4, a.Perform(std::make_tuple(false, 1, 10)));
1540 }
1541 
1542 // Tests using WithArgs with reversed argument order.
TEST(WithArgsTest,ReversedArgumentOrder)1543 TEST(WithArgsTest, ReversedArgumentOrder) {
1544   Action<const char*(short n, const char* input)> a =  // NOLINT
1545       WithArgs<1, 0>(Invoke(Binary));
1546   const char s[] = "Hello";
1547   EXPECT_EQ(s + 2, a.Perform(std::make_tuple(Short(2), CharPtr(s))));
1548 }
1549 
1550 // Tests using WithArgs with compatible, but not identical, argument types.
TEST(WithArgsTest,ArgsOfCompatibleTypes)1551 TEST(WithArgsTest, ArgsOfCompatibleTypes) {
1552   Action<long(short x, char y, double z, char c)> a =  // NOLINT
1553       WithArgs<0, 1, 3>(Invoke(Ternary));
1554   EXPECT_EQ(123,
1555             a.Perform(std::make_tuple(Short(100), Char(20), 5.6, Char(3))));
1556 }
1557 
1558 // Tests using WithArgs with an action that returns void.
TEST(WithArgsTest,VoidAction)1559 TEST(WithArgsTest, VoidAction) {
1560   Action<void(double x, char c, int n)> a = WithArgs<2, 1>(Invoke(VoidBinary));
1561   g_done = false;
1562   a.Perform(std::make_tuple(1.5, 'a', 3));
1563   EXPECT_TRUE(g_done);
1564 }
1565 
TEST(WithArgsTest,ReturnReference)1566 TEST(WithArgsTest, ReturnReference) {
1567   Action<int&(int&, void*)> aa = WithArgs<0>([](int& a) -> int& { return a; });
1568   int i = 0;
1569   const int& res = aa.Perform(std::forward_as_tuple(i, nullptr));
1570   EXPECT_EQ(&i, &res);
1571 }
1572 
TEST(WithArgsTest,InnerActionWithConversion)1573 TEST(WithArgsTest, InnerActionWithConversion) {
1574   Action<Derived*()> inner = [] { return nullptr; };
1575 
1576   MockFunction<Base*(double)> mock;
1577   EXPECT_CALL(mock, Call)
1578       .WillOnce(WithoutArgs(inner))
1579       .WillRepeatedly(WithoutArgs(inner));
1580 
1581   EXPECT_EQ(nullptr, mock.AsStdFunction()(1.1));
1582   EXPECT_EQ(nullptr, mock.AsStdFunction()(1.1));
1583 }
1584 
1585 // It should be possible to use an &&-qualified inner action as long as the
1586 // whole shebang is used as an rvalue with WillOnce.
TEST(WithArgsTest,RefQualifiedInnerAction)1587 TEST(WithArgsTest, RefQualifiedInnerAction) {
1588   struct SomeAction {
1589     int operator()(const int arg) && {
1590       EXPECT_EQ(17, arg);
1591       return 19;
1592     }
1593   };
1594 
1595   MockFunction<int(int, int)> mock;
1596   EXPECT_CALL(mock, Call).WillOnce(WithArg<1>(SomeAction{}));
1597   EXPECT_EQ(19, mock.AsStdFunction()(0, 17));
1598 }
1599 
1600 #ifndef GTEST_OS_WINDOWS_MOBILE
1601 
1602 class SetErrnoAndReturnTest : public testing::Test {
1603  protected:
SetUp()1604   void SetUp() override { errno = 0; }
TearDown()1605   void TearDown() override { errno = 0; }
1606 };
1607 
TEST_F(SetErrnoAndReturnTest,Int)1608 TEST_F(SetErrnoAndReturnTest, Int) {
1609   Action<int(void)> a = SetErrnoAndReturn(ENOTTY, -5);
1610   EXPECT_EQ(-5, a.Perform(std::make_tuple()));
1611   EXPECT_EQ(ENOTTY, errno);
1612 }
1613 
TEST_F(SetErrnoAndReturnTest,Ptr)1614 TEST_F(SetErrnoAndReturnTest, Ptr) {
1615   int x;
1616   Action<int*(void)> a = SetErrnoAndReturn(ENOTTY, &x);
1617   EXPECT_EQ(&x, a.Perform(std::make_tuple()));
1618   EXPECT_EQ(ENOTTY, errno);
1619 }
1620 
TEST_F(SetErrnoAndReturnTest,CompatibleTypes)1621 TEST_F(SetErrnoAndReturnTest, CompatibleTypes) {
1622   Action<double()> a = SetErrnoAndReturn(EINVAL, 5);
1623   EXPECT_DOUBLE_EQ(5.0, a.Perform(std::make_tuple()));
1624   EXPECT_EQ(EINVAL, errno);
1625 }
1626 
1627 #endif  // !GTEST_OS_WINDOWS_MOBILE
1628 
1629 // Tests ByRef().
1630 
1631 // Tests that the result of ByRef() is copyable.
TEST(ByRefTest,IsCopyable)1632 TEST(ByRefTest, IsCopyable) {
1633   const std::string s1 = "Hi";
1634   const std::string s2 = "Hello";
1635 
1636   auto ref_wrapper = ByRef(s1);
1637   const std::string& r1 = ref_wrapper;
1638   EXPECT_EQ(&s1, &r1);
1639 
1640   // Assigns a new value to ref_wrapper.
1641   ref_wrapper = ByRef(s2);
1642   const std::string& r2 = ref_wrapper;
1643   EXPECT_EQ(&s2, &r2);
1644 
1645   auto ref_wrapper1 = ByRef(s1);
1646   // Copies ref_wrapper1 to ref_wrapper.
1647   ref_wrapper = ref_wrapper1;
1648   const std::string& r3 = ref_wrapper;
1649   EXPECT_EQ(&s1, &r3);
1650 }
1651 
1652 // Tests using ByRef() on a const value.
TEST(ByRefTest,ConstValue)1653 TEST(ByRefTest, ConstValue) {
1654   const int n = 0;
1655   // int& ref = ByRef(n);  // This shouldn't compile - we have a
1656   // negative compilation test to catch it.
1657   const int& const_ref = ByRef(n);
1658   EXPECT_EQ(&n, &const_ref);
1659 }
1660 
1661 // Tests using ByRef() on a non-const value.
TEST(ByRefTest,NonConstValue)1662 TEST(ByRefTest, NonConstValue) {
1663   int n = 0;
1664 
1665   // ByRef(n) can be used as either an int&,
1666   int& ref = ByRef(n);
1667   EXPECT_EQ(&n, &ref);
1668 
1669   // or a const int&.
1670   const int& const_ref = ByRef(n);
1671   EXPECT_EQ(&n, &const_ref);
1672 }
1673 
1674 // Tests explicitly specifying the type when using ByRef().
TEST(ByRefTest,ExplicitType)1675 TEST(ByRefTest, ExplicitType) {
1676   int n = 0;
1677   const int& r1 = ByRef<const int>(n);
1678   EXPECT_EQ(&n, &r1);
1679 
1680   // ByRef<char>(n);  // This shouldn't compile - we have a negative
1681   // compilation test to catch it.
1682 
1683   Derived d;
1684   Derived& r2 = ByRef<Derived>(d);
1685   EXPECT_EQ(&d, &r2);
1686 
1687   const Derived& r3 = ByRef<const Derived>(d);
1688   EXPECT_EQ(&d, &r3);
1689 
1690   Base& r4 = ByRef<Base>(d);
1691   EXPECT_EQ(&d, &r4);
1692 
1693   const Base& r5 = ByRef<const Base>(d);
1694   EXPECT_EQ(&d, &r5);
1695 
1696   // The following shouldn't compile - we have a negative compilation
1697   // test for it.
1698   //
1699   // Base b;
1700   // ByRef<Derived>(b);
1701 }
1702 
1703 // Tests that Google Mock prints expression ByRef(x) as a reference to x.
TEST(ByRefTest,PrintsCorrectly)1704 TEST(ByRefTest, PrintsCorrectly) {
1705   int n = 42;
1706   ::std::stringstream expected, actual;
1707   testing::internal::UniversalPrinter<const int&>::Print(n, &expected);
1708   testing::internal::UniversalPrint(ByRef(n), &actual);
1709   EXPECT_EQ(expected.str(), actual.str());
1710 }
1711 
1712 struct UnaryConstructorClass {
UnaryConstructorClasstesting::__anon10e2b6f40111::UnaryConstructorClass1713   explicit UnaryConstructorClass(int v) : value(v) {}
1714   int value;
1715 };
1716 
1717 // Tests using ReturnNew() with a unary constructor.
TEST(ReturnNewTest,Unary)1718 TEST(ReturnNewTest, Unary) {
1719   Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
1720   UnaryConstructorClass* c = a.Perform(std::make_tuple());
1721   EXPECT_EQ(4000, c->value);
1722   delete c;
1723 }
1724 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodHasArgs)1725 TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
1726   Action<UnaryConstructorClass*(bool, int)> a =
1727       ReturnNew<UnaryConstructorClass>(4000);
1728   UnaryConstructorClass* c = a.Perform(std::make_tuple(false, 5));
1729   EXPECT_EQ(4000, c->value);
1730   delete c;
1731 }
1732 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodReturnsPointerToConst)1733 TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
1734   Action<const UnaryConstructorClass*()> a =
1735       ReturnNew<UnaryConstructorClass>(4000);
1736   const UnaryConstructorClass* c = a.Perform(std::make_tuple());
1737   EXPECT_EQ(4000, c->value);
1738   delete c;
1739 }
1740 
1741 class TenArgConstructorClass {
1742  public:
TenArgConstructorClass(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)1743   TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
1744                          int a8, int a9, int a10)
1745       : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {}
1746   int value_;
1747 };
1748 
1749 // Tests using ReturnNew() with a 10-argument constructor.
TEST(ReturnNewTest,ConstructorThatTakes10Arguments)1750 TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
1751   Action<TenArgConstructorClass*()> a = ReturnNew<TenArgConstructorClass>(
1752       1000000000, 200000000, 30000000, 4000000, 500000, 60000, 7000, 800, 90,
1753       0);
1754   TenArgConstructorClass* c = a.Perform(std::make_tuple());
1755   EXPECT_EQ(1234567890, c->value_);
1756   delete c;
1757 }
1758 
UniquePtrSource()1759 std::unique_ptr<int> UniquePtrSource() { return std::make_unique<int>(19); }
1760 
VectorUniquePtrSource()1761 std::vector<std::unique_ptr<int>> VectorUniquePtrSource() {
1762   std::vector<std::unique_ptr<int>> out;
1763   out.emplace_back(new int(7));
1764   return out;
1765 }
1766 
TEST(MockMethodTest,CanReturnMoveOnlyValue_Return)1767 TEST(MockMethodTest, CanReturnMoveOnlyValue_Return) {
1768   MockClass mock;
1769   std::unique_ptr<int> i(new int(19));
1770   EXPECT_CALL(mock, MakeUnique()).WillOnce(Return(ByMove(std::move(i))));
1771   EXPECT_CALL(mock, MakeVectorUnique())
1772       .WillOnce(Return(ByMove(VectorUniquePtrSource())));
1773   Derived* d = new Derived;
1774   EXPECT_CALL(mock, MakeUniqueBase())
1775       .WillOnce(Return(ByMove(std::unique_ptr<Derived>(d))));
1776 
1777   std::unique_ptr<int> result1 = mock.MakeUnique();
1778   EXPECT_EQ(19, *result1);
1779 
1780   std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique();
1781   EXPECT_EQ(1u, vresult.size());
1782   EXPECT_NE(nullptr, vresult[0]);
1783   EXPECT_EQ(7, *vresult[0]);
1784 
1785   std::unique_ptr<Base> result2 = mock.MakeUniqueBase();
1786   EXPECT_EQ(d, result2.get());
1787 }
1788 
TEST(MockMethodTest,CanReturnMoveOnlyValue_DoAllReturn)1789 TEST(MockMethodTest, CanReturnMoveOnlyValue_DoAllReturn) {
1790   testing::MockFunction<void()> mock_function;
1791   MockClass mock;
1792   std::unique_ptr<int> i(new int(19));
1793   EXPECT_CALL(mock_function, Call());
1794   EXPECT_CALL(mock, MakeUnique())
1795       .WillOnce(DoAll(InvokeWithoutArgs(&mock_function,
1796                                         &testing::MockFunction<void()>::Call),
1797                       Return(ByMove(std::move(i)))));
1798 
1799   std::unique_ptr<int> result1 = mock.MakeUnique();
1800   EXPECT_EQ(19, *result1);
1801 }
1802 
TEST(MockMethodTest,CanReturnMoveOnlyValue_Invoke)1803 TEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) {
1804   MockClass mock;
1805 
1806   // Check default value
1807   DefaultValue<std::unique_ptr<int>>::SetFactory(
1808       [] { return std::make_unique<int>(42); });
1809   EXPECT_EQ(42, *mock.MakeUnique());
1810 
1811   EXPECT_CALL(mock, MakeUnique()).WillRepeatedly(Invoke(UniquePtrSource));
1812   EXPECT_CALL(mock, MakeVectorUnique())
1813       .WillRepeatedly(Invoke(VectorUniquePtrSource));
1814   std::unique_ptr<int> result1 = mock.MakeUnique();
1815   EXPECT_EQ(19, *result1);
1816   std::unique_ptr<int> result2 = mock.MakeUnique();
1817   EXPECT_EQ(19, *result2);
1818   EXPECT_NE(result1, result2);
1819 
1820   std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique();
1821   EXPECT_EQ(1u, vresult.size());
1822   EXPECT_NE(nullptr, vresult[0]);
1823   EXPECT_EQ(7, *vresult[0]);
1824 }
1825 
TEST(MockMethodTest,CanTakeMoveOnlyValue)1826 TEST(MockMethodTest, CanTakeMoveOnlyValue) {
1827   MockClass mock;
1828   auto make = [](int i) { return std::make_unique<int>(i); };
1829 
1830   EXPECT_CALL(mock, TakeUnique(_)).WillRepeatedly([](std::unique_ptr<int> i) {
1831     return *i;
1832   });
1833   // DoAll() does not compile, since it would move from its arguments twice.
1834   // EXPECT_CALL(mock, TakeUnique(_, _))
1835   //     .WillRepeatedly(DoAll(Invoke([](std::unique_ptr<int> j) {}),
1836   //     Return(1)));
1837   EXPECT_CALL(mock, TakeUnique(testing::Pointee(7)))
1838       .WillOnce(Return(-7))
1839       .RetiresOnSaturation();
1840   EXPECT_CALL(mock, TakeUnique(testing::IsNull()))
1841       .WillOnce(Return(-1))
1842       .RetiresOnSaturation();
1843 
1844   EXPECT_EQ(5, mock.TakeUnique(make(5)));
1845   EXPECT_EQ(-7, mock.TakeUnique(make(7)));
1846   EXPECT_EQ(7, mock.TakeUnique(make(7)));
1847   EXPECT_EQ(7, mock.TakeUnique(make(7)));
1848   EXPECT_EQ(-1, mock.TakeUnique({}));
1849 
1850   // Some arguments are moved, some passed by reference.
1851   auto lvalue = make(6);
1852   EXPECT_CALL(mock, TakeUnique(_, _))
1853       .WillOnce([](const std::unique_ptr<int>& i, std::unique_ptr<int> j) {
1854         return *i * *j;
1855       });
1856   EXPECT_EQ(42, mock.TakeUnique(lvalue, make(7)));
1857 
1858   // The unique_ptr can be saved by the action.
1859   std::unique_ptr<int> saved;
1860   EXPECT_CALL(mock, TakeUnique(_)).WillOnce([&saved](std::unique_ptr<int> i) {
1861     saved = std::move(i);
1862     return 0;
1863   });
1864   EXPECT_EQ(0, mock.TakeUnique(make(42)));
1865   EXPECT_EQ(42, *saved);
1866 }
1867 
1868 // It should be possible to use callables with an &&-qualified call operator
1869 // with WillOnce, since they will be called only once. This allows actions to
1870 // contain and manipulate move-only types.
TEST(MockMethodTest,ActionHasRvalueRefQualifiedCallOperator)1871 TEST(MockMethodTest, ActionHasRvalueRefQualifiedCallOperator) {
1872   struct Return17 {
1873     int operator()() && { return 17; }
1874   };
1875 
1876   // Action is directly compatible with mocked function type.
1877   {
1878     MockFunction<int()> mock;
1879     EXPECT_CALL(mock, Call).WillOnce(Return17());
1880 
1881     EXPECT_EQ(17, mock.AsStdFunction()());
1882   }
1883 
1884   // Action doesn't want mocked function arguments.
1885   {
1886     MockFunction<int(int)> mock;
1887     EXPECT_CALL(mock, Call).WillOnce(Return17());
1888 
1889     EXPECT_EQ(17, mock.AsStdFunction()(0));
1890   }
1891 }
1892 
1893 // Edge case: if an action has both a const-qualified and an &&-qualified call
1894 // operator, there should be no "ambiguous call" errors. The &&-qualified
1895 // operator should be used by WillOnce (since it doesn't need to retain the
1896 // action beyond one call), and the const-qualified one by WillRepeatedly.
TEST(MockMethodTest,ActionHasMultipleCallOperators)1897 TEST(MockMethodTest, ActionHasMultipleCallOperators) {
1898   struct ReturnInt {
1899     int operator()() && { return 17; }
1900     int operator()() const& { return 19; }
1901   };
1902 
1903   // Directly compatible with mocked function type.
1904   {
1905     MockFunction<int()> mock;
1906     EXPECT_CALL(mock, Call).WillOnce(ReturnInt()).WillRepeatedly(ReturnInt());
1907 
1908     EXPECT_EQ(17, mock.AsStdFunction()());
1909     EXPECT_EQ(19, mock.AsStdFunction()());
1910     EXPECT_EQ(19, mock.AsStdFunction()());
1911   }
1912 
1913   // Ignores function arguments.
1914   {
1915     MockFunction<int(int)> mock;
1916     EXPECT_CALL(mock, Call).WillOnce(ReturnInt()).WillRepeatedly(ReturnInt());
1917 
1918     EXPECT_EQ(17, mock.AsStdFunction()(0));
1919     EXPECT_EQ(19, mock.AsStdFunction()(0));
1920     EXPECT_EQ(19, mock.AsStdFunction()(0));
1921   }
1922 }
1923 
1924 // WillOnce should have no problem coping with a move-only action, whether it is
1925 // &&-qualified or not.
TEST(MockMethodTest,MoveOnlyAction)1926 TEST(MockMethodTest, MoveOnlyAction) {
1927   // &&-qualified
1928   {
1929     struct Return17 {
1930       Return17() = default;
1931       Return17(Return17&&) = default;
1932 
1933       Return17(const Return17&) = delete;
1934       Return17 operator=(const Return17&) = delete;
1935 
1936       int operator()() && { return 17; }
1937     };
1938 
1939     MockFunction<int()> mock;
1940     EXPECT_CALL(mock, Call).WillOnce(Return17());
1941     EXPECT_EQ(17, mock.AsStdFunction()());
1942   }
1943 
1944   // Not &&-qualified
1945   {
1946     struct Return17 {
1947       Return17() = default;
1948       Return17(Return17&&) = default;
1949 
1950       Return17(const Return17&) = delete;
1951       Return17 operator=(const Return17&) = delete;
1952 
1953       int operator()() const { return 17; }
1954     };
1955 
1956     MockFunction<int()> mock;
1957     EXPECT_CALL(mock, Call).WillOnce(Return17());
1958     EXPECT_EQ(17, mock.AsStdFunction()());
1959   }
1960 }
1961 
1962 // It should be possible to use an action that returns a value with a mock
1963 // function that doesn't, both through WillOnce and WillRepeatedly.
TEST(MockMethodTest,ActionReturnsIgnoredValue)1964 TEST(MockMethodTest, ActionReturnsIgnoredValue) {
1965   struct ReturnInt {
1966     int operator()() const { return 0; }
1967   };
1968 
1969   MockFunction<void()> mock;
1970   EXPECT_CALL(mock, Call).WillOnce(ReturnInt()).WillRepeatedly(ReturnInt());
1971 
1972   mock.AsStdFunction()();
1973   mock.AsStdFunction()();
1974 }
1975 
1976 // Despite the fanciness around move-only actions and so on, it should still be
1977 // possible to hand an lvalue reference to a copyable action to WillOnce.
TEST(MockMethodTest,WillOnceCanAcceptLvalueReference)1978 TEST(MockMethodTest, WillOnceCanAcceptLvalueReference) {
1979   MockFunction<int()> mock;
1980 
1981   const auto action = [] { return 17; };
1982   EXPECT_CALL(mock, Call).WillOnce(action);
1983 
1984   EXPECT_EQ(17, mock.AsStdFunction()());
1985 }
1986 
1987 // A callable that doesn't use SFINAE to restrict its call operator's overload
1988 // set, but is still picky about which arguments it will accept.
1989 struct StaticAssertSingleArgument {
1990   template <typename... Args>
CheckArgstesting::__anon10e2b6f40111::StaticAssertSingleArgument1991   static constexpr bool CheckArgs() {
1992     static_assert(sizeof...(Args) == 1, "");
1993     return true;
1994   }
1995 
1996   template <typename... Args, bool = CheckArgs<Args...>()>
operator ()testing::__anon10e2b6f40111::StaticAssertSingleArgument1997   int operator()(Args...) const {
1998     return 17;
1999   }
2000 };
2001 
2002 // WillOnce and WillRepeatedly should both work fine with naïve implementations
2003 // of actions that don't use SFINAE to limit the overload set for their call
2004 // operator. If they are compatible with the actual mocked signature, we
2005 // shouldn't probe them with no arguments and trip a static_assert.
TEST(MockMethodTest,ActionSwallowsAllArguments)2006 TEST(MockMethodTest, ActionSwallowsAllArguments) {
2007   MockFunction<int(int)> mock;
2008   EXPECT_CALL(mock, Call)
2009       .WillOnce(StaticAssertSingleArgument{})
2010       .WillRepeatedly(StaticAssertSingleArgument{});
2011 
2012   EXPECT_EQ(17, mock.AsStdFunction()(0));
2013   EXPECT_EQ(17, mock.AsStdFunction()(0));
2014 }
2015 
2016 struct ActionWithTemplatedConversionOperators {
2017   template <typename... Args>
operator OnceAction<int(Args...)>testing::__anon10e2b6f40111::ActionWithTemplatedConversionOperators2018   operator OnceAction<int(Args...)>() && {  // NOLINT
2019     return [] { return 17; };
2020   }
2021 
2022   template <typename... Args>
operator Action<int(Args...)>testing::__anon10e2b6f40111::ActionWithTemplatedConversionOperators2023   operator Action<int(Args...)>() const {  // NOLINT
2024     return [] { return 19; };
2025   }
2026 };
2027 
2028 // It should be fine to hand both WillOnce and WillRepeatedly a function that
2029 // defines templated conversion operators to OnceAction and Action. WillOnce
2030 // should prefer the OnceAction version.
TEST(MockMethodTest,ActionHasTemplatedConversionOperators)2031 TEST(MockMethodTest, ActionHasTemplatedConversionOperators) {
2032   MockFunction<int()> mock;
2033   EXPECT_CALL(mock, Call)
2034       .WillOnce(ActionWithTemplatedConversionOperators{})
2035       .WillRepeatedly(ActionWithTemplatedConversionOperators{});
2036 
2037   EXPECT_EQ(17, mock.AsStdFunction()());
2038   EXPECT_EQ(19, mock.AsStdFunction()());
2039 }
2040 
2041 // Tests for std::function based action.
2042 
Add(int val,int & ref,int * ptr)2043 int Add(int val, int& ref, int* ptr) {  // NOLINT
2044   int result = val + ref + *ptr;
2045   ref = 42;
2046   *ptr = 43;
2047   return result;
2048 }
2049 
Deref(std::unique_ptr<int> ptr)2050 int Deref(std::unique_ptr<int> ptr) { return *ptr; }
2051 
2052 struct Double {
2053   template <typename T>
operator ()testing::__anon10e2b6f40111::Double2054   T operator()(T t) {
2055     return 2 * t;
2056   }
2057 };
2058 
UniqueInt(int i)2059 std::unique_ptr<int> UniqueInt(int i) { return std::make_unique<int>(i); }
2060 
TEST(FunctorActionTest,ActionFromFunction)2061 TEST(FunctorActionTest, ActionFromFunction) {
2062   Action<int(int, int&, int*)> a = &Add;
2063   int x = 1, y = 2, z = 3;
2064   EXPECT_EQ(6, a.Perform(std::forward_as_tuple(x, y, &z)));
2065   EXPECT_EQ(42, y);
2066   EXPECT_EQ(43, z);
2067 
2068   Action<int(std::unique_ptr<int>)> a1 = &Deref;
2069   EXPECT_EQ(7, a1.Perform(std::make_tuple(UniqueInt(7))));
2070 }
2071 
TEST(FunctorActionTest,ActionFromLambda)2072 TEST(FunctorActionTest, ActionFromLambda) {
2073   Action<int(bool, int)> a1 = [](bool b, int i) { return b ? i : 0; };
2074   EXPECT_EQ(5, a1.Perform(std::make_tuple(true, 5)));
2075   EXPECT_EQ(0, a1.Perform(std::make_tuple(false, 5)));
2076 
2077   std::unique_ptr<int> saved;
2078   Action<void(std::unique_ptr<int>)> a2 = [&saved](std::unique_ptr<int> p) {
2079     saved = std::move(p);
2080   };
2081   a2.Perform(std::make_tuple(UniqueInt(5)));
2082   EXPECT_EQ(5, *saved);
2083 }
2084 
TEST(FunctorActionTest,PolymorphicFunctor)2085 TEST(FunctorActionTest, PolymorphicFunctor) {
2086   Action<int(int)> ai = Double();
2087   EXPECT_EQ(2, ai.Perform(std::make_tuple(1)));
2088   Action<double(double)> ad = Double();  // Double? Double double!
2089   EXPECT_EQ(3.0, ad.Perform(std::make_tuple(1.5)));
2090 }
2091 
TEST(FunctorActionTest,TypeConversion)2092 TEST(FunctorActionTest, TypeConversion) {
2093   // Numeric promotions are allowed.
2094   const Action<bool(int)> a1 = [](int i) { return i > 1; };
2095   const Action<int(bool)> a2 = Action<int(bool)>(a1);
2096   EXPECT_EQ(1, a1.Perform(std::make_tuple(42)));
2097   EXPECT_EQ(0, a2.Perform(std::make_tuple(42)));
2098 
2099   // Implicit constructors are allowed.
2100   const Action<bool(std::string)> s1 = [](std::string s) { return !s.empty(); };
2101   const Action<int(const char*)> s2 = Action<int(const char*)>(s1);
2102   EXPECT_EQ(0, s2.Perform(std::make_tuple("")));
2103   EXPECT_EQ(1, s2.Perform(std::make_tuple("hello")));
2104 
2105   // Also between the lambda and the action itself.
2106   const Action<bool(std::string)> x1 = [](Unused) { return 42; };
2107   const Action<bool(std::string)> x2 = [] { return 42; };
2108   EXPECT_TRUE(x1.Perform(std::make_tuple("hello")));
2109   EXPECT_TRUE(x2.Perform(std::make_tuple("hello")));
2110 
2111   // Ensure decay occurs where required.
2112   std::function<int()> f = [] { return 7; };
2113   Action<int(int)> d = f;
2114   f = nullptr;
2115   EXPECT_EQ(7, d.Perform(std::make_tuple(1)));
2116 
2117   // Ensure creation of an empty action succeeds.
2118   Action<void(int)>(nullptr);
2119 }
2120 
TEST(FunctorActionTest,UnusedArguments)2121 TEST(FunctorActionTest, UnusedArguments) {
2122   // Verify that users can ignore uninteresting arguments.
2123   Action<int(int, double y, double z)> a = [](int i, Unused, Unused) {
2124     return 2 * i;
2125   };
2126   std::tuple<int, double, double> dummy = std::make_tuple(3, 7.3, 9.44);
2127   EXPECT_EQ(6, a.Perform(dummy));
2128 }
2129 
2130 // Test that basic built-in actions work with move-only arguments.
TEST(MoveOnlyArgumentsTest,ReturningActions)2131 TEST(MoveOnlyArgumentsTest, ReturningActions) {
2132   Action<int(std::unique_ptr<int>)> a = Return(1);
2133   EXPECT_EQ(1, a.Perform(std::make_tuple(nullptr)));
2134 
2135   a = testing::WithoutArgs([]() { return 7; });
2136   EXPECT_EQ(7, a.Perform(std::make_tuple(nullptr)));
2137 
2138   Action<void(std::unique_ptr<int>, int*)> a2 = testing::SetArgPointee<1>(3);
2139   int x = 0;
2140   a2.Perform(std::make_tuple(nullptr, &x));
2141   EXPECT_EQ(x, 3);
2142 }
2143 
ACTION(ReturnArity)2144 ACTION(ReturnArity) { return std::tuple_size<args_type>::value; }
2145 
TEST(ActionMacro,LargeArity)2146 TEST(ActionMacro, LargeArity) {
2147   EXPECT_EQ(
2148       1, testing::Action<int(int)>(ReturnArity()).Perform(std::make_tuple(0)));
2149   EXPECT_EQ(
2150       10,
2151       testing::Action<int(int, int, int, int, int, int, int, int, int, int)>(
2152           ReturnArity())
2153           .Perform(std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)));
2154   EXPECT_EQ(
2155       20,
2156       testing::Action<int(int, int, int, int, int, int, int, int, int, int, int,
2157                           int, int, int, int, int, int, int, int, int)>(
2158           ReturnArity())
2159           .Perform(std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
2160                                    14, 15, 16, 17, 18, 19)));
2161 }
2162 
2163 }  // namespace
2164 }  // namespace testing
2165 
2166 #if defined(_MSC_VER) && (_MSC_VER == 1900)
2167 GTEST_DISABLE_MSC_WARNINGS_POP_()  // 4800
2168 #endif
2169 GTEST_DISABLE_MSC_WARNINGS_POP_()  // 4100 4503
2170