X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/0c6d4ca0c33aa97202e0e94a4a2389cc432597bc..07a2e6f67810a8949b76a26c434c91d3fda7ac24:/fuzz.py?ds=sidebyside

diff --git a/fuzz.py b/fuzz.py
index 604e6ce..f5f655e 100644
--- a/fuzz.py
+++ b/fuzz.py
@@ -5,10 +5,13 @@ generation.  You can run this file with `python`, `pytest`, or (soon)
 a coverage-guided fuzzer I'm working on.
 """
 
+import re
+
 import hypothesmith
 from hypothesis import HealthCheck, given, settings, strategies as st
 
 import black
+from blib2to3.pgen2.tokenize import TokenError
 
 
 # This test uses the Hypothesis and Hypothesmith libraries to generate random
@@ -29,7 +32,9 @@ import black
         black.FileMode,
         line_length=st.just(88) | st.integers(0, 200),
         string_normalization=st.booleans(),
+        preview=st.booleans(),
         is_pyi=st.booleans(),
+        magic_trailing_comma=st.booleans(),
     ),
 )
 def test_idempotent_any_syntatically_valid_python(
@@ -43,9 +48,19 @@ def test_idempotent_any_syntatically_valid_python(
         dst_contents = black.format_str(src_contents, mode=mode)
     except black.InvalidInput:
         # This is a bug - if it's valid Python code, as above, Black should be
-        # able to cope with it.  See issues #970, #1012, #1358, and #1557.
+        # able to cope with it.  See issues #970, #1012
         # TODO: remove this try-except block when issues are resolved.
         return
+    except TokenError as e:
+        if (  # Special-case logic for backslashes followed by newlines or end-of-input
+            e.args[0] == "EOF in multi-line statement"
+            and re.search(r"\\($|\r?\n)", src_contents) is not None
+        ):
+            # This is a bug - if it's valid Python code, as above, Black should be
+            # able to cope with it.  See issue #1012.
+            # TODO: remove this block when the issue is resolved.
+            return
+        raise
 
     # And check that we got equivalent and stable output.
     black.assert_equivalent(src_contents, dst_contents)
@@ -56,4 +71,17 @@ def test_idempotent_any_syntatically_valid_python(
 
 
 if __name__ == "__main__":
+    # Run tests, including shrinking and reporting any known failures.
     test_idempotent_any_syntatically_valid_python()
+
+    # If Atheris is available, run coverage-guided fuzzing.
+    # (if you want only bounded fuzzing, just use `pytest fuzz.py`)
+    try:
+        import sys
+        import atheris
+    except ImportError:
+        pass
+    else:
+        test = test_idempotent_any_syntatically_valid_python
+        atheris.Setup(sys.argv, test.hypothesis.fuzz_one_input)
+        atheris.Fuzz()