blob: 0966059e24438c839b997bf52c0d0576d7fe461b [file] [log] [blame]
"""Test that C functions used in primitives are declared in a header such as CPy.h."""
import glob
import os
import re
import unittest
from mypyc.primitives import registry
from mypyc.primitives.registry import CFunctionDescription
class TestHeaderInclusion(unittest.TestCase):
def test_primitives_included_in_header(self) -> None:
base_dir = os.path.join(os.path.dirname(__file__), '..', 'lib-rt')
with open(os.path.join(base_dir, 'CPy.h')) as f:
header = f.read()
with open(os.path.join(base_dir, 'pythonsupport.h')) as f:
header += f.read()
def check_name(name: str) -> None:
if name.startswith('CPy'):
assert re.search(fr'\b{name}\b', header), (
f'"{name}" is used in mypyc.primitives but not declared in CPy.h')
for values in [registry.method_call_ops.values(),
registry.function_ops.values(),
registry.binary_ops.values(),
registry.unary_ops.values()]:
for ops in values:
if isinstance(ops, CFunctionDescription):
ops = [ops]
for op in ops:
check_name(op.c_function_name)
primitives_path = os.path.join(os.path.dirname(__file__), '..', 'primitives')
for fnam in glob.glob(f'{primitives_path}/*.py'):
with open(fnam) as f:
content = f.read()
for name in re.findall(r'c_function_name=["\'](CPy[A-Z_a-z0-9]+)', content):
check_name(name)