From 38b7763e9a613950bebab89505d77161902960fd Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 28 Mar 2020 14:51:27 +0100 Subject: [PATCH] Use _assert_nodes_are_equal in the fuzzer --- parso/grammar.py | 2 +- parso/python/diff.py | 28 +++++++++++++++++++++++++++- test/test_diff_parser.py | 22 +--------------------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/parso/grammar.py b/parso/grammar.py index 647793e..8e7b196 100644 --- a/parso/grammar.py +++ b/parso/grammar.py @@ -215,7 +215,7 @@ class PythonGrammar(Grammar): ) self.version_info = version_info - def _tokenize_lines(self, lines, start_pos): + def _tokenize_lines(self, lines, start_pos=(1, 0)): return tokenize_lines(lines, self.version_info, start_pos=start_pos) def _tokenize(self, code): diff --git a/parso/python/diff.py b/parso/python/diff.py index 400e9aa..bf84cbc 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -78,6 +78,26 @@ def _assert_valid_graph(node): _assert_valid_graph(child) +def _assert_nodes_are_equal(node1, node2): + try: + children1 = node1.children + except AttributeError: + assert not hasattr(node2, 'children'), (node1, node2) + assert node1.value == node2.value + assert node1.type == node2.type + assert node1.prefix == node2.prefix + assert node1.start_pos == node2.start_pos + return + else: + try: + children2 = node2.children + except AttributeError: + assert False, (node1, node2) + assert len(children1) == len(children2) + for n1, n2 in zip(children1, children2): + _assert_nodes_are_equal(n1, n2) + + def _get_debug_error_message(module, old_lines, new_lines): current_lines = split_lines(module.get_code(), keepends=True) current_diff = difflib.unified_diff(new_lines, current_lines) @@ -249,8 +269,14 @@ class DiffParser(object): # If there is reasonable suspicion that the diff parser is not # behaving well, this should be enabled. try: - assert self._module.get_code() == ''.join(new_lines) + code = ''.join(new_lines) + assert self._module.get_code() == code _assert_valid_graph(self._module) + without_diff_parser_module = Parser( + self._pgen_grammar, + error_recovery=True + ).parse(self._tokenizer(new_lines)) + _assert_nodes_are_equal(self._module, without_diff_parser_module) except AssertionError: print(_get_debug_error_message(self._module, old_lines, new_lines)) raise diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index b7f5a5c..a1aabe0 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -8,7 +8,7 @@ import pytest from parso.utils import split_lines from parso import cache from parso import load_grammar -from parso.python.diff import DiffParser, _assert_valid_graph +from parso.python.diff import DiffParser, _assert_valid_graph, _assert_nodes_are_equal from parso import parse ANY = object() @@ -39,26 +39,6 @@ def _check_error_leaves_nodes(node): return None -def _assert_nodes_are_equal(node1, node2): - try: - children1 = node1.children - except AttributeError: - assert not hasattr(node2, 'children'), (node1, node2) - assert node1.value == node2.value - assert node1.type == node2.type - assert node1.prefix == node2.prefix - assert node1.start_pos == node2.start_pos - return - else: - try: - children2 = node2.children - except AttributeError: - assert False, (node1, node2) - assert len(children1) == len(children2) - for n1, n2 in zip(children1, children2): - _assert_nodes_are_equal(n1, n2) - - class Differ(object): grammar = load_grammar()