@@ -93,22 +93,49 @@ impl Harness<StateParsed> {
93
93
mut self ,
94
94
cases : impl IntoIterator < Item = impl Case + ' static > ,
95
95
) -> std:: io:: Result < Harness < StateDiscovered > > {
96
- let mut cases = cases
97
- . into_iter ( )
98
- . map ( |c| Box :: new ( c) as Box < dyn Case > )
99
- . collect ( ) ;
100
- discover (
101
- & self . state . start ,
102
- & self . state . opts ,
103
- & mut cases,
104
- self . state . notifier . as_mut ( ) ,
96
+ self . state . notifier . notify (
97
+ notify:: event:: DiscoverStart {
98
+ elapsed_s : Some ( notify:: Elapsed ( self . state . start . elapsed ( ) ) ) ,
99
+ }
100
+ . into ( ) ,
101
+ ) ?;
102
+
103
+ let mut selected_cases = Vec :: new ( ) ;
104
+ for case in cases {
105
+ let selected = case_priority ( & case, & self . state . opts ) . is_some ( ) ;
106
+ self . state . notifier . notify (
107
+ notify:: event:: DiscoverCase {
108
+ name : case. name ( ) . to_owned ( ) ,
109
+ mode : RunMode :: Test ,
110
+ selected,
111
+ elapsed_s : Some ( notify:: Elapsed ( self . state . start . elapsed ( ) ) ) ,
112
+ }
113
+ . into ( ) ,
114
+ ) ?;
115
+ if selected {
116
+ selected_cases. push ( Box :: new ( case) as Box < dyn Case > ) ;
117
+ }
118
+ }
119
+
120
+ selected_cases. sort_unstable_by_key ( |case| {
121
+ let priority = case_priority ( case. as_ref ( ) , & self . state . opts ) ;
122
+ let name = case. name ( ) . to_owned ( ) ;
123
+ ( priority, name)
124
+ } ) ;
125
+
126
+ self . state . notifier . notify (
127
+ notify:: event:: DiscoverComplete {
128
+ elapsed_s : Some ( notify:: Elapsed ( self . state . start . elapsed ( ) ) ) ,
129
+ }
130
+ . into ( ) ,
105
131
) ?;
132
+
106
133
Ok ( Harness {
107
134
state : StateDiscovered {
108
135
start : self . state . start ,
109
136
opts : self . state . opts ,
110
137
notifier : self . state . notifier ,
111
- cases,
138
+ cases : selected_cases ,
112
139
} ,
113
140
} )
114
141
}
@@ -238,73 +265,27 @@ fn notifier(opts: &libtest_lexarg::TestOpts) -> Box<dyn notify::Notifier> {
238
265
}
239
266
}
240
267
241
- fn discover (
242
- start : & std:: time:: Instant ,
243
- opts : & libtest_lexarg:: TestOpts ,
244
- cases : & mut Vec < Box < dyn Case > > ,
245
- notifier : & mut dyn notify:: Notifier ,
246
- ) -> std:: io:: Result < ( ) > {
247
- notifier. notify (
248
- notify:: event:: DiscoverStart {
249
- elapsed_s : Some ( notify:: Elapsed ( start. elapsed ( ) ) ) ,
250
- }
251
- . into ( ) ,
252
- ) ?;
253
-
254
- let matches_filter = |case : & dyn Case , filter : & str | {
255
- let test_name = case. name ( ) ;
256
-
257
- match opts. filter_exact {
258
- true => test_name == filter,
259
- false => test_name. contains ( filter) ,
260
- }
261
- } ;
262
-
263
- // Do this first so it applies to both discover and running
264
- cases. sort_unstable_by_key ( |case| {
265
- let priority = if opts. filters . is_empty ( ) {
266
- Some ( 0 )
267
- } else {
268
- opts. filters
269
- . iter ( )
270
- . position ( |filter| matches_filter ( case. as_ref ( ) , filter) )
271
- } ;
272
- let name = case. name ( ) . to_owned ( ) ;
273
- ( priority, name)
274
- } ) ;
275
-
276
- let mut retain_cases = Vec :: with_capacity ( cases. len ( ) ) ;
277
- for case in cases. iter ( ) {
278
- let filtered_in = opts. filters . is_empty ( )
279
- || opts
280
- . filters
281
- . iter ( )
282
- . any ( |filter| matches_filter ( case. as_ref ( ) , filter) ) ;
283
- let filtered_out =
284
- !opts. skip . is_empty ( ) && opts. skip . iter ( ) . any ( |sf| matches_filter ( case. as_ref ( ) , sf) ) ;
285
- let retain_case = filtered_in && !filtered_out;
286
- retain_cases. push ( retain_case) ;
287
- notifier. notify (
288
- notify:: event:: DiscoverCase {
289
- name : case. name ( ) . to_owned ( ) ,
290
- mode : RunMode :: Test ,
291
- selected : retain_case,
292
- elapsed_s : Some ( notify:: Elapsed ( start. elapsed ( ) ) ) ,
293
- }
294
- . into ( ) ,
295
- ) ?;
268
+ fn case_priority ( case : & dyn Case , opts : & libtest_lexarg:: TestOpts ) -> Option < usize > {
269
+ let filtered_out =
270
+ !opts. skip . is_empty ( ) && opts. skip . iter ( ) . any ( |sf| matches_filter ( case, sf, opts) ) ;
271
+ if filtered_out {
272
+ None
273
+ } else if opts. filters . is_empty ( ) {
274
+ Some ( 0 )
275
+ } else {
276
+ opts. filters
277
+ . iter ( )
278
+ . position ( |filter| matches_filter ( case, filter, opts) )
296
279
}
297
- let mut retain_cases = retain_cases. into_iter ( ) ;
298
- cases. retain ( |_| retain_cases. next ( ) . unwrap ( ) ) ;
280
+ }
299
281
300
- notifier. notify (
301
- notify:: event:: DiscoverComplete {
302
- elapsed_s : Some ( notify:: Elapsed ( start. elapsed ( ) ) ) ,
303
- }
304
- . into ( ) ,
305
- ) ?;
282
+ fn matches_filter ( case : & dyn Case , filter : & str , opts : & libtest_lexarg:: TestOpts ) -> bool {
283
+ let test_name = case. name ( ) ;
306
284
307
- Ok ( ( ) )
285
+ match opts. filter_exact {
286
+ true => test_name == filter,
287
+ false => test_name. contains ( filter) ,
288
+ }
308
289
}
309
290
310
291
fn run (
0 commit comments