113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes.
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This file tests the function mocker classes.
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock-generated-function-mockers.h"
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
3913481Sgiacomo.travaglini@arm.com// MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
4013481Sgiacomo.travaglini@arm.com// we are getting compiler errors if we use basetyps.h, hence including
4113481Sgiacomo.travaglini@arm.com// objbase.h for definition of STDMETHOD.
4213481Sgiacomo.travaglini@arm.com# include <objbase.h>
4313481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
4413481Sgiacomo.travaglini@arm.com
4513481Sgiacomo.travaglini@arm.com#include <map>
4613481Sgiacomo.travaglini@arm.com#include <string>
4713481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h"
4813481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
4913481Sgiacomo.travaglini@arm.com
5013481Sgiacomo.travaglini@arm.com// There is a bug in MSVC (fixed in VS 2008) that prevents creating a
5113481Sgiacomo.travaglini@arm.com// mock for a function with const arguments, so we don't test such
5213481Sgiacomo.travaglini@arm.com// cases for MSVC versions older than 2008.
5313481Sgiacomo.travaglini@arm.com#if !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
5413481Sgiacomo.travaglini@arm.com# define GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
5513481Sgiacomo.travaglini@arm.com#endif  // !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
5613481Sgiacomo.travaglini@arm.com
5713481Sgiacomo.travaglini@arm.comnamespace testing {
5813481Sgiacomo.travaglini@arm.comnamespace gmock_generated_function_mockers_test {
5913481Sgiacomo.travaglini@arm.com
6013481Sgiacomo.travaglini@arm.comusing testing::internal::string;
6113481Sgiacomo.travaglini@arm.comusing testing::_;
6213481Sgiacomo.travaglini@arm.comusing testing::A;
6313481Sgiacomo.travaglini@arm.comusing testing::An;
6413481Sgiacomo.travaglini@arm.comusing testing::AnyNumber;
6513481Sgiacomo.travaglini@arm.comusing testing::Const;
6613481Sgiacomo.travaglini@arm.comusing testing::DoDefault;
6713481Sgiacomo.travaglini@arm.comusing testing::Eq;
6813481Sgiacomo.travaglini@arm.comusing testing::Lt;
6913481Sgiacomo.travaglini@arm.comusing testing::MockFunction;
7013481Sgiacomo.travaglini@arm.comusing testing::Ref;
7113481Sgiacomo.travaglini@arm.comusing testing::Return;
7213481Sgiacomo.travaglini@arm.comusing testing::ReturnRef;
7313481Sgiacomo.travaglini@arm.comusing testing::TypedEq;
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.comclass FooInterface {
7613481Sgiacomo.travaglini@arm.com public:
7713481Sgiacomo.travaglini@arm.com  virtual ~FooInterface() {}
7813481Sgiacomo.travaglini@arm.com
7913481Sgiacomo.travaglini@arm.com  virtual void VoidReturning(int x) = 0;
8013481Sgiacomo.travaglini@arm.com
8113481Sgiacomo.travaglini@arm.com  virtual int Nullary() = 0;
8213481Sgiacomo.travaglini@arm.com  virtual bool Unary(int x) = 0;
8313481Sgiacomo.travaglini@arm.com  virtual long Binary(short x, int y) = 0;  // NOLINT
8413481Sgiacomo.travaglini@arm.com  virtual int Decimal(bool b, char c, short d, int e, long f,  // NOLINT
8513481Sgiacomo.travaglini@arm.com                      float g, double h, unsigned i, char* j, const string& k)
8613481Sgiacomo.travaglini@arm.com      = 0;
8713481Sgiacomo.travaglini@arm.com
8813481Sgiacomo.travaglini@arm.com  virtual bool TakesNonConstReference(int& n) = 0;  // NOLINT
8913481Sgiacomo.travaglini@arm.com  virtual string TakesConstReference(const int& n) = 0;
9013481Sgiacomo.travaglini@arm.com#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
9113481Sgiacomo.travaglini@arm.com  virtual bool TakesConst(const int x) = 0;
9213481Sgiacomo.travaglini@arm.com#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.com  virtual int OverloadedOnArgumentNumber() = 0;
9513481Sgiacomo.travaglini@arm.com  virtual int OverloadedOnArgumentNumber(int n) = 0;
9613481Sgiacomo.travaglini@arm.com
9713481Sgiacomo.travaglini@arm.com  virtual int OverloadedOnArgumentType(int n) = 0;
9813481Sgiacomo.travaglini@arm.com  virtual char OverloadedOnArgumentType(char c) = 0;
9913481Sgiacomo.travaglini@arm.com
10013481Sgiacomo.travaglini@arm.com  virtual int OverloadedOnConstness() = 0;
10113481Sgiacomo.travaglini@arm.com  virtual char OverloadedOnConstness() const = 0;
10213481Sgiacomo.travaglini@arm.com
10313481Sgiacomo.travaglini@arm.com  virtual int TypeWithHole(int (*func)()) = 0;
10413481Sgiacomo.travaglini@arm.com  virtual int TypeWithComma(const std::map<int, string>& a_map) = 0;
10513481Sgiacomo.travaglini@arm.com
10613481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
10713481Sgiacomo.travaglini@arm.com  STDMETHOD_(int, CTNullary)() = 0;
10813481Sgiacomo.travaglini@arm.com  STDMETHOD_(bool, CTUnary)(int x) = 0;
10913481Sgiacomo.travaglini@arm.com  STDMETHOD_(int, CTDecimal)(bool b, char c, short d, int e, long f,  // NOLINT
11013481Sgiacomo.travaglini@arm.com      float g, double h, unsigned i, char* j, const string& k) = 0;
11113481Sgiacomo.travaglini@arm.com  STDMETHOD_(char, CTConst)(int x) const = 0;
11213481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
11313481Sgiacomo.travaglini@arm.com};
11413481Sgiacomo.travaglini@arm.com
11513481Sgiacomo.travaglini@arm.com// Const qualifiers on arguments were once (incorrectly) considered
11613481Sgiacomo.travaglini@arm.com// significant in determining whether two virtual functions had the same
11713481Sgiacomo.travaglini@arm.com// signature. This was fixed in Visual Studio 2008. However, the compiler
11813481Sgiacomo.travaglini@arm.com// still emits a warning that alerts about this change in behavior.
11913481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER
12013481Sgiacomo.travaglini@arm.com# pragma warning(push)
12113481Sgiacomo.travaglini@arm.com# pragma warning(disable : 4373)
12213481Sgiacomo.travaglini@arm.com#endif
12313481Sgiacomo.travaglini@arm.comclass MockFoo : public FooInterface {
12413481Sgiacomo.travaglini@arm.com public:
12513481Sgiacomo.travaglini@arm.com  MockFoo() {}
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.com  // Makes sure that a mock function parameter can be named.
12813481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(VoidReturning, void(int n));  // NOLINT
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(Nullary, int());  // NOLINT
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com  // Makes sure that a mock function parameter can be unnamed.
13313481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(Unary, bool(int));  // NOLINT
13413481Sgiacomo.travaglini@arm.com  MOCK_METHOD2(Binary, long(short, int));  // NOLINT
13513481Sgiacomo.travaglini@arm.com  MOCK_METHOD10(Decimal, int(bool, char, short, int, long, float,  // NOLINT
13613481Sgiacomo.travaglini@arm.com                             double, unsigned, char*, const string& str));
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(TakesNonConstReference, bool(int&));  // NOLINT
13913481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(TakesConstReference, string(const int&));
14013481Sgiacomo.travaglini@arm.com
14113481Sgiacomo.travaglini@arm.com#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
14213481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(TakesConst, bool(const int));  // NOLINT
14313481Sgiacomo.travaglini@arm.com#endif
14413481Sgiacomo.travaglini@arm.com
14513481Sgiacomo.travaglini@arm.com  // Tests that the function return type can contain unprotected comma.
14613481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(ReturnTypeWithComma, std::map<int, string>());
14713481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD1(ReturnTypeWithComma,
14813481Sgiacomo.travaglini@arm.com                     std::map<int, string>(int));  // NOLINT
14913481Sgiacomo.travaglini@arm.com
15013481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(OverloadedOnArgumentNumber, int());  // NOLINT
15113481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(OverloadedOnArgumentNumber, int(int));  // NOLINT
15213481Sgiacomo.travaglini@arm.com
15313481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(OverloadedOnArgumentType, int(int));  // NOLINT
15413481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(OverloadedOnArgumentType, char(char));  // NOLINT
15513481Sgiacomo.travaglini@arm.com
15613481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(OverloadedOnConstness, int());  // NOLINT
15713481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD0(OverloadedOnConstness, char());  // NOLINT
15813481Sgiacomo.travaglini@arm.com
15913481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(TypeWithHole, int(int (*)()));  // NOLINT
16013481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(TypeWithComma, int(const std::map<int, string>&));  // NOLINT
16113481Sgiacomo.travaglini@arm.com
16213481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
16313481Sgiacomo.travaglini@arm.com  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTNullary, int());
16413481Sgiacomo.travaglini@arm.com  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTUnary, bool(int));
16513481Sgiacomo.travaglini@arm.com  MOCK_METHOD10_WITH_CALLTYPE(STDMETHODCALLTYPE, CTDecimal, int(bool b, char c,
16613481Sgiacomo.travaglini@arm.com      short d, int e, long f, float g, double h, unsigned i, char* j,
16713481Sgiacomo.travaglini@arm.com      const string& k));
16813481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTConst, char(int));
16913481Sgiacomo.travaglini@arm.com
17013481Sgiacomo.travaglini@arm.com  // Tests that the function return type can contain unprotected comma.
17113481Sgiacomo.travaglini@arm.com  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTReturnTypeWithComma,
17213481Sgiacomo.travaglini@arm.com                             std::map<int, string>());
17313481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
17413481Sgiacomo.travaglini@arm.com
17513481Sgiacomo.travaglini@arm.com private:
17613481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
17713481Sgiacomo.travaglini@arm.com};
17813481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER
17913481Sgiacomo.travaglini@arm.com# pragma warning(pop)
18013481Sgiacomo.travaglini@arm.com#endif
18113481Sgiacomo.travaglini@arm.com
18213481Sgiacomo.travaglini@arm.comclass FunctionMockerTest : public testing::Test {
18313481Sgiacomo.travaglini@arm.com protected:
18413481Sgiacomo.travaglini@arm.com  FunctionMockerTest() : foo_(&mock_foo_) {}
18513481Sgiacomo.travaglini@arm.com
18613481Sgiacomo.travaglini@arm.com  FooInterface* const foo_;
18713481Sgiacomo.travaglini@arm.com  MockFoo mock_foo_;
18813481Sgiacomo.travaglini@arm.com};
18913481Sgiacomo.travaglini@arm.com
19013481Sgiacomo.travaglini@arm.com// Tests mocking a void-returning function.
19113481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksVoidFunction) {
19213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, VoidReturning(Lt(100)));
19313481Sgiacomo.travaglini@arm.com  foo_->VoidReturning(0);
19413481Sgiacomo.travaglini@arm.com}
19513481Sgiacomo.travaglini@arm.com
19613481Sgiacomo.travaglini@arm.com// Tests mocking a nullary function.
19713481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksNullaryFunction) {
19813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, Nullary())
19913481Sgiacomo.travaglini@arm.com      .WillOnce(DoDefault())
20013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
20113481Sgiacomo.travaglini@arm.com
20213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, foo_->Nullary());
20313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, foo_->Nullary());
20413481Sgiacomo.travaglini@arm.com}
20513481Sgiacomo.travaglini@arm.com
20613481Sgiacomo.travaglini@arm.com// Tests mocking a unary function.
20713481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksUnaryFunction) {
20813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, Unary(Eq(2)))
20913481Sgiacomo.travaglini@arm.com      .Times(2)
21013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(true));
21113481Sgiacomo.travaglini@arm.com
21213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(foo_->Unary(2));
21313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(foo_->Unary(2));
21413481Sgiacomo.travaglini@arm.com}
21513481Sgiacomo.travaglini@arm.com
21613481Sgiacomo.travaglini@arm.com// Tests mocking a binary function.
21713481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksBinaryFunction) {
21813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, Binary(2, _))
21913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(3));
22013481Sgiacomo.travaglini@arm.com
22113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, foo_->Binary(2, 1));
22213481Sgiacomo.travaglini@arm.com}
22313481Sgiacomo.travaglini@arm.com
22413481Sgiacomo.travaglini@arm.com// Tests mocking a decimal function.
22513481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksDecimalFunction) {
22613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, Decimal(true, 'a', 0, 0, 1L, A<float>(),
22713481Sgiacomo.travaglini@arm.com                                 Lt(100), 5U, NULL, "hi"))
22813481Sgiacomo.travaglini@arm.com      .WillOnce(Return(5));
22913481Sgiacomo.travaglini@arm.com
23013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, foo_->Decimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
23113481Sgiacomo.travaglini@arm.com}
23213481Sgiacomo.travaglini@arm.com
23313481Sgiacomo.travaglini@arm.com// Tests mocking a function that takes a non-const reference.
23413481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionWithNonConstReferenceArgument) {
23513481Sgiacomo.travaglini@arm.com  int a = 0;
23613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, TakesNonConstReference(Ref(a)))
23713481Sgiacomo.travaglini@arm.com      .WillOnce(Return(true));
23813481Sgiacomo.travaglini@arm.com
23913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(foo_->TakesNonConstReference(a));
24013481Sgiacomo.travaglini@arm.com}
24113481Sgiacomo.travaglini@arm.com
24213481Sgiacomo.travaglini@arm.com// Tests mocking a function that takes a const reference.
24313481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionWithConstReferenceArgument) {
24413481Sgiacomo.travaglini@arm.com  int a = 0;
24513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, TakesConstReference(Ref(a)))
24613481Sgiacomo.travaglini@arm.com      .WillOnce(Return("Hello"));
24713481Sgiacomo.travaglini@arm.com
24813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("Hello", foo_->TakesConstReference(a));
24913481Sgiacomo.travaglini@arm.com}
25013481Sgiacomo.travaglini@arm.com
25113481Sgiacomo.travaglini@arm.com#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
25213481Sgiacomo.travaglini@arm.com// Tests mocking a function that takes a const variable.
25313481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionWithConstArgument) {
25413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, TakesConst(Lt(10)))
25513481Sgiacomo.travaglini@arm.com      .WillOnce(DoDefault());
25613481Sgiacomo.travaglini@arm.com
25713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(foo_->TakesConst(5));
25813481Sgiacomo.travaglini@arm.com}
25913481Sgiacomo.travaglini@arm.com#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
26013481Sgiacomo.travaglini@arm.com
26113481Sgiacomo.travaglini@arm.com// Tests mocking functions overloaded on the number of arguments.
26213481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentNumber) {
26313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber())
26413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
26513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber(_))
26613481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
26713481Sgiacomo.travaglini@arm.com
26813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, foo_->OverloadedOnArgumentNumber(1));
26913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, foo_->OverloadedOnArgumentNumber());
27013481Sgiacomo.travaglini@arm.com}
27113481Sgiacomo.travaglini@arm.com
27213481Sgiacomo.travaglini@arm.com// Tests mocking functions overloaded on the types of argument.
27313481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentType) {
27413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(An<int>()))
27513481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
27613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(TypedEq<char>('a')))
27713481Sgiacomo.travaglini@arm.com      .WillOnce(Return('b'));
27813481Sgiacomo.travaglini@arm.com
27913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, foo_->OverloadedOnArgumentType(0));
28013481Sgiacomo.travaglini@arm.com  EXPECT_EQ('b', foo_->OverloadedOnArgumentType('a'));
28113481Sgiacomo.travaglini@arm.com}
28213481Sgiacomo.travaglini@arm.com
28313481Sgiacomo.travaglini@arm.com// Tests mocking functions overloaded on the const-ness of this object.
28413481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnConstnessOfThis) {
28513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, OverloadedOnConstness());
28613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(Const(mock_foo_), OverloadedOnConstness())
28713481Sgiacomo.travaglini@arm.com      .WillOnce(Return('a'));
28813481Sgiacomo.travaglini@arm.com
28913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, foo_->OverloadedOnConstness());
29013481Sgiacomo.travaglini@arm.com  EXPECT_EQ('a', Const(*foo_).OverloadedOnConstness());
29113481Sgiacomo.travaglini@arm.com}
29213481Sgiacomo.travaglini@arm.com
29313481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksReturnTypeWithComma) {
29413481Sgiacomo.travaglini@arm.com  const std::map<int, string> a_map;
29513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, ReturnTypeWithComma())
29613481Sgiacomo.travaglini@arm.com      .WillOnce(Return(a_map));
29713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, ReturnTypeWithComma(42))
29813481Sgiacomo.travaglini@arm.com      .WillOnce(Return(a_map));
29913481Sgiacomo.travaglini@arm.com
30013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(a_map, mock_foo_.ReturnTypeWithComma());
30113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(a_map, mock_foo_.ReturnTypeWithComma(42));
30213481Sgiacomo.travaglini@arm.com}
30313481Sgiacomo.travaglini@arm.com
30413481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
30513481Sgiacomo.travaglini@arm.com// Tests mocking a nullary function with calltype.
30613481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksNullaryFunctionWithCallType) {
30713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, CTNullary())
30813481Sgiacomo.travaglini@arm.com      .WillOnce(Return(-1))
30913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(0));
31013481Sgiacomo.travaglini@arm.com
31113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(-1, foo_->CTNullary());
31213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, foo_->CTNullary());
31313481Sgiacomo.travaglini@arm.com}
31413481Sgiacomo.travaglini@arm.com
31513481Sgiacomo.travaglini@arm.com// Tests mocking a unary function with calltype.
31613481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksUnaryFunctionWithCallType) {
31713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, CTUnary(Eq(2)))
31813481Sgiacomo.travaglini@arm.com      .Times(2)
31913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(true))
32013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(false));
32113481Sgiacomo.travaglini@arm.com
32213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(foo_->CTUnary(2));
32313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(foo_->CTUnary(2));
32413481Sgiacomo.travaglini@arm.com}
32513481Sgiacomo.travaglini@arm.com
32613481Sgiacomo.travaglini@arm.com// Tests mocking a decimal function with calltype.
32713481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksDecimalFunctionWithCallType) {
32813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, CTDecimal(true, 'a', 0, 0, 1L, A<float>(),
32913481Sgiacomo.travaglini@arm.com                                   Lt(100), 5U, NULL, "hi"))
33013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(10));
33113481Sgiacomo.travaglini@arm.com
33213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(10, foo_->CTDecimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
33313481Sgiacomo.travaglini@arm.com}
33413481Sgiacomo.travaglini@arm.com
33513481Sgiacomo.travaglini@arm.com// Tests mocking functions overloaded on the const-ness of this object.
33613481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksFunctionsConstFunctionWithCallType) {
33713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(Const(mock_foo_), CTConst(_))
33813481Sgiacomo.travaglini@arm.com      .WillOnce(Return('a'));
33913481Sgiacomo.travaglini@arm.com
34013481Sgiacomo.travaglini@arm.com  EXPECT_EQ('a', Const(*foo_).CTConst(0));
34113481Sgiacomo.travaglini@arm.com}
34213481Sgiacomo.travaglini@arm.com
34313481Sgiacomo.travaglini@arm.comTEST_F(FunctionMockerTest, MocksReturnTypeWithCommaAndCallType) {
34413481Sgiacomo.travaglini@arm.com  const std::map<int, string> a_map;
34513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock_foo_, CTReturnTypeWithComma())
34613481Sgiacomo.travaglini@arm.com      .WillOnce(Return(a_map));
34713481Sgiacomo.travaglini@arm.com
34813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(a_map, mock_foo_.CTReturnTypeWithComma());
34913481Sgiacomo.travaglini@arm.com}
35013481Sgiacomo.travaglini@arm.com
35113481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
35213481Sgiacomo.travaglini@arm.com
35313481Sgiacomo.travaglini@arm.comclass MockB {
35413481Sgiacomo.travaglini@arm.com public:
35513481Sgiacomo.travaglini@arm.com  MockB() {}
35613481Sgiacomo.travaglini@arm.com
35713481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(DoB, void());
35813481Sgiacomo.travaglini@arm.com
35913481Sgiacomo.travaglini@arm.com private:
36013481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
36113481Sgiacomo.travaglini@arm.com};
36213481Sgiacomo.travaglini@arm.com
36313481Sgiacomo.travaglini@arm.com// Tests that functions with no EXPECT_CALL() ruls can be called any
36413481Sgiacomo.travaglini@arm.com// number of times.
36513481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, UnmentionedFunctionCanBeCalledAnyNumberOfTimes) {
36613481Sgiacomo.travaglini@arm.com  {
36713481Sgiacomo.travaglini@arm.com    MockB b;
36813481Sgiacomo.travaglini@arm.com  }
36913481Sgiacomo.travaglini@arm.com
37013481Sgiacomo.travaglini@arm.com  {
37113481Sgiacomo.travaglini@arm.com    MockB b;
37213481Sgiacomo.travaglini@arm.com    b.DoB();
37313481Sgiacomo.travaglini@arm.com  }
37413481Sgiacomo.travaglini@arm.com
37513481Sgiacomo.travaglini@arm.com  {
37613481Sgiacomo.travaglini@arm.com    MockB b;
37713481Sgiacomo.travaglini@arm.com    b.DoB();
37813481Sgiacomo.travaglini@arm.com    b.DoB();
37913481Sgiacomo.travaglini@arm.com  }
38013481Sgiacomo.travaglini@arm.com}
38113481Sgiacomo.travaglini@arm.com
38213481Sgiacomo.travaglini@arm.com// Tests mocking template interfaces.
38313481Sgiacomo.travaglini@arm.com
38413481Sgiacomo.travaglini@arm.comtemplate <typename T>
38513481Sgiacomo.travaglini@arm.comclass StackInterface {
38613481Sgiacomo.travaglini@arm.com public:
38713481Sgiacomo.travaglini@arm.com  virtual ~StackInterface() {}
38813481Sgiacomo.travaglini@arm.com
38913481Sgiacomo.travaglini@arm.com  // Template parameter appears in function parameter.
39013481Sgiacomo.travaglini@arm.com  virtual void Push(const T& value) = 0;
39113481Sgiacomo.travaglini@arm.com  virtual void Pop() = 0;
39213481Sgiacomo.travaglini@arm.com  virtual int GetSize() const = 0;
39313481Sgiacomo.travaglini@arm.com  // Template parameter appears in function return type.
39413481Sgiacomo.travaglini@arm.com  virtual const T& GetTop() const = 0;
39513481Sgiacomo.travaglini@arm.com};
39613481Sgiacomo.travaglini@arm.com
39713481Sgiacomo.travaglini@arm.comtemplate <typename T>
39813481Sgiacomo.travaglini@arm.comclass MockStack : public StackInterface<T> {
39913481Sgiacomo.travaglini@arm.com public:
40013481Sgiacomo.travaglini@arm.com  MockStack() {}
40113481Sgiacomo.travaglini@arm.com
40213481Sgiacomo.travaglini@arm.com  MOCK_METHOD1_T(Push, void(const T& elem));
40313481Sgiacomo.travaglini@arm.com  MOCK_METHOD0_T(Pop, void());
40413481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD0_T(GetSize, int());  // NOLINT
40513481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD0_T(GetTop, const T&());
40613481Sgiacomo.travaglini@arm.com
40713481Sgiacomo.travaglini@arm.com  // Tests that the function return type can contain unprotected comma.
40813481Sgiacomo.travaglini@arm.com  MOCK_METHOD0_T(ReturnTypeWithComma, std::map<int, int>());
40913481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD1_T(ReturnTypeWithComma, std::map<int, int>(int));  // NOLINT
41013481Sgiacomo.travaglini@arm.com
41113481Sgiacomo.travaglini@arm.com private:
41213481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStack);
41313481Sgiacomo.travaglini@arm.com};
41413481Sgiacomo.travaglini@arm.com
41513481Sgiacomo.travaglini@arm.com// Tests that template mock works.
41613481Sgiacomo.travaglini@arm.comTEST(TemplateMockTest, Works) {
41713481Sgiacomo.travaglini@arm.com  MockStack<int> mock;
41813481Sgiacomo.travaglini@arm.com
41913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, GetSize())
42013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(0))
42113481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
42213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(0));
42313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Push(_));
42413481Sgiacomo.travaglini@arm.com  int n = 5;
42513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, GetTop())
42613481Sgiacomo.travaglini@arm.com      .WillOnce(ReturnRef(n));
42713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Pop())
42813481Sgiacomo.travaglini@arm.com      .Times(AnyNumber());
42913481Sgiacomo.travaglini@arm.com
43013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, mock.GetSize());
43113481Sgiacomo.travaglini@arm.com  mock.Push(5);
43213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, mock.GetSize());
43313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, mock.GetTop());
43413481Sgiacomo.travaglini@arm.com  mock.Pop();
43513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, mock.GetSize());
43613481Sgiacomo.travaglini@arm.com}
43713481Sgiacomo.travaglini@arm.com
43813481Sgiacomo.travaglini@arm.comTEST(TemplateMockTest, MethodWithCommaInReturnTypeWorks) {
43913481Sgiacomo.travaglini@arm.com  MockStack<int> mock;
44013481Sgiacomo.travaglini@arm.com
44113481Sgiacomo.travaglini@arm.com  const std::map<int, int> a_map;
44213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, ReturnTypeWithComma())
44313481Sgiacomo.travaglini@arm.com      .WillOnce(Return(a_map));
44413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, ReturnTypeWithComma(1))
44513481Sgiacomo.travaglini@arm.com      .WillOnce(Return(a_map));
44613481Sgiacomo.travaglini@arm.com
44713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(a_map, mock.ReturnTypeWithComma());
44813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(a_map, mock.ReturnTypeWithComma(1));
44913481Sgiacomo.travaglini@arm.com}
45013481Sgiacomo.travaglini@arm.com
45113481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
45213481Sgiacomo.travaglini@arm.com// Tests mocking template interfaces with calltype.
45313481Sgiacomo.travaglini@arm.com
45413481Sgiacomo.travaglini@arm.comtemplate <typename T>
45513481Sgiacomo.travaglini@arm.comclass StackInterfaceWithCallType {
45613481Sgiacomo.travaglini@arm.com public:
45713481Sgiacomo.travaglini@arm.com  virtual ~StackInterfaceWithCallType() {}
45813481Sgiacomo.travaglini@arm.com
45913481Sgiacomo.travaglini@arm.com  // Template parameter appears in function parameter.
46013481Sgiacomo.travaglini@arm.com  STDMETHOD_(void, Push)(const T& value) = 0;
46113481Sgiacomo.travaglini@arm.com  STDMETHOD_(void, Pop)() = 0;
46213481Sgiacomo.travaglini@arm.com  STDMETHOD_(int, GetSize)() const = 0;
46313481Sgiacomo.travaglini@arm.com  // Template parameter appears in function return type.
46413481Sgiacomo.travaglini@arm.com  STDMETHOD_(const T&, GetTop)() const = 0;
46513481Sgiacomo.travaglini@arm.com};
46613481Sgiacomo.travaglini@arm.com
46713481Sgiacomo.travaglini@arm.comtemplate <typename T>
46813481Sgiacomo.travaglini@arm.comclass MockStackWithCallType : public StackInterfaceWithCallType<T> {
46913481Sgiacomo.travaglini@arm.com public:
47013481Sgiacomo.travaglini@arm.com  MockStackWithCallType() {}
47113481Sgiacomo.travaglini@arm.com
47213481Sgiacomo.travaglini@arm.com  MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Push, void(const T& elem));
47313481Sgiacomo.travaglini@arm.com  MOCK_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Pop, void());
47413481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetSize, int());
47513481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTop, const T&());
47613481Sgiacomo.travaglini@arm.com
47713481Sgiacomo.travaglini@arm.com private:
47813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStackWithCallType);
47913481Sgiacomo.travaglini@arm.com};
48013481Sgiacomo.travaglini@arm.com
48113481Sgiacomo.travaglini@arm.com// Tests that template mock with calltype works.
48213481Sgiacomo.travaglini@arm.comTEST(TemplateMockTestWithCallType, Works) {
48313481Sgiacomo.travaglini@arm.com  MockStackWithCallType<int> mock;
48413481Sgiacomo.travaglini@arm.com
48513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, GetSize())
48613481Sgiacomo.travaglini@arm.com      .WillOnce(Return(0))
48713481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
48813481Sgiacomo.travaglini@arm.com      .WillOnce(Return(0));
48913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Push(_));
49013481Sgiacomo.travaglini@arm.com  int n = 5;
49113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, GetTop())
49213481Sgiacomo.travaglini@arm.com      .WillOnce(ReturnRef(n));
49313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Pop())
49413481Sgiacomo.travaglini@arm.com      .Times(AnyNumber());
49513481Sgiacomo.travaglini@arm.com
49613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, mock.GetSize());
49713481Sgiacomo.travaglini@arm.com  mock.Push(5);
49813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, mock.GetSize());
49913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, mock.GetTop());
50013481Sgiacomo.travaglini@arm.com  mock.Pop();
50113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, mock.GetSize());
50213481Sgiacomo.travaglini@arm.com}
50313481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
50413481Sgiacomo.travaglini@arm.com
50513481Sgiacomo.travaglini@arm.com#define MY_MOCK_METHODS1_ \
50613481Sgiacomo.travaglini@arm.com    MOCK_METHOD0(Overloaded, void()); \
50713481Sgiacomo.travaglini@arm.com    MOCK_CONST_METHOD1(Overloaded, int(int n)); \
50813481Sgiacomo.travaglini@arm.com    MOCK_METHOD2(Overloaded, bool(bool f, int n))
50913481Sgiacomo.travaglini@arm.com
51013481Sgiacomo.travaglini@arm.comclass MockOverloadedOnArgNumber {
51113481Sgiacomo.travaglini@arm.com public:
51213481Sgiacomo.travaglini@arm.com  MockOverloadedOnArgNumber() {}
51313481Sgiacomo.travaglini@arm.com
51413481Sgiacomo.travaglini@arm.com  MY_MOCK_METHODS1_;
51513481Sgiacomo.travaglini@arm.com
51613481Sgiacomo.travaglini@arm.com private:
51713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnArgNumber);
51813481Sgiacomo.travaglini@arm.com};
51913481Sgiacomo.travaglini@arm.com
52013481Sgiacomo.travaglini@arm.comTEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {
52113481Sgiacomo.travaglini@arm.com  MockOverloadedOnArgNumber mock;
52213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Overloaded());
52313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
52413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Overloaded(true, 1)).WillOnce(Return(true));
52513481Sgiacomo.travaglini@arm.com
52613481Sgiacomo.travaglini@arm.com  mock.Overloaded();
52713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, mock.Overloaded(1));
52813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(mock.Overloaded(true, 1));
52913481Sgiacomo.travaglini@arm.com}
53013481Sgiacomo.travaglini@arm.com
53113481Sgiacomo.travaglini@arm.com#define MY_MOCK_METHODS2_ \
53213481Sgiacomo.travaglini@arm.com    MOCK_CONST_METHOD1(Overloaded, int(int n)); \
53313481Sgiacomo.travaglini@arm.com    MOCK_METHOD1(Overloaded, int(int n));
53413481Sgiacomo.travaglini@arm.com
53513481Sgiacomo.travaglini@arm.comclass MockOverloadedOnConstness {
53613481Sgiacomo.travaglini@arm.com public:
53713481Sgiacomo.travaglini@arm.com  MockOverloadedOnConstness() {}
53813481Sgiacomo.travaglini@arm.com
53913481Sgiacomo.travaglini@arm.com  MY_MOCK_METHODS2_;
54013481Sgiacomo.travaglini@arm.com
54113481Sgiacomo.travaglini@arm.com private:
54213481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnConstness);
54313481Sgiacomo.travaglini@arm.com};
54413481Sgiacomo.travaglini@arm.com
54513481Sgiacomo.travaglini@arm.comTEST(OverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {
54613481Sgiacomo.travaglini@arm.com  MockOverloadedOnConstness mock;
54713481Sgiacomo.travaglini@arm.com  const MockOverloadedOnConstness* const_mock = &mock;
54813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
54913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*const_mock, Overloaded(1)).WillOnce(Return(3));
55013481Sgiacomo.travaglini@arm.com
55113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, mock.Overloaded(1));
55213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, const_mock->Overloaded(1));
55313481Sgiacomo.travaglini@arm.com}
55413481Sgiacomo.travaglini@arm.com
55513481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, WorksForVoidNullary) {
55613481Sgiacomo.travaglini@arm.com  MockFunction<void()> foo;
55713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call());
55813481Sgiacomo.travaglini@arm.com  foo.Call();
55913481Sgiacomo.travaglini@arm.com}
56013481Sgiacomo.travaglini@arm.com
56113481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, WorksForNonVoidNullary) {
56213481Sgiacomo.travaglini@arm.com  MockFunction<int()> foo;
56313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call())
56413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
56513481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
56613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, foo.Call());
56713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, foo.Call());
56813481Sgiacomo.travaglini@arm.com}
56913481Sgiacomo.travaglini@arm.com
57013481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, WorksForVoidUnary) {
57113481Sgiacomo.travaglini@arm.com  MockFunction<void(int)> foo;
57213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call(1));
57313481Sgiacomo.travaglini@arm.com  foo.Call(1);
57413481Sgiacomo.travaglini@arm.com}
57513481Sgiacomo.travaglini@arm.com
57613481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, WorksForNonVoidBinary) {
57713481Sgiacomo.travaglini@arm.com  MockFunction<int(bool, int)> foo;
57813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call(false, 42))
57913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
58013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
58113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call(true, Ge(100)))
58213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(3));
58313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, foo.Call(false, 42));
58413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, foo.Call(false, 42));
58513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, foo.Call(true, 120));
58613481Sgiacomo.travaglini@arm.com}
58713481Sgiacomo.travaglini@arm.com
58813481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, WorksFor10Arguments) {
58913481Sgiacomo.travaglini@arm.com  MockFunction<int(bool a0, char a1, int a2, int a3, int a4,
59013481Sgiacomo.travaglini@arm.com                   int a5, int a6, char a7, int a8, bool a9)> foo;
59113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call(_, 'a', _, _, _, _, _, _, _, _))
59213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
59313481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
59413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, foo.Call(false, 'a', 0, 0, 0, 0, 0, 'b', 0, true));
59513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, foo.Call(true, 'a', 0, 0, 0, 0, 0, 'b', 1, false));
59613481Sgiacomo.travaglini@arm.com}
59713481Sgiacomo.travaglini@arm.com
59813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
59913481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, AsStdFunction) {
60013481Sgiacomo.travaglini@arm.com  MockFunction<int(int)> foo;
60113481Sgiacomo.travaglini@arm.com  auto call = [](const std::function<int(int)> &f, int i) {
60213481Sgiacomo.travaglini@arm.com    return f(i);
60313481Sgiacomo.travaglini@arm.com  };
60413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call(1)).WillOnce(Return(-1));
60513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call(2)).WillOnce(Return(-2));
60613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(-1, call(foo.AsStdFunction(), 1));
60713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(-2, call(foo.AsStdFunction(), 2));
60813481Sgiacomo.travaglini@arm.com}
60913481Sgiacomo.travaglini@arm.com
61013481Sgiacomo.travaglini@arm.comTEST(MockFunctionTest, AsStdFunctionReturnsReference) {
61113481Sgiacomo.travaglini@arm.com  MockFunction<int&()> foo;
61213481Sgiacomo.travaglini@arm.com  int value = 1;
61313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(foo, Call()).WillOnce(ReturnRef(value));
61413481Sgiacomo.travaglini@arm.com  int& ref = foo.AsStdFunction()();
61513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, ref);
61613481Sgiacomo.travaglini@arm.com  value = 2;
61713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, ref);
61813481Sgiacomo.travaglini@arm.com}
61913481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
62013481Sgiacomo.travaglini@arm.com
62113481Sgiacomo.travaglini@arm.com}  // namespace gmock_generated_function_mockers_test
62213481Sgiacomo.travaglini@arm.com}  // namespace testing
623