Skip to content

Commit cee0067

Browse files
committed
[libclang/python] Add missing enum variants
Add tests to ensure that all C-enum variants are defined on Python side.
1 parent b36e161 commit cee0067

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

clang/bindings/python/tests/cindex/test_enums.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
from pathlib import Path
23

34
from clang.cindex import (
45
AccessSpecifier,
@@ -12,6 +13,7 @@
1213
TemplateArgumentKind,
1314
TLSKind,
1415
TokenKind,
16+
TranslationUnit,
1517
TypeKind,
1618
)
1719

@@ -44,8 +46,53 @@ def test_from_id(self):
4446

4547
def test_duplicate_ids(self):
4648
"""Check that no two kinds have the same id"""
47-
# for enum in self.enums:
4849
for enum in self.enums:
4950
num_declared_variants = len(enum._member_map_.keys())
5051
num_unique_variants = len(list(enum))
5152
self.assertEqual(num_declared_variants, num_unique_variants)
53+
54+
def test_all_variants(self):
55+
"""Check that all libclang enum values are also defined in cindex"""
56+
cenum_to_pythonenum = {
57+
"CX_CXXAccessSpecifier": AccessSpecifier,
58+
"CXAvailabilityKind": AvailabilityKind,
59+
"CXBinaryOperatorKind": BinaryOperator,
60+
"CXCursorKind": CursorKind,
61+
"CXCursor_ExceptionSpecificationKind": ExceptionSpecificationKind,
62+
"CXLinkageKind": LinkageKind,
63+
"CXRefQualifierKind": RefQualifierKind,
64+
"CX_StorageClass": StorageClass,
65+
"CXTemplateArgumentKind": TemplateArgumentKind,
66+
"CXTLSKind": TLSKind,
67+
"CXTokenKind": TokenKind,
68+
"CXTypeKind": TypeKind,
69+
}
70+
71+
indexheader = (
72+
Path(__file__).parent.parent.parent.parent.parent
73+
/ "include/clang-c/Index.h"
74+
)
75+
tu = TranslationUnit.from_source(indexheader, ["-x", "c++"])
76+
77+
enum_variant_map = {}
78+
# For all enums in self.enums, extract all enum variants defined in Index.h
79+
for cursor in tu.cursor.walk_preorder():
80+
type_class = cenum_to_pythonenum.get(cursor.type.spelling)
81+
if (
82+
cursor.kind == CursorKind.ENUM_CONSTANT_DECL
83+
and type_class in self.enums
84+
):
85+
if type_class not in enum_variant_map:
86+
enum_variant_map[type_class] = []
87+
enum_variant_map[type_class].append(cursor.enum_value)
88+
89+
for enum in self.enums:
90+
with self.subTest(enum):
91+
python_kinds = set([kind.value for kind in enum])
92+
c_kinds = set(enum_variant_map[enum])
93+
missing_python_kinds = c_kinds - python_kinds
94+
self.assertEqual(
95+
missing_python_kinds,
96+
set(),
97+
f"Please ensure these variants are defined inside {enum} in cindex.py.",
98+
)

0 commit comments

Comments
 (0)