@@ -189,10 +189,15 @@ def parse_test_case(case: DataDrivenTestCase) -> None:
189
189
elif item .id == "triggered" and item .arg is None :
190
190
triggered = item .data
191
191
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
+ )
193
196
194
197
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
+ )
196
201
197
202
for passnum in stale_modules .keys ():
198
203
if passnum not in rechecked_modules :
@@ -220,7 +225,7 @@ def parse_test_case(case: DataDrivenTestCase) -> None:
220
225
for file , _ in files :
221
226
if file in seen_files :
222
227
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"
224
229
" it multiple times?"
225
230
)
226
231
@@ -634,6 +639,16 @@ def pytest_pycollect_makeitem(collector: Any, name: str, obj: object) -> Any | N
634
639
return None
635
640
636
641
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
+
637
652
def split_test_cases (
638
653
parent : DataFileCollector , suite : DataSuite , file : str
639
654
) -> Iterator [DataDrivenTestCase ]:
@@ -644,40 +659,33 @@ def split_test_cases(
644
659
"""
645
660
with open (file , encoding = "utf-8" ) as f :
646
661
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
661
665
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" )
664
673
if name in test_names :
665
674
raise RuntimeError (
666
675
'Found a duplicate test name "{}" in {} on line {}' .format (
667
676
name , parent .name , line_no
668
677
)
669
678
)
670
- platform = platform_flag [1 :] if platform_flag else None
671
679
yield DataDrivenTestCase .from_parent (
672
680
parent = parent ,
673
681
suite = suite ,
674
682
file = file ,
675
683
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" ) ),
681
689
data = data ,
682
690
line = line_no ,
683
691
)
0 commit comments