blob: f6e1781746019a6009cc1f85c02c5e8189988070 [file] [log] [blame]
shiqiane35fdd92008-12-10 05:08:54 +00001$$ -*- mode: c++; -*-
Gennadiy Civilfe402c22018-04-05 16:09:17 -04002$$ This is a Pump source file. Please use Pump to convert
3$$ it to gmock-generated-function-mockers.h.
shiqiane35fdd92008-12-10 05:08:54 +00004$$
5$var n = 10 $$ The maximum arity we support.
6// Copyright 2007, Google Inc.
7// All rights reserved.
8//
9// Redistribution and use in source and binary forms, with or without
10// modification, are permitted provided that the following conditions are
11// met:
12//
13// * Redistributions of source code must retain the above copyright
14// notice, this list of conditions and the following disclaimer.
15// * Redistributions in binary form must reproduce the above
16// copyright notice, this list of conditions and the following disclaimer
17// in the documentation and/or other materials provided with the
18// distribution.
19// * Neither the name of Google Inc. nor the names of its
20// contributors may be used to endorse or promote products derived from
21// this software without specific prior written permission.
22//
23// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34//
35// Author: wan@google.com (Zhanyong Wan)
36
37// Google Mock - a framework for writing C++ mock classes.
38//
39// This file implements function mockers of various arities.
40
Gennadiy Civil984cba32018-07-27 11:15:08 -040041// GOOGLETEST_CM0002 DO NOT DELETE
42
shiqiane35fdd92008-12-10 05:08:54 +000043#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
44#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
45
zhanyong.wan53e08c42010-09-14 05:38:21 +000046#include "gmock/gmock-spec-builders.h"
47#include "gmock/internal/gmock-internal-utils.h"
shiqiane35fdd92008-12-10 05:08:54 +000048
kosak389bad62014-11-17 01:08:51 +000049#if GTEST_HAS_STD_FUNCTION_
50# include <functional>
51#endif
52
shiqiane35fdd92008-12-10 05:08:54 +000053namespace testing {
shiqiane35fdd92008-12-10 05:08:54 +000054namespace internal {
55
56template <typename F>
57class FunctionMockerBase;
58
59// Note: class FunctionMocker really belongs to the ::testing
60// namespace. However if we define it in ::testing, MSVC will
61// complain when classes in ::testing::internal declare it as a
62// friend class template. To workaround this compiler bug, we define
63// FunctionMocker in ::testing::internal and import it into ::testing.
64template <typename F>
65class FunctionMocker;
66
67
68$range i 0..n
69$for i [[
70$range j 1..i
71$var typename_As = [[$for j [[, typename A$j]]]]
72$var As = [[$for j, [[A$j]]]]
Gennadiy Civilfa658e02018-04-12 13:42:47 -040073$var as = [[$for j, [[internal::forward<A$j>(a$j)]]]]
shiqiane35fdd92008-12-10 05:08:54 +000074$var Aas = [[$for j, [[A$j a$j]]]]
75$var ms = [[$for j, [[m$j]]]]
76$var matchers = [[$for j, [[const Matcher<A$j>& m$j]]]]
77template <typename R$typename_As>
78class FunctionMocker<R($As)> : public
79 internal::FunctionMockerBase<R($As)> {
80 public:
81 typedef R F($As);
82 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
83
Gennadiy Civilfa658e02018-04-12 13:42:47 -040084 MockSpec<F> With($matchers) {
85 return MockSpec<F>(this, ::testing::make_tuple($ms));
shiqiane35fdd92008-12-10 05:08:54 +000086 }
87
88 R Invoke($Aas) {
zhanyong.wan21a58462009-11-12 19:18:08 +000089 // Even though gcc and MSVC don't enforce it, 'this->' is required
90 // by the C++ standard [14.6.4] here, as the base class type is
91 // dependent on the template argument (and thus shouldn't be
92 // looked into when resolving InvokeWith).
93 return this->InvokeWith(ArgumentTuple($as));
shiqiane35fdd92008-12-10 05:08:54 +000094 }
95};
96
97
98]]
Gennadiy Civilb5391672018-04-25 13:10:41 -040099// Removes the given pointer; this is a helper for the expectation setter method
100// for parameterless matchers.
101//
102// We want to make sure that the user cannot set a parameterless expectation on
103// overloaded methods, including methods which are overloaded on const. Example:
104//
105// class MockClass {
106// MOCK_METHOD0(GetName, string&());
107// MOCK_CONST_METHOD0(GetName, const string&());
108// };
109//
110// TEST() {
111// // This should be an error, as it's not clear which overload is expected.
112// EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));
113// }
114//
115// Here are the generated expectation-setter methods:
116//
117// class MockClass {
118// // Overload 1
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900119// MockSpec<string&()> gmock_GetName() { ... }
Gennadiy Civilb5391672018-04-25 13:10:41 -0400120// // Overload 2. Declared const so that the compiler will generate an
121// // error when trying to resolve between this and overload 4 in
122// // 'gmock_GetName(WithoutMatchers(), nullptr)'.
123// MockSpec<string&()> gmock_GetName(
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900124// const WithoutMatchers&, const Function<string&()>*) const {
Gennadiy Civilb5391672018-04-25 13:10:41 -0400125// // Removes const from this, calls overload 1
126// return AdjustConstness_(this)->gmock_GetName();
127// }
128//
129// // Overload 3
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900130// const string& gmock_GetName() const { ... }
Gennadiy Civilb5391672018-04-25 13:10:41 -0400131// // Overload 4
132// MockSpec<const string&()> gmock_GetName(
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900133// const WithoutMatchers&, const Function<const string&()>*) const {
Gennadiy Civilb5391672018-04-25 13:10:41 -0400134// // Does not remove const, calls overload 3
135// return AdjustConstness_const(this)->gmock_GetName();
136// }
137// }
138//
139template <typename MockType>
140const MockType* AdjustConstness_const(const MockType* mock) {
141 return mock;
142}
143
Gennadiy Civil984cba32018-07-27 11:15:08 -0400144// Removes const from and returns the given pointer; this is a helper for the
Gennadiy Civilb5391672018-04-25 13:10:41 -0400145// expectation setter method for parameterless matchers.
146template <typename MockType>
147MockType* AdjustConstness_(const MockType* mock) {
148 return const_cast<MockType*>(mock);
149}
150
shiqiane35fdd92008-12-10 05:08:54 +0000151} // namespace internal
152
153// The style guide prohibits "using" statements in a namespace scope
154// inside a header file. However, the FunctionMocker class template
155// is meant to be defined in the ::testing namespace. The following
156// line is just a trick for working around a bug in MSVC 8.0, which
157// cannot handle it if we define FunctionMocker in ::testing.
158using internal::FunctionMocker;
159
zhanyong.wan20d1a232013-03-01 06:58:38 +0000160// GMOCK_RESULT_(tn, F) expands to the result type of function type F.
161// We define this as a variadic macro in case F contains unprotected
162// commas (the same reason that we use variadic macros in other places
163// in this file).
shiqiane35fdd92008-12-10 05:08:54 +0000164// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000165#define GMOCK_RESULT_(tn, ...) \
166 tn ::testing::internal::Function<__VA_ARGS__>::Result
shiqiane35fdd92008-12-10 05:08:54 +0000167
zhanyong.wan20d1a232013-03-01 06:58:38 +0000168// The type of argument N of the given function type.
shiqiane35fdd92008-12-10 05:08:54 +0000169// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000170#define GMOCK_ARG_(tn, N, ...) \
171 tn ::testing::internal::Function<__VA_ARGS__>::Argument##N
shiqiane35fdd92008-12-10 05:08:54 +0000172
zhanyong.wan20d1a232013-03-01 06:58:38 +0000173// The matcher type for argument N of the given function type.
shiqiane35fdd92008-12-10 05:08:54 +0000174// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000175#define GMOCK_MATCHER_(tn, N, ...) \
176 const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&
shiqiane35fdd92008-12-10 05:08:54 +0000177
178// The variable for mocking the given method.
179// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan68be1112009-03-25 03:56:48 +0000180#define GMOCK_MOCKER_(arity, constness, Method) \
zhanyong.wanccedc1c2010-08-09 22:46:12 +0000181 GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
shiqiane35fdd92008-12-10 05:08:54 +0000182
183
184$for i [[
185$range j 1..i
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400186$var arg_as = [[$for j, [[GMOCK_ARG_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
187$var as = [[$for j, \
188 [[::testing::internal::forward<GMOCK_ARG_(tn, $j, __VA_ARGS__)>(gmock_a$j)]]]]
189$var matcher_arg_as = [[$for j, \
zhanyong.wan20d1a232013-03-01 06:58:38 +0000190 [[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400191$var matcher_as = [[$for j, [[gmock_a$j]]]]
Gennadiy Civilb5391672018-04-25 13:10:41 -0400192$var anything_matchers = [[$for j, \
193 [[::testing::A<GMOCK_ARG_(tn, $j, __VA_ARGS__)>()]]]]
shiqiane35fdd92008-12-10 05:08:54 +0000194// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000195#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \
196 GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
197 $arg_as) constness { \
kosakbd018832014-04-02 20:30:00 +0000198 GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
zhanyong.wan20d1a232013-03-01 06:58:38 +0000199 tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value == $i), \
shiqiane35fdd92008-12-10 05:08:54 +0000200 this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \
zhanyong.wan68be1112009-03-25 03:56:48 +0000201 GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \
202 return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \
shiqiane35fdd92008-12-10 05:08:54 +0000203 } \
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400204 ::testing::MockSpec<__VA_ARGS__> \
205 gmock_##Method($matcher_arg_as) constness { \
zhanyong.waned6c9272011-02-23 19:39:27 +0000206 GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400207 return GMOCK_MOCKER_($i, constness, Method).With($matcher_as); \
shiqiane35fdd92008-12-10 05:08:54 +0000208 } \
Gennadiy Civilb5391672018-04-25 13:10:41 -0400209 ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
210 const ::testing::internal::WithoutMatchers&, \
211 constness ::testing::internal::Function<__VA_ARGS__>* ) const { \
212 return ::testing::internal::AdjustConstness_##constness(this)-> \
213 gmock_##Method($anything_matchers); \
214 } \
zhanyong.wan20d1a232013-03-01 06:58:38 +0000215 mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method)
shiqiane35fdd92008-12-10 05:08:54 +0000216
217
218]]
219$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000220#define MOCK_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, , , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000221
222]]
223
224
225$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000226#define MOCK_CONST_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, const, , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000227
228]]
229
230
231$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000232#define MOCK_METHOD$i[[]]_T(m, ...) GMOCK_METHOD$i[[]]_(typename, , , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000233
234]]
235
236
237$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000238#define MOCK_CONST_METHOD$i[[]]_T(m, ...) \
239 GMOCK_METHOD$i[[]]_(typename, const, , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000240
241]]
242
243
244$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000245#define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \
246 GMOCK_METHOD$i[[]]_(, , ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000247
248]]
249
250
251$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000252#define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \
253 GMOCK_METHOD$i[[]]_(, const, ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000254
255]]
256
257
258$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000259#define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \
260 GMOCK_METHOD$i[[]]_(typename, , ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000261
262]]
263
264
265$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000266#define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \
267 GMOCK_METHOD$i[[]]_(typename, const, ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000268
269]]
270
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000271// A MockFunction<F> class has one mock method whose type is F. It is
272// useful when you just want your test code to emit some messages and
273// have Google Mock verify the right messages are sent (and perhaps at
274// the right times). For example, if you are exercising code:
275//
276// Foo(1);
277// Foo(2);
278// Foo(3);
279//
280// and want to verify that Foo(1) and Foo(3) both invoke
281// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:
282//
283// TEST(FooTest, InvokesBarCorrectly) {
284// MyMock mock;
285// MockFunction<void(string check_point_name)> check;
286// {
287// InSequence s;
288//
289// EXPECT_CALL(mock, Bar("a"));
290// EXPECT_CALL(check, Call("1"));
291// EXPECT_CALL(check, Call("2"));
292// EXPECT_CALL(mock, Bar("a"));
293// }
294// Foo(1);
295// check.Call("1");
296// Foo(2);
297// check.Call("2");
298// Foo(3);
299// }
300//
301// The expectation spec says that the first Bar("a") must happen
302// before check point "1", the second Bar("a") must happen after check
303// point "2", and nothing should happen between the two check
304// points. The explicit check points make it easy to tell which
305// Bar("a") is called by which call to Foo().
kosaka9e02a92014-06-17 23:19:54 +0000306//
307// MockFunction<F> can also be used to exercise code that accepts
308// std::function<F> callbacks. To do so, use AsStdFunction() method
309// to create std::function proxy forwarding to original object's Call.
310// Example:
311//
312// TEST(FooTest, RunsCallbackWithBarArgument) {
313// MockFunction<int(string)> callback;
314// EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));
315// Foo(callback.AsStdFunction());
316// }
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000317template <typename F>
318class MockFunction;
319
320
321$for i [[
322$range j 0..i-1
kosaka9e02a92014-06-17 23:19:54 +0000323$var ArgTypes = [[$for j, [[A$j]]]]
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400324$var ArgValues = [[$for j, [[::std::move(a$j)]]]]
kosaka9e02a92014-06-17 23:19:54 +0000325$var ArgDecls = [[$for j, [[A$j a$j]]]]
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000326template <typename R$for j [[, typename A$j]]>
kosaka9e02a92014-06-17 23:19:54 +0000327class MockFunction<R($ArgTypes)> {
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000328 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +0000329 MockFunction() {}
330
kosaka9e02a92014-06-17 23:19:54 +0000331 MOCK_METHOD$i[[]]_T(Call, R($ArgTypes));
332
kosak5b9cbbb2014-11-17 00:28:55 +0000333#if GTEST_HAS_STD_FUNCTION_
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400334 ::std::function<R($ArgTypes)> AsStdFunction() {
kosaka6e32f02015-07-24 20:05:26 +0000335 return [this]($ArgDecls) -> R {
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400336 return this->Call($ArgValues);
kosaka9e02a92014-06-17 23:19:54 +0000337 };
338 }
kosak5b9cbbb2014-11-17 00:28:55 +0000339#endif // GTEST_HAS_STD_FUNCTION_
zhanyong.wan32de5f52009-12-23 00:13:23 +0000340
341 private:
342 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000343};
344
345
346]]
shiqiane35fdd92008-12-10 05:08:54 +0000347} // namespace testing
348
349#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_