Index: third_party/cython/src/Cython/Compiler/Tests/TestVisitor.py |
diff --git a/third_party/cython/src/Cython/Compiler/Tests/TestVisitor.py b/third_party/cython/src/Cython/Compiler/Tests/TestVisitor.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dbc8e0c03ab957b92397635f6cdd9a488006fb42 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Compiler/Tests/TestVisitor.py |
@@ -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']) |