test preview cases with line-length 1 unless explicitly skipped (#4087)

* Add new flag for tests, --no-preview-line-length-1, to be used for test cases known to not work in preview mode with line-length=1. Also split out the problematic cases in three cases to separate files. Removed now redundant file which explicitly tested preview annotations with line-length=1

* mode.preview -> preview_mode, mark pep_572_remove_parens as failing with ll1
This commit is contained in:
John Litborn 2023-12-06 16:17:33 +01:00 committed by GitHub
parent 50d5756e8e
commit e4ae213f06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 154 additions and 127 deletions

View File

@ -0,0 +1,3 @@
# flags: --no-preview-line-length-1
# split out from comments2 as it does not work with line-length=1, losing the comment
a = "type comment with trailing space" # type: str

View File

@ -155,8 +155,6 @@ def _init_host(self, parsed) -> None:
pass
a = "type comment with trailing space" # type: str
#######################
### SECTION COMMENT ###
#######################
@ -335,8 +333,6 @@ def _init_host(self, parsed) -> None:
pass
a = "type comment with trailing space" # type: str
#######################
### SECTION COMMENT ###
#######################

View File

@ -1,9 +1,12 @@
# flags: --no-preview-line-length-1
# l2 loses the comment with line-length=1 in preview mode
l1 = ["This list should be broken up", "into multiple lines", "because it is way too long"]
l2 = ["But this list shouldn't", "even though it also has", "way too many characters in it"] # fmt: skip
l3 = ["I have", "trailing comma", "so I should be braked",]
# output
# l2 loses the comment with line-length=1 in preview mode
l1 = [
"This list should be broken up",
"into multiple lines",
@ -14,4 +17,4 @@
"I have",
"trailing comma",
"so I should be braked",
]
]

View File

@ -1,4 +1,4 @@
# flags: --minimum-version=3.8
# flags: --minimum-version=3.8 --no-preview-line-length-1
if (foo := 0):
pass

View File

