Spaces:
Build error
Build error
import unittest | |
from Cython import Shadow | |
from Cython.Compiler import Options, CythonScope, PyrexTypes, Errors | |
class TestShadow(unittest.TestCase): | |
def test_all_types_in_shadow(self): | |
cython_scope = CythonScope.create_cython_scope(None) | |
# Not doing load_cythonscope at this stage because it requires a proper context and | |
# Errors.py to be set up | |
missing_types = [] | |
for key in cython_scope.entries.keys(): | |
if key.startswith('__') and key.endswith('__'): | |
continue | |
if key in ('PyTypeObject', 'PyObject_TypeCheck'): | |
# These are declared in Shadow.py for reasons that look to | |
# be an implementation detail, but it isn't our intention for | |
# users to access them from Pure Python mode. | |
continue | |
if not hasattr(Shadow, key): | |
missing_types.append(key) | |
self.assertEqual(missing_types, []) | |
def test_int_types_in_shadow(self): | |
missing_types = [] | |
for int_name in Shadow.int_types: | |
for sign in ['', 'u', 's']: | |
name = sign + int_name | |
if sign and ( | |
int_name in ['Py_UNICODE', 'Py_UCS4', 'Py_ssize_t', | |
'ssize_t', 'ptrdiff_t', 'Py_hash_t'] or | |
name == "usize_t"): | |
# size_t is special-cased here a little since ssize_t legitimate | |
# but usize_t isn't | |
self.assertNotIn(name, dir(Shadow)) | |
self.assertNotIn('p_' + name, dir(Shadow)) | |
continue | |
if not hasattr(Shadow, name): | |
missing_types.append(name) | |
for ptr in range(1, 4): | |
ptr_name = 'p' * ptr + '_' + name | |
if not hasattr(Shadow, ptr_name): | |
missing_types.append(ptr_name) | |
self.assertEqual(missing_types, []) | |
def test_most_types(self): | |
# TODO it's unfortunately hard to get a definite list of types to confirm that they're | |
# present (because they're obtained by on-the-fly string parsing in `cython_scope.lookup_type`) | |
cython_scope = CythonScope.create_cython_scope(None) | |
# Set up just enough of "Context" and "Errors" that CythonScope.lookup_type can fail | |
class Context: | |
cpp = False | |
language_level = 3 | |
future_directives = [] | |
cython_scope.context = Context | |
Errors.init_thread() | |
missing_types = [] | |
missing_lookups = [] | |
for (signed, longness, name), type_ in PyrexTypes.modifiers_and_name_to_type.items(): | |
if name == 'object': | |
continue # This probably shouldn't be in Shadow | |
if not hasattr(Shadow, name): | |
missing_types.append(name) | |
if not cython_scope.lookup_type(name): | |
missing_lookups.append(name) | |
for ptr in range(1, 4): | |
ptr_name = 'p' * ptr + '_' + name | |
if not hasattr(Shadow, ptr_name): | |
missing_types.append(ptr_name) | |
if not cython_scope.lookup_type(ptr_name): | |
missing_lookups.append(ptr_name) | |
self.assertEqual(missing_types, []) | |
self.assertEqual(missing_lookups, []) | |