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