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