mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 09:20:06 +08:00
150 lines
4.6 KiB
Python
Vendored
150 lines
4.6 KiB
Python
Vendored
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'
|