test_cheader.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """Test that C functions used in primitives are declared in a header such as CPy.h."""
  2. from __future__ import annotations
  3. import glob
  4. import os
  5. import re
  6. import unittest
  7. from mypyc.primitives import registry
  8. from mypyc.primitives.registry import CFunctionDescription
  9. class TestHeaderInclusion(unittest.TestCase):
  10. def test_primitives_included_in_header(self) -> None:
  11. base_dir = os.path.join(os.path.dirname(__file__), "..", "lib-rt")
  12. with open(os.path.join(base_dir, "CPy.h")) as f:
  13. header = f.read()
  14. with open(os.path.join(base_dir, "pythonsupport.h")) as f:
  15. header += f.read()
  16. def check_name(name: str) -> None:
  17. if name.startswith("CPy"):
  18. assert re.search(
  19. rf"\b{name}\b", header
  20. ), f'"{name}" is used in mypyc.primitives but not declared in CPy.h'
  21. for values in [
  22. registry.method_call_ops.values(),
  23. registry.function_ops.values(),
  24. registry.binary_ops.values(),
  25. registry.unary_ops.values(),
  26. ]:
  27. for ops in values:
  28. if isinstance(ops, CFunctionDescription):
  29. ops = [ops]
  30. for op in ops:
  31. check_name(op.c_function_name)
  32. primitives_path = os.path.join(os.path.dirname(__file__), "..", "primitives")
  33. for fnam in glob.glob(f"{primitives_path}/*.py"):
  34. with open(fnam) as f:
  35. content = f.read()
  36. for name in re.findall(r'c_function_name=["\'](CPy[A-Z_a-z0-9]+)', content):
  37. check_name(name)