gmock-generated-function-mockers.h.pump 6.18 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
$$ -*- mode: c++; -*-
$$ This is a Pump source file.  Please use Pump to convert it to
$$ gmock-generated-function-mockers.h.
$$
$var n = 10  $$ The maximum arity we support.
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)

// Google Mock - a framework for writing C++ mock classes.
//
// This file implements function mockers of various arities.

#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_

#include <gmock/gmock-spec-builders.h>
#include <gmock/internal/gmock-internal-utils.h>

namespace testing {

template <typename F>
class MockSpec;

namespace internal {

template <typename F>
class FunctionMockerBase;

// Note: class FunctionMocker really belongs to the ::testing
// namespace.  However if we define it in ::testing, MSVC will
// complain when classes in ::testing::internal declare it as a
// friend class template.  To workaround this compiler bug, we define
// FunctionMocker in ::testing::internal and import it into ::testing.
template <typename F>
class FunctionMocker;


$range i 0..n
$for i [[
$range j 1..i
$var typename_As = [[$for j [[, typename A$j]]]]
$var As = [[$for j, [[A$j]]]]
$var as = [[$for j, [[a$j]]]]
$var Aas = [[$for j, [[A$j a$j]]]]
$var ms = [[$for j, [[m$j]]]]
$var matchers = [[$for j, [[const Matcher<A$j>& m$j]]]]
template <typename R$typename_As>
class FunctionMocker<R($As)> : public
    internal::FunctionMockerBase<R($As)> {
 public:
  typedef R F($As);
  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;

  MockSpec<F>& With($matchers) {

$if i >= 1 [[
    this->current_spec().SetMatchers(::std::tr1::make_tuple($ms));

]]
    return this->current_spec();
  }

  R Invoke($Aas) {
    return InvokeWith(ArgumentTuple($as));
  }
};


]]
}  // namespace internal

// The style guide prohibits "using" statements in a namespace scope
// inside a header file.  However, the FunctionMocker class template
// is meant to be defined in the ::testing namespace.  The following
// line is just a trick for working around a bug in MSVC 8.0, which
// cannot handle it if we define FunctionMocker in ::testing.
using internal::FunctionMocker;

// The result type of function type F.
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
109
#define GMOCK_RESULT_(tn, F) tn ::testing::internal::Function<F>::Result
110
111
112

// The type of argument N of function type F.
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
113
#define GMOCK_ARG_(tn, F, N) tn ::testing::internal::Function<F>::Argument##N
114
115
116

// The matcher type for argument N of function type F.
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
117
#define GMOCK_MATCHER_(tn, F, N) const ::testing::Matcher<GMOCK_ARG_(tn, F, N)>&
118
119
120

// The variable for mocking the given method.
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
121
#define GMOCK_MOCKER_(Method) GMOCK_CONCAT_TOKEN_(gmock_##Method##_, __LINE__)
122
123
124
125
126


$for i [[
$range j 1..i
$var arg_as = [[$for j, \
127
                                 [[GMOCK_ARG_(tn, F, $j) gmock_a$j]]]]
128
129
$var as = [[$for j, [[gmock_a$j]]]]
$var matcher_as = [[$for j, \
130
                     [[GMOCK_MATCHER_(tn, F, $j) gmock_a$j]]]]
131
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
132
133
134
#define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, F) \
  GMOCK_RESULT_(tn, F) ct Method($arg_as) constness { \
    GMOCK_COMPILE_ASSERT_(::std::tr1::tuple_size< \
135
136
        tn ::testing::internal::Function<F>::ArgumentTuple>::value == $i, \
        this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \
137
138
    GMOCK_MOCKER_(Method).SetOwnerAndName(this, #Method); \
    return GMOCK_MOCKER_(Method).Invoke($as); \
139
140
141
  } \
  ::testing::MockSpec<F>& \
      gmock_##Method($matcher_as) constness { \
142
    return GMOCK_MOCKER_(Method).RegisterOwner(this).With($as); \
143
  } \
144
  mutable ::testing::FunctionMocker<F> GMOCK_MOCKER_(Method)
145
146
147
148


]]
$for i [[
149
#define MOCK_METHOD$i(m, F) GMOCK_METHOD$i[[]]_(, , , m, F)
150
151
152
153
154

]]


$for i [[
155
#define MOCK_CONST_METHOD$i(m, F) GMOCK_METHOD$i[[]]_(, const, , m, F)
156
157
158
159
160

]]


$for i [[
161
#define MOCK_METHOD$i[[]]_T(m, F) GMOCK_METHOD$i[[]]_(typename, , , m, F)
162
163
164
165
166

]]


$for i [[
167
168
#define MOCK_CONST_METHOD$i[[]]_T(m, F) [[]]
GMOCK_METHOD$i[[]]_(typename, const, , m, F)
169
170
171
172
173

]]


$for i [[
174
175
#define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, F) [[]]
GMOCK_METHOD$i[[]]_(, , ct, m, F)
176
177
178
179
180
181

]]


$for i [[
#define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, F) \
182
    GMOCK_METHOD$i[[]]_(, const, ct, m, F)
183
184
185
186
187
188

]]


$for i [[
#define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, F) \
189
    GMOCK_METHOD$i[[]]_(typename, , ct, m, F)
190
191
192
193
194
195

]]


$for i [[
#define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, F) \
196
    GMOCK_METHOD$i[[]]_(typename, const, ct, m, F)
197
198
199
200
201
202

]]

}  // namespace testing

#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_