Skip to content

Commit 657323f

Browse files
committed
Use pytest for simpler tests
1 parent 669df36 commit 657323f

7 files changed

Lines changed: 158 additions & 109 deletions

File tree

.github/workflows/python.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ jobs:
3131
- name: Type checks
3232
run: uv run ty check .
3333
- name: Tests
34-
run: uv run python -m unittest discover --verbose .
34+
run: uv run pytest

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ uv sync
2525
To run the tests, run:
2626

2727
```sh
28-
uv run python -m unittest discover --verbose .
28+
uv run pytest
2929
```
3030

3131
To run type checking:

pyproject.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@ dev = [
2020
"jupyter>=1.1.1",
2121
"parameterized>=0.9.0",
2222
"pre-commit>=4.5.1",
23+
"pytest>=9.0.2",
24+
"pytest-xdist>=3.8.0",
2325
"ty>=0.0.14",
2426
]
2527

28+
[tool.pytest.ini_options]
29+
addopts = "-n auto -v"
30+
2631
[build-system]
2732
requires = ["hatchling"]
2833
build-backend = "hatchling.build"

test.macos.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ uv sync
77
uv run ty check .
88

99
# Unit tests
10-
uv run python -m unittest discover --verbose .
10+
uv run pytest
Lines changed: 37 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import unittest
2-
1+
import pytest
32
from clang.cindex import TranslationUnit
4-
from parameterized import parameterized
53

64
import py_cppmodel
75

@@ -14,50 +12,41 @@
1412
]
1513

1614

