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