• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2007, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 //     * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 //     * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 //     * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 // Google Mock - a framework for writing C++ mock classes.
31 //
32 // This file tests the 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