@@ -93,22 +93,49 @@ impl Harness<StateParsed> {
9393 mut self ,
9494 cases : impl IntoIterator < Item = impl Case + ' static > ,
9595 ) -> 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 ( ) ,
105131 ) ?;
132+
106133 Ok ( Harness {
107134 state : StateDiscovered {
108135 start : self . state . start ,
109136 opts : self . state . opts ,
110137 notifier : self . state . notifier ,
111- cases,
138+ cases : selected_cases ,
112139 } ,
113140 } )
114141 }
@@ -238,73 +265,27 @@ fn notifier(opts: &libtest_lexarg::TestOpts) -> Box<dyn notify::Notifier> {
238265 }
239266}
240267
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) )
296279 }
297- let mut retain_cases = retain_cases. into_iter ( ) ;
298- cases. retain ( |_| retain_cases. next ( ) . unwrap ( ) ) ;
280+ }
299281
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 ( ) ;
306284
307- Ok ( ( ) )
285+ match opts. filter_exact {
286+ true => test_name == filter,
287+ false => test_name. contains ( filter) ,
288+ }
308289}
309290
310291fn run (
0 commit comments