]> git.proxmox.com Git - ceph.git/blob - ceph/src/googletest/googlemock/scripts/generator/cpp/gmock_class_test.py
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / googletest / googlemock / scripts / generator / cpp / gmock_class_test.py
1 #!/usr/bin/env python
2 #
3 # Copyright 2009 Neal Norwitz All Rights Reserved.
4 # Portions Copyright 2009 Google Inc. All Rights Reserved.
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17
18 """Tests for gmock.scripts.generator.cpp.gmock_class."""
19
20 __author__ = 'nnorwitz@google.com (Neal Norwitz)'
21
22
23 import os
24 import sys
25 import unittest
26
27 # Allow the cpp imports below to work when run as a standalone script.
28 sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
29
30 from cpp import ast
31 from cpp import gmock_class
32
33
34 class TestCase(unittest.TestCase):
35 """Helper class that adds assert methods."""
36
37 def StripLeadingWhitespace(self, lines):
38 """Strip leading whitespace in each line in 'lines'."""
39 return '\n'.join([s.lstrip() for s in lines.split('\n')])
40
41 def assertEqualIgnoreLeadingWhitespace(self, expected_lines, lines):
42 """Specialized assert that ignores the indent level."""
43 self.assertEqual(expected_lines, self.StripLeadingWhitespace(lines))
44
45
46 class GenerateMethodsTest(TestCase):
47
48 def GenerateMethodSource(self, cpp_source):
49 """Convert C++ source to Google Mock output source lines."""
50 method_source_lines = []
51 # <test> is a pseudo-filename, it is not read or written.
52 builder = ast.BuilderFromSource(cpp_source, '<test>')
53 ast_list = list(builder.Generate())
54 gmock_class._GenerateMethods(method_source_lines, cpp_source, ast_list[0])
55 return '\n'.join(method_source_lines)
56
57 def testSimpleMethod(self):
58 source = """
59 class Foo {
60 public:
61 virtual int Bar();
62 };
63 """
64 self.assertEqualIgnoreLeadingWhitespace(
65 'MOCK_METHOD0(Bar,\nint());',
66 self.GenerateMethodSource(source))
67
68 def testSimpleConstructorsAndDestructor(self):
69 source = """
70 class Foo {
71 public:
72 Foo();
73 Foo(int x);
74 Foo(const Foo& f);
75 Foo(Foo&& f);
76 ~Foo();
77 virtual int Bar() = 0;
78 };
79 """
80 # The constructors and destructor should be ignored.
81 self.assertEqualIgnoreLeadingWhitespace(
82 'MOCK_METHOD0(Bar,\nint());',
83 self.GenerateMethodSource(source))
84
85 def testVirtualDestructor(self):
86 source = """
87 class Foo {
88 public:
89 virtual ~Foo();
90 virtual int Bar() = 0;
91 };
92 """
93 # The destructor should be ignored.
94 self.assertEqualIgnoreLeadingWhitespace(
95 'MOCK_METHOD0(Bar,\nint());',
96 self.GenerateMethodSource(source))
97
98 def testExplicitlyDefaultedConstructorsAndDestructor(self):
99 source = """
100 class Foo {
101 public:
102 Foo() = default;
103 Foo(const Foo& f) = default;
104 Foo(Foo&& f) = default;
105 ~Foo() = default;
106 virtual int Bar() = 0;
107 };
108 """
109 # The constructors and destructor should be ignored.
110 self.assertEqualIgnoreLeadingWhitespace(
111 'MOCK_METHOD0(Bar,\nint());',
112 self.GenerateMethodSource(source))
113
114 def testExplicitlyDeletedConstructorsAndDestructor(self):
115 source = """
116 class Foo {
117 public:
118 Foo() = delete;
119 Foo(const Foo& f) = delete;
120 Foo(Foo&& f) = delete;
121 ~Foo() = delete;
122 virtual int Bar() = 0;
123 };
124 """
125 # The constructors and destructor should be ignored.
126 self.assertEqualIgnoreLeadingWhitespace(
127 'MOCK_METHOD0(Bar,\nint());',
128 self.GenerateMethodSource(source))
129
130 def testSimpleOverrideMethod(self):
131 source = """
132 class Foo {
133 public:
134 int Bar() override;
135 };
136 """
137 self.assertEqualIgnoreLeadingWhitespace(
138 'MOCK_METHOD0(Bar,\nint());',
139 self.GenerateMethodSource(source))
140
141 def testSimpleConstMethod(self):
142 source = """
143 class Foo {
144 public:
145 virtual void Bar(bool flag) const;
146 };
147 """
148 self.assertEqualIgnoreLeadingWhitespace(
149 'MOCK_CONST_METHOD1(Bar,\nvoid(bool flag));',
150 self.GenerateMethodSource(source))
151
152 def testExplicitVoid(self):
153 source = """
154 class Foo {
155 public:
156 virtual int Bar(void);
157 };
158 """
159 self.assertEqualIgnoreLeadingWhitespace(
160 'MOCK_METHOD0(Bar,\nint(void));',
161 self.GenerateMethodSource(source))
162
163 def testStrangeNewlineInParameter(self):
164 source = """
165 class Foo {
166 public:
167 virtual void Bar(int
168 a) = 0;
169 };
170 """
171 self.assertEqualIgnoreLeadingWhitespace(
172 'MOCK_METHOD1(Bar,\nvoid(int a));',
173 self.GenerateMethodSource(source))
174
175 def testDefaultParameters(self):
176 source = """
177 class Foo {
178 public:
179 virtual void Bar(int a, char c = 'x') = 0;
180 };
181 """
182 self.assertEqualIgnoreLeadingWhitespace(
183 'MOCK_METHOD2(Bar,\nvoid(int, char));',
184 self.GenerateMethodSource(source))
185
186 def testMultipleDefaultParameters(self):
187 source = """
188 class Foo {
189 public:
190 virtual void Bar(int a = 42, char c = 'x') = 0;
191 };
192 """
193 self.assertEqualIgnoreLeadingWhitespace(
194 'MOCK_METHOD2(Bar,\nvoid(int, char));',
195 self.GenerateMethodSource(source))
196
197 def testRemovesCommentsWhenDefaultsArePresent(self):
198 source = """
199 class Foo {
200 public:
201 virtual void Bar(int a = 42 /* a comment */,
202 char /* other comment */ c= 'x') = 0;
203 };
204 """
205 self.assertEqualIgnoreLeadingWhitespace(
206 'MOCK_METHOD2(Bar,\nvoid(int, char));',
207 self.GenerateMethodSource(source))
208
209 def testDoubleSlashCommentsInParameterListAreRemoved(self):
210 source = """
211 class Foo {
212 public:
213 virtual void Bar(int a, // inline comments should be elided.
214 int b // inline comments should be elided.
215 ) const = 0;
216 };
217 """
218 self.assertEqualIgnoreLeadingWhitespace(
219 'MOCK_CONST_METHOD2(Bar,\nvoid(int a, int b));',
220 self.GenerateMethodSource(source))
221
222 def testCStyleCommentsInParameterListAreNotRemoved(self):
223 # NOTE(nnorwitz): I'm not sure if it's the best behavior to keep these
224 # comments. Also note that C style comments after the last parameter
225 # are still elided.
226 source = """
227 class Foo {
228 public:
229 virtual const string& Bar(int /* keeper */, int b);
230 };
231 """
232 self.assertEqualIgnoreLeadingWhitespace(
233 'MOCK_METHOD2(Bar,\nconst string&(int /* keeper */, int b));',
234 self.GenerateMethodSource(source))
235
236 def testArgsOfTemplateTypes(self):
237 source = """
238 class Foo {
239 public:
240 virtual int Bar(const vector<int>& v, map<int, string>* output);
241 };"""
242 self.assertEqualIgnoreLeadingWhitespace(
243 'MOCK_METHOD2(Bar,\n'
244 'int(const vector<int>& v, map<int, string>* output));',
245 self.GenerateMethodSource(source))
246
247 def testReturnTypeWithOneTemplateArg(self):
248 source = """
249 class Foo {
250 public:
251 virtual vector<int>* Bar(int n);
252 };"""
253 self.assertEqualIgnoreLeadingWhitespace(
254 'MOCK_METHOD1(Bar,\nvector<int>*(int n));',
255 self.GenerateMethodSource(source))
256
257 def testReturnTypeWithManyTemplateArgs(self):
258 source = """
259 class Foo {
260 public:
261 virtual map<int, string> Bar();
262 };"""
263 # Comparing the comment text is brittle - we'll think of something
264 # better in case this gets annoying, but for now let's keep it simple.
265 self.assertEqualIgnoreLeadingWhitespace(
266 '// The following line won\'t really compile, as the return\n'
267 '// type has multiple template arguments. To fix it, use a\n'
268 '// typedef for the return type.\n'
269 'MOCK_METHOD0(Bar,\nmap<int, string>());',
270 self.GenerateMethodSource(source))
271
272 def testSimpleMethodInTemplatedClass(self):
273 source = """
274 template<class T>
275 class Foo {
276 public:
277 virtual int Bar();
278 };
279 """
280 self.assertEqualIgnoreLeadingWhitespace(
281 'MOCK_METHOD0_T(Bar,\nint());',
282 self.GenerateMethodSource(source))
283
284 def testPointerArgWithoutNames(self):
285 source = """
286 class Foo {
287 virtual int Bar(C*);
288 };
289 """
290 self.assertEqualIgnoreLeadingWhitespace(
291 'MOCK_METHOD1(Bar,\nint(C*));',
292 self.GenerateMethodSource(source))
293
294 def testReferenceArgWithoutNames(self):
295 source = """
296 class Foo {
297 virtual int Bar(C&);
298 };
299 """
300 self.assertEqualIgnoreLeadingWhitespace(
301 'MOCK_METHOD1(Bar,\nint(C&));',
302 self.GenerateMethodSource(source))
303
304 def testArrayArgWithoutNames(self):
305 source = """
306 class Foo {
307 virtual int Bar(C[]);
308 };
309 """
310 self.assertEqualIgnoreLeadingWhitespace(
311 'MOCK_METHOD1(Bar,\nint(C[]));',
312 self.GenerateMethodSource(source))
313
314
315 class GenerateMocksTest(TestCase):
316
317 def GenerateMocks(self, cpp_source):
318 """Convert C++ source to complete Google Mock output source."""
319 # <test> is a pseudo-filename, it is not read or written.
320 filename = '<test>'
321 builder = ast.BuilderFromSource(cpp_source, filename)
322 ast_list = list(builder.Generate())
323 lines = gmock_class._GenerateMocks(filename, cpp_source, ast_list, None)
324 return '\n'.join(lines)
325
326 def testNamespaces(self):
327 source = """
328 namespace Foo {
329 namespace Bar { class Forward; }
330 namespace Baz {
331
332 class Test {
333 public:
334 virtual void Foo();
335 };
336
337 } // namespace Baz
338 } // namespace Foo
339 """
340 expected = """\
341 namespace Foo {
342 namespace Baz {
343
344 class MockTest : public Test {
345 public:
346 MOCK_METHOD0(Foo,
347 void());
348 };
349
350 } // namespace Baz
351 } // namespace Foo
352 """
353 self.assertEqualIgnoreLeadingWhitespace(
354 expected, self.GenerateMocks(source))
355
356 def testClassWithStorageSpecifierMacro(self):
357 source = """
358 class STORAGE_SPECIFIER Test {
359 public:
360 virtual void Foo();
361 };
362 """
363 expected = """\
364 class MockTest : public Test {
365 public:
366 MOCK_METHOD0(Foo,
367 void());
368 };
369 """
370 self.assertEqualIgnoreLeadingWhitespace(
371 expected, self.GenerateMocks(source))
372
373 def testTemplatedForwardDeclaration(self):
374 source = """
375 template <class T> class Forward; // Forward declaration should be ignored.
376 class Test {
377 public:
378 virtual void Foo();
379 };
380 """
381 expected = """\
382 class MockTest : public Test {
383 public:
384 MOCK_METHOD0(Foo,
385 void());
386 };
387 """
388 self.assertEqualIgnoreLeadingWhitespace(
389 expected, self.GenerateMocks(source))
390
391 def testTemplatedClass(self):
392 source = """
393 template <typename S, typename T>
394 class Test {
395 public:
396 virtual void Foo();
397 };
398 """
399 expected = """\
400 template <typename T0, typename T1>
401 class MockTest : public Test<T0, T1> {
402 public:
403 MOCK_METHOD0_T(Foo,
404 void());
405 };
406 """
407 self.assertEqualIgnoreLeadingWhitespace(
408 expected, self.GenerateMocks(source))
409
410 def testTemplateInATemplateTypedef(self):
411 source = """
412 class Test {
413 public:
414 typedef std::vector<std::list<int>> FooType;
415 virtual void Bar(const FooType& test_arg);
416 };
417 """
418 expected = """\
419 class MockTest : public Test {
420 public:
421 MOCK_METHOD1(Bar,
422 void(const FooType& test_arg));
423 };
424 """
425 self.assertEqualIgnoreLeadingWhitespace(
426 expected, self.GenerateMocks(source))
427
428 def testTemplateInATemplateTypedefWithComma(self):
429 source = """
430 class Test {
431 public:
432 typedef std::function<void(
433 const vector<std::list<int>>&, int> FooType;
434 virtual void Bar(const FooType& test_arg);
435 };
436 """
437 expected = """\
438 class MockTest : public Test {
439 public:
440 MOCK_METHOD1(Bar,
441 void(const FooType& test_arg));
442 };
443 """
444 self.assertEqualIgnoreLeadingWhitespace(
445 expected, self.GenerateMocks(source))
446
447 if __name__ == '__main__':
448 unittest.main()