1
2cimport cython
3from cpython.bool cimport bool
4
5cdef class A:
6    pass
7
8
9a_as_obj = A
10
11
12@cython.test_assert_path_exists('//SimpleCallNode//SimpleCallNode')
13@cython.test_fail_if_path_exists('//SimpleCallNode//PythonCapiCallNode',
14                                 '//PythonCapiCallNode//SimpleCallNode')
15def test_non_optimised():
16    """
17    >>> test_non_optimised()
18    True
19    """
20    # Non-optimized
21    cdef object foo = A
22    assert isinstance(A(), foo)
23    return True
24
25
26@cython.test_assert_path_exists('//PythonCapiCallNode',
27                                '//PythonCapiCallNode//SimpleCallNode',
28                                '//PythonCapiFunctionNode[@cname = "PyType_Check"]',
29                                '//PythonCapiFunctionNode[@cname = "PyInt_Check"]',
30                                '//PythonCapiFunctionNode[@cname = "PyFloat_Check"]',
31                                '//PythonCapiFunctionNode[@cname = "PyBytes_Check"]',
32                                '//PythonCapiFunctionNode[@cname = "PyUnicode_Check"]',
33                                '//PythonCapiFunctionNode[@cname = "PyTuple_Check"]',
34                                '//PythonCapiFunctionNode[@cname = "PyList_Check"]',
35                                '//PythonCapiFunctionNode[@cname = "PyDict_Check"]',
36                                '//PythonCapiFunctionNode[@cname = "PySet_Check"]',
37                                '//PythonCapiFunctionNode[@cname = "PySlice_Check"]',
38                                '//PythonCapiFunctionNode[@cname = "PyComplex_Check"]')
39@cython.test_fail_if_path_exists('//SimpleCallNode//SimpleCallNode',
40                                 '//SimpleCallNode//PythonCapiCallNode')
41def test_optimised():
42    """
43    >>> test_optimised()
44    True
45    """
46    # Optimized tests.
47    cdef object new_type = type('a',(),{})
48    assert isinstance(type('a',(),{}), type)
49    assert isinstance(new_type, type)
50
51    cdef object boolval = True
52    assert isinstance(boolval, bool)
53    assert isinstance(True, bool)
54
55    cdef object intval = int()
56    assert isinstance(intval, int)
57    assert isinstance(int(), int)
58
59    cdef object longval = long()
60    assert isinstance(longval, long)
61    assert isinstance(long(), long)
62
63    cdef object floatval = float()
64    assert isinstance(floatval, float)
65    assert isinstance(float(), float)
66
67    cdef object bytesval = bytes()
68    assert isinstance(bytesval, bytes)
69    assert isinstance(bytes(), bytes)
70
71    cdef object strval = str()
72    assert isinstance(strval, str)
73    assert isinstance(str(), str)
74
75    cdef object unicodeval = unicode()
76    assert isinstance(unicodeval, unicode)
77    assert isinstance(unicode(), unicode)
78
79    cdef object tupleval = tuple()
80    assert isinstance(tupleval, tuple)
81    assert isinstance(tuple(), tuple)
82
83    cdef object listval = list()
84    assert isinstance(listval, list)
85    assert isinstance(list(), list)
86
87    cdef object dictval = dict()
88    assert isinstance(dictval, dict)
89    assert isinstance(dict(), dict)
90
91    cdef object setval = set()
92    assert isinstance(setval, set)
93    assert isinstance(set(), set)
94
95    cdef object sliceval = slice(0)
96    assert isinstance(sliceval, slice)
97    assert isinstance(slice(0), slice)
98
99    cdef object complexval = complex()
100    assert isinstance(complexval, complex)
101    assert isinstance(complex(), complex)
102
103    assert not isinstance(u"foo", int)
104    assert isinstance(A, type)
105    assert isinstance(A(), A)
106    cdef type typed_type = A
107    assert isinstance(A(), typed_type)
108    cdef object untyped_type = A
109    assert isinstance(A(), <type>untyped_type)
110    return True
111
112
113@cython.test_assert_path_exists('//PythonCapiCallNode')
114@cython.test_fail_if_path_exists('//SimpleCallNode//SimpleCallNode',
115                                 '//SimpleCallNode//PythonCapiCallNode',
116                                 '//TupleNode//NameNode')
117def test_optimised_tuple():
118    """
119    >>> test_optimised_tuple()
120    True
121    """
122    assert isinstance(int(),   (int, long, float, bytes, str, unicode, tuple, list, dict, set, slice, type, A))
123    assert isinstance(list(),  (int, long, float, bytes, str, unicode, tuple, list, dict, set, slice, type, A))
124    assert isinstance(A(),  (int, long, float, bytes, str, unicode, tuple, list, dict, set, slice, type, A))
125    assert isinstance(A(),  (int, long, float, bytes, str, unicode, tuple, list, dict, set, slice, type, A, a_as_obj))
126    assert isinstance(A(),  (int, long, float, bytes, str, unicode, tuple, list, dict, set, slice, type, a_as_obj, A))
127    assert isinstance(A(),  (int, long, float, bytes, str, unicode, a_as_obj, tuple, list, dict, set, slice, type, A))
128    assert isinstance(0, (int, long))
129    assert not isinstance(u"xyz", (int, long))
130    return True
131
132
133def test_custom():
134    """
135    >>> test_custom()
136    True
137    """
138    assert isinstance(A(), A)
139    return True
140
141cdef class B:
142    pass
143
144cdef class C:
145    pass
146
147
148@cython.test_assert_path_exists('//PythonCapiCallNode')
149@cython.test_fail_if_path_exists('//SimpleCallNode//SimpleCallNode',
150                                 '//SimpleCallNode//PythonCapiCallNode',
151                                 '//TupleNode//NameNode')
152def test_custom_tuple(obj):
153    """
154    >>> test_custom_tuple(A())
155    True
156    >>> test_custom_tuple(B())
157    True
158    >>> test_custom_tuple(C())
159    False
160    """
161    return isinstance(obj, (A,B))
162
163
164def test_nested(x):
165    """
166    >>> test_nested(1)
167    True
168    >>> test_nested(1.5)
169    True
170    >>> test_nested("a")
171    False
172    """
173    cdef object a = (x, None)
174    if isinstance(a[0], (int, float)):
175        return True
176    return False
177