70
70
#include " gmock/internal/gmock-port.h"
71
71
72
72
namespace testing {
73
- template <class MockClass >
74
- class NiceMock ;
75
- template <class MockClass >
76
- class NaggyMock ;
77
- template <class MockClass >
78
- class StrictMock ;
79
73
80
- namespace internal {
81
- template <typename T>
82
- std::true_type StrictnessModifierProbe (const NiceMock<T>&);
83
- template <typename T>
84
- std::true_type StrictnessModifierProbe (const NaggyMock<T>&);
85
- template <typename T>
86
- std::true_type StrictnessModifierProbe (const StrictMock<T>&);
87
- std::false_type StrictnessModifierProbe (...);
74
+ template <class StrictNessModifier , class MockClass >
75
+ class StrictNessBase ;
88
76
89
- template <typename T>
90
- constexpr bool HasStrictnessModifier () {
91
- return decltype (StrictnessModifierProbe (std::declval<const T&>()))::value;
92
- }
77
+ namespace internal {
93
78
94
79
// Base classes that register and deregister with testing::Mock to alter the
95
80
// default behavior around uninteresting calls. Inheriting from one of these
@@ -143,61 +128,58 @@ class StrictMockImpl {
143
128
}
144
129
};
145
130
131
+ template <typename T>
132
+ std::true_type StrictnessModifierProbe (
133
+ const StrictNessBase<internal::NiceMockImpl<T>, T>&);
134
+ template <typename T>
135
+ std::true_type StrictnessModifierProbe (
136
+ const StrictNessBase<internal::NaggyMockImpl<T>, T>&);
137
+ template <typename T>
138
+ std::true_type StrictnessModifierProbe (
139
+ const StrictNessBase<internal::StrictMockImpl<T>, T>&);
140
+ std::false_type StrictnessModifierProbe (...);
141
+
142
+ template <typename T>
143
+ constexpr bool HasStrictnessModifier () {
144
+ return decltype (StrictnessModifierProbe (std::declval<const T&>()))::value;
145
+ }
146
+
146
147
} // namespace internal
147
148
148
- template <class MockClass >
149
- class GTEST_INTERNAL_EMPTY_BASE_CLASS NiceMock
150
- : private internal::NiceMockImpl<MockClass>,
151
- public MockClass {
149
+ template <class StrictNessModifier , class MockClass >
150
+ class GTEST_INTERNAL_EMPTY_BASE_CLASS StrictNessBase
151
+ : public StrictNessModifier {
152
152
public:
153
- static_assert (!internal::HasStrictnessModifier<MockClass >(),
153
+ static_assert (!internal::HasStrictnessModifier<StrictNessModifier >(),
154
154
" Can't apply NiceMock to a class hierarchy that already has a "
155
155
" strictness modifier. See "
156
156
" https://google.github.io/googletest/"
157
157
" gmock_cook_book.html#NiceStrictNaggy" );
158
- NiceMock () : MockClass() {
159
- static_assert (sizeof (*this ) == sizeof (MockClass),
160
- " The impl subclass shouldn't introduce any padding" );
161
- }
162
-
163
- // Ideally, we would inherit base class's constructors through a using
164
- // declaration, which would preserve their visibility. However, many existing
165
- // tests rely on the fact that current implementation reexports protected
166
- // constructors as public. These tests would need to be cleaned up first.
167
-
168
- // Single argument constructor is special-cased so that it can be
169
- // made explicit.
170
- template <typename A>
171
- explicit NiceMock (A&& arg) : MockClass(std::forward<A>(arg)) {
172
- static_assert (sizeof (*this ) == sizeof (MockClass),
173
- " The impl subclass shouldn't introduce any padding" );
174
- }
175
-
176
- template <typename TArg1, typename TArg2, typename ... An>
177
- NiceMock (TArg1&& arg1, TArg2&& arg2, An&&... args)
178
- : MockClass(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2),
179
- std::forward<An>(args)...) {
180
- static_assert (sizeof (*this ) == sizeof (MockClass),
181
- " The impl subclass shouldn't introduce any padding" );
182
- }
158
+ StrictNessBase () = default ;
183
159
184
160
private:
185
- NiceMock (const NiceMock &) = delete ;
186
- NiceMock & operator =(const NiceMock &) = delete ;
161
+ StrictNessBase (const StrictNessBase &) = delete ;
162
+ StrictNessBase & operator =(const StrictNessBase &) = delete ;
187
163
};
188
164
189
165
template <class MockClass >
190
- class GTEST_INTERNAL_EMPTY_BASE_CLASS NaggyMock
191
- : private internal::NaggyMockImpl<MockClass>,
192
- public MockClass {
193
- static_assert (!internal::HasStrictnessModifier<MockClass>(),
194
- " Can't apply NaggyMock to a class hierarchy that already has a "
195
- " strictness modifier. See "
196
- " https://google.github.io/googletest/"
197
- " gmock_cook_book.html#NiceStrictNaggy" );
166
+ using NiceMockable =
167
+ StrictNessBase<internal::NiceMockImpl<MockClass>, MockClass>;
198
168
169
+ template <class MockClass >
170
+ using StrictMockable =
171
+ StrictNessBase<internal::StrictMockImpl<MockClass>, MockClass>;
172
+
173
+ template <class MockClass >
174
+ using NaggyMockable =
175
+ StrictNessBase<internal::NaggyMockImpl<MockClass>, MockClass>;
176
+
177
+ template <class StrictNessModifier , class MockClass >
178
+ class GTEST_INTERNAL_EMPTY_BASE_CLASS StrictNessMockImplBase
179
+ : public StrictNessModifier,
180
+ public MockClass {
199
181
public:
200
- NaggyMock () : MockClass() {
182
+ StrictNessMockImplBase () : MockClass() {
201
183
static_assert (sizeof (*this ) == sizeof (MockClass),
202
184
" The impl subclass shouldn't introduce any padding" );
203
185
}
@@ -210,65 +192,31 @@ class GTEST_INTERNAL_EMPTY_BASE_CLASS NaggyMock
210
192
// Single argument constructor is special-cased so that it can be
211
193
// made explicit.
212
194
template <typename A>
213
- explicit NaggyMock (A&& arg) : MockClass(std::forward<A>(arg)) {
195
+ explicit StrictNessMockImplBase (A&& arg) : MockClass(std::forward<A>(arg)) {
214
196
static_assert (sizeof (*this ) == sizeof (MockClass),
215
197
" The impl subclass shouldn't introduce any padding" );
216
198
}
217
199
218
200
template <typename TArg1, typename TArg2, typename ... An>
219
- NaggyMock (TArg1&& arg1, TArg2&& arg2, An&&... args)
201
+ StrictNessMockImplBase (TArg1&& arg1, TArg2&& arg2, An&&... args)
220
202
: MockClass(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2),
221
203
std::forward<An>(args)...) {
222
204
static_assert (sizeof (*this ) == sizeof (MockClass),
223
205
" The impl subclass shouldn't introduce any padding" );
224
206
}
225
-
226
- private:
227
- NaggyMock (const NaggyMock&) = delete ;
228
- NaggyMock& operator =(const NaggyMock&) = delete ;
229
207
};
230
208
231
209
template <class MockClass >
232
- class GTEST_INTERNAL_EMPTY_BASE_CLASS StrictMock
233
- : private internal::StrictMockImpl<MockClass>,
234
- public MockClass {
235
- public:
236
- static_assert (
237
- !internal::HasStrictnessModifier<MockClass>(),
238
- " Can't apply StrictMock to a class hierarchy that already has a "
239
- " strictness modifier. See "
240
- " https://google.github.io/googletest/"
241
- " gmock_cook_book.html#NiceStrictNaggy" );
242
- StrictMock () : MockClass() {
243
- static_assert (sizeof (*this ) == sizeof (MockClass),
244
- " The impl subclass shouldn't introduce any padding" );
245
- }
246
-
247
- // Ideally, we would inherit base class's constructors through a using
248
- // declaration, which would preserve their visibility. However, many existing
249
- // tests rely on the fact that current implementation reexports protected
250
- // constructors as public. These tests would need to be cleaned up first.
251
-
252
- // Single argument constructor is special-cased so that it can be
253
- // made explicit.
254
- template <typename A>
255
- explicit StrictMock (A&& arg) : MockClass(std::forward<A>(arg)) {
256
- static_assert (sizeof (*this ) == sizeof (MockClass),
257
- " The impl subclass shouldn't introduce any padding" );
258
- }
210
+ using NiceMock =
211
+ StrictNessMockImplBase<internal::NiceMockImpl<MockClass>, MockClass>;
259
212
260
- template <typename TArg1, typename TArg2, typename ... An>
261
- StrictMock (TArg1&& arg1, TArg2&& arg2, An&&... args)
262
- : MockClass(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2),
263
- std::forward<An>(args)...) {
264
- static_assert (sizeof (*this ) == sizeof (MockClass),
265
- " The impl subclass shouldn't introduce any padding" );
266
- }
213
+ template <class MockClass >
214
+ using StrictMock =
215
+ StrictNessMockImplBase<internal::StrictMockImpl<MockClass>, MockClass>;
267
216
268
- private:
269
- StrictMock (const StrictMock&) = delete ;
270
- StrictMock& operator =(const StrictMock&) = delete ;
271
- };
217
+ template <class MockClass >
218
+ using NaggyMock =
219
+ StrictNessMockImplBase<internal::NaggyMockImpl<MockClass>, MockClass>;
272
220
273
221
#undef GTEST_INTERNAL_EMPTY_BASE_CLASS
274
222
0 commit comments