-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
TestTypes.py
77 lines (63 loc) · 3.26 KB
/
TestTypes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from __future__ import absolute_import
import unittest
import Cython.Compiler.PyrexTypes as PT
class TestMethodDispatcherTransform(unittest.TestCase):
def test_widest_numeric_type(self):
def assert_widest(type1, type2, widest):
self.assertEqual(widest, PT.widest_numeric_type(type1, type2))
assert_widest(PT.c_int_type, PT.c_long_type, PT.c_long_type)
assert_widest(PT.c_double_type, PT.c_long_type, PT.c_double_type)
assert_widest(PT.c_longdouble_type, PT.c_long_type, PT.c_longdouble_type)
cenum = PT.CEnumType("E", "cenum", typedef_flag=False)
assert_widest(PT.c_int_type, cenum, PT.c_int_type)
class TestTypeIdentifiers(unittest.TestCase):
TEST_DATA = [
("char*", "char__ptr"),
("char *", "char__ptr"),
("char **", "char__ptr__ptr"),
("_typedef", "_typedef"),
("__typedef", "__dundertypedef"),
("___typedef", "__dunder_typedef"),
("____typedef", "__dunder__dundertypedef"),
("_____typedef", "__dunder__dunder_typedef"),
("const __typedef", "__const___dundertypedef"),
("int[42]", "int__lArr42__rArr"),
("int[:]", "int__lArr__D__rArr"),
("int[:,:]", "int__lArr__D__comma___D__rArr"),
("int[:,:,:]", "int__lArr__D__comma___D__comma___D__rArr"),
("int[:,:,...]", "int__lArr__D__comma___D__comma___EL__rArr"),
("std::vector", "std__in_vector"),
("std::vector&&", "std__in_vector__fwref"),
("const std::vector", "__const_std__in_vector"),
("const std::vector&", "__const_std__in_vector__ref"),
("const_std", "const_std"),
]
def test_escape_special_type_characters(self):
test_func = PT._escape_special_type_characters # keep test usage visible for IDEs
function_name = "_escape_special_type_characters"
self._test_escape(function_name)
def test_type_identifier_for_declaration(self):
test_func = PT.type_identifier_from_declaration # keep test usage visible for IDEs
function_name = test_func.__name__
self._test_escape(function_name)
# differences due to whitespace removal
test_data = [
("const &std::vector", "const__refstd__in_vector"),
("const &std::vector<int>", "const__refstd__in_vector__lAngint__rAng"),
("const &&std::vector", "const__fwrefstd__in_vector"),
("const &&&std::vector", "const__fwref__refstd__in_vector"),
("const &&std::vector", "const__fwrefstd__in_vector"),
("void (*func)(int x, float y)",
"975d51__void__lParen__ptrfunc__rParen__lParenint__spac__etc"),
("float ** (*func)(int x, int[:] y)",
"31883a__float__ptr__ptr__lParen__ptrfunc__rParen__lPar__etc"),
]
self._test_escape(function_name, test_data)
def _test_escape(self, func_name, test_data=TEST_DATA):
escape = getattr(PT, func_name)
for declaration, expected in test_data:
escaped_value = escape(declaration)
self.assertEqual(escaped_value, expected, "%s('%s') == '%s' != '%s'" % (
func_name, declaration, escaped_value, expected))
# test that the length has been successfully capped
self.assertLessEqual(len(escaped_value), 64)