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