15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.TestUtils import CythonTest
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import Cython.Compiler.Errors as Errors
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Nodes import *
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.ParseTreeTransforms import *
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Buffer import *
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestMemviewParsing(CythonTest):
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def parse(self, s):
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return self.should_not_fail(lambda: self.fragment(s)).root
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def not_parseable(self, expected_error, s):
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        e = self.should_fail(lambda: self.fragment(s),  Errors.CompileError)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEqual(expected_error, e.message_only)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_default_1dim(self):
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef int[:] x")
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef short int[:] x")
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_default_ndim(self):
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef int[:,:,:,:,:] x")
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef unsigned long int[:,:,:,:,:] x")
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef unsigned int[:,:,:,:,:] x")
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_zero_offset(self):
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef long double[0:] x")
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef int[0:] x")
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_zero_offset_ndim(self):
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef int[0:,0:,0:,0:] x")
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_def_arg(self):
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"def foo(int[:,:] x): pass")
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_cdef_arg(self):
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"cdef foo(int[:,:] x): pass")
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_general_slice(self):
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u'cdef float[::ptr, ::direct & contig, 0::full & strided] x')
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_non_slice_memview(self):
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.not_parseable(u"An axis specification in memoryview declaration does not have a ':'.",
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                u"cdef double[:foo, bar] x")
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.not_parseable(u"An axis specification in memoryview declaration does not have a ':'.",
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                u"cdef double[0:foo, bar] x")
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_basic(self):
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.parse(u"cdef int[:] x")
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        memv_node = t.stats[0].base_type
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assert_(isinstance(memv_node, MemoryViewSliceTypeNode))
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # we also test other similar declarations (buffers, anonymous C arrays)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # since the parsing has to distinguish between them.
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def disable_test_no_buf_arg(self): # TODO
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.not_parseable(u"Expected ']'",
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                u"cdef extern foo(object[int, ndim=2])")
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def disable_test_parse_sizeof(self): # TODO
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"sizeof(int[NN])")
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"sizeof(int[])")
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.parse(u"sizeof(int[][NN])")
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.not_parseable(u"Expected an identifier or literal",
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                u"sizeof(int[:NN])")
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.not_parseable(u"Expected ']'",
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                u"sizeof(foo[dtype=bar]")
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if __name__ == '__main__':
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    import unittest
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    unittest.main()
72