• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2007, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 //     * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 //     * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 //     * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 // Google Mock - a framework for writing C++ mock classes.
31 //
32 // This file tests the built-in actions.
33 
34 // Silence C4100 (unreferenced formal parameter) for MSVC
35 #ifdef _MSC_VER
36 #pragma warning(push)
37 #pragma warning(disable : 4100)
38 #if _MSC_VER == 1900
39 // and silence C4800 (C4800: 'int *const ': forcing value
40 // to bool 'true' or 'false') for MSVC 15
41 #pragma warning(disable : 4800)
42 #endif
43 #endif
44 
45 #include "gmock/gmock-actions.h"
46 
47 #include <algorithm>
48 #include <iterator>
49 #include <memory>
50 #include <string>
51 #include <type_traits>
52 
53 #include "gmock/gmock.h"
54 #include "gmock/internal/gmock-port.h"
55 #include "gtest/gtest-spi.h"
56 #include "gtest/gtest.h"
57 
58 namespace {
59 
60 using ::testing::_;
61 using ::testing::Action;
62 using ::testing::ActionInterface;
63 using ::testing::Assign;
64 using ::testing::ByMove;
65 using ::testing::ByRef;
66 using ::testing::DefaultValue;
67 using ::testing::DoAll;
68 using ::testing::DoDefault;
69 using ::testing::IgnoreResult;
70 using ::testing::Invoke;
71 using ::testing::InvokeWithoutArgs;
72 using ::testing::MakePolymorphicAction;
73 using ::testing::PolymorphicAction;
74 using ::testing::Return;
75 using ::testing::ReturnNew;
76 using ::testing::ReturnNull;
77 using ::testing::ReturnRef;
78 using ::testing::ReturnRefOfCopy;
79 using ::testing::ReturnRoundRobin;
80 using ::testing::SetArgPointee;
81 using ::testing::SetArgumentPointee;
82 using ::testing::Unused;
83 using ::testing::WithArgs;
84 using ::testing::internal::BuiltInDefaultValue;
85 
86 #if !GTEST_OS_WINDOWS_MOBILE
87 using ::testing::SetErrnoAndReturn;
88 #endif
89 
90 // Tests that BuiltInDefaultValue<T*>::Get() returns NULL.
TEST(BuiltInDefaultValueTest,IsNullForPointerTypes)91 TEST(BuiltInDefaultValueTest, IsNullForPointerTypes) {
92   EXPECT_TRUE(BuiltInDefaultValue<int*>::Get() == nullptr);
93   EXPECT_TRUE(BuiltInDefaultValue<const char*>::Get() == nullptr);
94   EXPECT_TRUE(BuiltInDefaultValue<void*>::Get() == nullptr);
95 }
96 
97 // Tests that BuiltInDefaultValue<T*>::Exists() return true.
TEST(BuiltInDefaultValueTest,ExistsForPointerTypes)98 TEST(BuiltInDefaultValueTest, ExistsForPointerTypes) {
99   EXPECT_TRUE(BuiltInDefaultValue<int*>::Exists());
100   EXPECT_TRUE(BuiltInDefaultValue<const char*>::Exists());
101   EXPECT_TRUE(BuiltInDefaultValue<void*>::Exists());
102 }
103 
104 // Tests that BuiltInDefaultValue<T>::Get() returns 0 when T is a
105 // built-in numeric type.
TEST(BuiltInDefaultValueTest,IsZeroForNumericTypes)106 TEST(BuiltInDefaultValueTest, IsZeroForNumericTypes) {
107   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned char>::Get());
108   EXPECT_EQ(0, BuiltInDefaultValue<signed char>::Get());
109   EXPECT_EQ(0, BuiltInDefaultValue<char>::Get());
110 #if GMOCK_WCHAR_T_IS_NATIVE_
111 #if !defined(__WCHAR_UNSIGNED__)
112   EXPECT_EQ(0, BuiltInDefaultValue<wchar_t>::Get());
113 #else
114   EXPECT_EQ(0U, BuiltInDefaultValue<wchar_t>::Get());
115 #endif
116 #endif
117   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned short>::Get());  // NOLINT
118   EXPECT_EQ(0, BuiltInDefaultValue<signed short>::Get());     // NOLINT
119   EXPECT_EQ(0, BuiltInDefaultValue<short>::Get());            // NOLINT
120   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned int>::Get());
121   EXPECT_EQ(0, BuiltInDefaultValue<signed int>::Get());
122   EXPECT_EQ(0, BuiltInDefaultValue<int>::Get());
123   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long>::Get());       // NOLINT
124   EXPECT_EQ(0, BuiltInDefaultValue<signed long>::Get());          // NOLINT
125   EXPECT_EQ(0, BuiltInDefaultValue<long>::Get());                 // NOLINT
126   EXPECT_EQ(0U, BuiltInDefaultValue<unsigned long long>::Get());  // NOLINT
127   EXPECT_EQ(0, BuiltInDefaultValue<signed long long>::Get());     // NOLINT
128   EXPECT_EQ(0, BuiltInDefaultValue<long long>::Get());            // NOLINT
129   EXPECT_EQ(0, BuiltInDefaultValue<float>::Get());
130   EXPECT_EQ(0, BuiltInDefaultValue<double>::Get());
131 }
132 
133 // Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a
134 // built-in numeric type.
TEST(BuiltInDefaultValueTest,ExistsForNumericTypes)135 TEST(BuiltInDefaultValueTest, ExistsForNumericTypes) {
136   EXPECT_TRUE(BuiltInDefaultValue<unsigned char>::Exists());
137   EXPECT_TRUE(BuiltInDefaultValue<signed char>::Exists());
138   EXPECT_TRUE(BuiltInDefaultValue<char>::Exists());
139 #if GMOCK_WCHAR_T_IS_NATIVE_
140   EXPECT_TRUE(BuiltInDefaultValue<wchar_t>::Exists());
141 #endif
142   EXPECT_TRUE(BuiltInDefaultValue<unsigned short>::Exists());  // NOLINT
143   EXPECT_TRUE(BuiltInDefaultValue<signed short>::Exists());    // NOLINT
144   EXPECT_TRUE(BuiltInDefaultValue<short>::Exists());           // NOLINT
145   EXPECT_TRUE(BuiltInDefaultValue<unsigned int>::Exists());
146   EXPECT_TRUE(BuiltInDefaultValue<signed int>::Exists());
147   EXPECT_TRUE(BuiltInDefaultValue<int>::Exists());
148   EXPECT_TRUE(BuiltInDefaultValue<unsigned long>::Exists());       // NOLINT
149   EXPECT_TRUE(BuiltInDefaultValue<signed long>::Exists());         // NOLINT
150   EXPECT_TRUE(BuiltInDefaultValue<long>::Exists());                // NOLINT
151   EXPECT_TRUE(BuiltInDefaultValue<unsigned long long>::Exists());  // NOLINT
152   EXPECT_TRUE(BuiltInDefaultValue<signed long long>::Exists());    // NOLINT
153   EXPECT_TRUE(BuiltInDefaultValue<long long>::Exists());           // NOLINT
154   EXPECT_TRUE(BuiltInDefaultValue<float>::Exists());
155   EXPECT_TRUE(BuiltInDefaultValue<double>::Exists());
156 }
157 
158 // Tests that BuiltInDefaultValue<bool>::Get() returns false.
TEST(BuiltInDefaultValueTest,IsFalseForBool)159 TEST(BuiltInDefaultValueTest, IsFalseForBool) {
160   EXPECT_FALSE(BuiltInDefaultValue<bool>::Get());
161 }
162 
163 // Tests that BuiltInDefaultValue<bool>::Exists() returns true.
TEST(BuiltInDefaultValueTest,BoolExists)164 TEST(BuiltInDefaultValueTest, BoolExists) {
165   EXPECT_TRUE(BuiltInDefaultValue<bool>::Exists());
166 }
167 
168 // Tests that BuiltInDefaultValue<T>::Get() returns "" when T is a
169 // string type.
TEST(BuiltInDefaultValueTest,IsEmptyStringForString)170 TEST(BuiltInDefaultValueTest, IsEmptyStringForString) {
171   EXPECT_EQ("", BuiltInDefaultValue<::std::string>::Get());
172 }
173 
174 // Tests that BuiltInDefaultValue<T>::Exists() returns true when T is a
175 // string type.
TEST(BuiltInDefaultValueTest,ExistsForString)176 TEST(BuiltInDefaultValueTest, ExistsForString) {
177   EXPECT_TRUE(BuiltInDefaultValue<::std::string>::Exists());
178 }
179 
180 // Tests that BuiltInDefaultValue<const T>::Get() returns the same
181 // value as BuiltInDefaultValue<T>::Get() does.
TEST(BuiltInDefaultValueTest,WorksForConstTypes)182 TEST(BuiltInDefaultValueTest, WorksForConstTypes) {
183   EXPECT_EQ("", BuiltInDefaultValue<const std::string>::Get());
184   EXPECT_EQ(0, BuiltInDefaultValue<const int>::Get());
185   EXPECT_TRUE(BuiltInDefaultValue<char* const>::Get() == nullptr);
186   EXPECT_FALSE(BuiltInDefaultValue<const bool>::Get());
187 }
188 
189 // A type that's default constructible.
190 class MyDefaultConstructible {
191  public:
MyDefaultConstructible()192   MyDefaultConstructible() : value_(42) {}
193 
value() const194   int value() const { return value_; }
195 
196  private:
197   int value_;
198 };
199 
200 // A type that's not default constructible.
201 class MyNonDefaultConstructible {
202  public:
203   // Does not have a default ctor.
MyNonDefaultConstructible(int a_value)204   explicit MyNonDefaultConstructible(int a_value) : value_(a_value) {}
205 
value() const206   int value() const { return value_; }
207 
208  private:
209   int value_;
210 };
211 
TEST(BuiltInDefaultValueTest,ExistsForDefaultConstructibleType)212 TEST(BuiltInDefaultValueTest, ExistsForDefaultConstructibleType) {
213   EXPECT_TRUE(BuiltInDefaultValue<MyDefaultConstructible>::Exists());
214 }
215 
TEST(BuiltInDefaultValueTest,IsDefaultConstructedForDefaultConstructibleType)216 TEST(BuiltInDefaultValueTest, IsDefaultConstructedForDefaultConstructibleType) {
217   EXPECT_EQ(42, BuiltInDefaultValue<MyDefaultConstructible>::Get().value());
218 }
219 
TEST(BuiltInDefaultValueTest,DoesNotExistForNonDefaultConstructibleType)220 TEST(BuiltInDefaultValueTest, DoesNotExistForNonDefaultConstructibleType) {
221   EXPECT_FALSE(BuiltInDefaultValue<MyNonDefaultConstructible>::Exists());
222 }
223 
224 // Tests that BuiltInDefaultValue<T&>::Get() aborts the program.
TEST(BuiltInDefaultValueDeathTest,IsUndefinedForReferences)225 TEST(BuiltInDefaultValueDeathTest, IsUndefinedForReferences) {
226   EXPECT_DEATH_IF_SUPPORTED({ BuiltInDefaultValue<int&>::Get(); }, "");
227   EXPECT_DEATH_IF_SUPPORTED({ BuiltInDefaultValue<const char&>::Get(); }, "");
228 }
229 
TEST(BuiltInDefaultValueDeathTest,IsUndefinedForNonDefaultConstructibleType)230 TEST(BuiltInDefaultValueDeathTest, IsUndefinedForNonDefaultConstructibleType) {
231   EXPECT_DEATH_IF_SUPPORTED(
232       { BuiltInDefaultValue<MyNonDefaultConstructible>::Get(); }, "");
233 }
234 
235 // Tests that DefaultValue<T>::IsSet() is false initially.
TEST(DefaultValueTest,IsInitiallyUnset)236 TEST(DefaultValueTest, IsInitiallyUnset) {
237   EXPECT_FALSE(DefaultValue<int>::IsSet());
238   EXPECT_FALSE(DefaultValue<MyDefaultConstructible>::IsSet());
239   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet());
240 }
241 
242 // Tests that DefaultValue<T> can be set and then unset.
TEST(DefaultValueTest,CanBeSetAndUnset)243 TEST(DefaultValueTest, CanBeSetAndUnset) {
244   EXPECT_TRUE(DefaultValue<int>::Exists());
245   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists());
246 
247   DefaultValue<int>::Set(1);
248   DefaultValue<const MyNonDefaultConstructible>::Set(
249       MyNonDefaultConstructible(42));
250 
251   EXPECT_EQ(1, DefaultValue<int>::Get());
252   EXPECT_EQ(42, DefaultValue<const MyNonDefaultConstructible>::Get().value());
253 
254   EXPECT_TRUE(DefaultValue<int>::Exists());
255   EXPECT_TRUE(DefaultValue<const MyNonDefaultConstructible>::Exists());
256 
257   DefaultValue<int>::Clear();
258   DefaultValue<const MyNonDefaultConstructible>::Clear();
259 
260   EXPECT_FALSE(DefaultValue<int>::IsSet());
261   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::IsSet());
262 
263   EXPECT_TRUE(DefaultValue<int>::Exists());
264   EXPECT_FALSE(DefaultValue<const MyNonDefaultConstructible>::Exists());
265 }
266 
267 // Tests that DefaultValue<T>::Get() returns the
268 // BuiltInDefaultValue<T>::Get() when DefaultValue<T>::IsSet() is
269 // false.
TEST(DefaultValueDeathTest,GetReturnsBuiltInDefaultValueWhenUnset)270 TEST(DefaultValueDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) {
271   EXPECT_FALSE(DefaultValue<int>::IsSet());
272   EXPECT_TRUE(DefaultValue<int>::Exists());
273   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::IsSet());
274   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible>::Exists());
275 
276   EXPECT_EQ(0, DefaultValue<int>::Get());
277 
278   EXPECT_DEATH_IF_SUPPORTED({ DefaultValue<MyNonDefaultConstructible>::Get(); },
279                             "");
280 }
281 
TEST(DefaultValueTest,GetWorksForMoveOnlyIfSet)282 TEST(DefaultValueTest, GetWorksForMoveOnlyIfSet) {
283   EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());
284   EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Get() == nullptr);
285   DefaultValue<std::unique_ptr<int>>::SetFactory(
286       [] { return std::unique_ptr<int>(new int(42)); });
287   EXPECT_TRUE(DefaultValue<std::unique_ptr<int>>::Exists());
288   std::unique_ptr<int> i = DefaultValue<std::unique_ptr<int>>::Get();
289   EXPECT_EQ(42, *i);
290 }
291 
292 // Tests that DefaultValue<void>::Get() returns void.
TEST(DefaultValueTest,GetWorksForVoid)293 TEST(DefaultValueTest, GetWorksForVoid) { return DefaultValue<void>::Get(); }
294 
295 // Tests using DefaultValue with a reference type.
296 
297 // Tests that DefaultValue<T&>::IsSet() is false initially.
TEST(DefaultValueOfReferenceTest,IsInitiallyUnset)298 TEST(DefaultValueOfReferenceTest, IsInitiallyUnset) {
299   EXPECT_FALSE(DefaultValue<int&>::IsSet());
300   EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::IsSet());
301   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());
302 }
303 
304 // Tests that DefaultValue<T&>::Exists is false initiallly.
TEST(DefaultValueOfReferenceTest,IsInitiallyNotExisting)305 TEST(DefaultValueOfReferenceTest, IsInitiallyNotExisting) {
306   EXPECT_FALSE(DefaultValue<int&>::Exists());
307   EXPECT_FALSE(DefaultValue<MyDefaultConstructible&>::Exists());
308   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists());
309 }
310 
311 // Tests that DefaultValue<T&> can be set and then unset.
TEST(DefaultValueOfReferenceTest,CanBeSetAndUnset)312 TEST(DefaultValueOfReferenceTest, CanBeSetAndUnset) {
313   int n = 1;
314   DefaultValue<const int&>::Set(n);
315   MyNonDefaultConstructible x(42);
316   DefaultValue<MyNonDefaultConstructible&>::Set(x);
317 
318   EXPECT_TRUE(DefaultValue<const int&>::Exists());
319   EXPECT_TRUE(DefaultValue<MyNonDefaultConstructible&>::Exists());
320 
321   EXPECT_EQ(&n, &(DefaultValue<const int&>::Get()));
322   EXPECT_EQ(&x, &(DefaultValue<MyNonDefaultConstructible&>::Get()));
323 
324   DefaultValue<const int&>::Clear();
325   DefaultValue<MyNonDefaultConstructible&>::Clear();
326 
327   EXPECT_FALSE(DefaultValue<const int&>::Exists());
328   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::Exists());
329 
330   EXPECT_FALSE(DefaultValue<const int&>::IsSet());
331   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());
332 }
333 
334 // Tests that DefaultValue<T&>::Get() returns the
335 // BuiltInDefaultValue<T&>::Get() when DefaultValue<T&>::IsSet() is
336 // false.
TEST(DefaultValueOfReferenceDeathTest,GetReturnsBuiltInDefaultValueWhenUnset)337 TEST(DefaultValueOfReferenceDeathTest, GetReturnsBuiltInDefaultValueWhenUnset) {
338   EXPECT_FALSE(DefaultValue<int&>::IsSet());
339   EXPECT_FALSE(DefaultValue<MyNonDefaultConstructible&>::IsSet());
340 
341   EXPECT_DEATH_IF_SUPPORTED({ DefaultValue<int&>::Get(); }, "");
342   EXPECT_DEATH_IF_SUPPORTED({ DefaultValue<MyNonDefaultConstructible>::Get(); },
343                             "");
344 }
345 
346 // Tests that ActionInterface can be implemented by defining the
347 // Perform method.
348 
349 typedef int MyGlobalFunction(bool, int);
350 
351 class MyActionImpl : public ActionInterface<MyGlobalFunction> {
352  public:
Perform(const std::tuple<bool,int> & args)353   int Perform(const std::tuple<bool, int>& args) override {
354     return std::get<0>(args) ? std::get<1>(args) : 0;
355   }
356 };
357 
TEST(ActionInterfaceTest,CanBeImplementedByDefiningPerform)358 TEST(ActionInterfaceTest, CanBeImplementedByDefiningPerform) {
359   MyActionImpl my_action_impl;
360   (void)my_action_impl;
361 }
362 
TEST(ActionInterfaceTest,MakeAction)363 TEST(ActionInterfaceTest, MakeAction) {
364   Action<MyGlobalFunction> action = MakeAction(new MyActionImpl);
365 
366   // When exercising the Perform() method of Action<F>, we must pass
367   // it a tuple whose size and type are compatible with F's argument
368   // types.  For example, if F is int(), then Perform() takes a
369   // 0-tuple; if F is void(bool, int), then Perform() takes a
370   // std::tuple<bool, int>, and so on.
371   EXPECT_EQ(5, action.Perform(std::make_tuple(true, 5)));
372 }
373 
374 // Tests that Action<F> can be constructed from a pointer to
375 // ActionInterface<F>.
TEST(ActionTest,CanBeConstructedFromActionInterface)376 TEST(ActionTest, CanBeConstructedFromActionInterface) {
377   Action<MyGlobalFunction> action(new MyActionImpl);
378 }
379 
380 // Tests that Action<F> delegates actual work to ActionInterface<F>.
TEST(ActionTest,DelegatesWorkToActionInterface)381 TEST(ActionTest, DelegatesWorkToActionInterface) {
382   const Action<MyGlobalFunction> action(new MyActionImpl);
383 
384   EXPECT_EQ(5, action.Perform(std::make_tuple(true, 5)));
385   EXPECT_EQ(0, action.Perform(std::make_tuple(false, 1)));
386 }
387 
388 // Tests that Action<F> can be copied.
TEST(ActionTest,IsCopyable)389 TEST(ActionTest, IsCopyable) {
390   Action<MyGlobalFunction> a1(new MyActionImpl);
391   Action<MyGlobalFunction> a2(a1);  // Tests the copy constructor.
392 
393   // a1 should continue to work after being copied from.
394   EXPECT_EQ(5, a1.Perform(std::make_tuple(true, 5)));
395   EXPECT_EQ(0, a1.Perform(std::make_tuple(false, 1)));
396 
397   // a2 should work like the action it was copied from.
398   EXPECT_EQ(5, a2.Perform(std::make_tuple(true, 5)));
399   EXPECT_EQ(0, a2.Perform(std::make_tuple(false, 1)));
400 
401   a2 = a1;  // Tests the assignment operator.
402 
403   // a1 should continue to work after being copied from.
404   EXPECT_EQ(5, a1.Perform(std::make_tuple(true, 5)));
405   EXPECT_EQ(0, a1.Perform(std::make_tuple(false, 1)));
406 
407   // a2 should work like the action it was copied from.
408   EXPECT_EQ(5, a2.Perform(std::make_tuple(true, 5)));
409   EXPECT_EQ(0, a2.Perform(std::make_tuple(false, 1)));
410 }
411 
412 // Tests that an Action<From> object can be converted to a
413 // compatible Action<To> object.
414 
415 class IsNotZero : public ActionInterface<bool(int)> {  // NOLINT
416  public:
Perform(const std::tuple<int> & arg)417   bool Perform(const std::tuple<int>& arg) override {
418     return std::get<0>(arg) != 0;
419   }
420 };
421 
TEST(ActionTest,CanBeConvertedToOtherActionType)422 TEST(ActionTest, CanBeConvertedToOtherActionType) {
423   const Action<bool(int)> a1(new IsNotZero);           // NOLINT
424   const Action<int(char)> a2 = Action<int(char)>(a1);  // NOLINT
425   EXPECT_EQ(1, a2.Perform(std::make_tuple('a')));
426   EXPECT_EQ(0, a2.Perform(std::make_tuple('\0')));
427 }
428 
429 // The following two classes are for testing MakePolymorphicAction().
430 
431 // Implements a polymorphic action that returns the second of the
432 // arguments it receives.
433 class ReturnSecondArgumentAction {
434  public:
435   // We want to verify that MakePolymorphicAction() can work with a
436   // polymorphic action whose Perform() method template is either
437   // const or not.  This lets us verify the non-const case.
438   template <typename Result, typename ArgumentTuple>
Perform(const ArgumentTuple & args)439   Result Perform(const ArgumentTuple& args) {
440     return std::get<1>(args);
441   }
442 };
443 
444 // Implements a polymorphic action that can be used in a nullary
445 // function to return 0.
446 class ReturnZeroFromNullaryFunctionAction {
447  public:
448   // For testing that MakePolymorphicAction() works when the
449   // implementation class' Perform() method template takes only one
450   // template parameter.
451   //
452   // We want to verify that MakePolymorphicAction() can work with a
453   // polymorphic action whose Perform() method template is either
454   // const or not.  This lets us verify the const case.
455   template <typename Result>
Perform(const std::tuple<> &) const456   Result Perform(const std::tuple<>&) const {
457     return 0;
458   }
459 };
460 
461 // These functions verify that MakePolymorphicAction() returns a
462 // PolymorphicAction<T> where T is the argument's type.
463 
ReturnSecondArgument()464 PolymorphicAction<ReturnSecondArgumentAction> ReturnSecondArgument() {
465   return MakePolymorphicAction(ReturnSecondArgumentAction());
466 }
467 
468 PolymorphicAction<ReturnZeroFromNullaryFunctionAction>
ReturnZeroFromNullaryFunction()469 ReturnZeroFromNullaryFunction() {
470   return MakePolymorphicAction(ReturnZeroFromNullaryFunctionAction());
471 }
472 
473 // Tests that MakePolymorphicAction() turns a polymorphic action
474 // implementation class into a polymorphic action.
TEST(MakePolymorphicActionTest,ConstructsActionFromImpl)475 TEST(MakePolymorphicActionTest, ConstructsActionFromImpl) {
476   Action<int(bool, int, double)> a1 = ReturnSecondArgument();  // NOLINT
477   EXPECT_EQ(5, a1.Perform(std::make_tuple(false, 5, 2.0)));
478 }
479 
480 // Tests that MakePolymorphicAction() works when the implementation
481 // class' Perform() method template has only one template parameter.
TEST(MakePolymorphicActionTest,WorksWhenPerformHasOneTemplateParameter)482 TEST(MakePolymorphicActionTest, WorksWhenPerformHasOneTemplateParameter) {
483   Action<int()> a1 = ReturnZeroFromNullaryFunction();
484   EXPECT_EQ(0, a1.Perform(std::make_tuple()));
485 
486   Action<void*()> a2 = ReturnZeroFromNullaryFunction();
487   EXPECT_TRUE(a2.Perform(std::make_tuple()) == nullptr);
488 }
489 
490 // Tests that Return() works as an action for void-returning
491 // functions.
TEST(ReturnTest,WorksForVoid)492 TEST(ReturnTest, WorksForVoid) {
493   const Action<void(int)> ret = Return();  // NOLINT
494   return ret.Perform(std::make_tuple(1));
495 }
496 
497 // Tests that Return(v) returns v.
TEST(ReturnTest,ReturnsGivenValue)498 TEST(ReturnTest, ReturnsGivenValue) {
499   Action<int()> ret = Return(1);  // NOLINT
500   EXPECT_EQ(1, ret.Perform(std::make_tuple()));
501 
502   ret = Return(-5);
503   EXPECT_EQ(-5, ret.Perform(std::make_tuple()));
504 }
505 
506 // Tests that Return("string literal") works.
TEST(ReturnTest,AcceptsStringLiteral)507 TEST(ReturnTest, AcceptsStringLiteral) {
508   Action<const char*()> a1 = Return("Hello");
509   EXPECT_STREQ("Hello", a1.Perform(std::make_tuple()));
510 
511   Action<std::string()> a2 = Return("world");
512   EXPECT_EQ("world", a2.Perform(std::make_tuple()));
513 }
514 
515 // Test struct which wraps a vector of integers. Used in
516 // 'SupportsWrapperReturnType' test.
517 struct IntegerVectorWrapper {
518   std::vector<int>* v;
IntegerVectorWrapper__anon2e4943020111::IntegerVectorWrapper519   IntegerVectorWrapper(std::vector<int>& _v) : v(&_v) {}  // NOLINT
520 };
521 
522 // Tests that Return() works when return type is a wrapper type.
TEST(ReturnTest,SupportsWrapperReturnType)523 TEST(ReturnTest, SupportsWrapperReturnType) {
524   // Initialize vector of integers.
525   std::vector<int> v;
526   for (int i = 0; i < 5; ++i) v.push_back(i);
527 
528   // Return() called with 'v' as argument. The Action will return the same data
529   // as 'v' (copy) but it will be wrapped in an IntegerVectorWrapper.
530   Action<IntegerVectorWrapper()> a = Return(v);
531   const std::vector<int>& result = *(a.Perform(std::make_tuple()).v);
532   EXPECT_THAT(result, ::testing::ElementsAre(0, 1, 2, 3, 4));
533 }
534 
535 // Tests that Return(v) is covaraint.
536 
537 struct Base {
operator ==__anon2e4943020111::Base538   bool operator==(const Base&) { return true; }
539 };
540 
541 struct Derived : public Base {
operator ==__anon2e4943020111::Derived542   bool operator==(const Derived&) { return true; }
543 };
544 
TEST(ReturnTest,IsCovariant)545 TEST(ReturnTest, IsCovariant) {
546   Base base;
547   Derived derived;
548   Action<Base*()> ret = Return(&base);
549   EXPECT_EQ(&base, ret.Perform(std::make_tuple()));
550 
551   ret = Return(&derived);
552   EXPECT_EQ(&derived, ret.Perform(std::make_tuple()));
553 }
554 
555 // Tests that the type of the value passed into Return is converted into T
556 // when the action is cast to Action<T(...)> rather than when the action is
557 // performed. See comments on testing::internal::ReturnAction in
558 // gmock-actions.h for more information.
559 class FromType {
560  public:
FromType(bool * is_converted)561   explicit FromType(bool* is_converted) : converted_(is_converted) {}
converted() const562   bool* converted() const { return converted_; }
563 
564  private:
565   bool* const converted_;
566 };
567 
568 class ToType {
569  public:
570   // Must allow implicit conversion due to use in ImplicitCast_<T>.
ToType(const FromType & x)571   ToType(const FromType& x) { *x.converted() = true; }  // NOLINT
572 };
573 
TEST(ReturnTest,ConvertsArgumentWhenConverted)574 TEST(ReturnTest, ConvertsArgumentWhenConverted) {
575   bool converted = false;
576   FromType x(&converted);
577   Action<ToType()> action(Return(x));
578   EXPECT_TRUE(converted) << "Return must convert its argument in its own "
579                          << "conversion operator.";
580   converted = false;
581   action.Perform(std::tuple<>());
582   EXPECT_FALSE(converted) << "Action must NOT convert its argument "
583                           << "when performed.";
584 }
585 
586 class DestinationType {};
587 
588 class SourceType {
589  public:
590   // Note: a non-const typecast operator.
operator DestinationType()591   operator DestinationType() { return DestinationType(); }
592 };
593 
TEST(ReturnTest,CanConvertArgumentUsingNonConstTypeCastOperator)594 TEST(ReturnTest, CanConvertArgumentUsingNonConstTypeCastOperator) {
595   SourceType s;
596   Action<DestinationType()> action(Return(s));
597 }
598 
599 // Tests that ReturnNull() returns NULL in a pointer-returning function.
TEST(ReturnNullTest,WorksInPointerReturningFunction)600 TEST(ReturnNullTest, WorksInPointerReturningFunction) {
601   const Action<int*()> a1 = ReturnNull();
602   EXPECT_TRUE(a1.Perform(std::make_tuple()) == nullptr);
603 
604   const Action<const char*(bool)> a2 = ReturnNull();  // NOLINT
605   EXPECT_TRUE(a2.Perform(std::make_tuple(true)) == nullptr);
606 }
607 
608 // Tests that ReturnNull() returns NULL for shared_ptr and unique_ptr returning
609 // functions.
TEST(ReturnNullTest,WorksInSmartPointerReturningFunction)610 TEST(ReturnNullTest, WorksInSmartPointerReturningFunction) {
611   const Action<std::unique_ptr<const int>()> a1 = ReturnNull();
612   EXPECT_TRUE(a1.Perform(std::make_tuple()) == nullptr);
613 
614   const Action<std::shared_ptr<int>(std::string)> a2 = ReturnNull();
615   EXPECT_TRUE(a2.Perform(std::make_tuple("foo")) == nullptr);
616 }
617 
618 // Tests that ReturnRef(v) works for reference types.
TEST(ReturnRefTest,WorksForReference)619 TEST(ReturnRefTest, WorksForReference) {
620   const int n = 0;
621   const Action<const int&(bool)> ret = ReturnRef(n);  // NOLINT
622 
623   EXPECT_EQ(&n, &ret.Perform(std::make_tuple(true)));
624 }
625 
626 // Tests that ReturnRef(v) is covariant.
TEST(ReturnRefTest,IsCovariant)627 TEST(ReturnRefTest, IsCovariant) {
628   Base base;
629   Derived derived;
630   Action<Base&()> a = ReturnRef(base);
631   EXPECT_EQ(&base, &a.Perform(std::make_tuple()));
632 
633   a = ReturnRef(derived);
634   EXPECT_EQ(&derived, &a.Perform(std::make_tuple()));
635 }
636 
637 template <typename T, typename = decltype(ReturnRef(std::declval<T&&>()))>
CanCallReturnRef(T &&)638 bool CanCallReturnRef(T&&) {
639   return true;
640 }
CanCallReturnRef(Unused)641 bool CanCallReturnRef(Unused) { return false; }
642 
643 // Tests that ReturnRef(v) is working with non-temporaries (T&)
TEST(ReturnRefTest,WorksForNonTemporary)644 TEST(ReturnRefTest, WorksForNonTemporary) {
645   int scalar_value = 123;
646   EXPECT_TRUE(CanCallReturnRef(scalar_value));
647 
648   std::string non_scalar_value("ABC");
649   EXPECT_TRUE(CanCallReturnRef(non_scalar_value));
650 
651   const int const_scalar_value{321};
652   EXPECT_TRUE(CanCallReturnRef(const_scalar_value));
653 
654   const std::string const_non_scalar_value("CBA");
655   EXPECT_TRUE(CanCallReturnRef(const_non_scalar_value));
656 }
657 
658 // Tests that ReturnRef(v) is not working with temporaries (T&&)
TEST(ReturnRefTest,DoesNotWorkForTemporary)659 TEST(ReturnRefTest, DoesNotWorkForTemporary) {
660   auto scalar_value = []() -> int { return 123; };
661   EXPECT_FALSE(CanCallReturnRef(scalar_value()));
662 
663   auto non_scalar_value = []() -> std::string { return "ABC"; };
664   EXPECT_FALSE(CanCallReturnRef(non_scalar_value()));
665 
666   // cannot use here callable returning "const scalar type",
667   // because such const for scalar return type is ignored
668   EXPECT_FALSE(CanCallReturnRef(static_cast<const int>(321)));
669 
670   auto const_non_scalar_value = []() -> const std::string { return "CBA"; };
671   EXPECT_FALSE(CanCallReturnRef(const_non_scalar_value()));
672 }
673 
674 // Tests that ReturnRefOfCopy(v) works for reference types.
TEST(ReturnRefOfCopyTest,WorksForReference)675 TEST(ReturnRefOfCopyTest, WorksForReference) {
676   int n = 42;
677   const Action<const int&()> ret = ReturnRefOfCopy(n);
678 
679   EXPECT_NE(&n, &ret.Perform(std::make_tuple()));
680   EXPECT_EQ(42, ret.Perform(std::make_tuple()));
681 
682   n = 43;
683   EXPECT_NE(&n, &ret.Perform(std::make_tuple()));
684   EXPECT_EQ(42, ret.Perform(std::make_tuple()));
685 }
686 
687 // Tests that ReturnRefOfCopy(v) is covariant.
TEST(ReturnRefOfCopyTest,IsCovariant)688 TEST(ReturnRefOfCopyTest, IsCovariant) {
689   Base base;
690   Derived derived;
691   Action<Base&()> a = ReturnRefOfCopy(base);
692   EXPECT_NE(&base, &a.Perform(std::make_tuple()));
693 
694   a = ReturnRefOfCopy(derived);
695   EXPECT_NE(&derived, &a.Perform(std::make_tuple()));
696 }
697 
698 // Tests that ReturnRoundRobin(v) works with initializer lists
TEST(ReturnRoundRobinTest,WorksForInitList)699 TEST(ReturnRoundRobinTest, WorksForInitList) {
700   Action<int()> ret = ReturnRoundRobin({1, 2, 3});
701 
702   EXPECT_EQ(1, ret.Perform(std::make_tuple()));
703   EXPECT_EQ(2, ret.Perform(std::make_tuple()));
704   EXPECT_EQ(3, ret.Perform(std::make_tuple()));
705   EXPECT_EQ(1, ret.Perform(std::make_tuple()));
706   EXPECT_EQ(2, ret.Perform(std::make_tuple()));
707   EXPECT_EQ(3, ret.Perform(std::make_tuple()));
708 }
709 
710 // Tests that ReturnRoundRobin(v) works with vectors
TEST(ReturnRoundRobinTest,WorksForVector)711 TEST(ReturnRoundRobinTest, WorksForVector) {
712   std::vector<double> v = {4.4, 5.5, 6.6};
713   Action<double()> ret = ReturnRoundRobin(v);
714 
715   EXPECT_EQ(4.4, ret.Perform(std::make_tuple()));
716   EXPECT_EQ(5.5, ret.Perform(std::make_tuple()));
717   EXPECT_EQ(6.6, ret.Perform(std::make_tuple()));
718   EXPECT_EQ(4.4, ret.Perform(std::make_tuple()));
719   EXPECT_EQ(5.5, ret.Perform(std::make_tuple()));
720   EXPECT_EQ(6.6, ret.Perform(std::make_tuple()));
721 }
722 
723 // Tests that DoDefault() does the default action for the mock method.
724 
725 class MockClass {
726  public:
MockClass()727   MockClass() {}
728 
729   MOCK_METHOD1(IntFunc, int(bool flag));  // NOLINT
730   MOCK_METHOD0(Foo, MyNonDefaultConstructible());
731   MOCK_METHOD0(MakeUnique, std::unique_ptr<int>());
732   MOCK_METHOD0(MakeUniqueBase, std::unique_ptr<Base>());
733   MOCK_METHOD0(MakeVectorUnique, std::vector<std::unique_ptr<int>>());
734   MOCK_METHOD1(TakeUnique, int(std::unique_ptr<int>));
735   MOCK_METHOD2(TakeUnique,
736                int(const std::unique_ptr<int>&, std::unique_ptr<int>));
737 
738  private:
739   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockClass);
740 };
741 
742 // Tests that DoDefault() returns the built-in default value for the
743 // return type by default.
TEST(DoDefaultTest,ReturnsBuiltInDefaultValueByDefault)744 TEST(DoDefaultTest, ReturnsBuiltInDefaultValueByDefault) {
745   MockClass mock;
746   EXPECT_CALL(mock, IntFunc(_)).WillOnce(DoDefault());
747   EXPECT_EQ(0, mock.IntFunc(true));
748 }
749 
750 // Tests that DoDefault() throws (when exceptions are enabled) or aborts
751 // the process when there is no built-in default value for the return type.
TEST(DoDefaultDeathTest,DiesForUnknowType)752 TEST(DoDefaultDeathTest, DiesForUnknowType) {
753   MockClass mock;
754   EXPECT_CALL(mock, Foo()).WillRepeatedly(DoDefault());
755 #if GTEST_HAS_EXCEPTIONS
756   EXPECT_ANY_THROW(mock.Foo());
757 #else
758   EXPECT_DEATH_IF_SUPPORTED({ mock.Foo(); }, "");
759 #endif
760 }
761 
762 // Tests that using DoDefault() inside a composite action leads to a
763 // run-time error.
764 
VoidFunc(bool)765 void VoidFunc(bool /* flag */) {}
766 
TEST(DoDefaultDeathTest,DiesIfUsedInCompositeAction)767 TEST(DoDefaultDeathTest, DiesIfUsedInCompositeAction) {
768   MockClass mock;
769   EXPECT_CALL(mock, IntFunc(_))
770       .WillRepeatedly(DoAll(Invoke(VoidFunc), DoDefault()));
771 
772   // Ideally we should verify the error message as well.  Sadly,
773   // EXPECT_DEATH() can only capture stderr, while Google Mock's
774   // errors are printed on stdout.  Therefore we have to settle for
775   // not verifying the message.
776   EXPECT_DEATH_IF_SUPPORTED({ mock.IntFunc(true); }, "");
777 }
778 
779 // Tests that DoDefault() returns the default value set by
780 // DefaultValue<T>::Set() when it's not overridden by an ON_CALL().
TEST(DoDefaultTest,ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne)781 TEST(DoDefaultTest, ReturnsUserSpecifiedPerTypeDefaultValueWhenThereIsOne) {
782   DefaultValue<int>::Set(1);
783   MockClass mock;
784   EXPECT_CALL(mock, IntFunc(_)).WillOnce(DoDefault());
785   EXPECT_EQ(1, mock.IntFunc(false));
786   DefaultValue<int>::Clear();
787 }
788 
789 // Tests that DoDefault() does the action specified by ON_CALL().
TEST(DoDefaultTest,DoesWhatOnCallSpecifies)790 TEST(DoDefaultTest, DoesWhatOnCallSpecifies) {
791   MockClass mock;
792   ON_CALL(mock, IntFunc(_)).WillByDefault(Return(2));
793   EXPECT_CALL(mock, IntFunc(_)).WillOnce(DoDefault());
794   EXPECT_EQ(2, mock.IntFunc(false));
795 }
796 
797 // Tests that using DoDefault() in ON_CALL() leads to a run-time failure.
TEST(DoDefaultTest,CannotBeUsedInOnCall)798 TEST(DoDefaultTest, CannotBeUsedInOnCall) {
799   MockClass mock;
800   EXPECT_NONFATAL_FAILURE(
801       {  // NOLINT
802         ON_CALL(mock, IntFunc(_)).WillByDefault(DoDefault());
803       },
804       "DoDefault() cannot be used in ON_CALL()");
805 }
806 
807 // Tests that SetArgPointee<N>(v) sets the variable pointed to by
808 // the N-th (0-based) argument to v.
TEST(SetArgPointeeTest,SetsTheNthPointee)809 TEST(SetArgPointeeTest, SetsTheNthPointee) {
810   typedef void MyFunction(bool, int*, char*);
811   Action<MyFunction> a = SetArgPointee<1>(2);
812 
813   int n = 0;
814   char ch = '\0';
815   a.Perform(std::make_tuple(true, &n, &ch));
816   EXPECT_EQ(2, n);
817   EXPECT_EQ('\0', ch);
818 
819   a = SetArgPointee<2>('a');
820   n = 0;
821   ch = '\0';
822   a.Perform(std::make_tuple(true, &n, &ch));
823   EXPECT_EQ(0, n);
824   EXPECT_EQ('a', ch);
825 }
826 
827 // Tests that SetArgPointee<N>() accepts a string literal.
TEST(SetArgPointeeTest,AcceptsStringLiteral)828 TEST(SetArgPointeeTest, AcceptsStringLiteral) {
829   typedef void MyFunction(std::string*, const char**);
830   Action<MyFunction> a = SetArgPointee<0>("hi");
831   std::string str;
832   const char* ptr = nullptr;
833   a.Perform(std::make_tuple(&str, &ptr));
834   EXPECT_EQ("hi", str);
835   EXPECT_TRUE(ptr == nullptr);
836 
837   a = SetArgPointee<1>("world");
838   str = "";
839   a.Perform(std::make_tuple(&str, &ptr));
840   EXPECT_EQ("", str);
841   EXPECT_STREQ("world", ptr);
842 }
843 
TEST(SetArgPointeeTest,AcceptsWideStringLiteral)844 TEST(SetArgPointeeTest, AcceptsWideStringLiteral) {
845   typedef void MyFunction(const wchar_t**);
846   Action<MyFunction> a = SetArgPointee<0>(L"world");
847   const wchar_t* ptr = nullptr;
848   a.Perform(std::make_tuple(&ptr));
849   EXPECT_STREQ(L"world", ptr);
850 
851 #if GTEST_HAS_STD_WSTRING
852 
853   typedef void MyStringFunction(std::wstring*);
854   Action<MyStringFunction> a2 = SetArgPointee<0>(L"world");
855   std::wstring str = L"";
856   a2.Perform(std::make_tuple(&str));
857   EXPECT_EQ(L"world", str);
858 
859 #endif
860 }
861 
862 // Tests that SetArgPointee<N>() accepts a char pointer.
TEST(SetArgPointeeTest,AcceptsCharPointer)863 TEST(SetArgPointeeTest, AcceptsCharPointer) {
864   typedef void MyFunction(bool, std::string*, const char**);
865   const char* const hi = "hi";
866   Action<MyFunction> a = SetArgPointee<1>(hi);
867   std::string str;
868   const char* ptr = nullptr;
869   a.Perform(std::make_tuple(true, &str, &ptr));
870   EXPECT_EQ("hi", str);
871   EXPECT_TRUE(ptr == nullptr);
872 
873   char world_array[] = "world";
874   char* const world = world_array;
875   a = SetArgPointee<2>(world);
876   str = "";
877   a.Perform(std::make_tuple(true, &str, &ptr));
878   EXPECT_EQ("", str);
879   EXPECT_EQ(world, ptr);
880 }
881 
TEST(SetArgPointeeTest,AcceptsWideCharPointer)882 TEST(SetArgPointeeTest, AcceptsWideCharPointer) {
883   typedef void MyFunction(bool, const wchar_t**);
884   const wchar_t* const hi = L"hi";
885   Action<MyFunction> a = SetArgPointee<1>(hi);
886   const wchar_t* ptr = nullptr;
887   a.Perform(std::make_tuple(true, &ptr));
888   EXPECT_EQ(hi, ptr);
889 
890 #if GTEST_HAS_STD_WSTRING
891 
892   typedef void MyStringFunction(bool, std::wstring*);
893   wchar_t world_array[] = L"world";
894   wchar_t* const world = world_array;
895   Action<MyStringFunction> a2 = SetArgPointee<1>(world);
896   std::wstring str;
897   a2.Perform(std::make_tuple(true, &str));
898   EXPECT_EQ(world_array, str);
899 #endif
900 }
901 
902 // Tests that SetArgumentPointee<N>(v) sets the variable pointed to by
903 // the N-th (0-based) argument to v.
TEST(SetArgumentPointeeTest,SetsTheNthPointee)904 TEST(SetArgumentPointeeTest, SetsTheNthPointee) {
905   typedef void MyFunction(bool, int*, char*);
906   Action<MyFunction> a = SetArgumentPointee<1>(2);
907 
908   int n = 0;
909   char ch = '\0';
910   a.Perform(std::make_tuple(true, &n, &ch));
911   EXPECT_EQ(2, n);
912   EXPECT_EQ('\0', ch);
913 
914   a = SetArgumentPointee<2>('a');
915   n = 0;
916   ch = '\0';
917   a.Perform(std::make_tuple(true, &n, &ch));
918   EXPECT_EQ(0, n);
919   EXPECT_EQ('a', ch);
920 }
921 
922 // Sample functions and functors for testing Invoke() and etc.
Nullary()923 int Nullary() { return 1; }
924 
925 class NullaryFunctor {
926  public:
operator ()()927   int operator()() { return 2; }
928 };
929 
930 bool g_done = false;
VoidNullary()931 void VoidNullary() { g_done = true; }
932 
933 class VoidNullaryFunctor {
934  public:
operator ()()935   void operator()() { g_done = true; }
936 };
937 
Short(short n)938 short Short(short n) { return n; }  // NOLINT
Char(char ch)939 char Char(char ch) { return ch; }
940 
CharPtr(const char * s)941 const char* CharPtr(const char* s) { return s; }
942 
Unary(int x)943 bool Unary(int x) { return x < 0; }
944 
Binary(const char * input,short n)945 const char* Binary(const char* input, short n) { return input + n; }  // NOLINT
946 
VoidBinary(int,char)947 void VoidBinary(int, char) { g_done = true; }
948 
Ternary(int x,char y,short z)949 int Ternary(int x, char y, short z) { return x + y + z; }  // NOLINT
950 
SumOf4(int a,int b,int c,int d)951 int SumOf4(int a, int b, int c, int d) { return a + b + c + d; }
952 
953 class Foo {
954  public:
Foo()955   Foo() : value_(123) {}
956 
Nullary() const957   int Nullary() const { return value_; }
958 
959  private:
960   int value_;
961 };
962 
963 // Tests InvokeWithoutArgs(function).
TEST(InvokeWithoutArgsTest,Function)964 TEST(InvokeWithoutArgsTest, Function) {
965   // As an action that takes one argument.
966   Action<int(int)> a = InvokeWithoutArgs(Nullary);  // NOLINT
967   EXPECT_EQ(1, a.Perform(std::make_tuple(2)));
968 
969   // As an action that takes two arguments.
970   Action<int(int, double)> a2 = InvokeWithoutArgs(Nullary);  // NOLINT
971   EXPECT_EQ(1, a2.Perform(std::make_tuple(2, 3.5)));
972 
973   // As an action that returns void.
974   Action<void(int)> a3 = InvokeWithoutArgs(VoidNullary);  // NOLINT
975   g_done = false;
976   a3.Perform(std::make_tuple(1));
977   EXPECT_TRUE(g_done);
978 }
979 
980 // Tests InvokeWithoutArgs(functor).
TEST(InvokeWithoutArgsTest,Functor)981 TEST(InvokeWithoutArgsTest, Functor) {
982   // As an action that takes no argument.
983   Action<int()> a = InvokeWithoutArgs(NullaryFunctor());  // NOLINT
984   EXPECT_EQ(2, a.Perform(std::make_tuple()));
985 
986   // As an action that takes three arguments.
987   Action<int(int, double, char)> a2 =  // NOLINT
988       InvokeWithoutArgs(NullaryFunctor());
989   EXPECT_EQ(2, a2.Perform(std::make_tuple(3, 3.5, 'a')));
990 
991   // As an action that returns void.
992   Action<void()> a3 = InvokeWithoutArgs(VoidNullaryFunctor());
993   g_done = false;
994   a3.Perform(std::make_tuple());
995   EXPECT_TRUE(g_done);
996 }
997 
998 // Tests InvokeWithoutArgs(obj_ptr, method).
TEST(InvokeWithoutArgsTest,Method)999 TEST(InvokeWithoutArgsTest, Method) {
1000   Foo foo;
1001   Action<int(bool, char)> a =  // NOLINT
1002       InvokeWithoutArgs(&foo, &Foo::Nullary);
1003   EXPECT_EQ(123, a.Perform(std::make_tuple(true, 'a')));
1004 }
1005 
1006 // Tests using IgnoreResult() on a polymorphic action.
TEST(IgnoreResultTest,PolymorphicAction)1007 TEST(IgnoreResultTest, PolymorphicAction) {
1008   Action<void(int)> a = IgnoreResult(Return(5));  // NOLINT
1009   a.Perform(std::make_tuple(1));
1010 }
1011 
1012 // Tests using IgnoreResult() on a monomorphic action.
1013 
ReturnOne()1014 int ReturnOne() {
1015   g_done = true;
1016   return 1;
1017 }
1018 
TEST(IgnoreResultTest,MonomorphicAction)1019 TEST(IgnoreResultTest, MonomorphicAction) {
1020   g_done = false;
1021   Action<void()> a = IgnoreResult(Invoke(ReturnOne));
1022   a.Perform(std::make_tuple());
1023   EXPECT_TRUE(g_done);
1024 }
1025 
1026 // Tests using IgnoreResult() on an action that returns a class type.
1027 
ReturnMyNonDefaultConstructible(double)1028 MyNonDefaultConstructible ReturnMyNonDefaultConstructible(double /* x */) {
1029   g_done = true;
1030   return MyNonDefaultConstructible(42);
1031 }
1032 
TEST(IgnoreResultTest,ActionReturningClass)1033 TEST(IgnoreResultTest, ActionReturningClass) {
1034   g_done = false;
1035   Action<void(int)> a =
1036       IgnoreResult(Invoke(ReturnMyNonDefaultConstructible));  // NOLINT
1037   a.Perform(std::make_tuple(2));
1038   EXPECT_TRUE(g_done);
1039 }
1040 
TEST(AssignTest,Int)1041 TEST(AssignTest, Int) {
1042   int x = 0;
1043   Action<void(int)> a = Assign(&x, 5);
1044   a.Perform(std::make_tuple(0));
1045   EXPECT_EQ(5, x);
1046 }
1047 
TEST(AssignTest,String)1048 TEST(AssignTest, String) {
1049   ::std::string x;
1050   Action<void(void)> a = Assign(&x, "Hello, world");
1051   a.Perform(std::make_tuple());
1052   EXPECT_EQ("Hello, world", x);
1053 }
1054 
TEST(AssignTest,CompatibleTypes)1055 TEST(AssignTest, CompatibleTypes) {
1056   double x = 0;
1057   Action<void(int)> a = Assign(&x, 5);
1058   a.Perform(std::make_tuple(0));
1059   EXPECT_DOUBLE_EQ(5, x);
1060 }
1061 
1062 // Tests using WithArgs and with an action that takes 1 argument.
TEST(WithArgsTest,OneArg)1063 TEST(WithArgsTest, OneArg) {
1064   Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary));  // NOLINT
1065   EXPECT_TRUE(a.Perform(std::make_tuple(1.5, -1)));
1066   EXPECT_FALSE(a.Perform(std::make_tuple(1.5, 1)));
1067 }
1068 
1069 // Tests using WithArgs with an action that takes 2 arguments.
TEST(WithArgsTest,TwoArgs)1070 TEST(WithArgsTest, TwoArgs) {
1071   Action<const char*(const char* s, double x, short n)> a =  // NOLINT
1072       WithArgs<0, 2>(Invoke(Binary));
1073   const char s[] = "Hello";
1074   EXPECT_EQ(s + 2, a.Perform(std::make_tuple(CharPtr(s), 0.5, Short(2))));
1075 }
1076 
1077 struct ConcatAll {
operator ()__anon2e4943020111::ConcatAll1078   std::string operator()() const { return {}; }
1079   template <typename... I>
operator ()__anon2e4943020111::ConcatAll1080   std::string operator()(const char* a, I... i) const {
1081     return a + ConcatAll()(i...);
1082   }
1083 };
1084 
1085 // Tests using WithArgs with an action that takes 10 arguments.
TEST(WithArgsTest,TenArgs)1086 TEST(WithArgsTest, TenArgs) {
1087   Action<std::string(const char*, const char*, const char*, const char*)> a =
1088       WithArgs<0, 1, 2, 3, 2, 1, 0, 1, 2, 3>(Invoke(ConcatAll{}));
1089   EXPECT_EQ("0123210123",
1090             a.Perform(std::make_tuple(CharPtr("0"), CharPtr("1"), CharPtr("2"),
1091                                       CharPtr("3"))));
1092 }
1093 
1094 // Tests using WithArgs with an action that is not Invoke().
1095 class SubtractAction : public ActionInterface<int(int, int)> {
1096  public:
Perform(const std::tuple<int,int> & args)1097   int Perform(const std::tuple<int, int>& args) override {
1098     return std::get<0>(args) - std::get<1>(args);
1099   }
1100 };
1101 
TEST(WithArgsTest,NonInvokeAction)1102 TEST(WithArgsTest, NonInvokeAction) {
1103   Action<int(const std::string&, int, int)> a =
1104       WithArgs<2, 1>(MakeAction(new SubtractAction));
1105   std::tuple<std::string, int, int> dummy =
1106       std::make_tuple(std::string("hi"), 2, 10);
1107   EXPECT_EQ(8, a.Perform(dummy));
1108 }
1109 
1110 // Tests using WithArgs to pass all original arguments in the original order.
TEST(WithArgsTest,Identity)1111 TEST(WithArgsTest, Identity) {
1112   Action<int(int x, char y, short z)> a =  // NOLINT
1113       WithArgs<0, 1, 2>(Invoke(Ternary));
1114   EXPECT_EQ(123, a.Perform(std::make_tuple(100, Char(20), Short(3))));
1115 }
1116 
1117 // Tests using WithArgs with repeated arguments.
TEST(WithArgsTest,RepeatedArguments)1118 TEST(WithArgsTest, RepeatedArguments) {
1119   Action<int(bool, int m, int n)> a =  // NOLINT
1120       WithArgs<1, 1, 1, 1>(Invoke(SumOf4));
1121   EXPECT_EQ(4, a.Perform(std::make_tuple(false, 1, 10)));
1122 }
1123 
1124 // Tests using WithArgs with reversed argument order.
TEST(WithArgsTest,ReversedArgumentOrder)1125 TEST(WithArgsTest, ReversedArgumentOrder) {
1126   Action<const char*(short n, const char* input)> a =  // NOLINT
1127       WithArgs<1, 0>(Invoke(Binary));
1128   const char s[] = "Hello";
1129   EXPECT_EQ(s + 2, a.Perform(std::make_tuple(Short(2), CharPtr(s))));
1130 }
1131 
1132 // Tests using WithArgs with compatible, but not identical, argument types.
TEST(WithArgsTest,ArgsOfCompatibleTypes)1133 TEST(WithArgsTest, ArgsOfCompatibleTypes) {
1134   Action<long(short x, char y, double z, char c)> a =  // NOLINT
1135       WithArgs<0, 1, 3>(Invoke(Ternary));
1136   EXPECT_EQ(123,
1137             a.Perform(std::make_tuple(Short(100), Char(20), 5.6, Char(3))));
1138 }
1139 
1140 // Tests using WithArgs with an action that returns void.
TEST(WithArgsTest,VoidAction)1141 TEST(WithArgsTest, VoidAction) {
1142   Action<void(double x, char c, int n)> a = WithArgs<2, 1>(Invoke(VoidBinary));
1143   g_done = false;
1144   a.Perform(std::make_tuple(1.5, 'a', 3));
1145   EXPECT_TRUE(g_done);
1146 }
1147 
TEST(WithArgsTest,ReturnReference)1148 TEST(WithArgsTest, ReturnReference) {
1149   Action<int&(int&, void*)> aa = WithArgs<0>([](int& a) -> int& { return a; });
1150   int i = 0;
1151   const int& res = aa.Perform(std::forward_as_tuple(i, nullptr));
1152   EXPECT_EQ(&i, &res);
1153 }
1154 
TEST(WithArgsTest,InnerActionWithConversion)1155 TEST(WithArgsTest, InnerActionWithConversion) {
1156   Action<Derived*()> inner = [] { return nullptr; };
1157   Action<Base*(double)> a = testing::WithoutArgs(inner);
1158   EXPECT_EQ(nullptr, a.Perform(std::make_tuple(1.1)));
1159 }
1160 
1161 #if !GTEST_OS_WINDOWS_MOBILE
1162 
1163 class SetErrnoAndReturnTest : public testing::Test {
1164  protected:
SetUp()1165   void SetUp() override { errno = 0; }
TearDown()1166   void TearDown() override { errno = 0; }
1167 };
1168 
TEST_F(SetErrnoAndReturnTest,Int)1169 TEST_F(SetErrnoAndReturnTest, Int) {
1170   Action<int(void)> a = SetErrnoAndReturn(ENOTTY, -5);
1171   EXPECT_EQ(-5, a.Perform(std::make_tuple()));
1172   EXPECT_EQ(ENOTTY, errno);
1173 }
1174 
TEST_F(SetErrnoAndReturnTest,Ptr)1175 TEST_F(SetErrnoAndReturnTest, Ptr) {
1176   int x;
1177   Action<int*(void)> a = SetErrnoAndReturn(ENOTTY, &x);
1178   EXPECT_EQ(&x, a.Perform(std::make_tuple()));
1179   EXPECT_EQ(ENOTTY, errno);
1180 }
1181 
TEST_F(SetErrnoAndReturnTest,CompatibleTypes)1182 TEST_F(SetErrnoAndReturnTest, CompatibleTypes) {
1183   Action<double()> a = SetErrnoAndReturn(EINVAL, 5);
1184   EXPECT_DOUBLE_EQ(5.0, a.Perform(std::make_tuple()));
1185   EXPECT_EQ(EINVAL, errno);
1186 }
1187 
1188 #endif  // !GTEST_OS_WINDOWS_MOBILE
1189 
1190 // Tests ByRef().
1191 
1192 // Tests that the result of ByRef() is copyable.
TEST(ByRefTest,IsCopyable)1193 TEST(ByRefTest, IsCopyable) {
1194   const std::string s1 = "Hi";
1195   const std::string s2 = "Hello";
1196 
1197   auto ref_wrapper = ByRef(s1);
1198   const std::string& r1 = ref_wrapper;
1199   EXPECT_EQ(&s1, &r1);
1200 
1201   // Assigns a new value to ref_wrapper.
1202   ref_wrapper = ByRef(s2);
1203   const std::string& r2 = ref_wrapper;
1204   EXPECT_EQ(&s2, &r2);
1205 
1206   auto ref_wrapper1 = ByRef(s1);
1207   // Copies ref_wrapper1 to ref_wrapper.
1208   ref_wrapper = ref_wrapper1;
1209   const std::string& r3 = ref_wrapper;
1210   EXPECT_EQ(&s1, &r3);
1211 }
1212 
1213 // Tests using ByRef() on a const value.
TEST(ByRefTest,ConstValue)1214 TEST(ByRefTest, ConstValue) {
1215   const int n = 0;
1216   // int& ref = ByRef(n);  // This shouldn't compile - we have a
1217   // negative compilation test to catch it.
1218   const int& const_ref = ByRef(n);
1219   EXPECT_EQ(&n, &const_ref);
1220 }
1221 
1222 // Tests using ByRef() on a non-const value.
TEST(ByRefTest,NonConstValue)1223 TEST(ByRefTest, NonConstValue) {
1224   int n = 0;
1225 
1226   // ByRef(n) can be used as either an int&,
1227   int& ref = ByRef(n);
1228   EXPECT_EQ(&n, &ref);
1229 
1230   // or a const int&.
1231   const int& const_ref = ByRef(n);
1232   EXPECT_EQ(&n, &const_ref);
1233 }
1234 
1235 // Tests explicitly specifying the type when using ByRef().
TEST(ByRefTest,ExplicitType)1236 TEST(ByRefTest, ExplicitType) {
1237   int n = 0;
1238   const int& r1 = ByRef<const int>(n);
1239   EXPECT_EQ(&n, &r1);
1240 
1241   // ByRef<char>(n);  // This shouldn't compile - we have a negative
1242   // compilation test to catch it.
1243 
1244   Derived d;
1245   Derived& r2 = ByRef<Derived>(d);
1246   EXPECT_EQ(&d, &r2);
1247 
1248   const Derived& r3 = ByRef<const Derived>(d);
1249   EXPECT_EQ(&d, &r3);
1250 
1251   Base& r4 = ByRef<Base>(d);
1252   EXPECT_EQ(&d, &r4);
1253 
1254   const Base& r5 = ByRef<const Base>(d);
1255   EXPECT_EQ(&d, &r5);
1256 
1257   // The following shouldn't compile - we have a negative compilation
1258   // test for it.
1259   //
1260   // Base b;
1261   // ByRef<Derived>(b);
1262 }
1263 
1264 // Tests that Google Mock prints expression ByRef(x) as a reference to x.
TEST(ByRefTest,PrintsCorrectly)1265 TEST(ByRefTest, PrintsCorrectly) {
1266   int n = 42;
1267   ::std::stringstream expected, actual;
1268   testing::internal::UniversalPrinter<const int&>::Print(n, &expected);
1269   testing::internal::UniversalPrint(ByRef(n), &actual);
1270   EXPECT_EQ(expected.str(), actual.str());
1271 }
1272 
1273 struct UnaryConstructorClass {
UnaryConstructorClass__anon2e4943020111::UnaryConstructorClass1274   explicit UnaryConstructorClass(int v) : value(v) {}
1275   int value;
1276 };
1277 
1278 // Tests using ReturnNew() with a unary constructor.
TEST(ReturnNewTest,Unary)1279 TEST(ReturnNewTest, Unary) {
1280   Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
1281   UnaryConstructorClass* c = a.Perform(std::make_tuple());
1282   EXPECT_EQ(4000, c->value);
1283   delete c;
1284 }
1285 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodHasArgs)1286 TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
1287   Action<UnaryConstructorClass*(bool, int)> a =
1288       ReturnNew<UnaryConstructorClass>(4000);
1289   UnaryConstructorClass* c = a.Perform(std::make_tuple(false, 5));
1290   EXPECT_EQ(4000, c->value);
1291   delete c;
1292 }
1293 
TEST(ReturnNewTest,UnaryWorksWhenMockMethodReturnsPointerToConst)1294 TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
1295   Action<const UnaryConstructorClass*()> a =
1296       ReturnNew<UnaryConstructorClass>(4000);
1297   const UnaryConstructorClass* c = a.Perform(std::make_tuple());
1298   EXPECT_EQ(4000, c->value);
1299   delete c;
1300 }
1301 
1302 class TenArgConstructorClass {
1303  public:
TenArgConstructorClass(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)1304   TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
1305                          int a8, int a9, int a10)
1306       : value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {}
1307   int value_;
1308 };
1309 
1310 // Tests using ReturnNew() with a 10-argument constructor.
TEST(ReturnNewTest,ConstructorThatTakes10Arguments)1311 TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
1312   Action<TenArgConstructorClass*()> a = ReturnNew<TenArgConstructorClass>(
1313       1000000000, 200000000, 30000000, 4000000, 500000, 60000, 7000, 800, 90,
1314       0);
1315   TenArgConstructorClass* c = a.Perform(std::make_tuple());
1316   EXPECT_EQ(1234567890, c->value_);
1317   delete c;
1318 }
1319 
UniquePtrSource()1320 std::unique_ptr<int> UniquePtrSource() {
1321   return std::unique_ptr<int>(new int(19));
1322 }
1323 
VectorUniquePtrSource()1324 std::vector<std::unique_ptr<int>> VectorUniquePtrSource() {
1325   std::vector<std::unique_ptr<int>> out;
1326   out.emplace_back(new int(7));
1327   return out;
1328 }
1329 
TEST(MockMethodTest,CanReturnMoveOnlyValue_Return)1330 TEST(MockMethodTest, CanReturnMoveOnlyValue_Return) {
1331   MockClass mock;
1332   std::unique_ptr<int> i(new int(19));
1333   EXPECT_CALL(mock, MakeUnique()).WillOnce(Return(ByMove(std::move(i))));
1334   EXPECT_CALL(mock, MakeVectorUnique())
1335       .WillOnce(Return(ByMove(VectorUniquePtrSource())));
1336   Derived* d = new Derived;
1337   EXPECT_CALL(mock, MakeUniqueBase())
1338       .WillOnce(Return(ByMove(std::unique_ptr<Derived>(d))));
1339 
1340   std::unique_ptr<int> result1 = mock.MakeUnique();
1341   EXPECT_EQ(19, *result1);
1342 
1343   std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique();
1344   EXPECT_EQ(1u, vresult.size());
1345   EXPECT_NE(nullptr, vresult[0]);
1346   EXPECT_EQ(7, *vresult[0]);
1347 
1348   std::unique_ptr<Base> result2 = mock.MakeUniqueBase();
1349   EXPECT_EQ(d, result2.get());
1350 }
1351 
TEST(MockMethodTest,CanReturnMoveOnlyValue_DoAllReturn)1352 TEST(MockMethodTest, CanReturnMoveOnlyValue_DoAllReturn) {
1353   testing::MockFunction<void()> mock_function;
1354   MockClass mock;
1355   std::unique_ptr<int> i(new int(19));
1356   EXPECT_CALL(mock_function, Call());
1357   EXPECT_CALL(mock, MakeUnique())
1358       .WillOnce(DoAll(InvokeWithoutArgs(&mock_function,
1359                                         &testing::MockFunction<void()>::Call),
1360                       Return(ByMove(std::move(i)))));
1361 
1362   std::unique_ptr<int> result1 = mock.MakeUnique();
1363   EXPECT_EQ(19, *result1);
1364 }
1365 
TEST(MockMethodTest,CanReturnMoveOnlyValue_Invoke)1366 TEST(MockMethodTest, CanReturnMoveOnlyValue_Invoke) {
1367   MockClass mock;
1368 
1369   // Check default value
1370   DefaultValue<std::unique_ptr<int>>::SetFactory(
1371       [] { return std::unique_ptr<int>(new int(42)); });
1372   EXPECT_EQ(42, *mock.MakeUnique());
1373 
1374   EXPECT_CALL(mock, MakeUnique()).WillRepeatedly(Invoke(UniquePtrSource));
1375   EXPECT_CALL(mock, MakeVectorUnique())
1376       .WillRepeatedly(Invoke(VectorUniquePtrSource));
1377   std::unique_ptr<int> result1 = mock.MakeUnique();
1378   EXPECT_EQ(19, *result1);
1379   std::unique_ptr<int> result2 = mock.MakeUnique();
1380   EXPECT_EQ(19, *result2);
1381   EXPECT_NE(result1, result2);
1382 
1383   std::vector<std::unique_ptr<int>> vresult = mock.MakeVectorUnique();
1384   EXPECT_EQ(1u, vresult.size());
1385   EXPECT_NE(nullptr, vresult[0]);
1386   EXPECT_EQ(7, *vresult[0]);
1387 }
1388 
TEST(MockMethodTest,CanTakeMoveOnlyValue)1389 TEST(MockMethodTest, CanTakeMoveOnlyValue) {
1390   MockClass mock;
1391   auto make = [](int i) { return std::unique_ptr<int>(new int(i)); };
1392 
1393   EXPECT_CALL(mock, TakeUnique(_)).WillRepeatedly([](std::unique_ptr<int> i) {
1394     return *i;
1395   });
1396   // DoAll() does not compile, since it would move from its arguments twice.
1397   // EXPECT_CALL(mock, TakeUnique(_, _))
1398   //     .WillRepeatedly(DoAll(Invoke([](std::unique_ptr<int> j) {}),
1399   //     Return(1)));
1400   EXPECT_CALL(mock, TakeUnique(testing::Pointee(7)))
1401       .WillOnce(Return(-7))
1402       .RetiresOnSaturation();
1403   EXPECT_CALL(mock, TakeUnique(testing::IsNull()))
1404       .WillOnce(Return(-1))
1405       .RetiresOnSaturation();
1406 
1407   EXPECT_EQ(5, mock.TakeUnique(make(5)));
1408   EXPECT_EQ(-7, mock.TakeUnique(make(7)));
1409   EXPECT_EQ(7, mock.TakeUnique(make(7)));
1410   EXPECT_EQ(7, mock.TakeUnique(make(7)));
1411   EXPECT_EQ(-1, mock.TakeUnique({}));
1412 
1413   // Some arguments are moved, some passed by reference.
1414   auto lvalue = make(6);
1415   EXPECT_CALL(mock, TakeUnique(_, _))
1416       .WillOnce([](const std::unique_ptr<int>& i, std::unique_ptr<int> j) {
1417         return *i * *j;
1418       });
1419   EXPECT_EQ(42, mock.TakeUnique(lvalue, make(7)));
1420 
1421   // The unique_ptr can be saved by the action.
1422   std::unique_ptr<int> saved;
1423   EXPECT_CALL(mock, TakeUnique(_)).WillOnce([&saved](std::unique_ptr<int> i) {
1424     saved = std::move(i);
1425     return 0;
1426   });
1427   EXPECT_EQ(0, mock.TakeUnique(make(42)));
1428   EXPECT_EQ(42, *saved);
1429 }
1430 
1431 // Tests for std::function based action.
1432 
Add(int val,int & ref,int * ptr)1433 int Add(int val, int& ref, int* ptr) {  // NOLINT
1434   int result = val + ref + *ptr;
1435   ref = 42;
1436   *ptr = 43;
1437   return result;
1438 }
1439 
Deref(std::unique_ptr<int> ptr)1440 int Deref(std::unique_ptr<int> ptr) { return *ptr; }
1441 
1442 struct Double {
1443   template <typename T>
operator ()__anon2e4943020111::Double1444   T operator()(T t) {
1445     return 2 * t;
1446   }
1447 };
1448 
UniqueInt(int i)1449 std::unique_ptr<int> UniqueInt(int i) {
1450   return std::unique_ptr<int>(new int(i));
1451 }
1452 
TEST(FunctorActionTest,ActionFromFunction)1453 TEST(FunctorActionTest, ActionFromFunction) {
1454   Action<int(int, int&, int*)> a = &Add;
1455   int x = 1, y = 2, z = 3;
1456   EXPECT_EQ(6, a.Perform(std::forward_as_tuple(x, y, &z)));
1457   EXPECT_EQ(42, y);
1458   EXPECT_EQ(43, z);
1459 
1460   Action<int(std::unique_ptr<int>)> a1 = &Deref;
1461   EXPECT_EQ(7, a1.Perform(std::make_tuple(UniqueInt(7))));
1462 }
1463 
TEST(FunctorActionTest,ActionFromLambda)1464 TEST(FunctorActionTest, ActionFromLambda) {
1465   Action<int(bool, int)> a1 = [](bool b, int i) { return b ? i : 0; };
1466   EXPECT_EQ(5, a1.Perform(std::make_tuple(true, 5)));
1467   EXPECT_EQ(0, a1.Perform(std::make_tuple(false, 5)));
1468 
1469   std::unique_ptr<int> saved;
1470   Action<void(std::unique_ptr<int>)> a2 = [&saved](std::unique_ptr<int> p) {
1471     saved = std::move(p);
1472   };
1473   a2.Perform(std::make_tuple(UniqueInt(5)));
1474   EXPECT_EQ(5, *saved);
1475 }
1476 
TEST(FunctorActionTest,PolymorphicFunctor)1477 TEST(FunctorActionTest, PolymorphicFunctor) {
1478   Action<int(int)> ai = Double();
1479   EXPECT_EQ(2, ai.Perform(std::make_tuple(1)));
1480   Action<double(double)> ad = Double();  // Double? Double double!
1481   EXPECT_EQ(3.0, ad.Perform(std::make_tuple(1.5)));
1482 }
1483 
TEST(FunctorActionTest,TypeConversion)1484 TEST(FunctorActionTest, TypeConversion) {
1485   // Numeric promotions are allowed.
1486   const Action<bool(int)> a1 = [](int i) { return i > 1; };
1487   const Action<int(bool)> a2 = Action<int(bool)>(a1);
1488   EXPECT_EQ(1, a1.Perform(std::make_tuple(42)));
1489   EXPECT_EQ(0, a2.Perform(std::make_tuple(42)));
1490 
1491   // Implicit constructors are allowed.
1492   const Action<bool(std::string)> s1 = [](std::string s) { return !s.empty(); };
1493   const Action<int(const char*)> s2 = Action<int(const char*)>(s1);
1494   EXPECT_EQ(0, s2.Perform(std::make_tuple("")));
1495   EXPECT_EQ(1, s2.Perform(std::make_tuple("hello")));
1496 
1497   // Also between the lambda and the action itself.
1498   const Action<bool(std::string)> x1 = [](Unused) { return 42; };
1499   const Action<bool(std::string)> x2 = [] { return 42; };
1500   EXPECT_TRUE(x1.Perform(std::make_tuple("hello")));
1501   EXPECT_TRUE(x2.Perform(std::make_tuple("hello")));
1502 
1503   // Ensure decay occurs where required.
1504   std::function<int()> f = [] { return 7; };
1505   Action<int(int)> d = f;
1506   f = nullptr;
1507   EXPECT_EQ(7, d.Perform(std::make_tuple(1)));
1508 
1509   // Ensure creation of an empty action succeeds.
1510   Action<void(int)>(nullptr);
1511 }
1512 
TEST(FunctorActionTest,UnusedArguments)1513 TEST(FunctorActionTest, UnusedArguments) {
1514   // Verify that users can ignore uninteresting arguments.
1515   Action<int(int, double y, double z)> a = [](int i, Unused, Unused) {
1516     return 2 * i;
1517   };
1518   std::tuple<int, double, double> dummy = std::make_tuple(3, 7.3, 9.44);
1519   EXPECT_EQ(6, a.Perform(dummy));
1520 }
1521 
1522 // Test that basic built-in actions work with move-only arguments.
TEST(MoveOnlyArgumentsTest,ReturningActions)1523 TEST(MoveOnlyArgumentsTest, ReturningActions) {
1524   Action<int(std::unique_ptr<int>)> a = Return(1);
1525   EXPECT_EQ(1, a.Perform(std::make_tuple(nullptr)));
1526 
1527   a = testing::WithoutArgs([]() { return 7; });
1528   EXPECT_EQ(7, a.Perform(std::make_tuple(nullptr)));
1529 
1530   Action<void(std::unique_ptr<int>, int*)> a2 = testing::SetArgPointee<1>(3);
1531   int x = 0;
1532   a2.Perform(std::make_tuple(nullptr, &x));
1533   EXPECT_EQ(x, 3);
1534 }
1535 
ACTION(ReturnArity)1536 ACTION(ReturnArity) { return std::tuple_size<args_type>::value; }
1537 
TEST(ActionMacro,LargeArity)1538 TEST(ActionMacro, LargeArity) {
1539   EXPECT_EQ(
1540       1, testing::Action<int(int)>(ReturnArity()).Perform(std::make_tuple(0)));
1541   EXPECT_EQ(
1542       10,
1543       testing::Action<int(int, int, int, int, int, int, int, int, int, int)>(
1544           ReturnArity())
1545           .Perform(std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)));
1546   EXPECT_EQ(
1547       20,
1548       testing::Action<int(int, int, int, int, int, int, int, int, int, int, int,
1549                           int, int, int, int, int, int, int, int, int)>(
1550           ReturnArity())
1551           .Perform(std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
1552                                    14, 15, 16, 17, 18, 19)));
1553 }
1554 
1555 }  // Unnamed namespace
1556 
1557 #ifdef _MSC_VER
1558 #if _MSC_VER == 1900
1559 #pragma warning(pop)
1560 #endif
1561 #endif
1562