some new features
This commit is contained in:
@ -0,0 +1,61 @@
|
||||
from Cython.Compiler.ModuleNode import ModuleNode
|
||||
from Cython.Compiler.Symtab import ModuleScope
|
||||
from Cython.TestUtils import TransformTest
|
||||
from Cython.Compiler.Visitor import MethodDispatcherTransform
|
||||
from Cython.Compiler.ParseTreeTransforms import (
|
||||
NormalizeTree, AnalyseDeclarationsTransform,
|
||||
AnalyseExpressionsTransform, InterpretCompilerDirectives)
|
||||
|
||||
|
||||
class TestMethodDispatcherTransform(TransformTest):
|
||||
_tree = None
|
||||
|
||||
def _build_tree(self):
|
||||
if self._tree is None:
|
||||
context = None
|
||||
|
||||
def fake_module(node):
|
||||
scope = ModuleScope('test', None, None)
|
||||
return ModuleNode(node.pos, doc=None, body=node,
|
||||
scope=scope, full_module_name='test',
|
||||
directive_comments={})
|
||||
pipeline = [
|
||||
fake_module,
|
||||
NormalizeTree(context),
|
||||
InterpretCompilerDirectives(context, {}),
|
||||
AnalyseDeclarationsTransform(context),
|
||||
AnalyseExpressionsTransform(context),
|
||||
]
|
||||
self._tree = self.run_pipeline(pipeline, u"""
|
||||
cdef bytes s = b'asdfg'
|
||||
cdef dict d = {1:2}
|
||||
x = s * 3
|
||||
d.get('test')
|
||||
""")
|
||||
return self._tree
|
||||
|
||||
def test_builtin_method(self):
|
||||
calls = [0]
|
||||
class Test(MethodDispatcherTransform):
|
||||
def _handle_simple_method_dict_get(self, node, func, args, unbound):
|
||||
calls[0] += 1
|
||||
return node
|
||||
|
||||
tree = self._build_tree()
|
||||
Test(None)(tree)
|
||||
self.assertEqual(1, calls[0])
|
||||
|
||||
def test_binop_method(self):
|
||||
calls = {'bytes': 0, 'object': 0}
|
||||
class Test(MethodDispatcherTransform):
|
||||
def _handle_simple_method_bytes___mul__(self, node, func, args, unbound):
|
||||
calls['bytes'] += 1
|
||||
return node
|
||||
def _handle_simple_method_object___mul__(self, node, func, args, unbound):
|
||||
calls['object'] += 1
|
||||
return node
|
||||
|
||||
tree = self._build_tree()
|
||||
Test(None)(tree)
|
||||
self.assertEqual(1, calls['bytes'])
|
||||
self.assertEqual(0, calls['object'])
|
||||
Reference in New Issue
Block a user