1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2007, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Google Mock - a framework for writing C++ mock classes.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file tests the function mocker classes.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock-generated-function-mockers.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock.h"
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest.h"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// MSDN says the header file to be included for STDMETHOD is BaseTyps.h but
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// we are getting compiler errors if we use basetyps.h, hence including
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// objbase.h for definition of STDMETHOD.
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# include <objbase.h>
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// There is a bug in MSVC (fixed in VS 2008) that prevents creating a
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// mock for a function with const arguments, so we don't test such
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// cases for MSVC versions older than 2008.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# define GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !GTEST_OS_WINDOWS || (_MSC_VER >= 1500)
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gmock_generated_function_mockers_test {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::string;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::_;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::A;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::An;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::AnyNumber;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Const;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::DoDefault;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Eq;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Lt;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::MockFunction;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Ref;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Return;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::ReturnRef;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::TypedEq;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FooInterface {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~FooInterface() {}
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void VoidReturning(int x) = 0;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int Nullary() = 0;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Unary(int x) = 0;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual long Binary(short x, int y) = 0;  // NOLINT
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int Decimal(bool b, char c, short d, int e, long f,  // NOLINT
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      float g, double h, unsigned i, char* j, const string& k)
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      = 0;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool TakesNonConstReference(int& n) = 0;  // NOLINT
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual string TakesConstReference(const int& n) = 0;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool TakesConst(const int x) = 0;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int OverloadedOnArgumentNumber() = 0;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int OverloadedOnArgumentNumber(int n) = 0;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int OverloadedOnArgumentType(int n) = 0;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual char OverloadedOnArgumentType(char c) = 0;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int OverloadedOnConstness() = 0;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual char OverloadedOnConstness() const = 0;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int TypeWithHole(int (*func)()) = 0;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int TypeWithComma(const std::map<int, string>& a_map) = 0;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(int, CTNullary)() = 0;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(bool, CTUnary)(int x) = 0;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(int, CTDecimal)(bool b, char c, short d, int e, long f,  // NOLINT
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      float g, double h, unsigned i, char* j, const string& k) = 0;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(char, CTConst)(int x) const = 0;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockFoo : public FooInterface {
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFoo() {}
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Makes sure that a mock function parameter can be named.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(VoidReturning, void(int n));  // NOLINT
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(Nullary, int());  // NOLINT
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Makes sure that a mock function parameter can be unnamed.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(Unary, bool(int));  // NOLINT
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD2(Binary, long(short, int));  // NOLINT
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD10(Decimal, int(bool, char, short, int, long, float,  // NOLINT
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             double, unsigned, char*, const string& str));
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(TakesNonConstReference, bool(int&));  // NOLINT
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(TakesConstReference, string(const int&));
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(TakesConst, bool(const int));  // NOLINT
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(OverloadedOnArgumentNumber, int());  // NOLINT
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(OverloadedOnArgumentNumber, int(int));  // NOLINT
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(OverloadedOnArgumentType, int(int));  // NOLINT
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(OverloadedOnArgumentType, char(char));  // NOLINT
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(OverloadedOnConstness, int());  // NOLINT
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0(OverloadedOnConstness, char());  // NOLINT
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(TypeWithHole, int(int (*)()));  // NOLINT
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(TypeWithComma, int(const std::map<int, string>&));  // NOLINT
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, CTNullary, int());
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTUnary, bool(int));
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD10_WITH_CALLTYPE(STDMETHODCALLTYPE, CTDecimal, int(bool b, char c,
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      short d, int e, long f, float g, double h, unsigned i, char* j,
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const string& k));
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, CTConst, char(int));
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FunctionMockerTest : public testing::Test {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FunctionMockerTest() : foo_(&mock_foo_) {}
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FooInterface* const foo_;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFoo mock_foo_;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a void-returning function.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksVoidFunction) {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, VoidReturning(Lt(100)));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  foo_->VoidReturning(0);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a nullary function.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksNullaryFunction) {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, Nullary())
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(DoDefault())
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1));
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, foo_->Nullary());
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, foo_->Nullary());
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a unary function.
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksUnaryFunction) {
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, Unary(Eq(2)))
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(2)
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(true));
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(foo_->Unary(2));
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(foo_->Unary(2));
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a binary function.
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksBinaryFunction) {
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, Binary(2, _))
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(3));
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, foo_->Binary(2, 1));
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a decimal function.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksDecimalFunction) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, Decimal(true, 'a', 0, 0, 1L, A<float>(),
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 Lt(100), 5U, NULL, "hi"))
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(5));
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(5, foo_->Decimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a function that takes a non-const reference.
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionWithNonConstReferenceArgument) {
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int a = 0;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, TakesNonConstReference(Ref(a)))
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(true));
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(foo_->TakesNonConstReference(a));
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a function that takes a const reference.
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionWithConstReferenceArgument) {
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int a = 0;
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, TakesConstReference(Ref(a)))
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return("Hello"));
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("Hello", foo_->TakesConstReference(a));
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a function that takes a const variable.
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionWithConstArgument) {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, TakesConst(Lt(10)))
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(DoDefault());
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(foo_->TakesConst(5));
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GMOCK_ALLOWS_CONST_PARAM_FUNCTIONS
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking functions overloaded on the number of arguments.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentNumber) {
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber())
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1));
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, OverloadedOnArgumentNumber(_))
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(2));
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, foo_->OverloadedOnArgumentNumber(1));
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, foo_->OverloadedOnArgumentNumber());
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking functions overloaded on the types of argument.
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnArgumentType) {
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(An<int>()))
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1));
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, OverloadedOnArgumentType(TypedEq<char>('a')))
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return('b'));
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, foo_->OverloadedOnArgumentType(0));
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('b', foo_->OverloadedOnArgumentType('a'));
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking functions overloaded on the const-ness of this object.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionsOverloadedOnConstnessOfThis) {
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, OverloadedOnConstness());
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(Const(mock_foo_), OverloadedOnConstness())
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return('a'));
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, foo_->OverloadedOnConstness());
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', Const(*foo_).OverloadedOnConstness());
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a nullary function with calltype.
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksNullaryFunctionWithCallType) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, CTNullary())
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(-1))
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(0));
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(-1, foo_->CTNullary());
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, foo_->CTNullary());
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a unary function with calltype.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksUnaryFunctionWithCallType) {
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, CTUnary(Eq(2)))
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(2)
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(true))
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(false));
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(foo_->CTUnary(2));
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(foo_->CTUnary(2));
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking a decimal function with calltype.
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksDecimalFunctionWithCallType) {
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock_foo_, CTDecimal(true, 'a', 0, 0, 1L, A<float>(),
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   Lt(100), 5U, NULL, "hi"))
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(10));
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(10, foo_->CTDecimal(true, 'a', 0, 0, 1, 0, 0, 5, NULL, "hi"));
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking functions overloaded on the const-ness of this object.
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FunctionMockerTest, MocksFunctionsConstFunctionWithCallType) {
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(Const(mock_foo_), CTConst(_))
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return('a'));
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ('a', Const(*foo_).CTConst(0));
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockB {
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockB() {}
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(DoB, void());
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that functions with no EXPECT_CALL() ruls can be called any
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// number of times.
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(ExpectCallTest, UnmentionedFunctionCanBeCalledAnyNumberOfTimes) {
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MockB b;
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MockB b;
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    b.DoB();
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MockB b;
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    b.DoB();
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    b.DoB();
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking template interfaces.
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StackInterface {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~StackInterface() {}
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Template parameter appears in function parameter.
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Push(const T& value) = 0;
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Pop() = 0;
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int GetSize() const = 0;
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Template parameter appears in function return type.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const T& GetTop() const = 0;
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockStack : public StackInterface<T> {
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockStack() {}
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1_T(Push, void(const T& elem));
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0_T(Pop, void());
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0_T(GetSize, int());  // NOLINT
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0_T(GetTop, const T&());
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStack);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that template mock works.
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(TemplateMockTest, Works) {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockStack<int> mock;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, GetSize())
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(0))
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1))
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(0));
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Push(_));
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int n = 5;
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, GetTop())
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(ReturnRef(n));
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Pop())
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(AnyNumber());
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, mock.GetSize());
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mock.Push(5);
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, mock.GetSize());
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(5, mock.GetTop());
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mock.Pop();
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, mock.GetSize());
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if GTEST_OS_WINDOWS
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests mocking template interfaces with calltype.
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StackInterfaceWithCallType {
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~StackInterfaceWithCallType() {}
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Template parameter appears in function parameter.
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(void, Push)(const T& value) = 0;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(void, Pop)() = 0;
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(int, GetSize)() const = 0;
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Template parameter appears in function return type.
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  STDMETHOD_(const T&, GetTop)() const = 0;
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename T>
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockStackWithCallType : public StackInterfaceWithCallType<T> {
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockStackWithCallType() {}
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Push, void(const T& elem));
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, Pop, void());
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetSize, int());
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_CONST_METHOD0_T_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTop, const T&());
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockStackWithCallType);
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that template mock with calltype works.
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(TemplateMockTestWithCallType, Works) {
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockStackWithCallType<int> mock;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, GetSize())
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(0))
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1))
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(0));
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Push(_));
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int n = 5;
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, GetTop())
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(ReturnRef(n));
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Pop())
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(AnyNumber());
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, mock.GetSize());
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mock.Push(5);
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, mock.GetSize());
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(5, mock.GetTop());
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mock.Pop();
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, mock.GetSize());
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_OS_WINDOWS
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MY_MOCK_METHODS1_ \
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MOCK_METHOD0(Overloaded, void()); \
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MOCK_CONST_METHOD1(Overloaded, int(int n)); \
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MOCK_METHOD2(Overloaded, bool(bool f, int n))
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockOverloadedOnArgNumber {
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockOverloadedOnArgNumber() {}
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MY_MOCK_METHODS1_;
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnArgNumber);
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(OverloadedMockMethodTest, CanOverloadOnArgNumberInMacroBody) {
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockOverloadedOnArgNumber mock;
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Overloaded());
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Overloaded(true, 1)).WillOnce(Return(true));
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mock.Overloaded();
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, mock.Overloaded(1));
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(mock.Overloaded(true, 1));
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MY_MOCK_METHODS2_ \
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MOCK_CONST_METHOD1(Overloaded, int(int n)); \
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MOCK_METHOD1(Overloaded, int(int n));
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockOverloadedOnConstness {
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockOverloadedOnConstness() {}
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MY_MOCK_METHODS2_;
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockOverloadedOnConstness);
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(OverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockOverloadedOnConstness mock;
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const MockOverloadedOnConstness* const_mock = &mock;
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(mock, Overloaded(1)).WillOnce(Return(2));
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(*const_mock, Overloaded(1)).WillOnce(Return(3));
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, mock.Overloaded(1));
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, const_mock->Overloaded(1));
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MockFunctionTest, WorksForVoidNullary) {
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFunction<void()> foo;
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(foo, Call());
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  foo.Call();
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MockFunctionTest, WorksForNonVoidNullary) {
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFunction<int()> foo;
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(foo, Call())
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1))
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(2));
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, foo.Call());
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, foo.Call());
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MockFunctionTest, WorksForVoidUnary) {
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFunction<void(int)> foo;
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(foo, Call(1));
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  foo.Call(1);
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MockFunctionTest, WorksForNonVoidBinary) {
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFunction<int(bool, int)> foo;
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(foo, Call(false, 42))
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1))
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(2));
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(foo, Call(true, Ge(100)))
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(3));
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, foo.Call(false, 42));
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, foo.Call(false, 42));
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, foo.Call(true, 120));
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(MockFunctionTest, WorksFor10Arguments) {
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFunction<int(bool a0, char a1, int a2, int a3, int a4,
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int a5, int a6, char a7, int a8, bool a9)> foo;
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(foo, Call(_, 'a', _, _, _, _, _, _, _, _))
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(1))
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillOnce(Return(2));
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, foo.Call(false, 'a', 0, 0, 0, 0, 0, 'b', 0, true));
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, foo.Call(true, 'a', 0, 0, 0, 0, 0, 'b', 1, false));
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace gmock_generated_function_mockers_test
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
541