blob: 82f9512f07745bf044ca82a04101cf1521bd1afb [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.
Gennadiy Civila3c0dd02018-08-14 14:04:07 -040034
shiqiane35fdd92008-12-10 05:08:54 +000035
36// Google Mock - a framework for writing C++ mock classes.
37//
38// This file implements function mockers of various arities.
39
Gennadiy Civil984cba32018-07-27 11:15:08 -040040// GOOGLETEST_CM0002 DO NOT DELETE
41
shiqiane35fdd92008-12-10 05:08:54 +000042#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
43#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
44
zhanyong.wan53e08c42010-09-14 05:38:21 +000045#include "gmock/gmock-spec-builders.h"
46#include "gmock/internal/gmock-internal-utils.h"
shiqiane35fdd92008-12-10 05:08:54 +000047
kosak389bad62014-11-17 01:08:51 +000048#if GTEST_HAS_STD_FUNCTION_
49# include <functional>
50#endif
51
shiqiane35fdd92008-12-10 05:08:54 +000052namespace testing {
shiqiane35fdd92008-12-10 05:08:54 +000053namespace internal {
54
55template <typename F>
56class FunctionMockerBase;
57
58// Note: class FunctionMocker really belongs to the ::testing
59// namespace. However if we define it in ::testing, MSVC will
60// complain when classes in ::testing::internal declare it as a
61// friend class template. To workaround this compiler bug, we define
62// FunctionMocker in ::testing::internal and import it into ::testing.
63template <typename F>
64class FunctionMocker;
65
66
67$range i 0..n
68$for i [[
69$range j 1..i
70$var typename_As = [[$for j [[, typename A$j]]]]
71$var As = [[$for j, [[A$j]]]]
Gennadiy Civilfa658e02018-04-12 13:42:47 -040072$var as = [[$for j, [[internal::forward<A$j>(a$j)]]]]
shiqiane35fdd92008-12-10 05:08:54 +000073$var Aas = [[$for j, [[A$j a$j]]]]
74$var ms = [[$for j, [[m$j]]]]
75$var matchers = [[$for j, [[const Matcher<A$j>& m$j]]]]
76template <typename R$typename_As>
77class FunctionMocker<R($As)> : public
78 internal::FunctionMockerBase<R($As)> {
79 public:
80 typedef R F($As);
81 typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
82
Gennadiy Civilfa658e02018-04-12 13:42:47 -040083 MockSpec<F> With($matchers) {
84 return MockSpec<F>(this, ::testing::make_tuple($ms));
shiqiane35fdd92008-12-10 05:08:54 +000085 }
86
87 R Invoke($Aas) {
zhanyong.wan21a58462009-11-12 19:18:08 +000088 // Even though gcc and MSVC don't enforce it, 'this->' is required
89 // by the C++ standard [14.6.4] here, as the base class type is
90 // dependent on the template argument (and thus shouldn't be
91 // looked into when resolving InvokeWith).
92 return this->InvokeWith(ArgumentTuple($as));
shiqiane35fdd92008-12-10 05:08:54 +000093 }
94};
95
96
97]]
Gennadiy Civilb5391672018-04-25 13:10:41 -040098// Removes the given pointer; this is a helper for the expectation setter method
99// for parameterless matchers.
100//
101// We want to make sure that the user cannot set a parameterless expectation on
102// overloaded methods, including methods which are overloaded on const. Example:
103//
104// class MockClass {
105// MOCK_METHOD0(GetName, string&());
106// MOCK_CONST_METHOD0(GetName, const string&());
107// };
108//
109// TEST() {
110// // This should be an error, as it's not clear which overload is expected.
111// EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));
112// }
113//
114// Here are the generated expectation-setter methods:
115//
116// class MockClass {
117// // Overload 1
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900118// MockSpec<string&()> gmock_GetName() { ... }
Gennadiy Civilb5391672018-04-25 13:10:41 -0400119// // Overload 2. Declared const so that the compiler will generate an
120// // error when trying to resolve between this and overload 4 in
121// // 'gmock_GetName(WithoutMatchers(), nullptr)'.
122// MockSpec<string&()> gmock_GetName(
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900123// const WithoutMatchers&, const Function<string&()>*) const {
Gennadiy Civilb5391672018-04-25 13:10:41 -0400124// // Removes const from this, calls overload 1
125// return AdjustConstness_(this)->gmock_GetName();
126// }
127//
128// // Overload 3
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900129// const string& gmock_GetName() const { ... }
Gennadiy Civilb5391672018-04-25 13:10:41 -0400130// // Overload 4
131// MockSpec<const string&()> gmock_GetName(
Masaru Tsuchiyama4bcc9b92018-05-23 21:11:45 +0900132// const WithoutMatchers&, const Function<const string&()>*) const {
Gennadiy Civilb5391672018-04-25 13:10:41 -0400133// // Does not remove const, calls overload 3
134// return AdjustConstness_const(this)->gmock_GetName();
135// }
136// }
137//
138template <typename MockType>
139const MockType* AdjustConstness_const(const MockType* mock) {
140 return mock;
141}
142
Gennadiy Civil984cba32018-07-27 11:15:08 -0400143// Removes const from and returns the given pointer; this is a helper for the
Gennadiy Civilb5391672018-04-25 13:10:41 -0400144// expectation setter method for parameterless matchers.
145template <typename MockType>
146MockType* AdjustConstness_(const MockType* mock) {
147 return const_cast<MockType*>(mock);
148}
149
shiqiane35fdd92008-12-10 05:08:54 +0000150} // namespace internal
151
152// The style guide prohibits "using" statements in a namespace scope
153// inside a header file. However, the FunctionMocker class template
154// is meant to be defined in the ::testing namespace. The following
155// line is just a trick for working around a bug in MSVC 8.0, which
156// cannot handle it if we define FunctionMocker in ::testing.
157using internal::FunctionMocker;
158
zhanyong.wan20d1a232013-03-01 06:58:38 +0000159// GMOCK_RESULT_(tn, F) expands to the result type of function type F.
160// We define this as a variadic macro in case F contains unprotected
161// commas (the same reason that we use variadic macros in other places
162// in this file).
shiqiane35fdd92008-12-10 05:08:54 +0000163// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000164#define GMOCK_RESULT_(tn, ...) \
165 tn ::testing::internal::Function<__VA_ARGS__>::Result
shiqiane35fdd92008-12-10 05:08:54 +0000166
zhanyong.wan20d1a232013-03-01 06:58:38 +0000167// The type of argument N of the given function type.
shiqiane35fdd92008-12-10 05:08:54 +0000168// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000169#define GMOCK_ARG_(tn, N, ...) \
170 tn ::testing::internal::Function<__VA_ARGS__>::Argument##N
shiqiane35fdd92008-12-10 05:08:54 +0000171
zhanyong.wan20d1a232013-03-01 06:58:38 +0000172// The matcher type for argument N of the given function type.
shiqiane35fdd92008-12-10 05:08:54 +0000173// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000174#define GMOCK_MATCHER_(tn, N, ...) \
175 const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&
shiqiane35fdd92008-12-10 05:08:54 +0000176
177// The variable for mocking the given method.
178// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan68be1112009-03-25 03:56:48 +0000179#define GMOCK_MOCKER_(arity, constness, Method) \
zhanyong.wanccedc1c2010-08-09 22:46:12 +0000180 GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
shiqiane35fdd92008-12-10 05:08:54 +0000181
182
183$for i [[
184$range j 1..i
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400185$var arg_as = [[$for j, [[GMOCK_ARG_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
186$var as = [[$for j, \
187 [[::testing::internal::forward<GMOCK_ARG_(tn, $j, __VA_ARGS__)>(gmock_a$j)]]]]
188$var matcher_arg_as = [[$for j, \
zhanyong.wan20d1a232013-03-01 06:58:38 +0000189 [[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400190$var matcher_as = [[$for j, [[gmock_a$j]]]]
Gennadiy Civilb5391672018-04-25 13:10:41 -0400191$var anything_matchers = [[$for j, \
192 [[::testing::A<GMOCK_ARG_(tn, $j, __VA_ARGS__)>()]]]]
shiqiane35fdd92008-12-10 05:08:54 +0000193// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
zhanyong.wan20d1a232013-03-01 06:58:38 +0000194#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \
195 GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
196 $arg_as) constness { \
kosakbd018832014-04-02 20:30:00 +0000197 GTEST_COMPILE_ASSERT_((::testing::tuple_size< \
zhanyong.wan20d1a232013-03-01 06:58:38 +0000198 tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value == $i), \
shiqiane35fdd92008-12-10 05:08:54 +0000199 this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \
zhanyong.wan68be1112009-03-25 03:56:48 +0000200 GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \
201 return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \
shiqiane35fdd92008-12-10 05:08:54 +0000202 } \
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400203 ::testing::MockSpec<__VA_ARGS__> \
204 gmock_##Method($matcher_arg_as) constness { \
zhanyong.waned6c9272011-02-23 19:39:27 +0000205 GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400206 return GMOCK_MOCKER_($i, constness, Method).With($matcher_as); \
shiqiane35fdd92008-12-10 05:08:54 +0000207 } \
Gennadiy Civilb5391672018-04-25 13:10:41 -0400208 ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \
209 const ::testing::internal::WithoutMatchers&, \
210 constness ::testing::internal::Function<__VA_ARGS__>* ) const { \
211 return ::testing::internal::AdjustConstness_##constness(this)-> \
212 gmock_##Method($anything_matchers); \
213 } \
zhanyong.wan20d1a232013-03-01 06:58:38 +0000214 mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method)
shiqiane35fdd92008-12-10 05:08:54 +0000215
216
217]]
218$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000219#define MOCK_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, , , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000220
221]]
222
223
224$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000225#define MOCK_CONST_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, const, , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000226
227]]
228
229
230$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000231#define MOCK_METHOD$i[[]]_T(m, ...) GMOCK_METHOD$i[[]]_(typename, , , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000232
233]]
234
235
236$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000237#define MOCK_CONST_METHOD$i[[]]_T(m, ...) \
238 GMOCK_METHOD$i[[]]_(typename, const, , m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000239
240]]
241
242
243$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000244#define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \
245 GMOCK_METHOD$i[[]]_(, , ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000246
247]]
248
249
250$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000251#define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \
252 GMOCK_METHOD$i[[]]_(, const, ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000253
254]]
255
256
257$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000258#define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \
259 GMOCK_METHOD$i[[]]_(typename, , ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000260
261]]
262
263
264$for i [[
zhanyong.wan20d1a232013-03-01 06:58:38 +0000265#define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \
266 GMOCK_METHOD$i[[]]_(typename, const, ct, m, __VA_ARGS__)
shiqiane35fdd92008-12-10 05:08:54 +0000267
268]]
269
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000270// A MockFunction<F> class has one mock method whose type is F. It is
271// useful when you just want your test code to emit some messages and
272// have Google Mock verify the right messages are sent (and perhaps at
273// the right times). For example, if you are exercising code:
274//
275// Foo(1);
276// Foo(2);
277// Foo(3);
278//
279// and want to verify that Foo(1) and Foo(3) both invoke
280// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:
281//
282// TEST(FooTest, InvokesBarCorrectly) {
283// MyMock mock;
284// MockFunction<void(string check_point_name)> check;
285// {
286// InSequence s;
287//
288// EXPECT_CALL(mock, Bar("a"));
289// EXPECT_CALL(check, Call("1"));
290// EXPECT_CALL(check, Call("2"));
291// EXPECT_CALL(mock, Bar("a"));
292// }
293// Foo(1);
294// check.Call("1");
295// Foo(2);
296// check.Call("2");
297// Foo(3);
298// }
299//
300// The expectation spec says that the first Bar("a") must happen
301// before check point "1", the second Bar("a") must happen after check
302// point "2", and nothing should happen between the two check
303// points. The explicit check points make it easy to tell which
304// Bar("a") is called by which call to Foo().
kosaka9e02a92014-06-17 23:19:54 +0000305//
306// MockFunction<F> can also be used to exercise code that accepts
307// std::function<F> callbacks. To do so, use AsStdFunction() method
308// to create std::function proxy forwarding to original object's Call.
309// Example:
310//
311// TEST(FooTest, RunsCallbackWithBarArgument) {
312// MockFunction<int(string)> callback;
313// EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));
314// Foo(callback.AsStdFunction());
315// }
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000316template <typename F>
317class MockFunction;
318
319
320$for i [[
321$range j 0..i-1
kosaka9e02a92014-06-17 23:19:54 +0000322$var ArgTypes = [[$for j, [[A$j]]]]
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400323$var ArgValues = [[$for j, [[::std::move(a$j)]]]]
kosaka9e02a92014-06-17 23:19:54 +0000324$var ArgDecls = [[$for j, [[A$j a$j]]]]
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000325template <typename R$for j [[, typename A$j]]>
kosaka9e02a92014-06-17 23:19:54 +0000326class MockFunction<R($ArgTypes)> {
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000327 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +0000328 MockFunction() {}
329
kosaka9e02a92014-06-17 23:19:54 +0000330 MOCK_METHOD$i[[]]_T(Call, R($ArgTypes));
331
kosak5b9cbbb2014-11-17 00:28:55 +0000332#if GTEST_HAS_STD_FUNCTION_
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400333 ::std::function<R($ArgTypes)> AsStdFunction() {
kosaka6e32f02015-07-24 20:05:26 +0000334 return [this]($ArgDecls) -> R {
Gennadiy Civilfa658e02018-04-12 13:42:47 -0400335 return this->Call($ArgValues);
kosaka9e02a92014-06-17 23:19:54 +0000336 };
337 }
kosak5b9cbbb2014-11-17 00:28:55 +0000338#endif // GTEST_HAS_STD_FUNCTION_
zhanyong.wan32de5f52009-12-23 00:13:23 +0000339
340 private:
341 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
zhanyong.wanf3aa4d22009-09-25 22:34:47 +0000342};
343
344
345]]
shiqiane35fdd92008-12-10 05:08:54 +0000346} // namespace testing
347
348#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_