-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtest_py_cppmodel.py
85 lines (69 loc) · 2.74 KB
/
test_py_cppmodel.py
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
import clang
import os
import py_cppmodel
import unittest
from ctypes.util import find_library
LIBCLANG_PATH = os.environ.get("PY_CPPMODEL_LIBCLANG_PATH")
if not LIBCLANG_PATH:
raise RuntimeError("PY_CPPMODEL_LIBCLANG_PATH is unset")
clang.cindex.Config.set_library_file(LIBCLANG_PATH) # type: ignore
from clang.cindex import TranslationUnit
COMPILER_ARGS = [
"-x",
"c++",
"-std=c++20",
"-I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1",
"-I/Library/Developer/CommandLineTools/usr/include",
]
class TestCppModel(unittest.TestCase):
def setUp(self):
tu = TranslationUnit.from_source(
"sample.cc",
COMPILER_ARGS,
)
self.model = py_cppmodel.Model(tu)
def test_filename(self):
self.assertEqual(self.model.filename, "sample.cc")
def test_functions(self):
self.assertEqual(len(self.model.functions), 2)
self.assertEqual(
str(self.model.functions[0]), "<py_cppmodel.Function double bar(double)>"
)
self.assertEqual(
str(self.model.functions[1]), "<py_cppmodel.Function int main()>"
)
def test_classes(self):
self.assertEqual(len(self.model.classes), 1)
self.assertEqual(str(self.model.classes[0]), "<py_cppmodel.Class A>")
self.assertEqual(len(self.model.classes[0].annotations), 1)
self.assertEqual(self.model.classes[0].annotations[0], "A")
self.assertEqual(len(self.model.classes[0].members), 3)
self.assertEqual(
str(self.model.classes[0].members[0]),
"<py_cppmodel.Member <py_cppmodel.Type int> a>",
)
self.assertEqual(
str(self.model.classes[0].members[1]),
"<py_cppmodel.Member <py_cppmodel.Type double> b>",
)
self.assertEqual(
str(self.model.classes[0].members[2]),
"<py_cppmodel.Member <py_cppmodel.Type char[8]> c>",
)
self.assertEqual(len(self.model.classes[0].methods), 1)
self.assertEqual(
str(self.model.classes[0].methods[0]), "<py_cppmodel.Method int foo(int)>"
)
self.assertEqual(len(self.model.classes[0].methods[0].annotations), 1)
self.assertEqual(self.model.classes[0].methods[0].annotations[0], "foo")
self.assertEqual(len(self.model.unmodelled_nodes), 2)
self.assertEqual(
str(self.model.unmodelled_nodes[0]),
"<py_cppmodel.Unmodelled z <SourceLocation file 'sample.cc', line 1, column 5>>",
)
self.assertEqual(
str(self.model.unmodelled_nodes[1]),
"<py_cppmodel.Unmodelled B<T> <SourceLocation file 'sample.cc', line 12, column 7>>",
)
if __name__ == "__main__":
unittest.main()