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