12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 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'])
|