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