Skip to content

Commit cbf5f72

Browse files
committed
Fix testcase parsing gotchas
1 parent 66bd2c4 commit cbf5f72

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

mypy/test/data.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,15 @@ def parse_test_case(case: DataDrivenTestCase) -> None:
189189
elif item.id == "triggered" and item.arg is None:
190190
triggered = item.data
191191
else:
192-
raise ValueError(f"Invalid section header {item.id} in {case.file}:{item.line}")
192+
section = item.id + (f" {item.arg}" if item.arg else "")
193+
raise ValueError(
194+
f"{case.file}:{case.line + item.line - 2}: Invalid section header [{section}] in case {case.name!r}"
195+
)
193196

194197
if out_section_missing:
195-
raise ValueError(f"{case.file}, line {first_item.line}: Required output section not found")
198+
raise ValueError(
199+
f"{case.file}:{case.line}: Required output section not found in case {case.name!r}"
200+
)
196201

197202
for passnum in stale_modules.keys():
198203
if passnum not in rechecked_modules:
@@ -220,7 +225,7 @@ def parse_test_case(case: DataDrivenTestCase) -> None:
220225
for file, _ in files:
221226
if file in seen_files:
222227
raise ValueError(
223-
f"{case.file}, line {first_item.line}: Duplicated filename {file}. Did you include"
228+
f"{case.file}:{case.line}: Duplicated filename {file}. Did you include"
224229
" it multiple times?"
225230
)
226231

@@ -634,6 +639,16 @@ def pytest_pycollect_makeitem(collector: Any, name: str, obj: object) -> Any | N
634639
return None
635640

636641

642+
_case_name_pattern = re.compile(
643+
r"(?P<name>[a-zA-Z_0-9]+)"
644+
r"(?P<writescache>-writescache)?"
645+
r"(?P<only_when>-only_when_cache|-only_when_nocache)?"
646+
r"(-(?P<platform>posix|windows))?"
647+
r"(?P<skip>-skip)?"
648+
r"(?P<xfail>-xfail)?"
649+
)
650+
651+
637652
def split_test_cases(
638653
parent: DataFileCollector, suite: DataSuite, file: str
639654
) -> Iterator[DataDrivenTestCase]:
@@ -644,40 +659,33 @@ def split_test_cases(
644659
"""
645660
with open(file, encoding="utf-8") as f:
646661
data = f.read()
647-
# number of groups in the below regex
648-
NUM_GROUPS = 7
649-
cases = re.split(
650-
r"^\[case ([a-zA-Z_0-9]+)"
651-
r"(-writescache)?"
652-
r"(-only_when_cache|-only_when_nocache)?"
653-
r"(-posix|-windows)?"
654-
r"(-skip)?"
655-
r"(-xfail)?"
656-
r"\][ \t]*$\n",
657-
data,
658-
flags=re.DOTALL | re.MULTILINE,
659-
)
660-
line_no = cases[0].count("\n") + 1
662+
cases = re.split(r"^\[case ([^]+)]+)\][ \t]*$\n", data, flags=re.DOTALL | re.MULTILINE)
663+
cases_iter = iter(cases)
664+
line_no = next(cases).count("\n") + 1
661665
test_names = set()
662-
for i in range(1, len(cases), NUM_GROUPS):
663-
name, writescache, only_when, platform_flag, skip, xfail, data = cases[i : i + NUM_GROUPS]
666+
for case_id in cases_iter:
667+
data = next(cases_iter)
668+
669+
m = _case_name_pattern.match(case_id)
670+
if not m:
671+
raise RuntimeError(f"Invalid testcase id {case_id!r}")
672+
name = m.group("name")
664673
if name in test_names:
665674
raise RuntimeError(
666675
'Found a duplicate test name "{}" in {} on line {}'.format(
667676
name, parent.name, line_no
668677
)
669678
)
670-
platform = platform_flag[1:] if platform_flag else None
671679
yield DataDrivenTestCase.from_parent(
672680
parent=parent,
673681
suite=suite,
674682
file=file,
675683
name=add_test_name_suffix(name, suite.test_name_suffix),
676-
writescache=bool(writescache),
677-
only_when=only_when,
678-
platform=platform,
679-
skip=bool(skip),
680-
xfail=bool(xfail),
684+
writescache=bool(m.group("writescache")),
685+
only_when=m.group("only_when"),
686+
platform=m.group("platform"),
687+
skip=bool(m.group("skip")),
688+
xfail=bool(m.group("xfail")),
681689
data=data,
682690
line=line_no,
683691
)

0 commit comments

Comments
 (0)