@ -125,23 +125,6 @@ def foo_square_brackets(request):
func([x for x in "long line long line long line long line long line long line long line"])
func([x for x in [x for x in "long line long line long line long line long line long line long line"]])
func({"short line"})
func({"long line", "long long line", "long long long line", "long long long long line", "long long long long long line"})
func({{"long line", "long long line", "long long long line", "long long long long line", "long long long long long line"}})
func(("long line", "long long line", "long long long line", "long long long long line", "long long long long long line"))
func((("long line", "long long line", "long long long line", "long long long long line", "long long long long long line")))
func([["long line", "long long line", "long long long line", "long long long long line", "long long long long long line"]])
# Do not hug if the argument fits on a single line.
func({"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"})
func(("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"))
func(["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"])
func(**{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit---"})
func(*("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit----"))
array = [{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"}]
array = [("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line")]
array = [["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"]]
foooooooooooooooooooo(
[{c: n + 1 for c in range(256)} for n in range(100)] + [{}], {size}
)
@ -151,14 +134,11 @@ def foo_square_brackets(request):
)
nested_mapping = {"key": [{"a very long key 1": "with a very long value", "a very long key 2": "with a very long value"}]}
nested_array = [[["long line", "long long line", "long long long line", "long long long long line", "long long long long long line"]]]
explicit_exploding = [[["short", "line",],],]
single_item_do_not_explode = Context({
"version": get_docs_version(),
})
foo(*["long long long long long line", "long long long long long line", "long long long long long line"])
foo(*[str(i) for i in range(100000000000000000000000000000000000000000000000000000000000)])
foo(
@ -310,69 +290,6 @@ def foo_square_brackets(request):
]
])
func({"short line"})
func({
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
})
func({{
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
}})
func((
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
))
func(((
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
)))
func([[
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
]])
# Do not hug if the argument fits on a single line.
func(
{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"}
)
func(
("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line")
)
func(
["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"]
)
func(
**{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit---"}
)
func(
*("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit----")
)
array = [
{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"}
]
array = [
("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line")
]
array = [
["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"]
]
foooooooooooooooooooo(
[{c: n + 1 for c in range(256)} for n in range(100)] + [{}], {size}
)
@ -387,13 +304,6 @@ def foo_square_brackets(request):
"a very long key 2": "with a very long value",
}]
}
nested_array = [[[
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
]]]
explicit_exploding = [
[
[
@ -406,12 +316,6 @@ def foo_square_brackets(request):
"version": get_docs_version(),
})
foo(*[
"long long long long long line",
"long long long long long line",
"long long long long long line",
])
foo(*[
str(i) for i in range(100000000000000000000000000000000000000000000000000000000000)
])

View File

@ -0,0 +1,106 @@
# flags: --preview --no-preview-line-length-1
# split out from preview_hug_parens_with_brackes_and_square_brackets, as it produces
# different code on the second pass with line-length 1 in many cases.
# Seems to be about whether the last string in a sequence gets wrapped in parens or not.
foo(*["long long long long long line", "long long long long long line", "long long long long long line"])
func({"short line"})
func({"long line", "long long line", "long long long line", "long long long long line", "long long long long long line"})
func({{"long line", "long long line", "long long long line", "long long long long line", "long long long long long line"}})
func(("long line", "long long line", "long long long line", "long long long long line", "long long long long long line"))
func((("long line", "long long line", "long long long line", "long long long long line", "long long long long long line")))
func([["long line", "long long line", "long long long line", "long long long long line", "long long long long long line"]])
# Do not hug if the argument fits on a single line.
func({"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"})
func(("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"))
func(["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"])
func(**{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit---"})
func(*("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit----"))
array = [{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"}]
array = [("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line")]
array = [["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"]]
nested_array = [[["long line", "long long line", "long long long line", "long long long long line", "long long long long long line"]]]
# output
# split out from preview_hug_parens_with_brackes_and_square_brackets, as it produces
# different code on the second pass with line-length 1 in many cases.
# Seems to be about whether the last string in a sequence gets wrapped in parens or not.
foo(*[
"long long long long long line",
"long long long long long line",
"long long long long long line",
])
func({"short line"})
func({
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
})
func({{
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
}})
func((
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
))
func(((
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
)))
func([[
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
]])
# Do not hug if the argument fits on a single line.
func(
{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"}
)
func(
("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line")
)
func(
["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"]
)
func(
**{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit---"}
)
func(
*("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit----")
)
array = [
{"fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"}
]
array = [
("fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line")
]
array = [
["fit line", "fit line", "fit line", "fit line", "fit line", "fit line", "fit line"]
]
nested_array = [[[
"long line",
"long long line",
"long long long line",
"long long long long line",
"long long long long long line",
]]]

View File

@ -1,9 +0,0 @@
# flags: --preview --minimum-version=3.10 --line-length=1
def foo() -> tuple[int, int,]:
...
# output
def foo() -> tuple[
int,
int,
]: ...

View File

@ -30,6 +30,7 @@ def check_file(subdir: str, filename: str, *, data: bool = True) -> None:
fast=args.fast,
minimum_version=args.minimum_version,
lines=args.lines,
no_preview_line_length_1=args.no_preview_line_length_1,
)
if args.minimum_version is not None:
major, minor = args.minimum_version
@ -42,6 +43,7 @@ def check_file(subdir: str, filename: str, *, data: bool = True) -> None:
fast=args.fast,
minimum_version=args.minimum_version,
lines=args.lines,
no_preview_line_length_1=args.no_preview_line_length_1,
)

View File

@ -46,6 +46,7 @@ class TestCaseArgs:
fast: bool = False
minimum_version: Optional[Tuple[int, int]] = None
lines: Collection[Tuple[int, int]] = ()
no_preview_line_length_1: bool = False
def _assert_format_equal(expected: str, actual: str) -> None:
@ -96,6 +97,7 @@ def assert_format(
fast: bool = False,
minimum_version: Optional[Tuple[int, int]] = None,
lines: Collection[Tuple[int, int]] = (),
no_preview_line_length_1: bool = False,
) -> None:
"""Convenience function to check that Black formats as expected.
@ -124,21 +126,28 @@ def assert_format(
f"Black crashed formatting this case in {text} mode."
) from e
# Similarly, setting line length to 1 is a good way to catch
# stability bugs. But only in non-preview mode because preview mode
# currently has a lot of line length 1 bugs.
try:
_assert_format_inner(
source,
None,
replace(mode, preview=False, line_length=1),
fast=fast,
minimum_version=minimum_version,
lines=lines,
)
except Exception as e:
raise FormatFailure(
"Black crashed formatting this case with line-length set to 1."
) from e
# stability bugs. Some tests are known to be broken in preview mode with line length
# of 1 though, and have marked that with a flag --no-preview-line-length-1
preview_modes = [False]
if not no_preview_line_length_1:
preview_modes.append(True)
for preview_mode in preview_modes:
try:
_assert_format_inner(
source,
None,
replace(mode, preview=preview_mode, line_length=1),
fast=fast,
minimum_version=minimum_version,
lines=lines,
)
except Exception as e:
text = "preview" if preview_mode else "non-preview"
raise FormatFailure(
f"Black crashed formatting this case in {text} mode with line-length=1."
) from e
def _assert_format_inner(
@ -246,6 +255,15 @@ def get_flags_parser() -> argparse.ArgumentParser:
),
)
parser.add_argument("--line-ranges", action="append")
parser.add_argument(
"--no-preview-line-length-1",
default=False,
action="store_true",
help=(
"Don't run in preview mode with --line-length=1, as that's known to cause a"
" crash"
),
)
return parser
@ -266,7 +284,11 @@ def parse_mode(flags_line: str) -> TestCaseArgs:
else:
lines = []
return TestCaseArgs(
mode=mode, fast=args.fast, minimum_version=args.minimum_version, lines=lines
mode=mode,
fast=args.fast,
minimum_version=args.minimum_version,
lines=lines,
no_preview_line_length_1=args.no_preview_line_length_1,
)