mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-06 12:54:29 +08:00
The fuzzer now tries to reuse previous modfiications as well sometimes
This commit is contained in:
@@ -102,9 +102,17 @@ class LineCopy:
|
|||||||
|
|
||||||
class FileModification:
|
class FileModification:
|
||||||
@classmethod
|
@classmethod
|
||||||
def generate(cls, code_lines, change_count):
|
def generate(cls, code_lines, change_count, previous_file_modification=None):
|
||||||
|
if previous_file_modification is not None and random.random() > 0.5:
|
||||||
|
# We want to keep the previous modifications in some cases to make
|
||||||
|
# more complex parser issues visible.
|
||||||
|
code_lines = previous_file_modification.apply(code_lines)
|
||||||
|
added_modifications = previous_file_modification.modification_list
|
||||||
|
else:
|
||||||
|
added_modifications = []
|
||||||
return cls(
|
return cls(
|
||||||
list(cls._generate_line_modifications(code_lines, change_count)),
|
added_modifications
|
||||||
|
+ list(cls._generate_line_modifications(code_lines, change_count)),
|
||||||
# work with changed trees more than with normal ones.
|
# work with changed trees more than with normal ones.
|
||||||
check_original=random.random() > 0.8,
|
check_original=random.random() > 0.8,
|
||||||
)
|
)
|
||||||
@@ -158,18 +166,18 @@ class FileModification:
|
|||||||
yield l
|
yield l
|
||||||
|
|
||||||
def __init__(self, modification_list, check_original):
|
def __init__(self, modification_list, check_original):
|
||||||
self._modification_list = modification_list
|
self.modification_list = modification_list
|
||||||
self._check_original = check_original
|
self._check_original = check_original
|
||||||
|
|
||||||
def _apply(self, code_lines):
|
def apply(self, code_lines):
|
||||||
changed_lines = list(code_lines)
|
changed_lines = list(code_lines)
|
||||||
for modification in self._modification_list:
|
for modification in self.modification_list:
|
||||||
modification.apply(changed_lines)
|
modification.apply(changed_lines)
|
||||||
return changed_lines
|
return changed_lines
|
||||||
|
|
||||||
def run(self, grammar, code_lines, print_code):
|
def run(self, grammar, code_lines, print_code):
|
||||||
code = ''.join(code_lines)
|
code = ''.join(code_lines)
|
||||||
modified_lines = self._apply(code_lines)
|
modified_lines = self.apply(code_lines)
|
||||||
modified_code = ''.join(modified_lines)
|
modified_code = ''.join(modified_lines)
|
||||||
|
|
||||||
if print_code:
|
if print_code:
|
||||||
@@ -228,8 +236,12 @@ class FileTests:
|
|||||||
|
|
||||||
def run(self, grammar, debugger):
|
def run(self, grammar, debugger):
|
||||||
def iterate():
|
def iterate():
|
||||||
|
fm = None
|
||||||
for _ in range(self._test_count):
|
for _ in range(self._test_count):
|
||||||
fm = FileModification.generate(self._code_lines, self._change_count)
|
fm = FileModification.generate(
|
||||||
|
self._code_lines, self._change_count,
|
||||||
|
previous_file_modification=fm
|
||||||
|
)
|
||||||
self._file_modifications.append(fm)
|
self._file_modifications.append(fm)
|
||||||
yield fm
|
yield fm
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user