Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:19:55

0001 // Copyright 2007, Google Inc.
0002 // All rights reserved.
0003 //
0004 // Redistribution and use in source and binary forms, with or without
0005 // modification, are permitted provided that the following conditions are
0006 // met:
0007 //
0008 //     * Redistributions of source code must retain the above copyright
0009 // notice, this list of conditions and the following disclaimer.
0010 //     * Redistributions in binary form must reproduce the above
0011 // copyright notice, this list of conditions and the following disclaimer
0012 // in the documentation and/or other materials provided with the
0013 // distribution.
0014 //     * Neither the name of Google Inc. nor the names of its
0015 // contributors may be used to endorse or promote products derived from
0016 // this software without specific prior written permission.
0017 //
0018 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
0019 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
0020 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
0021 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
0022 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
0023 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
0024 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0025 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
0026 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0027 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
0028 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0029 //
0030 // Author: wan@google.com (Zhanyong Wan)
0031 
0032 // Google Mock - a framework for writing C++ mock classes.
0033 //
0034 // This file tests the function mocker classes.
0035 
0036 #include "gmock/gmock-generated-function-mockers.h"
0037 
0038 #if GTEST_OS_WINDOWS
0039 // MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
0040 // we are getting compiler errors if we use basetyps.h, hence including
0041 // objbase.h for definition of STDMETHOD.
0042 # include <objbase.h>
0043 #endif  // GTEST_OS_WINDOWS
0044 
0045 #include <map>
0046 #include <string>
0047 #include "gmock/gmock.h"
0048 #include "gtest/gtest.h"
0049 
0050 // There is a bug in MSVC (fixed in VS 2008) that prevents creating a
0051 // mock for a function with const arguments, so we don't test such
0052 // cases for MSVC versions older than 2008.
0053 #if !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
0054 # define GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0055 #endif  // !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
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;  // NOLINT
0084   virtual int Decimal(bool b, char c, short d, int e, long f,  // NOLINT
0085                       float g, double h, unsigned i, char* j, const string& k)
0086       = 0;
0087 
0088   virtual bool TakesNonConstReference(int& n) = 0;  // NOLINT
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  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
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,  // NOLINT
0110       float g, double h, unsigned i, char* j, const string& k) = 0;
0111   STDMETHOD_(char, CTConst)(int x) const = 0;
0112 #endif  // GTEST_OS_WINDOWS
0113 };
0114 
0115 // Const qualifiers on arguments were once (incorrectly) considered
0116 // significant in determining whether two virtual functions had the same
0117 // signature. This was fixed in Visual Studio 2008. However, the compiler
0118 // still emits a warning that alerts about this change in behavior.
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   // Makes sure that a mock function parameter can be named.
0128   MOCK_METHOD1(VoidReturning, void(int n));  // NOLINT
0129 
0130   MOCK_METHOD0(Nullary, int());  // NOLINT
0131 
0132   // Makes sure that a mock function parameter can be unnamed.
0133   MOCK_METHOD1(Unary, bool(int));  // NOLINT
0134   MOCK_METHOD2(Binary, long(short, int));  // NOLINT
0135   MOCK_METHOD10(Decimal, int(bool, char, short, int, long, float,  // NOLINT
0136                              double, unsigned, char*, const string& str));
0137 
0138   MOCK_METHOD1(TakesNonConstReference, bool(int&));  // NOLINT
0139   MOCK_METHOD1(TakesConstReference, string(const int&));
0140 
0141 #ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0142   MOCK_METHOD1(TakesConst, bool(const int));  // NOLINT
0143 #endif
0144 
0145   // Tests that the function return type can contain unprotected comma.
0146   MOCK_METHOD0(ReturnTypeWithComma, std::map<int, string>());
0147   MOCK_CONST_METHOD1(ReturnTypeWithComma,
0148                      std::map<int, string>(int));  // NOLINT
0149 
0150   MOCK_METHOD0(OverloadedOnArgumentNumber, int());  // NOLINT
0151   MOCK_METHOD1(OverloadedOnArgumentNumber, int(int));  // NOLINT
0152 
0153   MOCK_METHOD1(OverloadedOnArgumentType, int(int));  // NOLINT
0154   MOCK_METHOD1(OverloadedOnArgumentType, char(char));  // NOLINT
0155 
0156   MOCK_METHOD0(OverloadedOnConstness, int());  // NOLINT
0157   MOCK_CONST_METHOD0(OverloadedOnConstness, char());  // NOLINT
0158 
0159   MOCK_METHOD1(TypeWithHole, int(int (*)()));  // NOLINT
0160   MOCK_METHOD1(TypeWithComma, int(const std::map<int, string>&));  // NOLINT
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   // Tests that the function return type can contain unprotected comma.
0171   MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTReturnTypeWithComma,
0172                              std::map<int, string>());
0173 #endif  // GTEST_OS_WINDOWS
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 // Tests mocking a void-returning function.
0191 TEST_F(FunctionMockerTest, MocksVoidFunction) {
0192   EXPECT_CALL(mock_foo_, VoidReturning(Lt(100)));
0193   foo_->VoidReturning(0);
0194 }
0195 
0196 // Tests mocking a nullary function.
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 // Tests mocking a unary function.
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 // Tests mocking a binary function.
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 // Tests mocking a decimal function.
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 // Tests mocking a function that takes a non-const reference.
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 // Tests mocking a function that takes a const reference.
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 // Tests mocking a function that takes a const variable.
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  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
0260 
0261 // Tests mocking functions overloaded on the number of arguments.
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 // Tests mocking functions overloaded on the types of argument.
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 // Tests mocking functions overloaded on the const-ness of this object.
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 // Tests mocking a nullary function with calltype.
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 // Tests mocking a unary function with calltype.
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 // Tests mocking a decimal function with calltype.
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 // Tests mocking functions overloaded on the const-ness of this object.
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  // GTEST_OS_WINDOWS
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 // Tests that functions with no EXPECT_CALL() ruls can be called any
0364 // number of times.
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 // Tests mocking template interfaces.
0383 
0384 template <typename T>
0385 class StackInterface {
0386  public:
0387   virtual ~StackInterface() {}
0388 
0389   // Template parameter appears in function parameter.
0390   virtual void Push(const T& value) = 0;
0391   virtual void Pop() = 0;
0392   virtual int GetSize() const = 0;
0393   // Template parameter appears in function return type.
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());  // NOLINT
0405   MOCK_CONST_METHOD0_T(GetTop, const T&());
0406 
0407   // Tests that the function return type can contain unprotected comma.
0408   MOCK_METHOD0_T(ReturnTypeWithComma, std::map<int, int>());
0409   MOCK_CONST_METHOD1_T(ReturnTypeWithComma, std::map<int, int>(int));  // NOLINT
0410 
0411  private:
0412   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStack);
0413 };
0414 
0415 // Tests that template mock works.
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 // Tests mocking template interfaces with calltype.
0453 
0454 template <typename T>
0455 class StackInterfaceWithCallType {
0456  public:
0457   virtual ~StackInterfaceWithCallType() {}
0458 
0459   // Template parameter appears in function parameter.
0460   STDMETHOD_(void, Push)(const T& value) = 0;
0461   STDMETHOD_(void, Pop)() = 0;
0462   STDMETHOD_(int, GetSize)() const = 0;
0463   // Template parameter appears in function return type.
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 // Tests that template mock with calltype works.
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  // GTEST_OS_WINDOWS
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  // GTEST_HAS_STD_FUNCTION_
0620 
0621 }  // namespace gmock_generated_function_mockers_test
0622 }  // namespace testing