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 function mocker classes.
33 #include "gmock/gmock-function-mocker.h"
34
35 #if GTEST_OS_WINDOWS
36 // MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
37 // we are getting compiler errors if we use basetyps.h, hence including
38 // objbase.h for definition of STDMETHOD.
39 #include <objbase.h>
40 #endif // GTEST_OS_WINDOWS
41
42 #include <functional>
43 #include <map>
44 #include <string>
45 #include <type_traits>
46
47 #include "gmock/gmock.h"
48 #include "gtest/gtest.h"
49
50 namespace testing {
51 namespace gmock_function_mocker_test {
52
53 using testing::_;
54 using testing::A;
55 using testing::An;
56 using testing::AnyNumber;
57 using testing::Const;
58 using testing::DoDefault;
59 using testing::Eq;
60 using testing::Lt;
61 using testing::MockFunction;
62 using testing::Ref;
63 using testing::Return;
64 using testing::ReturnRef;
65 using testing::TypedEq;
66
67 template <typename T>
68 class TemplatedCopyable {
69 public:
TemplatedCopyable()70 TemplatedCopyable() {}
71
72 template <typename U>
TemplatedCopyable(const U & other)73 TemplatedCopyable(const U& other) {} // NOLINT
74 };
75
76 class FooInterface {
77 public:
~FooInterface()78 virtual ~FooInterface() {}
79
80 virtual void VoidReturning(int x) = 0;
81
82 virtual int Nullary() = 0;
83 virtual bool Unary(int x) = 0;
84 virtual long Binary(short x, int y) = 0; // NOLINT
85 virtual int Decimal(bool b, char c, short d, int e, long f, // NOLINT
86 float g, double h, unsigned i, char* j,
87 const std::string& k) = 0;
88
89 virtual bool TakesNonConstReference(int& n) = 0; // NOLINT
90 virtual std::string TakesConstReference(const int& n) = 0;
91 virtual bool TakesConst(const int x) = 0;
92
93 virtual int OverloadedOnArgumentNumber() = 0;
94 virtual int OverloadedOnArgumentNumber(int n) = 0;
95
96 virtual int OverloadedOnArgumentType(int n) = 0;
97 virtual char OverloadedOnArgumentType(char c) = 0;
98
99 virtual int OverloadedOnConstness() = 0;
100 virtual char OverloadedOnConstness() const = 0;
101
102 virtual int TypeWithHole(int (*func)()) = 0;
103 virtual int TypeWithComma(const std::map<int, std::string>& a_map) = 0;
104 virtual int TypeWithTemplatedCopyCtor(const TemplatedCopyable<int>&) = 0;
105
106 virtual int (*ReturnsFunctionPointer1(int))(bool) = 0;
107 using fn_ptr = int (*)(bool);
108 virtual fn_ptr ReturnsFunctionPointer2(int) = 0;
109
110 virtual int RefQualifiedConstRef() const& = 0;
111 virtual int RefQualifiedConstRefRef() const&& = 0;
112 virtual int RefQualifiedRef() & = 0;
113 virtual int RefQualifiedRefRef() && = 0;
114
115 virtual int RefQualifiedOverloaded() const& = 0;
116 virtual int RefQualifiedOverloaded() const&& = 0;
117 virtual int RefQualifiedOverloaded() & = 0;
118 virtual int RefQualifiedOverloaded() && = 0;
119
120 #if GTEST_OS_WINDOWS
121 STDMETHOD_(int, CTNullary)() = 0;
122 STDMETHOD_(bool, CTUnary)(int x) = 0;
123 STDMETHOD_(int, CTDecimal)
124 (bool b, char c, short d, int e, long f, // NOLINT
125 float g, double h, unsigned i, char* j, const std::string& k) = 0;
126 STDMETHOD_(char, CTConst)(int x) const = 0;
127 #endif // GTEST_OS_WINDOWS
128 };
129
130 // Const qualifiers on arguments were once (incorrectly) considered
131 // significant in determining whether two virtual functions had the same
132 // signature. This was fixed in Visual Studio 2008. However, the compiler
133 // still emits a warning that alerts about this change in behavior.
134 #ifdef _MSC_VER
135 #pragma warning(push)
136 #pragma warning(disable : 4373)
137 #endif
138 class MockFoo : public FooInterface {
139 public:
MockFoo()140 MockFoo() {}
141
142 // Makes sure that a mock function parameter can be named.
143 MOCK_METHOD(void, VoidReturning, (int n)); // NOLINT
144
145 MOCK_METHOD(int, Nullary, ()); // NOLINT
146
147 // Makes sure that a mock function parameter can be unnamed.
148 MOCK_METHOD(bool, Unary, (int)); // NOLINT
149 MOCK_METHOD(long, Binary, (short, int)); // NOLINT
150 MOCK_METHOD(int, Decimal,
151 (bool, char, short, int, long, float, // NOLINT
152 double, unsigned, char*, const std::string& str),
153 (override));
154
155 MOCK_METHOD(bool, TakesNonConstReference, (int&)); // NOLINT
156 MOCK_METHOD(std::string, TakesConstReference, (const int&));
157 MOCK_METHOD(bool, TakesConst, (const int)); // NOLINT
158
159 // Tests that the function return type can contain unprotected comma.
160 MOCK_METHOD((std::map<int, std::string>), ReturnTypeWithComma, (), ());
161 MOCK_METHOD((std::map<int, std::string>), ReturnTypeWithComma, (int),
162 (const)); // NOLINT
163
164 MOCK_METHOD(int, OverloadedOnArgumentNumber, ()); // NOLINT
165 MOCK_METHOD(int, OverloadedOnArgumentNumber, (int)); // NOLINT
166
167 MOCK_METHOD(int, OverloadedOnArgumentType, (int)); // NOLINT
168 MOCK_METHOD(char, OverloadedOnArgumentType, (char)); // NOLINT
169
170 MOCK_METHOD(int, OverloadedOnConstness, (), (override)); // NOLINT
171 MOCK_METHOD(char, OverloadedOnConstness, (), (override, const)); // NOLINT
172
173 MOCK_METHOD(int, TypeWithHole, (int (*)()), ()); // NOLINT
174 MOCK_METHOD(int, TypeWithComma, ((const std::map<int, std::string>&)));
175 MOCK_METHOD(int, TypeWithTemplatedCopyCtor,
176 (const TemplatedCopyable<int>&)); // NOLINT
177
178 MOCK_METHOD(int (*)(bool), ReturnsFunctionPointer1, (int), ());
179 MOCK_METHOD(fn_ptr, ReturnsFunctionPointer2, (int), ());
180
181 #if GTEST_OS_WINDOWS
182 MOCK_METHOD(int, CTNullary, (), (Calltype(STDMETHODCALLTYPE)));
183 MOCK_METHOD(bool, CTUnary, (int), (Calltype(STDMETHODCALLTYPE)));
184 MOCK_METHOD(int, CTDecimal,
185 (bool b, char c, short d, int e, long f, float g, double h,
186 unsigned i, char* j, const std::string& k),
187 (Calltype(STDMETHODCALLTYPE)));
188 MOCK_METHOD(char, CTConst, (int), (const, Calltype(STDMETHODCALLTYPE)));
189 MOCK_METHOD((std::map<int, std::string>), CTReturnTypeWithComma, (),
190 (Calltype(STDMETHODCALLTYPE)));
191 #endif // GTEST_OS_WINDOWS
192
193 // Test reference qualified functions.
194 MOCK_METHOD(int, RefQualifiedConstRef, (), (const, ref(&), override));
195 MOCK_METHOD(int, RefQualifiedConstRefRef, (), (const, ref(&&), override));
196 MOCK_METHOD(int, RefQualifiedRef, (), (ref(&), override));
197 MOCK_METHOD(int, RefQualifiedRefRef, (), (ref(&&), override));
198
199 MOCK_METHOD(int, RefQualifiedOverloaded, (), (const, ref(&), override));
200 MOCK_METHOD(int, RefQualifiedOverloaded, (), (const, ref(&&), override));
201 MOCK_METHOD(int, RefQualifiedOverloaded, (), (ref(&), override));
202 MOCK_METHOD(int, RefQualifiedOverloaded, (), (ref(&&), override));
203
204 private:
205 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
206 };
207
208 class LegacyMockFoo : public FooInterface {
209 public:
LegacyMockFoo()210 LegacyMockFoo() {}
211
212 // Makes sure that a mock function parameter can be named.
213 MOCK_METHOD1(VoidReturning, void(int n)); // NOLINT
214
215 MOCK_METHOD0(Nullary, int()); // NOLINT
216
217 // Makes sure that a mock function parameter can be unnamed.
218 MOCK_METHOD1(Unary, bool(int)); // NOLINT
219 MOCK_METHOD2(Binary, long(short, int)); // NOLINT
220 MOCK_METHOD10(Decimal, int(bool, char, short, int, long, float, // NOLINT
221 double, unsigned, char*, const std::string& str));
222
223 MOCK_METHOD1(TakesNonConstReference, bool(int&)); // NOLINT
224 MOCK_METHOD1(TakesConstReference, std::string(const int&));
225 MOCK_METHOD1(TakesConst, bool(const int)); // NOLINT
226
227 // Tests that the function return type can contain unprotected comma.
228 MOCK_METHOD0(ReturnTypeWithComma, std::map<int, std::string>());
229 MOCK_CONST_METHOD1(ReturnTypeWithComma,
230 std::map<int, std::string>(int)); // NOLINT
231
232 MOCK_METHOD0(OverloadedOnArgumentNumber, int()); // NOLINT
233 MOCK_METHOD1(OverloadedOnArgumentNumber, int(int)); // NOLINT
234
235 MOCK_METHOD1(OverloadedOnArgumentType, int(int)); // NOLINT
236 MOCK_METHOD1(OverloadedOnArgumentType, char(char)); // NOLINT
237
238 MOCK_METHOD0(OverloadedOnConstness, int()); // NOLINT
239 MOCK_CONST_METHOD0(OverloadedOnConstness, char()); // NOLINT
240
241 MOCK_METHOD1(TypeWithHole, int(int (*)())); // NOLINT
242 MOCK_METHOD1(TypeWithComma,
243 int(const std::map<int, std::string>&)); // NOLINT
244 MOCK_METHOD1(TypeWithTemplatedCopyCtor,
245 int(const TemplatedCopyable<int>&)); // NOLINT
246
247 MOCK_METHOD1(ReturnsFunctionPointer1, int (*(int))(bool));
248 MOCK_METHOD1(ReturnsFunctionPointer2, fn_ptr(int));
249
250 #if GTEST_OS_WINDOWS
251 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTNullary, int());
252 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTUnary, bool(int)); // NOLINT
253 MOCK_METHOD10_WITH_CALLTYPE(STDMETHODCALLTYPE, CTDecimal,
254 int(bool b, char c, short d, int e, // NOLINT
255 long f, float g, double h, // NOLINT
256 unsigned i, char* j, const std::string& k));
257 MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTConst,
258 char(int)); // NOLINT
259
260 // Tests that the function return type can contain unprotected comma.
261 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTReturnTypeWithComma,
262 std::map<int, std::string>());
263 #endif // GTEST_OS_WINDOWS
264
265 // We can't mock these with the old macros, but we need to define them to make
266 // it concrete.
RefQualifiedConstRef() const267 int RefQualifiedConstRef() const& override { return 0; }
RefQualifiedConstRefRef() const268 int RefQualifiedConstRefRef() const&& override { return 0; }
RefQualifiedRef()269 int RefQualifiedRef() & override { return 0; }
RefQualifiedRefRef()270 int RefQualifiedRefRef() && override { return 0; }
RefQualifiedOverloaded() const271 int RefQualifiedOverloaded() const& override { return 0; }
RefQualifiedOverloaded() const272 int RefQualifiedOverloaded() const&& override { return 0; }
RefQualifiedOverloaded()273 int RefQualifiedOverloaded() & override { return 0; }
RefQualifiedOverloaded()274 int RefQualifiedOverloaded() && override { return 0; }
275
276 private:
277 GTEST_DISALLOW_COPY_AND_ASSIGN_(LegacyMockFoo);
278 };
279
280 #ifdef _MSC_VER
281 #pragma warning(pop)
282 #endif
283
284 template <class T>
285 class FunctionMockerTest : public testing::Test {
286 protected:
FunctionMockerTest()287 FunctionMockerTest() : foo_(&mock_foo_) {}
288
289 FooInterface* const foo_;
290 T mock_foo_;
291 };
292 using FunctionMockerTestTypes = ::testing::Types<MockFoo, LegacyMockFoo>;
293 TYPED_TEST_SUITE(FunctionMockerTest, FunctionMockerTestTypes);
294
295 // Tests mocking a void-returning function.
TYPED_TEST(FunctionMockerTest,MocksVoidFunction)296 TYPED_TEST(FunctionMockerTest, MocksVoidFunction) {
297 EXPECT_CALL(this->mock_foo_, VoidReturning(Lt(100)));
298 this->foo_->VoidReturning(0);
299 }
300
301 // Tests mocking a nullary function.
TYPED_TEST(FunctionMockerTest,MocksNullaryFunction)302 TYPED_TEST(FunctionMockerTest, MocksNullaryFunction) {
303 EXPECT_CALL(this->mock_foo_, Nullary())
304 .WillOnce(DoDefault())
305 .WillOnce(Return(1));
306
307 EXPECT_EQ(0, this->foo_->Nullary());
308 EXPECT_EQ(1, this->foo_->Nullary());
309 }
310
311 // Tests mocking a unary function.
TYPED_TEST(FunctionMockerTest,MocksUnaryFunction)312 TYPED_TEST(FunctionMockerTest, MocksUnaryFunction) {
313 EXPECT_CALL(this->mock_foo_, Unary(Eq(2))).Times(2).WillOnce(Return(true));
314
315 EXPECT_TRUE(this->foo_->Unary(2));
316 EXPECT_FALSE(this->foo_->Unary(2));
317 }
318
319 // Tests mocking a binary function.
TYPED_TEST(FunctionMockerTest,MocksBinaryFunction)320 TYPED_TEST(FunctionMockerTest, MocksBinaryFunction) {
321 EXPECT_CALL(this->mock_foo_, Binary(2, _)).WillOnce(Return(3));
322
323 EXPECT_EQ(3, this->foo_->Binary(2, 1));
324 }
325
326 // Tests mocking a decimal function.
TYPED_TEST(FunctionMockerTest,MocksDecimalFunction)327 TYPED_TEST(FunctionMockerTest, MocksDecimalFunction) {
328 EXPECT_CALL(this->mock_foo_,
329 Decimal(true, 'a', 0, 0, 1L, A<float>(), Lt(100), 5U, NULL, "hi"))
330 .WillOnce(Return(5));
331
332 EXPECT_EQ(5, this->foo_->Decimal(true, 'a', 0, 0, 1, 0, 0, 5, nullptr, "hi"));
333 }
334
335 // Tests mocking a function that takes a non-const reference.
TYPED_TEST(FunctionMockerTest,MocksFunctionWithNonConstReferenceArgument)336 TYPED_TEST(FunctionMockerTest, MocksFunctionWithNonConstReferenceArgument) {
337 int a = 0;
338 EXPECT_CALL(this->mock_foo_, TakesNonConstReference(Ref(a)))
339 .WillOnce(Return(true));
340
341 EXPECT_TRUE(this->foo_->TakesNonConstReference(a));
342 }
343
344 // Tests mocking a function that takes a const reference.
TYPED_TEST(FunctionMockerTest,MocksFunctionWithConstReferenceArgument)345 TYPED_TEST(FunctionMockerTest, MocksFunctionWithConstReferenceArgument) {
346 int a = 0;
347 EXPECT_CALL(this->mock_foo_, TakesConstReference(Ref(a)))
348 .WillOnce(Return("Hello"));
349
350 EXPECT_EQ("Hello", this->foo_->TakesConstReference(a));
351 }
352
353 // Tests mocking a function that takes a const variable.
TYPED_TEST(FunctionMockerTest,MocksFunctionWithConstArgument)354 TYPED_TEST(FunctionMockerTest, MocksFunctionWithConstArgument) {
355 EXPECT_CALL(this->mock_foo_, TakesConst(Lt(10))).WillOnce(DoDefault());
356
357 EXPECT_FALSE(this->foo_->TakesConst(5));
358 }
359
360 // Tests mocking functions overloaded on the number of arguments.
TYPED_TEST(FunctionMockerTest,MocksFunctionsOverloadedOnArgumentNumber)361 TYPED_TEST(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentNumber) {
362 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentNumber())
363 .WillOnce(Return(1));
364 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentNumber(_))
365 .WillOnce(Return(2));
366
367 EXPECT_EQ(2, this->foo_->OverloadedOnArgumentNumber(1));
368 EXPECT_EQ(1, this->foo_->OverloadedOnArgumentNumber());
369 }
370
371 // Tests mocking functions overloaded on the types of argument.
TYPED_TEST(FunctionMockerTest,MocksFunctionsOverloadedOnArgumentType)372 TYPED_TEST(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentType) {
373 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentType(An<int>()))
374 .WillOnce(Return(1));
375 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentType(TypedEq<char>('a')))
376 .WillOnce(Return('b'));
377
378 EXPECT_EQ(1, this->foo_->OverloadedOnArgumentType(0));
379 EXPECT_EQ('b', this->foo_->OverloadedOnArgumentType('a'));
380 }
381
382 // Tests mocking functions overloaded on the const-ness of this object.
TYPED_TEST(FunctionMockerTest,MocksFunctionsOverloadedOnConstnessOfThis)383 TYPED_TEST(FunctionMockerTest, MocksFunctionsOverloadedOnConstnessOfThis) {
384 EXPECT_CALL(this->mock_foo_, OverloadedOnConstness());
385 EXPECT_CALL(Const(this->mock_foo_), OverloadedOnConstness())
386 .WillOnce(Return('a'));
387
388 EXPECT_EQ(0, this->foo_->OverloadedOnConstness());
389 EXPECT_EQ('a', Const(*this->foo_).OverloadedOnConstness());
390 }
391
TYPED_TEST(FunctionMockerTest,MocksReturnTypeWithComma)392 TYPED_TEST(FunctionMockerTest, MocksReturnTypeWithComma) {
393 const std::map<int, std::string> a_map;
394 EXPECT_CALL(this->mock_foo_, ReturnTypeWithComma()).WillOnce(Return(a_map));
395 EXPECT_CALL(this->mock_foo_, ReturnTypeWithComma(42)).WillOnce(Return(a_map));
396
397 EXPECT_EQ(a_map, this->mock_foo_.ReturnTypeWithComma());
398 EXPECT_EQ(a_map, this->mock_foo_.ReturnTypeWithComma(42));
399 }
400
TYPED_TEST(FunctionMockerTest,MocksTypeWithTemplatedCopyCtor)401 TYPED_TEST(FunctionMockerTest, MocksTypeWithTemplatedCopyCtor) {
402 EXPECT_CALL(this->mock_foo_, TypeWithTemplatedCopyCtor(_))
403 .WillOnce(Return(true));
404 EXPECT_TRUE(this->foo_->TypeWithTemplatedCopyCtor(TemplatedCopyable<int>()));
405 }
406
407 #if GTEST_OS_WINDOWS
408 // Tests mocking a nullary function with calltype.
TYPED_TEST(FunctionMockerTest,MocksNullaryFunctionWithCallType)409 TYPED_TEST(FunctionMockerTest, MocksNullaryFunctionWithCallType) {
410 EXPECT_CALL(this->mock_foo_, CTNullary())
411 .WillOnce(Return(-1))
412 .WillOnce(Return(0));
413
414 EXPECT_EQ(-1, this->foo_->CTNullary());
415 EXPECT_EQ(0, this->foo_->CTNullary());
416 }
417
418 // Tests mocking a unary function with calltype.
TYPED_TEST(FunctionMockerTest,MocksUnaryFunctionWithCallType)419 TYPED_TEST(FunctionMockerTest, MocksUnaryFunctionWithCallType) {
420 EXPECT_CALL(this->mock_foo_, CTUnary(Eq(2)))
421 .Times(2)
422 .WillOnce(Return(true))
423 .WillOnce(Return(false));
424
425 EXPECT_TRUE(this->foo_->CTUnary(2));
426 EXPECT_FALSE(this->foo_->CTUnary(2));
427 }
428
429 // Tests mocking a decimal function with calltype.
TYPED_TEST(FunctionMockerTest,MocksDecimalFunctionWithCallType)430 TYPED_TEST(FunctionMockerTest, MocksDecimalFunctionWithCallType) {
431 EXPECT_CALL(this->mock_foo_, CTDecimal(true, 'a', 0, 0, 1L, A<float>(),
432 Lt(100), 5U, NULL, "hi"))
433 .WillOnce(Return(10));
434
435 EXPECT_EQ(10, this->foo_->CTDecimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
436 }
437
438 // Tests mocking functions overloaded on the const-ness of this object.
TYPED_TEST(FunctionMockerTest,MocksFunctionsConstFunctionWithCallType)439 TYPED_TEST(FunctionMockerTest, MocksFunctionsConstFunctionWithCallType) {
440 EXPECT_CALL(Const(this->mock_foo_), CTConst(_)).WillOnce(Return('a'));
441
442 EXPECT_EQ('a', Const(*this->foo_).CTConst(0));
443 }
444
TYPED_TEST(FunctionMockerTest,MocksReturnTypeWithCommaAndCallType)445 TYPED_TEST(FunctionMockerTest, MocksReturnTypeWithCommaAndCallType) {
446 const std::map<int, std::string> a_map;
447 EXPECT_CALL(this->mock_foo_, CTReturnTypeWithComma()).WillOnce(Return(a_map));
448
449 EXPECT_EQ(a_map, this->mock_foo_.CTReturnTypeWithComma());
450 }
451
452 #endif // GTEST_OS_WINDOWS
453
TEST(FunctionMockerTest,RefQualified)454 TEST(FunctionMockerTest, RefQualified) {
455 MockFoo mock_foo;
456
457 EXPECT_CALL(mock_foo, RefQualifiedConstRef).WillOnce(Return(1));
458 EXPECT_CALL(std::move(mock_foo), // NOLINT
459 RefQualifiedConstRefRef)
460 .WillOnce(Return(2));
461 EXPECT_CALL(mock_foo, RefQualifiedRef).WillOnce(Return(3));
462 EXPECT_CALL(std::move(mock_foo), // NOLINT
463 RefQualifiedRefRef)
464 .WillOnce(Return(4));
465
466 EXPECT_CALL(static_cast<const MockFoo&>(mock_foo), RefQualifiedOverloaded())
467 .WillOnce(Return(5));
468 EXPECT_CALL(static_cast<const MockFoo&&>(mock_foo), RefQualifiedOverloaded())
469 .WillOnce(Return(6));
470 EXPECT_CALL(static_cast<MockFoo&>(mock_foo), RefQualifiedOverloaded())
471 .WillOnce(Return(7));
472 EXPECT_CALL(static_cast<MockFoo&&>(mock_foo), RefQualifiedOverloaded())
473 .WillOnce(Return(8));
474
475 EXPECT_EQ(mock_foo.RefQualifiedConstRef(), 1);
476 EXPECT_EQ(std::move(mock_foo).RefQualifiedConstRefRef(), 2); // NOLINT
477 EXPECT_EQ(mock_foo.RefQualifiedRef(), 3);
478 EXPECT_EQ(std::move(mock_foo).RefQualifiedRefRef(), 4); // NOLINT
479
480 EXPECT_EQ(std::cref(mock_foo).get().RefQualifiedOverloaded(), 5);
481 EXPECT_EQ(std::move(std::cref(mock_foo).get()) // NOLINT
482 .RefQualifiedOverloaded(),
483 6);
484 EXPECT_EQ(mock_foo.RefQualifiedOverloaded(), 7);
485 EXPECT_EQ(std::move(mock_foo).RefQualifiedOverloaded(), 8); // NOLINT
486 }
487
488 class MockB {
489 public:
MockB()490 MockB() {}
491
492 MOCK_METHOD(void, DoB, ());
493
494 private:
495 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
496 };
497
498 class LegacyMockB {
499 public:
LegacyMockB()500 LegacyMockB() {}
501
502 MOCK_METHOD0(DoB, void());
503
504 private:
505 GTEST_DISALLOW_COPY_AND_ASSIGN_(LegacyMockB);
506 };
507
508 template <typename T>
509 class ExpectCallTest : public ::testing::Test {};
510 using ExpectCallTestTypes = ::testing::Types<MockB, LegacyMockB>;
511 TYPED_TEST_SUITE(ExpectCallTest, ExpectCallTestTypes);
512
513 // Tests that functions with no EXPECT_CALL() rules can be called any
514 // number of times.
TYPED_TEST(ExpectCallTest,UnmentionedFunctionCanBeCalledAnyNumberOfTimes)515 TYPED_TEST(ExpectCallTest, UnmentionedFunctionCanBeCalledAnyNumberOfTimes) {
516 { TypeParam b; }
517
518 {
519 TypeParam b;
520 b.DoB();
521 }
522
523 {
524 TypeParam b;
525 b.DoB();
526 b.DoB();
527 }
528 }
529
530 // Tests mocking template interfaces.
531
532 template <typename T>
533 class StackInterface {
534 public:
~StackInterface()535 virtual ~StackInterface() {}
536
537 // Template parameter appears in function parameter.
538 virtual void Push(const T& value) = 0;
539 virtual void Pop() = 0;
540 virtual int GetSize() const = 0;
541 // Template parameter appears in function return type.
542 virtual const T& GetTop() const = 0;
543 };
544
545 template <typename T>
546 class MockStack : public StackInterface<T> {
547 public:
MockStack()548 MockStack() {}
549
550 MOCK_METHOD(void, Push, (const T& elem), ());
551 MOCK_METHOD(void, Pop, (), (final));
552 MOCK_METHOD(int, GetSize, (), (const, override));
553 MOCK_METHOD(const T&, GetTop, (), (const));
554
555 // Tests that the function return type can contain unprotected comma.
556 MOCK_METHOD((std::map<int, int>), ReturnTypeWithComma, (), ());
557 MOCK_METHOD((std::map<int, int>), ReturnTypeWithComma, (int), (const));
558
559 private:
560 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStack);
561 };
562
563 template <typename T>
564 class LegacyMockStack : public StackInterface<T> {
565 public:
LegacyMockStack()566 LegacyMockStack() {}
567
568 MOCK_METHOD1_T(Push, void(const T& elem));
569 MOCK_METHOD0_T(Pop, void());
570 MOCK_CONST_METHOD0_T(GetSize, int()); // NOLINT
571 MOCK_CONST_METHOD0_T(GetTop, const T&());
572
573 // Tests that the function return type can contain unprotected comma.
574 MOCK_METHOD0_T(ReturnTypeWithComma, std::map<int, int>());
575 MOCK_CONST_METHOD1_T(ReturnTypeWithComma, std::map<int, int>(int)); // NOLINT
576
577 private:
578 GTEST_DISALLOW_COPY_AND_ASSIGN_(LegacyMockStack);
579 };
580
581 template <typename T>
582 class TemplateMockTest : public ::testing::Test {};
583 using TemplateMockTestTypes =
584 ::testing::Types<MockStack<int>, LegacyMockStack<int>>;
585 TYPED_TEST_SUITE(TemplateMockTest, TemplateMockTestTypes);
586
587 // Tests that template mock works.
TYPED_TEST(TemplateMockTest,Works)588 TYPED_TEST(TemplateMockTest, Works) {
589 TypeParam mock;
590
591 EXPECT_CALL(mock, GetSize())
592 .WillOnce(Return(0))
593 .WillOnce(Return(1))
594 .WillOnce(Return(0));
595 EXPECT_CALL(mock, Push(_));
596 int n = 5;
597 EXPECT_CALL(mock, GetTop()).WillOnce(ReturnRef(n));
598 EXPECT_CALL(mock, Pop()).Times(AnyNumber());
599
600 EXPECT_EQ(0, mock.GetSize());
601 mock.Push(5);
602 EXPECT_EQ(1, mock.GetSize());
603 EXPECT_EQ(5, mock.GetTop());
604 mock.Pop();
605 EXPECT_EQ(0, mock.GetSize());
606 }
607
TYPED_TEST(TemplateMockTest,MethodWithCommaInReturnTypeWorks)608 TYPED_TEST(TemplateMockTest, MethodWithCommaInReturnTypeWorks) {
609 TypeParam mock;
610
611 const std::map<int, int> a_map;
612 EXPECT_CALL(mock, ReturnTypeWithComma()).WillOnce(Return(a_map));
613 EXPECT_CALL(mock, ReturnTypeWithComma(1)).WillOnce(Return(a_map));
614
615 EXPECT_EQ(a_map, mock.ReturnTypeWithComma());
616 EXPECT_EQ(a_map, mock.ReturnTypeWithComma(1));
617 }
618
619 #if GTEST_OS_WINDOWS
620 // Tests mocking template interfaces with calltype.
621
622 template <typename T>
623 class StackInterfaceWithCallType {
624 public:
~StackInterfaceWithCallType()625 virtual ~StackInterfaceWithCallType() {}
626
627 // Template parameter appears in function parameter.
628 STDMETHOD_(void, Push)(const T& value) = 0;
629 STDMETHOD_(void, Pop)() = 0;
630 STDMETHOD_(int, GetSize)() const = 0;
631 // Template parameter appears in function return type.
632 STDMETHOD_(const T&, GetTop)() const = 0;
633 };
634
635 template <typename T>
636 class MockStackWithCallType : public StackInterfaceWithCallType<T> {
637 public:
MockStackWithCallType()638 MockStackWithCallType() {}
639
640 MOCK_METHOD(void, Push, (const T& elem),
641 (Calltype(STDMETHODCALLTYPE), override));
642 MOCK_METHOD(void, Pop, (), (Calltype(STDMETHODCALLTYPE), override));
643 MOCK_METHOD(int, GetSize, (), (Calltype(STDMETHODCALLTYPE), override, const));
644 MOCK_METHOD(const T&, GetTop, (),
645 (Calltype(STDMETHODCALLTYPE), override, const));
646
647 private:
648 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStackWithCallType);
649 };
650
651 template <typename T>
652 class LegacyMockStackWithCallType : public StackInterfaceWithCallType<T> {
653 public:
LegacyMockStackWithCallType()654 LegacyMockStackWithCallType() {}
655
656 MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Push, void(const T& elem));
657 MOCK_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Pop, void());
658 MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetSize, int());
659 MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTop, const T&());
660
661 private:
662 GTEST_DISALLOW_COPY_AND_ASSIGN_(LegacyMockStackWithCallType);
663 };
664
665 template <typename T>
666 class TemplateMockTestWithCallType : public ::testing::Test {};
667 using TemplateMockTestWithCallTypeTypes =
668 ::testing::Types<MockStackWithCallType<int>,
669 LegacyMockStackWithCallType<int>>;
670 TYPED_TEST_SUITE(TemplateMockTestWithCallType,
671 TemplateMockTestWithCallTypeTypes);
672
673 // Tests that template mock with calltype works.
TYPED_TEST(TemplateMockTestWithCallType,Works)674 TYPED_TEST(TemplateMockTestWithCallType, Works) {
675 TypeParam mock;
676
677 EXPECT_CALL(mock, GetSize())
678 .WillOnce(Return(0))
679 .WillOnce(Return(1))
680 .WillOnce(Return(0));
681 EXPECT_CALL(mock, Push(_));
682 int n = 5;
683 EXPECT_CALL(mock, GetTop()).WillOnce(ReturnRef(n));
684 EXPECT_CALL(mock, Pop()).Times(AnyNumber());
685
686 EXPECT_EQ(0, mock.GetSize());
687 mock.Push(5);
688 EXPECT_EQ(1, mock.GetSize());
689 EXPECT_EQ(5, mock.GetTop());
690 mock.Pop();
691 EXPECT_EQ(0, mock.GetSize());
692 }
693 #endif // GTEST_OS_WINDOWS
694
695 #define MY_MOCK_METHODS1_ \
696 MOCK_METHOD(void, Overloaded, ()); \
697 MOCK_METHOD(int, Overloaded, (int), (const)); \
698 MOCK_METHOD(bool, Overloaded, (bool f, int n))
699
700 #define LEGACY_MY_MOCK_METHODS1_ \
701 MOCK_METHOD0(Overloaded, void()); \
702 MOCK_CONST_METHOD1(Overloaded, int(int n)); \
703 MOCK_METHOD2(Overloaded, bool(bool f, int n))
704
705 class MockOverloadedOnArgNumber {
706 public:
MockOverloadedOnArgNumber()707 MockOverloadedOnArgNumber() {}
708
709 MY_MOCK_METHODS1_;
710
711 private:
712 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnArgNumber);
713 };
714
715 class LegacyMockOverloadedOnArgNumber {
716 public:
LegacyMockOverloadedOnArgNumber()717 LegacyMockOverloadedOnArgNumber() {}
718
719 LEGACY_MY_MOCK_METHODS1_;
720
721 private:
722 GTEST_DISALLOW_COPY_AND_ASSIGN_(LegacyMockOverloadedOnArgNumber);
723 };
724
725 template <typename T>
726 class OverloadedMockMethodTest : public ::testing::Test {};
727 using OverloadedMockMethodTestTypes =
728 ::testing::Types<MockOverloadedOnArgNumber,
729 LegacyMockOverloadedOnArgNumber>;
730 TYPED_TEST_SUITE(OverloadedMockMethodTest, OverloadedMockMethodTestTypes);
731
TYPED_TEST(OverloadedMockMethodTest,CanOverloadOnArgNumberInMacroBody)732 TYPED_TEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {
733 TypeParam mock;
734 EXPECT_CALL(mock, Overloaded());
735 EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
736 EXPECT_CALL(mock, Overloaded(true, 1)).WillOnce(Return(true));
737
738 mock.Overloaded();
739 EXPECT_EQ(2, mock.Overloaded(1));
740 EXPECT_TRUE(mock.Overloaded(true, 1));
741 }
742
743 #define MY_MOCK_METHODS2_ \
744 MOCK_CONST_METHOD1(Overloaded, int(int n)); \
745 MOCK_METHOD1(Overloaded, int(int n))
746
747 class MockOverloadedOnConstness {
748 public:
MockOverloadedOnConstness()749 MockOverloadedOnConstness() {}
750
751 MY_MOCK_METHODS2_;
752
753 private:
754 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnConstness);
755 };
756
TEST(MockMethodOverloadedMockMethodTest,CanOverloadOnConstnessInMacroBody)757 TEST(MockMethodOverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {
758 MockOverloadedOnConstness mock;
759 const MockOverloadedOnConstness* const_mock = &mock;
760 EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
761 EXPECT_CALL(*const_mock, Overloaded(1)).WillOnce(Return(3));
762
763 EXPECT_EQ(2, mock.Overloaded(1));
764 EXPECT_EQ(3, const_mock->Overloaded(1));
765 }
766
TEST(MockMethodMockFunctionTest,WorksForVoidNullary)767 TEST(MockMethodMockFunctionTest, WorksForVoidNullary) {
768 MockFunction<void()> foo;
769 EXPECT_CALL(foo, Call());
770 foo.Call();
771 }
772
TEST(MockMethodMockFunctionTest,WorksForNonVoidNullary)773 TEST(MockMethodMockFunctionTest, WorksForNonVoidNullary) {
774 MockFunction<int()> foo;
775 EXPECT_CALL(foo, Call()).WillOnce(Return(1)).WillOnce(Return(2));
776 EXPECT_EQ(1, foo.Call());
777 EXPECT_EQ(2, foo.Call());
778 }
779
TEST(MockMethodMockFunctionTest,WorksForVoidUnary)780 TEST(MockMethodMockFunctionTest, WorksForVoidUnary) {
781 MockFunction<void(int)> foo;
782 EXPECT_CALL(foo, Call(1));
783 foo.Call(1);
784 }
785
TEST(MockMethodMockFunctionTest,WorksForNonVoidBinary)786 TEST(MockMethodMockFunctionTest, WorksForNonVoidBinary) {
787 MockFunction<int(bool, int)> foo;
788 EXPECT_CALL(foo, Call(false, 42)).WillOnce(Return(1)).WillOnce(Return(2));
789 EXPECT_CALL(foo, Call(true, Ge(100))).WillOnce(Return(3));
790 EXPECT_EQ(1, foo.Call(false, 42));
791 EXPECT_EQ(2, foo.Call(false, 42));
792 EXPECT_EQ(3, foo.Call(true, 120));
793 }
794
TEST(MockMethodMockFunctionTest,WorksFor10Arguments)795 TEST(MockMethodMockFunctionTest, WorksFor10Arguments) {
796 MockFunction<int(bool a0, char a1, int a2, int a3, int a4, int a5, int a6,
797 char a7, int a8, bool a9)>
798 foo;
799 EXPECT_CALL(foo, Call(_, 'a', _, _, _, _, _, _, _, _))
800 .WillOnce(Return(1))
801 .WillOnce(Return(2));
802 EXPECT_EQ(1, foo.Call(false, 'a', 0, 0, 0, 0, 0, 'b', 0, true));
803 EXPECT_EQ(2, foo.Call(true, 'a', 0, 0, 0, 0, 0, 'b', 1, false));
804 }
805
TEST(MockMethodMockFunctionTest,AsStdFunction)806 TEST(MockMethodMockFunctionTest, AsStdFunction) {
807 MockFunction<int(int)> foo;
808 auto call = [](const std::function<int(int)>& f, int i) { return f(i); };
809 EXPECT_CALL(foo, Call(1)).WillOnce(Return(-1));
810 EXPECT_CALL(foo, Call(2)).WillOnce(Return(-2));
811 EXPECT_EQ(-1, call(foo.AsStdFunction(), 1));
812 EXPECT_EQ(-2, call(foo.AsStdFunction(), 2));
813 }
814
TEST(MockMethodMockFunctionTest,AsStdFunctionReturnsReference)815 TEST(MockMethodMockFunctionTest, AsStdFunctionReturnsReference) {
816 MockFunction<int&()> foo;
817 int value = 1;
818 EXPECT_CALL(foo, Call()).WillOnce(ReturnRef(value));
819 int& ref = foo.AsStdFunction()();
820 EXPECT_EQ(1, ref);
821 value = 2;
822 EXPECT_EQ(2, ref);
823 }
824
TEST(MockMethodMockFunctionTest,AsStdFunctionWithReferenceParameter)825 TEST(MockMethodMockFunctionTest, AsStdFunctionWithReferenceParameter) {
826 MockFunction<int(int&)> foo;
827 auto call = [](const std::function<int(int&)>& f, int& i) { return f(i); };
828 int i = 42;
829 EXPECT_CALL(foo, Call(i)).WillOnce(Return(-1));
830 EXPECT_EQ(-1, call(foo.AsStdFunction(), i));
831 }
832
833 namespace {
834
835 template <typename Expected, typename F>
IsMockFunctionTemplateArgumentDeducedTo(const internal::MockFunction<F> &)836 static constexpr bool IsMockFunctionTemplateArgumentDeducedTo(
837 const internal::MockFunction<F>&) {
838 return std::is_same<F, Expected>::value;
839 }
840
841 } // namespace
842
843 template <typename F>
844 class MockMethodMockFunctionSignatureTest : public Test {};
845
846 using MockMethodMockFunctionSignatureTypes =
847 Types<void(), int(), void(int), int(int), int(bool, int),
848 int(bool, char, int, int, int, int, int, char, int, bool)>;
849 TYPED_TEST_SUITE(MockMethodMockFunctionSignatureTest,
850 MockMethodMockFunctionSignatureTypes);
851
TYPED_TEST(MockMethodMockFunctionSignatureTest,IsMockFunctionTemplateArgumentDeducedForRawSignature)852 TYPED_TEST(MockMethodMockFunctionSignatureTest,
853 IsMockFunctionTemplateArgumentDeducedForRawSignature) {
854 using Argument = TypeParam;
855 MockFunction<Argument> foo;
856 EXPECT_TRUE(IsMockFunctionTemplateArgumentDeducedTo<TypeParam>(foo));
857 }
858
TYPED_TEST(MockMethodMockFunctionSignatureTest,IsMockFunctionTemplateArgumentDeducedForStdFunction)859 TYPED_TEST(MockMethodMockFunctionSignatureTest,
860 IsMockFunctionTemplateArgumentDeducedForStdFunction) {
861 using Argument = std::function<TypeParam>;
862 MockFunction<Argument> foo;
863 EXPECT_TRUE(IsMockFunctionTemplateArgumentDeducedTo<TypeParam>(foo));
864 }
865
TYPED_TEST(MockMethodMockFunctionSignatureTest,IsMockFunctionCallMethodSignatureTheSameForRawSignatureAndStdFunction)866 TYPED_TEST(
867 MockMethodMockFunctionSignatureTest,
868 IsMockFunctionCallMethodSignatureTheSameForRawSignatureAndStdFunction) {
869 using ForRawSignature = decltype(&MockFunction<TypeParam>::Call);
870 using ForStdFunction =
871 decltype(&MockFunction<std::function<TypeParam>>::Call);
872 EXPECT_TRUE((std::is_same<ForRawSignature, ForStdFunction>::value));
873 }
874
875 template <typename F>
876 struct AlternateCallable {};
877
TYPED_TEST(MockMethodMockFunctionSignatureTest,IsMockFunctionTemplateArgumentDeducedForAlternateCallable)878 TYPED_TEST(MockMethodMockFunctionSignatureTest,
879 IsMockFunctionTemplateArgumentDeducedForAlternateCallable) {
880 using Argument = AlternateCallable<TypeParam>;
881 MockFunction<Argument> foo;
882 EXPECT_TRUE(IsMockFunctionTemplateArgumentDeducedTo<TypeParam>(foo));
883 }
884
TYPED_TEST(MockMethodMockFunctionSignatureTest,IsMockFunctionCallMethodSignatureTheSameForAlternateCallable)885 TYPED_TEST(MockMethodMockFunctionSignatureTest,
886 IsMockFunctionCallMethodSignatureTheSameForAlternateCallable) {
887 using ForRawSignature = decltype(&MockFunction<TypeParam>::Call);
888 using ForStdFunction =
889 decltype(&MockFunction<std::function<TypeParam>>::Call);
890 EXPECT_TRUE((std::is_same<ForRawSignature, ForStdFunction>::value));
891 }
892
893 struct MockMethodSizes0 {
894 MOCK_METHOD(void, func, ());
895 };
896 struct MockMethodSizes1 {
897 MOCK_METHOD(void, func, (int));
898 };
899 struct MockMethodSizes2 {
900 MOCK_METHOD(void, func, (int, int));
901 };
902 struct MockMethodSizes3 {
903 MOCK_METHOD(void, func, (int, int, int));
904 };
905 struct MockMethodSizes4 {
906 MOCK_METHOD(void, func, (int, int, int, int));
907 };
908
909 struct LegacyMockMethodSizes0 {
910 MOCK_METHOD0(func, void());
911 };
912 struct LegacyMockMethodSizes1 {
913 MOCK_METHOD1(func, void(int));
914 };
915 struct LegacyMockMethodSizes2 {
916 MOCK_METHOD2(func, void(int, int));
917 };
918 struct LegacyMockMethodSizes3 {
919 MOCK_METHOD3(func, void(int, int, int));
920 };
921 struct LegacyMockMethodSizes4 {
922 MOCK_METHOD4(func, void(int, int, int, int));
923 };
924
TEST(MockMethodMockFunctionTest,MockMethodSizeOverhead)925 TEST(MockMethodMockFunctionTest, MockMethodSizeOverhead) {
926 EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes1));
927 EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes2));
928 EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes3));
929 EXPECT_EQ(sizeof(MockMethodSizes0), sizeof(MockMethodSizes4));
930
931 EXPECT_EQ(sizeof(LegacyMockMethodSizes0), sizeof(LegacyMockMethodSizes1));
932 EXPECT_EQ(sizeof(LegacyMockMethodSizes0), sizeof(LegacyMockMethodSizes2));
933 EXPECT_EQ(sizeof(LegacyMockMethodSizes0), sizeof(LegacyMockMethodSizes3));
934 EXPECT_EQ(sizeof(LegacyMockMethodSizes0), sizeof(LegacyMockMethodSizes4));
935
936 EXPECT_EQ(sizeof(LegacyMockMethodSizes0), sizeof(MockMethodSizes0));
937 }
938
939 void hasTwoParams(int, int);
940 void MaybeThrows();
941 void DoesntThrow() noexcept;
942 struct MockMethodNoexceptSpecifier {
943 MOCK_METHOD(void, func1, (), (noexcept));
944 MOCK_METHOD(void, func2, (), (noexcept(true)));
945 MOCK_METHOD(void, func3, (), (noexcept(false)));
946 MOCK_METHOD(void, func4, (), (noexcept(noexcept(MaybeThrows()))));
947 MOCK_METHOD(void, func5, (), (noexcept(noexcept(DoesntThrow()))));
948 MOCK_METHOD(void, func6, (), (noexcept(noexcept(DoesntThrow())), const));
949 MOCK_METHOD(void, func7, (), (const, noexcept(noexcept(DoesntThrow()))));
950 // Put commas in the noexcept expression
951 MOCK_METHOD(void, func8, (), (noexcept(noexcept(hasTwoParams(1, 2))), const));
952 };
953
TEST(MockMethodMockFunctionTest,NoexceptSpecifierPreserved)954 TEST(MockMethodMockFunctionTest, NoexceptSpecifierPreserved) {
955 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func1()));
956 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func2()));
957 EXPECT_FALSE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func3()));
958 EXPECT_FALSE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func4()));
959 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func5()));
960 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func6()));
961 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func7()));
962 EXPECT_EQ(noexcept(std::declval<MockMethodNoexceptSpecifier>().func8()),
963 noexcept(hasTwoParams(1, 2)));
964 }
965
966 } // namespace gmock_function_mocker_test
967 } // namespace testing
968