Skip to content

Commit 16998dd

Browse files
committed
optional cpp generation
1 parent 0fe8601 commit 16998dd

File tree

7 files changed

+73
-26
lines changed

7 files changed

+73
-26
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,15 @@ find project -iname "*.h" -or -iname "*.hpp" | xargs "project/externals/gmock.py
6666
# guard: header guard
6767
# interface: interface class
6868
# mock_methods: generated gmock methods
69+
# generated_dir: generated dir
70+
# mock_file_hpp: mock header file
71+
# mock_file_cpp: mock source file
6972

7073
mock_file_hpp = "%(interface)sMock.hpp"
7174

7275
file_template_hpp = """\
7376
/*
74-
* file generated by gmock: %(mock_file)s
77+
* file generated by gmock: %(mock_file_hpp)s
7578
*/
7679
#ifndef %(guard)s
7780
#define %(guard)s
@@ -93,7 +96,7 @@ public:
9396
9497
"""
9598

96-
mock_file_cpp = None
99+
mock_file_cpp = ""
97100
file_template_cpp = None
98101

99102
```

gmock.conf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
# guard: header guard
55
# interface: interface class
66
# mock_methods: generated gmock methods
7+
# generated_dir: generated dir
8+
# mock_file_hpp: mock header file
9+
# mock_file_cpp: mock source file
710

811
mock_file_hpp = "%(interface)sMock.hpp"
912

@@ -31,6 +34,6 @@ public:
3134

3235
"""
3336

34-
mock_file_cpp = None
37+
mock_file_cpp = ""
3538
file_template_cpp = None
3639

gmock.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -186,33 +186,42 @@ def __get_mock_methods(self, node, mock_methods, class_decl = ""):
186186
else:
187187
[self.__get_mock_methods(c, mock_methods, class_decl) for c in node.get_children()]
188188

189-
def __init__(self, cursor, decl, path, mock_file_hpp, file_template_hpp):
189+
def __generate_file(self, decl, mock_methods, file_type, file_template_type):
190+
interface = decl.split("::")[-1]
191+
mock_file = {
192+
'hpp' : self.mock_file_hpp % { 'interface' : interface },
193+
'cpp' : self.mock_file_cpp % { 'interface' : interface },
194+
}
195+
with open(self.path + "/" + mock_file[file_type], 'w') as file:
196+
file.write(file_template_type % {
197+
'mock_file_hpp' : mock_file['hpp'],
198+
'mock_file_cpp' : mock_file['cpp'],
199+
'generated_dir' : self.path,
200+
'guard' : mock_file[file_type].replace('.', '_').upper(),
201+
'dir' : os.path.dirname(mock_methods[0]),
202+
'file' : os.path.basename(mock_methods[0]),
203+
'namespaces_begin' : self.__pretty_namespaces_begin(decl),
204+
'interface' : interface,
205+
'mock_methods' : self.__pretty_mock_methods(mock_methods[1:]),
206+
'namespaces_end' : self.__pretty_namespaces_end(decl)
207+
})
208+
209+
def __init__(self, cursor, decl, path, mock_file_hpp, file_template_hpp, mock_file_cpp, file_template_cpp):
190210
self.cursor = cursor
191211
self.decl = decl
192212
self.path = path
193213
self.mock_file_hpp = mock_file_hpp
194214
self.file_template_hpp = file_template_hpp
215+
self.mock_file_cpp = mock_file_cpp
216+
self.file_template_cpp = file_template_cpp
195217

196218
def generate(self):
197219
mock_methods = {}
198220
self.__get_mock_methods(self.cursor, mock_methods)
199221
for decl, mock_methods in mock_methods.iteritems():
200222
if len(mock_methods) > 0:
201-
interface = decl.split("::")[-1]
202-
203-
if self.mock_file_hpp != None:
204-
mock_file_hpp = self.mock_file_hpp % { 'interface' : interface }
205-
with open(self.path + "/" + mock_file_hpp, 'w') as file:
206-
file.write(self.file_template_hpp % {
207-
'mock_file_hpp' : mock_file_hpp,
208-
'guard' : mock_file_hpp.replace('.', '_').upper(),
209-
'dir' : os.path.dirname(mock_methods[0]),
210-
'file' : os.path.basename(mock_methods[0]),
211-
'namespaces_begin' : self.__pretty_namespaces_begin(decl),
212-
'interface' : interface,
213-
'mock_methods' : self.__pretty_mock_methods(mock_methods[1:]),
214-
'namespaces_end' : self.__pretty_namespaces_end(decl)
215-
})
223+
self.file_template_hpp != None and self.__generate_file(decl, mock_methods, 'hpp', self.file_template_hpp)
224+
self.file_template_cpp != None and self.__generate_file(decl, mock_methods, 'cpp', self.file_template_cpp)
216225
return 0
217226

218227
def main(args):
@@ -247,7 +256,9 @@ def generate_includes(includes):
247256
decl = options.decl,
248257
path = options.path,
249258
mock_file_hpp = config['mock_file_hpp'],
250-
file_template_hpp = config['file_template_hpp']
259+
file_template_hpp = config['file_template_hpp'],
260+
mock_file_cpp = config['mock_file_cpp'],
261+
file_template_cpp = config['file_template_cpp']
251262
).generate()
252263

253264
if __name__ == "__main__":

test/gmock_test.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,16 @@ def test_gmock_many_files(self):
5656

5757
def test_gmock_custom_conf(self):
5858
self.assertEqual(0, gmock.main(['./gmock.py', '-c', 'test.conf', '-d', self.generated_dir, '-l', 'n1', 'given/I2.hpp']))
59-
self.assertEqual(1, len([name for name in os.listdir(self.generated_dir)]))
59+
self.assertEqual(2, len([name for name in os.listdir(self.generated_dir)]))
6060
self.assertTrue('I2_mock.hpp' in os.listdir(self.generated_dir))
61+
self.assertTrue('I2_mock.cpp' in os.listdir(self.generated_dir))
6162
self.assertMocks();
6263

6364
def test_gmock_long_args(self):
6465
self.assertEqual(0, gmock.main(['./gmock.py', '--config=test.conf', '--dir='+self.generated_dir, '--limit=n1', 'given/I2.hpp']))
65-
self.assertEqual(1, len([name for name in os.listdir(self.generated_dir)]))
66+
self.assertEqual(2, len([name for name in os.listdir(self.generated_dir)]))
6667
self.assertTrue('I2_mock.hpp' in os.listdir(self.generated_dir))
68+
self.assertTrue('I2_mock.cpp' in os.listdir(self.generated_dir))
6769
self.assertMocks();
6870

6971
if __name__ == '__main__':

test/test.conf

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ file_template_hpp = """\
1212
class %(interface)s_mock : public %(interface)s
1313
{
1414
public:
15-
virtual ~%(interface)s_mock() { }
15+
%(interface)s_mock();
16+
virtual ~%(interface)s_mock();
1617

1718
%(mock_methods)s
1819
};
@@ -23,6 +24,20 @@ public:
2324

2425
"""
2526

26-
mock_file_cpp = None
27-
file_template_cpp = None
27+
mock_file_cpp = "%(interface)s_mock.cpp"
28+
29+
file_template_cpp = """\
30+
/*
31+
* file generated by gmock: %(mock_file_cpp)s
32+
*/
33+
#include "%(mock_file_hpp)s"
34+
35+
%(namespaces_begin)s
36+
37+
%(interface)s_mock::%(interface)s_mock() { }
38+
%(interface)s_mock::~%(interface)s_mock() { }
39+
40+
%(namespaces_end)s
41+
42+
"""
2843

test/then/I2_mock.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* file generated by gmock: I2_mock.cpp
3+
*/
4+
#include "I2_mock.hpp"
5+
6+
namespace n1 {
7+
8+
I2_mock::I2_mock() { }
9+
I2_mock::~I2_mock() { }
10+
11+
} // namespace n1
12+

test/then/I2_mock.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ namespace n1 {
99
class I2_mock : public I2
1010
{
1111
public:
12-
virtual ~I2_mock() { }
12+
I2_mock();
13+
virtual ~I2_mock();
1314

1415
MOCK_CONST_METHOD0(f0, void());
1516
MOCK_METHOD1(f1, void(int));

0 commit comments

Comments
 (0)