123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- from textwrap import dedent
- from parso import parse, load_grammar
- def test_with_stmt():
- module = parse('with x: f.\na')
- assert module.children[0].type == 'with_stmt'
- w, with_item, colon, f = module.children[0].children
- assert f.type == 'error_node'
- assert f.get_code(include_prefix=False) == 'f.'
- assert module.children[2].type == 'name'
- def test_one_line_function(each_version):
- module = parse('def x(): f.', version=each_version)
- assert module.children[0].type == 'funcdef'
- def_, name, parameters, colon, f = module.children[0].children
- assert f.type == 'error_node'
- module = parse('def x(a:', version=each_version)
- func = module.children[0]
- assert func.type == 'error_node'
- if each_version.startswith('2'):
- assert func.children[-1].value == 'a'
- else:
- assert func.children[-1] == ':'
- def test_if_else():
- module = parse('if x:\n f.\nelse:\n g(')
- if_stmt = module.children[0]
- if_, test, colon, suite1, else_, colon, suite2 = if_stmt.children
- f = suite1.children[1]
- assert f.type == 'error_node'
- assert f.children[0].value == 'f'
- assert f.children[1].value == '.'
- g = suite2.children[1]
- assert g.children[0].value == 'g'
- assert g.children[1].value == '('
- def test_if_stmt():
- module = parse('if x: f.\nelse: g(')
- if_stmt = module.children[0]
- assert if_stmt.type == 'if_stmt'
- if_, test, colon, f = if_stmt.children
- assert f.type == 'error_node'
- assert f.children[0].value == 'f'
- assert f.children[1].value == '.'
- assert module.children[1].type == 'newline'
- assert module.children[1].value == '\n'
- assert module.children[2].type == 'error_leaf'
- assert module.children[2].value == 'else'
- assert module.children[3].type == 'error_leaf'
- assert module.children[3].value == ':'
- in_else_stmt = module.children[4]
- assert in_else_stmt.type == 'error_node'
- assert in_else_stmt.children[0].value == 'g'
- assert in_else_stmt.children[1].value == '('
- def test_invalid_token():
- module = parse('a + ? + b')
- error_node, q, plus_b, endmarker = module.children
- assert error_node.get_code() == 'a +'
- assert q.value == '?'
- assert q.type == 'error_leaf'
- assert plus_b.type == 'factor'
- assert plus_b.get_code() == ' + b'
- def test_invalid_token_in_fstr():
- module = load_grammar(version='3.9').parse('f"{a + ? + b}"')
- error_node, q, plus_b, error1, error2, endmarker = module.children
- assert error_node.get_code() == 'f"{a +'
- assert q.value == '?'
- assert q.type == 'error_leaf'
- assert plus_b.type == 'error_node'
- assert plus_b.get_code() == ' + b'
- assert error1.value == '}'
- assert error1.type == 'error_leaf'
- assert error2.value == '"'
- assert error2.type == 'error_leaf'
- def test_dedent_issues1():
- code = dedent('''\
- class C:
- @property
- f
- g
- end
- ''')
- module = load_grammar(version='3.8').parse(code)
- klass, endmarker = module.children
- suite = klass.children[-1]
- assert suite.children[2].type == 'error_leaf'
- assert suite.children[3].get_code(include_prefix=False) == 'f\n'
- assert suite.children[5].get_code(include_prefix=False) == 'g\n'
- assert suite.type == 'suite'
- def test_dedent_issues2():
- code = dedent('''\
- class C:
- @property
- if 1:
- g
- else:
- h
- end
- ''')
- module = load_grammar(version='3.8').parse(code)
- klass, endmarker = module.children
- suite = klass.children[-1]
- assert suite.children[2].type == 'error_leaf'
- if_ = suite.children[3]
- assert if_.children[0] == 'if'
- assert if_.children[3].type == 'suite'
- assert if_.children[3].get_code() == '\n g\n'
- assert if_.children[4] == 'else'
- assert if_.children[6].type == 'suite'
- assert if_.children[6].get_code() == '\n h\n'
- assert suite.children[4].get_code(include_prefix=False) == 'end\n'
- assert suite.type == 'suite'
- def test_dedent_issues3():
- code = dedent('''\
- class C:
- f
- g
- ''')
- module = load_grammar(version='3.8').parse(code)
- klass, endmarker = module.children
- suite = klass.children[-1]
- assert len(suite.children) == 4
- assert suite.children[1].get_code() == ' f\n'
- assert suite.children[1].type == 'simple_stmt'
- assert suite.children[2].get_code() == ''
- assert suite.children[2].type == 'error_leaf'
- assert suite.children[2].token_type == 'ERROR_DEDENT'
- assert suite.children[3].get_code() == ' g\n'
- assert suite.children[3].type == 'simple_stmt'
|