17-
def _custom_name_func(testcase_func, _, param):
18-
return "%s_%s" % (testcase_func.__name__, parameterized.to_safe_name(param.args[0]))
19-
20-
21-
class TestStandardLibraryIncludes(unittest.TestCase):
22-
@parameterized.expand(
23-
[
24-
"algorithm",
25-
"any",
26-
"array",
27-
"deque",
28-
"forward_list",
29-
"functional",
30-
"iterator",
31-
"list",
32-
"map",
33-
"memory",
34-
"numeric",
35-
"optional",
36-
"queue",
37-
"set",
38-
"stack",
39-
"string",
40-
"tuple",
41-
"type_traits",
42-
"unordered_map",
43-
"unordered_set",
44-
"utility",
45-
"variant",
46-
"vector",
47-
],
48-
name_func=_custom_name_func,
15+
@pytest.mark.parametrize(
16+
"include",
17+
[
18+
"algorithm",
19+
"any",
20+
"array",
21+
"deque",
22+
"forward_list",
23+
"functional",
24+
"iterator",
25+
"list",
26+
"map",
27+
"memory",
28+
"numeric",
29+
"optional",
30+
"queue",
31+
"set",
32+
"stack",
33+
"string",
34+
"tuple",
35+
"type_traits",
36+
"unordered_map",
37+
"unordered_set",
38+
"utility",
39+
"variant",
40+
"vector",
41+
],
42+
)
43+
def test_include(include):
44+
source = f"#include <{include}>"
45+
tu = TranslationUnit.from_source(
46+
"t.cc",
47+
COMPILER_ARGS,
48+
unsaved_files=[("t.cc", source)],
4949
)
50-
def test_include(self, include):
51-
source = f"#include <{include}>"
52-
tu = TranslationUnit.from_source(
53-
"t.cc",
54-
COMPILER_ARGS,
55-
unsaved_files=[("t.cc", source)],
56-
)
57-
58-
# This should not raise an exception.
59-
self.model = py_cppmodel.Model(tu)
60-
6150

62-
if __name__ == "__main__":
63-
unittest.main()
51+
# This should not raise an exception.
52+
py_cppmodel.Model(tu)

test_py_cppmodel.py

Lines changed: 51 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import unittest
2-
1+
import pytest
32
from clang.cindex import TranslationUnit
43

54
import py_cppmodel
@@ -35,59 +34,53 @@ class B {
3534
"""
3635

3736

38-
class TestCppModel(unittest.TestCase):
39-
def setUp(self):
40-
tu = TranslationUnit.from_source(
41-
"sample.cc",
42-
COMPILER_ARGS,
43-
unsaved_files=[("sample.cc", SOURCE)],
44-
)
45-
self.model = py_cppmodel.Model(tu)
46-
47-
def test_filename(self):
48-
self.assertEqual(self.model.filename, "sample.cc")
49-
50-
def test_functions(self):
51-
self.assertEqual(len(self.model.functions), 2)
52-
self.assertEqual(str(self.model.functions[0]), "<py_cppmodel.Function double bar(double)>")
53-
self.assertEqual(str(self.model.functions[1]), "<py_cppmodel.Function int main()>")
54-
55-
def test_classes(self):
56-
self.assertEqual(len(self.model.classes), 1)
57-
self.assertEqual(str(self.model.classes[0]), "<py_cppmodel.Class A>")
58-
59-
self.assertEqual(len(self.model.classes[0].annotations), 1)
60-
self.assertEqual(self.model.classes[0].annotations[0], "A")
61-
62-
self.assertEqual(len(self.model.classes[0].members), 3)
63-
self.assertEqual(
64-
str(self.model.classes[0].members[0]),
65-
"<py_cppmodel.Member <py_cppmodel.Type int> a>",
66-
)
67-
self.assertEqual(
68-
str(self.model.classes[0].members[1]),
69-
"<py_cppmodel.Member <py_cppmodel.Type double> b>",
70-
)
71-
self.assertEqual(
72-
str(self.model.classes[0].members[2]),
73-
"<py_cppmodel.Member <py_cppmodel.Type char[8]> c>",
74-
)
75-
76-
self.assertEqual(len(self.model.classes[0].methods), 1)
77-
self.assertEqual(str(self.model.classes[0].methods[0]), "<py_cppmodel.Method int foo(int)>")
78-
self.assertEqual(len(self.model.classes[0].methods[0].annotations), 1)
79-
self.assertEqual(self.model.classes[0].methods[0].annotations[0], "foo")
80-
81-
self.assertEqual(len(self.model.unmodelled_nodes), 2)
82-
self.assertEqual(
83-
str(self.model.unmodelled_nodes[0]),
84-
"<py_cppmodel.Unmodelled z <SourceLocation file 'sample.cc', line 1, column 5>>",
85-
)
86-
self.assertEqual(
87-
str(self.model.unmodelled_nodes[1]),
88-
"<py_cppmodel.Unmodelled B<T> <SourceLocation file 'sample.cc', line 12, column 7>>",
89-
)
90-
91-
92-
if __name__ == "__main__":
93-
unittest.main()
37+
@pytest.fixture
38+
def model():
39+
tu = TranslationUnit.from_source(
40+
"sample.cc",
41+
COMPILER_ARGS,
42+
unsaved_files=[("sample.cc", SOURCE)],
43+
)
44+
return py_cppmodel.Model(tu)
45+
46+
47+
def test_filename(model):
48+
assert model.filename == "sample.cc"
49+
50+
51+
def test_functions(model):
52+
assert len(model.functions) == 2
53+
assert str(model.functions[0]) == "<py_cppmodel.Function double bar(double)>"
54+
assert str(model.functions[1]) == "<py_cppmodel.Function int main()>"
55+
56+
57+
def test_classes(model):
58+
assert len(model.classes) == 1
59+
assert str(model.classes[0]) == "<py_cppmodel.Class A>"
60+
61+
assert len(model.classes[0].annotations) == 1
62+
assert model.classes[0].annotations[0] == "A"
63+
64+
65+
def test_class_members(model):
66+
assert len(model.classes[0].members) == 3
67+
assert str(model.classes[0].members[0]) == "<py_cppmodel.Member <py_cppmodel.Type int> a>"
68+
assert str(model.classes[0].members[1]) == "<py_cppmodel.Member <py_cppmodel.Type double> b>"
69+
assert str(model.classes[0].members[2]) == "<py_cppmodel.Member <py_cppmodel.Type char[8]> c>"
70+
71+
assert len(model.classes[0].methods) == 1
72+
assert str(model.classes[0].methods[0]) == "<py_cppmodel.Method int foo(int)>"
73+
assert len(model.classes[0].methods[0].annotations) == 1
74+
assert model.classes[0].methods[0].annotations[0] == "foo"
75+
76+
77+
def test_unmodelled_nodes(model):
78+
assert len(model.unmodelled_nodes) == 2
79+
assert (
80+
str(model.unmodelled_nodes[0])
81+
== "<py_cppmodel.Unmodelled z <SourceLocation file 'sample.cc', line 1, column 5>>"
82+
)
83+
assert (
84+
str(model.unmodelled_nodes[1])
85+
== "<py_cppmodel.Unmodelled B<T> <SourceLocation file 'sample.cc', line 12, column 7>>"
86+
)

uv.lock

Lines changed: 62 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)