File indexing completed on 2025-08-06 08:19:55
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include "gmock/gmock-generated-function-mockers.h"
0037
0038 #if GTEST_OS_WINDOWS
0039
0040
0041
0042 # include <objbase.h>
0043 #endif
0044
0045 #include <map>
0046 #include <string>
0047 #include "gmock/gmock.h"
0048 #include "gtest/gtest.h"
0049
0050
0051
0052
0053 #if !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
0054 # define GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0055 #endif
0056
0057 namespace testing {
0058 namespace gmock_generated_function_mockers_test {
0059
0060 using testing::internal::string;
0061 using testing::_;
0062 using testing::A;
0063 using testing::An;
0064 using testing::AnyNumber;
0065 using testing::Const;
0066 using testing::DoDefault;
0067 using testing::Eq;
0068 using testing::Lt;
0069 using testing::MockFunction;
0070 using testing::Ref;
0071 using testing::Return;
0072 using testing::ReturnRef;
0073 using testing::TypedEq;
0074
0075 class FooInterface {
0076 public:
0077 virtual ~FooInterface() {}
0078
0079 virtual void VoidReturning(int x) = 0;
0080
0081 virtual int Nullary() = 0;
0082 virtual bool Unary(int x) = 0;
0083 virtual long Binary(short x, int y) = 0;
0084 virtual int Decimal(bool b, char c, short d, int e, long f,
0085 float g, double h, unsigned i, char* j, const string& k)
0086 = 0;
0087
0088 virtual bool TakesNonConstReference(int& n) = 0;
0089 virtual string TakesConstReference(const int& n) = 0;
0090 #ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0091 virtual bool TakesConst(const int x) = 0;
0092 #endif
0093
0094 virtual int OverloadedOnArgumentNumber() = 0;
0095 virtual int OverloadedOnArgumentNumber(int n) = 0;
0096
0097 virtual int OverloadedOnArgumentType(int n) = 0;
0098 virtual char OverloadedOnArgumentType(char c) = 0;
0099
0100 virtual int OverloadedOnConstness() = 0;
0101 virtual char OverloadedOnConstness() const = 0;
0102
0103 virtual int TypeWithHole(int (*func)()) = 0;
0104 virtual int TypeWithComma(const std::map<int, string>& a_map) = 0;
0105
0106 #if GTEST_OS_WINDOWS
0107 STDMETHOD_(int, CTNullary)() = 0;
0108 STDMETHOD_(bool, CTUnary)(int x) = 0;
0109 STDMETHOD_(int, CTDecimal)(bool b, char c, short d, int e, long f,
0110 float g, double h, unsigned i, char* j, const string& k) = 0;
0111 STDMETHOD_(char, CTConst)(int x) const = 0;
0112 #endif
0113 };
0114
0115
0116
0117
0118
0119 #ifdef _MSC_VER
0120 # pragma warning(push)
0121 # pragma warning(disable : 4373)
0122 #endif
0123 class MockFoo : public FooInterface {
0124 public:
0125 MockFoo() {}
0126
0127
0128 MOCK_METHOD1(VoidReturning, void(int n));
0129
0130 MOCK_METHOD0(Nullary, int());
0131
0132
0133 MOCK_METHOD1(Unary, bool(int));
0134 MOCK_METHOD2(Binary, long(short, int));
0135 MOCK_METHOD10(Decimal, int(bool, char, short, int, long, float,
0136 double, unsigned, char*, const string& str));
0137
0138 MOCK_METHOD1(TakesNonConstReference, bool(int&));
0139 MOCK_METHOD1(TakesConstReference, string(const int&));
0140
0141 #ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0142 MOCK_METHOD1(TakesConst, bool(const int));
0143 #endif
0144
0145
0146 MOCK_METHOD0(ReturnTypeWithComma, std::map<int, string>());
0147 MOCK_CONST_METHOD1(ReturnTypeWithComma,
0148 std::map<int, string>(int));
0149
0150 MOCK_METHOD0(OverloadedOnArgumentNumber, int());
0151 MOCK_METHOD1(OverloadedOnArgumentNumber, int(int));
0152
0153 MOCK_METHOD1(OverloadedOnArgumentType, int(int));
0154 MOCK_METHOD1(OverloadedOnArgumentType, char(char));
0155
0156 MOCK_METHOD0(OverloadedOnConstness, int());
0157 MOCK_CONST_METHOD0(OverloadedOnConstness, char());
0158
0159 MOCK_METHOD1(TypeWithHole, int(int (*)()));
0160 MOCK_METHOD1(TypeWithComma, int(const std::map<int, string>&));
0161
0162 #if GTEST_OS_WINDOWS
0163 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTNullary, int());
0164 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTUnary, bool(int));
0165 MOCK_METHOD10_WITH_CALLTYPE(STDMETHODCALLTYPE, CTDecimal, int(bool b, char c,
0166 short d, int e, long f, float g, double h, unsigned i, char* j,
0167 const string& k));
0168 MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTConst, char(int));
0169
0170
0171 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTReturnTypeWithComma,
0172 std::map<int, string>());
0173 #endif
0174
0175 private:
0176 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
0177 };
0178 #ifdef _MSC_VER
0179 # pragma warning(pop)
0180 #endif
0181
0182 class FunctionMockerTest : public testing::Test {
0183 protected:
0184 FunctionMockerTest() : foo_(&mock_foo_) {}
0185
0186 FooInterface* const foo_;
0187 MockFoo mock_foo_;
0188 };
0189
0190
0191 TEST_F(FunctionMockerTest, MocksVoidFunction) {
0192 EXPECT_CALL(mock_foo_, VoidReturning(Lt(100)));
0193 foo_->VoidReturning(0);
0194 }
0195
0196
0197 TEST_F(FunctionMockerTest, MocksNullaryFunction) {
0198 EXPECT_CALL(mock_foo_, Nullary())
0199 .WillOnce(DoDefault())
0200 .WillOnce(Return(1));
0201
0202 EXPECT_EQ(0, foo_->Nullary());
0203 EXPECT_EQ(1, foo_->Nullary());
0204 }
0205
0206
0207 TEST_F(FunctionMockerTest, MocksUnaryFunction) {
0208 EXPECT_CALL(mock_foo_, Unary(Eq(2)))
0209 .Times(2)
0210 .WillOnce(Return(true));
0211
0212 EXPECT_TRUE(foo_->Unary(2));
0213 EXPECT_FALSE(foo_->Unary(2));
0214 }
0215
0216
0217 TEST_F(FunctionMockerTest, MocksBinaryFunction) {
0218 EXPECT_CALL(mock_foo_, Binary(2, _))
0219 .WillOnce(Return(3));
0220
0221 EXPECT_EQ(3, foo_->Binary(2, 1));
0222 }
0223
0224
0225 TEST_F(FunctionMockerTest, MocksDecimalFunction) {
0226 EXPECT_CALL(mock_foo_, Decimal(true, 'a', 0, 0, 1L, A<float>(),
0227 Lt(100), 5U, NULL, "hi"))
0228 .WillOnce(Return(5));
0229
0230 EXPECT_EQ(5, foo_->Decimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
0231 }
0232
0233
0234 TEST_F(FunctionMockerTest, MocksFunctionWithNonConstReferenceArgument) {
0235 int a = 0;
0236 EXPECT_CALL(mock_foo_, TakesNonConstReference(Ref(a)))
0237 .WillOnce(Return(true));
0238
0239 EXPECT_TRUE(foo_->TakesNonConstReference(a));
0240 }
0241
0242
0243 TEST_F(FunctionMockerTest, MocksFunctionWithConstReferenceArgument) {
0244 int a = 0;
0245 EXPECT_CALL(mock_foo_, TakesConstReference(Ref(a)))
0246 .WillOnce(Return("Hello"));
0247
0248 EXPECT_EQ("Hello", foo_->TakesConstReference(a));
0249 }
0250
0251 #ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0252
0253 TEST_F(FunctionMockerTest, MocksFunctionWithConstArgument) {
0254 EXPECT_CALL(mock_foo_, TakesConst(Lt(10)))
0255 .WillOnce(DoDefault());
0256
0257 EXPECT_FALSE(foo_->TakesConst(5));
0258 }
0259 #endif
0260
0261
0262 TEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentNumber) {
0263 EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber())
0264 .WillOnce(Return(1));
0265 EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber(_))
0266 .WillOnce(Return(2));
0267
0268 EXPECT_EQ(2, foo_->OverloadedOnArgumentNumber(1));
0269 EXPECT_EQ(1, foo_->OverloadedOnArgumentNumber());
0270 }
0271
0272
0273 TEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentType) {
0274 EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(An<int>()))
0275 .WillOnce(Return(1));
0276 EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(TypedEq<char>('a')))
0277 .WillOnce(Return('b'));
0278
0279 EXPECT_EQ(1, foo_->OverloadedOnArgumentType(0));
0280 EXPECT_EQ('b', foo_->OverloadedOnArgumentType('a'));
0281 }
0282
0283
0284 TEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnConstnessOfThis) {
0285 EXPECT_CALL(mock_foo_, OverloadedOnConstness());
0286 EXPECT_CALL(Const(mock_foo_), OverloadedOnConstness())
0287 .WillOnce(Return('a'));
0288
0289 EXPECT_EQ(0, foo_->OverloadedOnConstness());
0290 EXPECT_EQ('a', Const(*foo_).OverloadedOnConstness());
0291 }
0292
0293 TEST_F(FunctionMockerTest, MocksReturnTypeWithComma) {
0294 const std::map<int, string> a_map;
0295 EXPECT_CALL(mock_foo_, ReturnTypeWithComma())
0296 .WillOnce(Return(a_map));
0297 EXPECT_CALL(mock_foo_, ReturnTypeWithComma(42))
0298 .WillOnce(Return(a_map));
0299
0300 EXPECT_EQ(a_map, mock_foo_.ReturnTypeWithComma());
0301 EXPECT_EQ(a_map, mock_foo_.ReturnTypeWithComma(42));
0302 }
0303
0304 #if GTEST_OS_WINDOWS
0305
0306 TEST_F(FunctionMockerTest, MocksNullaryFunctionWithCallType) {
0307 EXPECT_CALL(mock_foo_, CTNullary())
0308 .WillOnce(Return(-1))
0309 .WillOnce(Return(0));
0310
0311 EXPECT_EQ(-1, foo_->CTNullary());
0312 EXPECT_EQ(0, foo_->CTNullary());
0313 }
0314
0315
0316 TEST_F(FunctionMockerTest, MocksUnaryFunctionWithCallType) {
0317 EXPECT_CALL(mock_foo_, CTUnary(Eq(2)))
0318 .Times(2)
0319 .WillOnce(Return(true))
0320 .WillOnce(Return(false));
0321
0322 EXPECT_TRUE(foo_->CTUnary(2));
0323 EXPECT_FALSE(foo_->CTUnary(2));
0324 }
0325
0326
0327 TEST_F(FunctionMockerTest, MocksDecimalFunctionWithCallType) {
0328 EXPECT_CALL(mock_foo_, CTDecimal(true, 'a', 0, 0, 1L, A<float>(),
0329 Lt(100), 5U, NULL, "hi"))
0330 .WillOnce(Return(10));
0331
0332 EXPECT_EQ(10, foo_->CTDecimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
0333 }
0334
0335
0336 TEST_F(FunctionMockerTest, MocksFunctionsConstFunctionWithCallType) {
0337 EXPECT_CALL(Const(mock_foo_), CTConst(_))
0338 .WillOnce(Return('a'));
0339
0340 EXPECT_EQ('a', Const(*foo_).CTConst(0));
0341 }
0342
0343 TEST_F(FunctionMockerTest, MocksReturnTypeWithCommaAndCallType) {
0344 const std::map<int, string> a_map;
0345 EXPECT_CALL(mock_foo_, CTReturnTypeWithComma())
0346 .WillOnce(Return(a_map));
0347
0348 EXPECT_EQ(a_map, mock_foo_.CTReturnTypeWithComma());
0349 }
0350
0351 #endif
0352
0353 class MockB {
0354 public:
0355 MockB() {}
0356
0357 MOCK_METHOD0(DoB, void());
0358
0359 private:
0360 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
0361 };
0362
0363
0364
0365 TEST(ExpectCallTest, UnmentionedFunctionCanBeCalledAnyNumberOfTimes) {
0366 {
0367 MockB b;
0368 }
0369
0370 {
0371 MockB b;
0372 b.DoB();
0373 }
0374
0375 {
0376 MockB b;
0377 b.DoB();
0378 b.DoB();
0379 }
0380 }
0381
0382
0383
0384 template <typename T>
0385 class StackInterface {
0386 public:
0387 virtual ~StackInterface() {}
0388
0389
0390 virtual void Push(const T& value) = 0;
0391 virtual void Pop() = 0;
0392 virtual int GetSize() const = 0;
0393
0394 virtual const T& GetTop() const = 0;
0395 };
0396
0397 template <typename T>
0398 class MockStack : public StackInterface<T> {
0399 public:
0400 MockStack() {}
0401
0402 MOCK_METHOD1_T(Push, void(const T& elem));
0403 MOCK_METHOD0_T(Pop, void());
0404 MOCK_CONST_METHOD0_T(GetSize, int());
0405 MOCK_CONST_METHOD0_T(GetTop, const T&());
0406
0407
0408 MOCK_METHOD0_T(ReturnTypeWithComma, std::map<int, int>());
0409 MOCK_CONST_METHOD1_T(ReturnTypeWithComma, std::map<int, int>(int));
0410
0411 private:
0412 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStack);
0413 };
0414
0415
0416 TEST(TemplateMockTest, Works) {
0417 MockStack<int> mock;
0418
0419 EXPECT_CALL(mock, GetSize())
0420 .WillOnce(Return(0))
0421 .WillOnce(Return(1))
0422 .WillOnce(Return(0));
0423 EXPECT_CALL(mock, Push(_));
0424 int n = 5;
0425 EXPECT_CALL(mock, GetTop())
0426 .WillOnce(ReturnRef(n));
0427 EXPECT_CALL(mock, Pop())
0428 .Times(AnyNumber());
0429
0430 EXPECT_EQ(0, mock.GetSize());
0431 mock.Push(5);
0432 EXPECT_EQ(1, mock.GetSize());
0433 EXPECT_EQ(5, mock.GetTop());
0434 mock.Pop();
0435 EXPECT_EQ(0, mock.GetSize());
0436 }
0437
0438 TEST(TemplateMockTest, MethodWithCommaInReturnTypeWorks) {
0439 MockStack<int> mock;
0440
0441 const std::map<int, int> a_map;
0442 EXPECT_CALL(mock, ReturnTypeWithComma())
0443 .WillOnce(Return(a_map));
0444 EXPECT_CALL(mock, ReturnTypeWithComma(1))
0445 .WillOnce(Return(a_map));
0446
0447 EXPECT_EQ(a_map, mock.ReturnTypeWithComma());
0448 EXPECT_EQ(a_map, mock.ReturnTypeWithComma(1));
0449 }
0450
0451 #if GTEST_OS_WINDOWS
0452
0453
0454 template <typename T>
0455 class StackInterfaceWithCallType {
0456 public:
0457 virtual ~StackInterfaceWithCallType() {}
0458
0459
0460 STDMETHOD_(void, Push)(const T& value) = 0;
0461 STDMETHOD_(void, Pop)() = 0;
0462 STDMETHOD_(int, GetSize)() const = 0;
0463
0464 STDMETHOD_(const T&, GetTop)() const = 0;
0465 };
0466
0467 template <typename T>
0468 class MockStackWithCallType : public StackInterfaceWithCallType<T> {
0469 public:
0470 MockStackWithCallType() {}
0471
0472 MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Push, void(const T& elem));
0473 MOCK_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Pop, void());
0474 MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetSize, int());
0475 MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTop, const T&());
0476
0477 private:
0478 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStackWithCallType);
0479 };
0480
0481
0482 TEST(TemplateMockTestWithCallType, Works) {
0483 MockStackWithCallType<int> mock;
0484
0485 EXPECT_CALL(mock, GetSize())
0486 .WillOnce(Return(0))
0487 .WillOnce(Return(1))
0488 .WillOnce(Return(0));
0489 EXPECT_CALL(mock, Push(_));
0490 int n = 5;
0491 EXPECT_CALL(mock, GetTop())
0492 .WillOnce(ReturnRef(n));
0493 EXPECT_CALL(mock, Pop())
0494 .Times(AnyNumber());
0495
0496 EXPECT_EQ(0, mock.GetSize());
0497 mock.Push(5);
0498 EXPECT_EQ(1, mock.GetSize());
0499 EXPECT_EQ(5, mock.GetTop());
0500 mock.Pop();
0501 EXPECT_EQ(0, mock.GetSize());
0502 }
0503 #endif
0504
0505 #define MY_MOCK_METHODS1_ \
0506 MOCK_METHOD0(Overloaded, void()); \
0507 MOCK_CONST_METHOD1(Overloaded, int(int n)); \
0508 MOCK_METHOD2(Overloaded, bool(bool f, int n))
0509
0510 class MockOverloadedOnArgNumber {
0511 public:
0512 MockOverloadedOnArgNumber() {}
0513
0514 MY_MOCK_METHODS1_;
0515
0516 private:
0517 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnArgNumber);
0518 };
0519
0520 TEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {
0521 MockOverloadedOnArgNumber mock;
0522 EXPECT_CALL(mock, Overloaded());
0523 EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
0524 EXPECT_CALL(mock, Overloaded(true, 1)).WillOnce(Return(true));
0525
0526 mock.Overloaded();
0527 EXPECT_EQ(2, mock.Overloaded(1));
0528 EXPECT_TRUE(mock.Overloaded(true, 1));
0529 }
0530
0531 #define MY_MOCK_METHODS2_ \
0532 MOCK_CONST_METHOD1(Overloaded, int(int n)); \
0533 MOCK_METHOD1(Overloaded, int(int n));
0534
0535 class MockOverloadedOnConstness {
0536 public:
0537 MockOverloadedOnConstness() {}
0538
0539 MY_MOCK_METHODS2_;
0540
0541 private:
0542 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnConstness);
0543 };
0544
0545 TEST(OverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {
0546 MockOverloadedOnConstness mock;
0547 const MockOverloadedOnConstness* const_mock = &mock;
0548 EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
0549 EXPECT_CALL(*const_mock, Overloaded(1)).WillOnce(Return(3));
0550
0551 EXPECT_EQ(2, mock.Overloaded(1));
0552 EXPECT_EQ(3, const_mock->Overloaded(1));
0553 }
0554
0555 TEST(MockFunctionTest, WorksForVoidNullary) {
0556 MockFunction<void()> foo;
0557 EXPECT_CALL(foo, Call());
0558 foo.Call();
0559 }
0560
0561 TEST(MockFunctionTest, WorksForNonVoidNullary) {
0562 MockFunction<int()> foo;
0563 EXPECT_CALL(foo, Call())
0564 .WillOnce(Return(1))
0565 .WillOnce(Return(2));
0566 EXPECT_EQ(1, foo.Call());
0567 EXPECT_EQ(2, foo.Call());
0568 }
0569
0570 TEST(MockFunctionTest, WorksForVoidUnary) {
0571 MockFunction<void(int)> foo;
0572 EXPECT_CALL(foo, Call(1));
0573 foo.Call(1);
0574 }
0575
0576 TEST(MockFunctionTest, WorksForNonVoidBinary) {
0577 MockFunction<int(bool, int)> foo;
0578 EXPECT_CALL(foo, Call(false, 42))
0579 .WillOnce(Return(1))
0580 .WillOnce(Return(2));
0581 EXPECT_CALL(foo, Call(true, Ge(100)))
0582 .WillOnce(Return(3));
0583 EXPECT_EQ(1, foo.Call(false, 42));
0584 EXPECT_EQ(2, foo.Call(false, 42));
0585 EXPECT_EQ(3, foo.Call(true, 120));
0586 }
0587
0588 TEST(MockFunctionTest, WorksFor10Arguments) {
0589 MockFunction<int(bool a0, char a1, int a2, int a3, int a4,
0590 int a5, int a6, char a7, int a8, bool a9)> foo;
0591 EXPECT_CALL(foo, Call(_, 'a', _, _, _, _, _, _, _, _))
0592 .WillOnce(Return(1))
0593 .WillOnce(Return(2));
0594 EXPECT_EQ(1, foo.Call(false, 'a', 0, 0, 0, 0, 0, 'b', 0, true));
0595 EXPECT_EQ(2, foo.Call(true, 'a', 0, 0, 0, 0, 0, 'b', 1, false));
0596 }
0597
0598 #if GTEST_HAS_STD_FUNCTION_
0599 TEST(MockFunctionTest, AsStdFunction) {
0600 MockFunction<int(int)> foo;
0601 auto call = [](const std::function<int(int)> &f, int i) {
0602 return f(i);
0603 };
0604 EXPECT_CALL(foo, Call(1)).WillOnce(Return(-1));
0605 EXPECT_CALL(foo, Call(2)).WillOnce(Return(-2));
0606 EXPECT_EQ(-1, call(foo.AsStdFunction(), 1));
0607 EXPECT_EQ(-2, call(foo.AsStdFunction(), 2));
0608 }
0609
0610 TEST(MockFunctionTest, AsStdFunctionReturnsReference) {
0611 MockFunction<int&()> foo;
0612 int value = 1;
0613 EXPECT_CALL(foo, Call()).WillOnce(ReturnRef(value));
0614 int& ref = foo.AsStdFunction()();
0615 EXPECT_EQ(1, ref);
0616 value = 2;
0617 EXPECT_EQ(2, ref);
0618 }
0619 #endif
0620
0621 }
0622 }