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