aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython/Cython/Build/Tests/TestInline.py
blob: 0877dee03fda36f12fd76caf93aa7ec8cd010ecd (plain) (blame)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import os, tempfile 
from Cython.Shadow import inline 
from Cython.Build.Inline import safe_type 
from Cython.TestUtils import CythonTest 
 
try: 
    import numpy 
    has_numpy = True 
except: 
    has_numpy = False 
 
test_kwds = dict(force=True, quiet=True) 
 
global_value = 100 
 
class TestInline(CythonTest): 
    def setUp(self): 
        CythonTest.setUp(self) 
        self.test_kwds = dict(test_kwds) 
        if os.path.isdir('TEST_TMP'):
            lib_dir = os.path.join('TEST_TMP','inline')
        else: 
            lib_dir = tempfile.mkdtemp(prefix='cython_inline_') 
        self.test_kwds['lib_dir'] = lib_dir 
 
    def test_simple(self): 
        self.assertEqual(inline("return 1+2", **self.test_kwds), 3)
 
    def test_types(self): 
        self.assertEqual(inline("""
            cimport cython 
            return cython.typeof(a), cython.typeof(b) 
        """, a=1.0, b=[], **self.test_kwds), ('double', 'list object')) 
 
    def test_locals(self): 
        a = 1 
        b = 2 
        self.assertEqual(inline("return a+b", **self.test_kwds), 3)
 
    def test_globals(self): 
        self.assertEqual(inline("return global_value + 1", **self.test_kwds), global_value + 1)
 
    def test_no_return(self): 
        self.assertEqual(inline("""
            a = 1 
            cdef double b = 2 
            cdef c = [] 
        """, **self.test_kwds), dict(a=1, b=2.0, c=[]))
 
    def test_def_node(self): 
        foo = inline("def foo(x): return x * x", **self.test_kwds)['foo']
        self.assertEqual(foo(7), 49)
 
    def test_class_ref(self):
        class Type(object):
            pass
        tp = inline("Type")['Type']
        self.assertEqual(tp, Type)

    def test_pure(self): 
        import cython as cy 
        b = inline(""" 
        b = cy.declare(float, a) 
        c = cy.declare(cy.pointer(cy.float), &b) 
        return b 
        """, a=3, **self.test_kwds)
        self.assertEqual(type(b), float)
 
    def test_compiler_directives(self):
        self.assertEqual(
            inline('return sum(x)',
                   x=[1, 2, 3],
                   cython_compiler_directives={'boundscheck': False}),
            6
        )

    def test_lang_version(self):
        # GH-3419. Caching for inline code didn't always respect compiler directives.
        inline_divcode = "def f(int a, int b): return a/b"
        self.assertEqual(
            inline(inline_divcode, language_level=2)['f'](5,2),
            2
        )
        self.assertEqual(
            inline(inline_divcode, language_level=3)['f'](5,2),
            2.5
        )

    if has_numpy: 
 
        def test_numpy(self): 
            import numpy 
            a = numpy.ndarray((10, 20)) 
            a[0,0] = 10 
            self.assertEqual(safe_type(a), 'numpy.ndarray[numpy.float64_t, ndim=2]')
            self.assertEqual(inline("return a[0,0]", a=a, **self.test_kwds), 10.0)