mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-07 21:34:32 +08:00
73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
"""
|
|
Testing if parso finds syntax errors and indentation errors.
|
|
"""
|
|
|
|
import pytest
|
|
import ast
|
|
|
|
import parso
|
|
from parso.python.normalizer import ErrorFinderConfig
|
|
|
|
def _get_error_list(code, version=None):
|
|
grammar = parso.load_grammar(version=version)
|
|
tree = grammar.parse(code)
|
|
config = ErrorFinderConfig()
|
|
return list(tree._get_normalizer_issues(config))
|
|
|
|
|
|
def assert_comparison(code, error_code, positions):
|
|
errors = [(error.start_pos, error.code) for error in _get_error_list(code)]
|
|
assert [(pos, error_code) for pos in positions] == errors
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
('code', 'positions'), [
|
|
('1 +', [(1, 3)]),
|
|
('1 +\n', [(1, 3)]),
|
|
('1 +\n2 +', [(1, 3), (2, 3)]),
|
|
('x + 2', []),
|
|
('[\n', [(2, 0)]),
|
|
('[\ndef x(): pass', [(2, 0)]),
|
|
('[\nif 1: pass', [(2, 0)]),
|
|
('1+?', [(1, 2)]),
|
|
('?', [(1, 0)]),
|
|
('??', [(1, 0)]),
|
|
('? ?', [(1, 0)]),
|
|
('?\n?', [(1, 0), (2, 0)]),
|
|
('? * ?', [(1, 0)]),
|
|
('1 + * * 2', [(1, 4)]),
|
|
('?\n1\n?', [(1, 0), (3, 0)]),
|
|
]
|
|
)
|
|
def test_syntax_errors(code, positions):
|
|
assert_comparison(code, 901, positions)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
('code', 'positions'), [
|
|
(' 1', [(1, 0)]),
|
|
('def x():\n 1\n 2', [(3, 0)]),
|
|
('def x():\n 1\n 2', [(3, 0)]),
|
|
]
|
|
)
|
|
def test_indentation_errors(code, positions):
|
|
assert_comparison(code, 903, positions)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'code', [
|
|
' foo',
|
|
'def x():\n 1\n 2',
|
|
'def x():\n 1\n 2',
|
|
]
|
|
)
|
|
def test_python_exception_matches(code):
|
|
error, = _get_error_list(code)
|
|
try:
|
|
ast.parse(code)
|
|
except (SyntaxError, IndentationError) as e:
|
|
wanted = e.__class__.__name__ + ': ' + e.msg
|
|
else:
|
|
assert False, "The piece of code should raise an exception."
|
|
assert wanted == error.message
|