aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython/Cython/Compiler/Tests/TestMemView.py
blob: 15785f418d45a9092a5c52a9eec430566b9cb88f (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
from Cython.TestUtils import CythonTest 
import Cython.Compiler.Errors as Errors 
from Cython.Compiler.Nodes import * 
from Cython.Compiler.ParseTreeTransforms import * 
from Cython.Compiler.Buffer import * 
 
 
class TestMemviewParsing(CythonTest): 
 
    def parse(self, s): 
        return self.should_not_fail(lambda: self.fragment(s)).root 
 
    def not_parseable(self, expected_error, s): 
        e = self.should_fail(lambda: self.fragment(s),  Errors.CompileError) 
        self.assertEqual(expected_error, e.message_only) 

    def test_default_1dim(self): 
        self.parse(u"cdef int[:] x") 
        self.parse(u"cdef short int[:] x") 
 
    def test_default_ndim(self): 
        self.parse(u"cdef int[:,:,:,:,:] x") 
        self.parse(u"cdef unsigned long int[:,:,:,:,:] x") 
        self.parse(u"cdef unsigned int[:,:,:,:,:] x") 
 
    def test_zero_offset(self): 
        self.parse(u"cdef long double[0:] x") 
        self.parse(u"cdef int[0:] x") 
 
    def test_zero_offset_ndim(self): 
        self.parse(u"cdef int[0:,0:,0:,0:] x") 
 
    def test_def_arg(self): 
        self.parse(u"def foo(int[:,:] x): pass") 
 
    def test_cdef_arg(self): 
        self.parse(u"cdef foo(int[:,:] x): pass") 
 
    def test_general_slice(self): 
        self.parse(u'cdef float[::ptr, ::direct & contig, 0::full & strided] x') 
 
    def test_non_slice_memview(self): 
        self.not_parseable(u"An axis specification in memoryview declaration does not have a ':'.", 
                u"cdef double[:foo, bar] x") 
        self.not_parseable(u"An axis specification in memoryview declaration does not have a ':'.", 
                u"cdef double[0:foo, bar] x") 
 
    def test_basic(self): 
        t = self.parse(u"cdef int[:] x") 
        memv_node = t.stats[0].base_type 
        self.assertTrue(isinstance(memv_node, MemoryViewSliceTypeNode))
 
    # we also test other similar declarations (buffers, anonymous C arrays) 
    # since the parsing has to distinguish between them. 
 
    def disable_test_no_buf_arg(self): # TODO 
        self.not_parseable(u"Expected ']'", 
                u"cdef extern foo(object[int, ndim=2])") 
 
    def disable_test_parse_sizeof(self): # TODO 
        self.parse(u"sizeof(int[NN])") 
        self.parse(u"sizeof(int[])") 
        self.parse(u"sizeof(int[][NN])") 
        self.not_parseable(u"Expected an identifier or literal", 
                u"sizeof(int[:NN])") 
        self.not_parseable(u"Expected ']'", 
                u"sizeof(foo[dtype=bar]") 
 
if __name__ == '__main__': 
    import unittest 
    unittest.main()