| 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()
|
|
|