Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Unified Diff: tools/telemetry/third_party/rope/ropetest/refactor/patchedasttest.py

Issue 1132103009: Example of refactoring using rope library. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/third_party/rope/ropetest/refactor/patchedasttest.py
diff --git a/tools/telemetry/third_party/rope/ropetest/refactor/patchedasttest.py b/tools/telemetry/third_party/rope/ropetest/refactor/patchedasttest.py
new file mode 100644
index 0000000000000000000000000000000000000000..e600b74ce81212440bbca0c1899a93194dd4f736
--- /dev/null
+++ b/tools/telemetry/third_party/rope/ropetest/refactor/patchedasttest.py
@@ -0,0 +1,867 @@
+import unittest
+
+from rope.base import ast
+from rope.refactor import patchedast
+from ropetest import testutils
+
+try:
+ basestring
+except NameError:
+ basestring = (str, bytes)
+
+
+class PatchedASTTest(unittest.TestCase):
+
+ def setUp(self):
+ super(PatchedASTTest, self).setUp()
+
+ def tearDown(self):
+ super(PatchedASTTest, self).tearDown()
+
+ def test_integer_literals_and_region(self):
+ source = 'a = 10\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ start = source.index('10')
+ checker.check_region('Num', start, start + 2)
+
+ def test_integer_literals_and_sorted_children(self):
+ source = 'a = 10\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ #start = source.index('10')
+ checker.check_children('Num', ['10'])
+
+ def test_ass_name_node(self):
+ source = 'a = 10\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ start = source.index('a')
+ checker.check_region('Name', start, start + 1)
+ checker.check_children('Name', ['a'])
+
+ def test_assign_node(self):
+ source = 'a = 10\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ start = source.index('a') # noqa
+ checker.check_region('Assign', 0, len(source) - 1)
+ checker.check_children(
+ 'Assign', ['Name', ' ', '=', ' ', 'Num'])
+
+ def test_add_node(self):
+ source = '1 + 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' ', 'Num'])
+
+ def test_lshift_node(self):
+ source = '1 << 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '<<', ' ', 'Num'])
+
+ def test_and_node(self):
+ source = 'True and True\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BoolOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BoolOp', ['Name', ' ', 'and', ' ', 'Name'])
+
+ def test_basic_closing_parens(self):
+ source = '1 + (2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' (', 'Num', ')'])
+
+ def test_basic_opening_parens(self):
+ source = '(1) + 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['(', 'Num', ') ', '+', ' ', 'Num'])
+
+ def test_basic_opening_biway(self):
+ source = '(1) + (2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['(', 'Num', ') ', '+', ' (', 'Num', ')'])
+
+ def test_basic_opening_double(self):
+ source = '1 + ((2))\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' ((', 'Num', '))'])
+
+ def test_handling_comments(self):
+ source = '(1 + #(\n2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' #(\n', 'Num'])
+
+ def test_handling_parens_with_spaces(self):
+ source = '1 + (2\n )\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' (', 'Num', '\n )'])
+
+ def test_handling_strings(self):
+ source = '1 + "("\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' ', 'Str'])
+
+ def test_handling_implicit_string_concatenation(self):
+ source = "a = '1''2'"
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Assign', ['Name', ' ', '=', ' ', 'Str'])
+ checker.check_children('Str', ["'1''2'"])
+
+ def test_handling_implicit_string_concatenation_line_breaks(self):
+ source = "a = '1' \\\n'2'"
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Assign', ['Name', ' ', '=', ' ', 'Str'])
+ checker.check_children('Str', ["'1' \\\n'2'"])
+
+ def test_handling_explicit_string_concatenation_line_breaks(self):
+ source = "a = ('1' \n'2')"
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Assign', ['Name', ' ', '=', ' (', 'Str', ')'])
+ checker.check_children('Str', ["'1' \n'2'"])
+
+ def test_not_concatenating_strings_on_separate_lines(self):
+ source = "'1'\n'2'\n"
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Module', ['', 'Expr', '\n', 'Expr', '\n'])
+
+ def test_long_integer_literals(self):
+ source = "0x1L + a"
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' ', 'Name'])
+ checker.check_children('Num', ['0x1L'])
+
+ def test_complex_number_literals(self):
+ source = "1.0e2j + a"
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '+', ' ', 'Name'])
+ checker.check_children('Num', ['1.0e2j'])
+
+ def test_ass_attr_node(self):
+ source = 'a.b = 1\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Attribute', 0, source.index('=') - 1)
+ checker.check_children('Attribute', ['Name', '', '.', '', 'b'])
+
+ def test_ass_list_node(self):
+ source = '[a, b] = 1, 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('List', 0, source.index(']') + 1)
+ checker.check_children('List', ['[', '', 'Name', '', ',',
+ ' ', 'Name', '', ']'])
+
+ def test_ass_tuple(self):
+ source = 'a, b = range(2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Tuple', 0, source.index('=') - 1)
+ checker.check_children(
+ 'Tuple', ['Name', '', ',', ' ', 'Name'])
+
+ def test_ass_tuple2(self):
+ source = '(a, b) = range(2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Tuple', 0, source.index('=') - 1)
+ checker.check_children(
+ 'Tuple', ['(', '', 'Name', '', ',', ' ', 'Name', '', ')'])
+
+ def test_assert(self):
+ source = 'assert True\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Assert', 0, len(source) - 1)
+ checker.check_children(
+ 'Assert', ['assert', ' ', 'Name'])
+
+ def test_assert2(self):
+ source = 'assert True, "error"\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Assert', 0, len(source) - 1)
+ checker.check_children(
+ 'Assert', ['assert', ' ', 'Name', '', ',', ' ', 'Str'])
+
+ def test_aug_assign_node(self):
+ source = 'a += 1\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ start = source.index('a') # noqa
+ checker.check_region('AugAssign', 0, len(source) - 1)
+ checker.check_children(
+ 'AugAssign', ['Name', ' ', '+', '', '=', ' ', 'Num'])
+
+ def test_back_quotenode(self):
+ source = '`1`\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Repr', 0, len(source) - 1)
+ checker.check_children(
+ 'Repr', ['`', '', 'Num', '', '`'])
+
+ def test_bitand(self):
+ source = '1 & 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '&', ' ', 'Num'])
+
+ def test_bitor(self):
+ source = '1 | 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'BinOp', ['Num', ' ', '|', ' ', 'Num'])
+
+ def test_call_func(self):
+ source = 'f(1, 2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Call', 0, len(source) - 1)
+ checker.check_children(
+ 'Call', ['Name', '', '(', '', 'Num', '', ',',
+ ' ', 'Num', '', ')'])
+
+ def test_call_func_and_keywords(self):
+ source = 'f(1, p=2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Call', ['Name', '', '(', '', 'Num', '', ',',
+ ' ', 'keyword', '', ')'])
+
+ def test_call_func_and_start_args(self):
+ source = 'f(1, *args)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Call', ['Name', '', '(', '', 'Num', '', ',',
+ ' ', '*', '', 'Name', '', ')'])
+
+ def test_call_func_and_only_dstart_args(self):
+ source = 'f(**kwds)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Call', ['Name', '', '(', '', '**', '', 'Name', '', ')'])
+
+ def test_call_func_and_both_varargs_and_kwargs(self):
+ source = 'f(*args, **kwds)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Call', ['Name', '', '(', '', '*', '', 'Name', '', ',',
+ ' ', '**', '', 'Name', '', ')'])
+
+ def test_class_node(self):
+ source = 'class A(object):\n """class docs"""\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Class', 0, len(source) - 1)
+ checker.check_children(
+ 'Class', ['class', ' ', 'A', '', '(', '', 'Name', '', ')',
+ '', ':', '\n ', 'Expr', '\n ', 'Pass'])
+
+ def test_class_with_no_bases(self):
+ source = 'class A:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Class', 0, len(source) - 1)
+ checker.check_children(
+ 'Class', ['class', ' ', 'A', '', ':', '\n ', 'Pass'])
+
+ def test_simple_compare(self):
+ source = '1 < 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Compare', 0, len(source) - 1)
+ checker.check_children(
+ 'Compare', ['Num', ' ', '<', ' ', 'Num'])
+
+ def test_multiple_compare(self):
+ source = '1 < 2 <= 3\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Compare', 0, len(source) - 1)
+ checker.check_children(
+ 'Compare', ['Num', ' ', '<', ' ', 'Num', ' ',
+ '<=', ' ', 'Num'])
+
+ def test_decorators_node(self):
+ source = '@d\ndef f():\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('FunctionDef', 0, len(source) - 1)
+ checker.check_children(
+ 'FunctionDef',
+ ['@', '', 'Name', '\n', 'def', ' ', 'f', '', '(', '', 'arguments',
+ '', ')', '', ':', '\n ', 'Pass'])
+
+ @testutils.only_for('2.6')
+ def test_decorators_for_classes(self):
+ source = '@d\nclass C(object):\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ClassDef', 0, len(source) - 1)
+ checker.check_children(
+ 'ClassDef',
+ ['@', '', 'Name', '\n', 'class', ' ', 'C', '', '(', '', 'Name',
+ '', ')', '', ':', '\n ', 'Pass'])
+
+ def test_both_varargs_and_kwargs(self):
+ source = 'def f(*args, **kwds):\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'arguments', ['*', '', 'args', '', ',', ' ', '**', '', 'kwds'])
+
+ def test_function_node(self):
+ source = 'def f():\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Function', 0, len(source) - 1)
+ checker.check_children('Function',
+ ['def', ' ', 'f', '', '(', '', 'arguments', '',
+ ')', '', ':', '\n ', 'Pass'])
+
+ def test_function_node2(self):
+ source = 'def f(p1, **p2):\n """docs"""\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Function', 0, len(source) - 1)
+ checker.check_children(
+ 'Function', ['def', ' ', 'f', '', '(', '', 'arguments',
+ '', ')', '', ':', '\n ', 'Expr', '\n ',
+ 'Pass'])
+ checker.check_children(
+ 'arguments', ['Name', '', ',',
+ ' ', '**', '', 'p2'])
+
+ def test_function_node_and_tuple_parameters(self):
+ source = 'def f(a, (b, c)):\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Function', 0, len(source) - 1)
+ checker.check_children(
+ 'Function', ['def', ' ', 'f', '', '(', '', 'arguments',
+ '', ')', '', ':', '\n ', 'Pass'])
+ checker.check_children(
+ 'arguments', ['Name', '', ',', ' ', 'Tuple'])
+
+ def test_dict_node(self):
+ source = '{1: 2, 3: 4}\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Dict', 0, len(source) - 1)
+ checker.check_children(
+ 'Dict', ['{', '', 'Num', '', ':', ' ', 'Num', '', ',',
+ ' ', 'Num', '', ':', ' ', 'Num', '', '}'])
+
+ def test_div_node(self):
+ source = '1 / 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('BinOp', 0, len(source) - 1)
+ checker.check_children('BinOp', ['Num', ' ', '/', ' ', 'Num'])
+
+ def test_simple_exec_node(self):
+ source = 'exec ""\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Exec', 0, len(source) - 1)
+ checker.check_children('Exec', ['exec', ' ', 'Str'])
+
+ def test_exec_node(self):
+ source = 'exec "" in locals(), globals()\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Exec', 0, len(source) - 1)
+ checker.check_children(
+ 'Exec', ['exec', ' ', 'Str', ' ', 'in',
+ ' ', 'Call', '', ',', ' ', 'Call'])
+
+ def test_for_node(self):
+ source = 'for i in range(1):\n pass\nelse:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('For', 0, len(source) - 1)
+ checker.check_children(
+ 'For', ['for', ' ', 'Name', ' ', 'in', ' ', 'Call', '',
+ ':', '\n ', 'Pass', '\n',
+ 'else', '', ':', '\n ', 'Pass'])
+
+ def test_normal_from_node(self):
+ source = 'from x import y\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ImportFrom', 0, len(source) - 1)
+ checker.check_children(
+ 'ImportFrom', ['from', ' ', 'x', ' ', 'import', ' ', 'alias'])
+ checker.check_children('alias', ['y'])
+
+ @testutils.run_only_for_25
+ def test_from_node(self):
+ source = 'from ..x import y as z\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ImportFrom', 0, len(source) - 1)
+ checker.check_children(
+ 'ImportFrom', ['from', ' ', '..', '', 'x', ' ',
+ 'import', ' ', 'alias'])
+ checker.check_children('alias', ['y', ' ', 'as', ' ', 'z'])
+
+ @testutils.run_only_for_25
+ def test_from_node_relative_import(self):
+ source = 'from . import y as z\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ImportFrom', 0, len(source) - 1)
+ checker.check_children(
+ 'ImportFrom', ['from', ' ', '.', '', '', ' ',
+ 'import', ' ', 'alias'])
+ checker.check_children('alias', ['y', ' ', 'as', ' ', 'z'])
+
+ def test_simple_gen_expr_node(self):
+ source = 'zip(i for i in x)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('GeneratorExp', 4, len(source) - 2)
+ checker.check_children(
+ 'GeneratorExp', ['Name', ' ', 'comprehension'])
+ checker.check_children(
+ 'comprehension', ['for', ' ', 'Name', ' ', 'in', ' ', 'Name'])
+
+ def test_gen_expr_node_handling_surrounding_parens(self):
+ source = '(i for i in x)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('GeneratorExp', 0, len(source) - 1)
+ checker.check_children(
+ 'GeneratorExp', ['(', '', 'Name', ' ', 'comprehension', '', ')'])
+
+ def test_gen_expr_node2(self):
+ source = 'zip(i for i in range(1) if i == 1)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'comprehension', ['for', ' ', 'Name', ' ', 'in', ' ', 'Call',
+ ' ', 'if', ' ', 'Compare'])
+
+ def test_get_attr_node(self):
+ source = 'a.b\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Attribute', 0, len(source) - 1)
+ checker.check_children('Attribute', ['Name', '', '.', '', 'b'])
+
+ def test_global_node(self):
+ source = 'global a, b\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Global', 0, len(source) - 1)
+ checker.check_children('Global', ['global', ' ', 'a', '', ',', ' ',
+ 'b'])
+
+ def test_if_node(self):
+ source = 'if True:\n pass\nelse:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('If', 0, len(source) - 1)
+ checker.check_children(
+ 'If', ['if', ' ', 'Name', '', ':', '\n ', 'Pass', '\n',
+ 'else', '', ':', '\n ', 'Pass'])
+
+ def test_if_node2(self):
+ source = 'if True:\n pass\nelif False:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('If', 0, len(source) - 1)
+ checker.check_children(
+ 'If', ['if', ' ', 'Name', '', ':', '\n ', 'Pass', '\n',
+ 'If'])
+
+ def test_if_node3(self):
+ source = 'if True:\n pass\nelse:\n' \
+ ' if True:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('If', 0, len(source) - 1)
+ checker.check_children(
+ 'If', ['if', ' ', 'Name', '', ':', '\n ', 'Pass', '\n',
+ 'else', '', ':', '\n ', 'If'])
+
+ def test_import_node(self):
+ source = 'import a, b as c\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Import', 0, len(source) - 1)
+ checker.check_children(
+ 'Import', ['import', ' ', 'alias', '', ',', ' ', 'alias'])
+
+ def test_lambda_node(self):
+ source = 'lambda a, b=1, *z: None\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Lambda', 0, len(source) - 1)
+ checker.check_children(
+ 'Lambda', ['lambda', ' ', 'arguments', '', ':', ' ', 'Name'])
+ checker.check_children(
+ 'arguments', ['Name', '', ',', ' ', 'Name', '', '=', '',
+ 'Num', '', ',', ' ', '*', '', 'z'])
+
+ def test_list_node(self):
+ source = '[1, 2]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('List', 0, len(source) - 1)
+ checker.check_children(
+ 'List', ['[', '', 'Num', '', ',', ' ', 'Num', '', ']'])
+
+ def test_list_comp_node(self):
+ source = '[i for i in range(1) if True]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ListComp', 0, len(source) - 1)
+ checker.check_children(
+ 'ListComp', ['[', '', 'Name', ' ', 'comprehension', '', ']'])
+ checker.check_children(
+ 'comprehension', ['for', ' ', 'Name', ' ', 'in', ' ',
+ 'Call', ' ', 'if', ' ', 'Name'])
+
+ def test_list_comp_node_with_multiple_comprehensions(self):
+ source = '[i for i in range(1) for j in range(1) if True]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ListComp', 0, len(source) - 1)
+ checker.check_children(
+ 'ListComp', ['[', '', 'Name', ' ', 'comprehension',
+ ' ', 'comprehension', '', ']'])
+ checker.check_children(
+ 'comprehension', ['for', ' ', 'Name', ' ', 'in', ' ',
+ 'Call', ' ', 'if', ' ', 'Name'])
+
+ def test_ext_slice_node(self):
+ source = 'x = xs[0,:]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('ExtSlice', 7, len(source) - 2)
+ checker.check_children('ExtSlice', ['Index', '', ',', '', 'Slice'])
+
+ def test_simple_module_node(self):
+ source = 'pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Module', 0, len(source))
+ checker.check_children('Module', ['', 'Pass', '\n'])
+
+ def test_module_node(self):
+ source = '"""docs"""\npass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Module', 0, len(source))
+ checker.check_children('Module', ['', 'Expr', '\n', 'Pass', '\n'])
+ checker.check_children('Str', ['"""docs"""'])
+
+ def test_not_and_or_nodes(self):
+ source = 'not True or False\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Expr', ['BoolOp'])
+ checker.check_children('BoolOp', ['UnaryOp', ' ', 'or', ' ', 'Name'])
+
+ def test_print_node(self):
+ source = 'print >>out, 1,\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Print', 0, len(source) - 1)
+ checker.check_children('Print', ['print', ' ', '>>', '', 'Name', '',
+ ',', ' ', 'Num', '', ','])
+
+ def test_printnl_node(self):
+ source = 'print 1\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Print', 0, len(source) - 1)
+ checker.check_children('Print', ['print', ' ', 'Num'])
+
+ def test_raise_node(self):
+ source = 'raise x, y, z\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_region('Raise', 0, len(source) - 1)
+ checker.check_children(
+ 'Raise', ['raise', ' ', 'Name', '', ',', ' ', 'Name', '', ',',
+ ' ', 'Name'])
+
+ def test_return_node(self):
+ source = 'def f():\n return None\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Return', ['return', ' ', 'Name'])
+
+ def test_empty_return_node(self):
+ source = 'def f():\n return\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Return', ['return'])
+
+ def test_simple_slice_node(self):
+ source = 'a[1:2]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Subscript', ['Name', '', '[', '', 'Slice', '', ']'])
+ checker.check_children(
+ 'Slice', ['Num', '', ':', '', 'Num'])
+
+ def test_slice_node2(self):
+ source = 'a[:]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Subscript', ['Name', '', '[', '', 'Slice',
+ '', ']'])
+ checker.check_children('Slice', [':'])
+
+ def test_simple_subscript(self):
+ source = 'a[1]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Subscript', ['Name', '', '[', '', 'Index', '', ']'])
+ checker.check_children('Index', ['Num'])
+
+ def test_tuple_node(self):
+ source = '(1, 2)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Tuple', ['(', '', 'Num', '', ',', ' ', 'Num', '', ')'])
+
+ def test_tuple_node2(self):
+ source = '#(\n1, 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Tuple', ['Num', '', ',', ' ', 'Num'])
+
+ def test_one_item_tuple_node(self):
+ source = '(1,)\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Tuple', ['(', '', 'Num', ',', ')'])
+
+ def test_empty_tuple_node(self):
+ source = '()\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Tuple', ['(', '', ')'])
+
+ def test_yield_node(self):
+ source = 'def f():\n yield None\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children('Yield', ['yield', ' ', 'Name'])
+
+ def test_while_node(self):
+ source = 'while True:\n pass\nelse:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'While', ['while', ' ', 'Name', '', ':', '\n ', 'Pass', '\n',
+ 'else', '', ':', '\n ', 'Pass'])
+
+ @testutils.run_only_for_25
+ def test_with_node(self):
+ source = 'from __future__ import with_statement\nwith a as ' \
+ 'b:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'With', ['with', ' ', 'Name', ' ', 'as', ' ', 'Name', '', ':',
+ '\n ', 'Pass'])
+
+ def test_try_finally_node(self):
+ source = 'try:\n pass\nfinally:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'TryFinally', ['try', '', ':', '\n ', 'Pass', '\n', 'finally',
+ '', ':', '\n ', 'Pass'])
+
+ def test_try_except_node(self):
+ source = 'try:\n pass\nexcept Exception, e:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'TryExcept', ['try', '', ':', '\n ', 'Pass', '\n',
+ ('excepthandler', 'ExceptHandler')])
+ checker.check_children(
+ ('excepthandler', 'ExceptHandler'),
+ ['except', ' ', 'Name', '', ',', ' ', 'Name', '', ':',
+ '\n ', 'Pass'])
+
+ def test_try_except_node__with_as_syntax(self):
+ source = 'try:\n pass\nexcept Exception as e:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'TryExcept', ['try', '', ':', '\n ', 'Pass', '\n',
+ ('excepthandler', 'ExceptHandler')])
+ checker.check_children(
+ ('excepthandler', 'ExceptHandler'),
+ ['except', ' ', 'Name', ' ', 'as', ' ', 'Name', '', ':',
+ '\n ', 'Pass'])
+
+ @testutils.run_only_for_25
+ def test_try_except_and_finally_node(self):
+ source = 'try:\n pass\nexcept:\n pass\nfinally:\n pass\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'TryFinally', ['TryExcept', '\n', 'finally',
+ '', ':', '\n ', 'Pass'])
+
+ def test_ignoring_comments(self):
+ source = '#1\n1\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ start = source.rindex('1')
+ checker.check_region('Num', start, start + 1)
+
+ def test_simple_sliceobj(self):
+ source = 'a[1::3]\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Slice', ['Num', '', ':', '', ':', '', 'Num'])
+
+ def test_ignoring_strings_that_start_with_a_char(self):
+ source = 'r"""("""\n1\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Module', ['', 'Expr', '\n', 'Expr', '\n'])
+
+ def test_how_to_handle_old_not_equals(self):
+ source = '1 <> 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Compare', ['Num', ' ', '<>', ' ', 'Num'])
+
+ def test_semicolon(self):
+ source = '1;\n'
+ patchedast.get_patched_ast(source, True)
+
+ @testutils.run_only_for_25
+ def test_if_exp_node(self):
+ source = '1 if True else 2\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'IfExp', ['Num', ' ', 'if', ' ', 'Name', ' ', 'else',
+ ' ', 'Num'])
+
+ def test_delete_node(self):
+ source = 'del a, b\n'
+ ast_frag = patchedast.get_patched_ast(source, True)
+ checker = _ResultChecker(self, ast_frag)
+ checker.check_children(
+ 'Delete', ['del', ' ', 'Name', '', ',', ' ', 'Name'])
+
+
+class _ResultChecker(object):
+
+ def __init__(self, test_case, ast):
+ self.test_case = test_case
+ self.ast = ast
+
+ def check_region(self, text, start, end):
+ node = self._find_node(text)
+ if node is None:
+ self.test_case.fail('Node <%s> cannot be found' % text)
+ self.test_case.assertEquals((start, end), node.region)
+
+ def _find_node(self, text):
+ goal = text
+ if not isinstance(text, (tuple, list)):
+ goal = [text]
+
+ class Search(object):
+ result = None
+
+ def __call__(self, node):
+ for text in goal:
+ if str(node).startswith(text):
+ self.result = node
+ break
+ if node.__class__.__name__.startswith(text):
+ self.result = node
+ break
+ return self.result is not None
+ search = Search()
+ ast.call_for_nodes(self.ast, search, recursive=True)
+ return search.result
+
+ def check_children(self, text, children):
+ node = self._find_node(text)
+ if node is None:
+ self.test_case.fail('Node <%s> cannot be found' % text)
+ result = list(node.sorted_children)
+ self.test_case.assertEquals(len(children), len(result))
+ for expected, child in zip(children, result):
+ goals = expected
+ if not isinstance(expected, (tuple, list)):
+ goals = [expected]
+ for goal in goals:
+ if goal == '' or isinstance(child, basestring):
+ self.test_case.assertEquals(goal, child)
+ break
+ else:
+ self.test_case.assertNotEquals(
+ '', text, 'probably ignoring some node')
+ self.test_case.assertTrue(
+ child.__class__.__name__.startswith(expected),
+ msg='Expected <%s> but was <%s>' %
+ (expected, child.__class__.__name__))
+
+
+if __name__ == '__main__':
+ unittest.main()

Powered by Google App Engine
This is Rietveld 408576698