""" 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