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