@@ -81,10 +81,10 @@ impl VitestFramework {
8181 }
8282}
8383
84- /// Convert a test name (after file prefix) to vitest's space-separated format.
84+ /// Convert ` > ` separators to spaces to match vitest's internal name format.
8585///
86- /// `vitest list --json` joins describe/test names with ` > `, but vitest's
87- /// `--testNamePattern` matches against names joined with spaces.
86+ /// `vitest list --json` returns names with ` > ` between describe/test titles,
87+ /// but `--testNamePattern` matches against names joined with spaces.
8888fn to_vitest_match_name ( name : & str ) -> String {
8989 name. replace ( " > " , " " )
9090}
@@ -114,11 +114,11 @@ fn check_unique_test_names(tests: &[TestRecord]) -> FrameworkResult<()> {
114114 let mut sorted = duplicates;
115115 sorted. sort_unstable ( ) ;
116116 return Err ( FrameworkError :: DiscoveryFailed ( format ! (
117- "Duplicate test names found (after converting ` > ` to spaces ): {}\n \
118- Vitest --testNamePattern matches by the space-joined full name, so it \
119- cannot distinguish tests that produce the same pattern. To fix this, \
120- rename the duplicate test() or it() calls, or move them into uniquely \
121- named describe() blocks so the full name differs.",
117+ "Duplicate test names found (space-separated ): {}\n \
118+ Vitest --testNamePattern matches by the space-joined describe chain + \
119+ test name, so it cannot distinguish tests that produce the same pattern. \
120+ To fix this, rename the duplicate test()/ it() calls, or wrap them in \
121+ uniquely named describe() blocks so the full name differs.",
122122 sorted. join( ", " )
123123 ) ) ) ;
124124 }
@@ -230,18 +230,15 @@ impl TestFramework for VitestFramework {
230230 cmd = cmd. arg ( "run" ) ;
231231
232232 // Split each test ID at the first ` > ` to get file and name parts.
233- // Vitest's --testNamePattern matches against the full test name where
234- // describe/suite names are joined with spaces (not ` > `), so we
235- // convert ` > ` separators to spaces before regex-escaping.
233+ // Convert ` > ` to spaces since vitest's --testNamePattern matches
234+ // against space-separated describe chain + test title.
236235 let mut selectors: Vec < & str > = Vec :: new ( ) ;
237236 let mut escaped_names: Vec < String > = Vec :: new ( ) ;
238237 for t in tests {
239238 if let Some ( ( file, name) ) = t. id ( ) . split_once ( " > " ) {
240239 selectors. push ( file) ;
241- let space_separated = name. replace ( " > " , " " ) ;
242- escaped_names. push ( regex:: escape ( & space_separated) ) ;
240+ escaped_names. push ( regex:: escape ( & to_vitest_match_name ( name) ) ) ;
243241 } else {
244- // Fallback: use the whole ID as a file selector only.
245242 selectors. push ( t. id ( ) ) ;
246243 }
247244 }
@@ -509,7 +506,7 @@ mod tests {
509506 let pattern = & cmd. args [ tnp_idx + 1 ] ;
510507 assert ! ( pattern. starts_with( "^(" ) ) ;
511508 assert ! ( pattern. ends_with( ")$" ) ) ;
512- // ` > ` separators replaced with spaces for vitest matching
509+ // ` > ` converted to spaces for vitest matching
513510 assert ! (
514511 pattern. contains( "math add adds two positive numbers" ) ,
515512 "should have space-separated name. Got: {}" ,
@@ -525,12 +522,6 @@ mod tests {
525522 "should have space-separated name. Got: {}" ,
526523 pattern
527524 ) ;
528- // Should NOT contain ` > ` separators
529- assert ! (
530- !pattern. contains( " > " ) ,
531- "should not contain > separators. Got: {}" ,
532- pattern
533- ) ;
534525 // Names are separated by |
535526 assert ! ( pattern. contains( '|' ) ) ;
536527
@@ -605,7 +596,6 @@ mod tests {
605596
606597 let result = check_unique_test_names ( & tests) ;
607598 assert ! ( result. is_err( ) ) ;
608- // Error message uses space-separated form
609599 let msg = result. unwrap_err ( ) . to_string ( ) ;
610600 assert ! (
611601 msg. contains( "suite duplicate name" ) ,
0 commit comments