1 from Cython
.TestUtils
import CythonTest
2 import Cython
.Compiler
.Errors
as Errors
3 from Cython
.Compiler
.Nodes
import *
4 from Cython
.Compiler
.ParseTreeTransforms
import *
5 from Cython
.Compiler
.Buffer
import *
8 class TestBufferParsing(CythonTest
):
9 # First, we only test the raw parser, i.e.
10 # the number and contents of arguments are NOT checked.
11 # However "dtype"/the first positional argument is special-cased
12 # to parse a type argument rather than an expression
15 return self
.should_not_fail(lambda: self
.fragment(s
)).root
17 def not_parseable(self
, expected_error
, s
):
18 e
= self
.should_fail(lambda: self
.fragment(s
), Errors
.CompileError
)
19 self
.assertEqual(expected_error
, e
.message_only
)
22 t
= self
.parse(u
"cdef object[float, 4, ndim=2, foo=foo] x")
23 bufnode
= t
.stats
[0].base_type
24 self
.assert_(isinstance(bufnode
, TemplatedTypeNode
))
25 self
.assertEqual(2, len(bufnode
.positional_args
))
26 # print bufnode.dump()
27 # should put more here...
29 def test_type_pos(self
):
30 self
.parse(u
"cdef object[short unsigned int, 3] x")
32 def test_type_keyword(self
):
33 self
.parse(u
"cdef object[foo=foo, dtype=short unsigned int] x")
35 def test_pos_after_key(self
):
36 self
.not_parseable("Non-keyword arg following keyword arg",
37 u
"cdef object[foo=1, 2] x")
40 # See also tests/error/e_bufaccess.pyx and tets/run/bufaccess.pyx
41 # THESE TESTS ARE NOW DISABLED, the code they test was pretty much
43 class TestBufferOptions(CythonTest
):
44 # Tests the full parsing of the options within the brackets
46 def nonfatal_error(self
, error
):
47 # We're passing self as context to transform to trap this
49 self
.assert_(self
.expect_error
)
51 def parse_opts(self
, opts
, expect_error
=False):
53 s
= u
"def f():\n cdef object[%s] x" % opts
54 self
.expect_error
= expect_error
55 root
= self
.fragment(s
, pipeline
=[NormalizeTree(self
), PostParse(self
)]).root
57 vardef
= root
.stats
[0].body
.stats
[0]
58 assert isinstance(vardef
, CVarDefNode
) # use normal assert as this is to validate the test code
59 buftype
= vardef
.base_type
60 self
.assert_(isinstance(buftype
, TemplatedTypeNode
))
61 self
.assert_(isinstance(buftype
.base_type_node
, CSimpleBaseTypeNode
))
62 self
.assertEqual(u
"object", buftype
.base_type_node
.name
)
65 self
.assert_(len(root
.stats
[0].body
.stats
) == 0)
67 def non_parse(self
, expected_err
, opts
):
68 self
.parse_opts(opts
, expect_error
=True)
69 # e = self.should_fail(lambda: self.parse_opts(opts))
70 self
.assertEqual(expected_err
, self
.error
.message_only
)
72 def __test_basic(self
):
73 buf
= self
.parse_opts(u
"unsigned short int, 3")
74 self
.assert_(isinstance(buf
.dtype_node
, CSimpleBaseTypeNode
))
75 self
.assert_(buf
.dtype_node
.signed
== 0 and buf
.dtype_node
.longness
== -1)
76 self
.assertEqual(3, buf
.ndim
)
78 def __test_dict(self
):
79 buf
= self
.parse_opts(u
"ndim=3, dtype=unsigned short int")
80 self
.assert_(isinstance(buf
.dtype_node
, CSimpleBaseTypeNode
))
81 self
.assert_(buf
.dtype_node
.signed
== 0 and buf
.dtype_node
.longness
== -1)
82 self
.assertEqual(3, buf
.ndim
)
84 def __test_ndim(self
):
85 self
.parse_opts(u
"int, 2")
86 self
.non_parse(ERR_BUF_NDIM
, u
"int, 'a'")
87 self
.non_parse(ERR_BUF_NDIM
, u
"int, -34")
89 def __test_use_DEF(self
):
90 t
= self
.fragment(u
"""
93 cdef object[int, ndim] x
94 cdef object[ndim=ndim, dtype=int] y
95 """, pipeline
=[NormalizeTree(self
), PostParse(self
)]).root
96 stats
= t
.stats
[0].body
.stats
97 self
.assert_(stats
[0].base_type
.ndim
== 3)
98 self
.assert_(stats
[1].base_type
.ndim
== 3)
100 # add exotic and impossible combinations as they come along...
102 if __name__
== '__main__':