@@ -253,58 +253,62 @@ impl<'a> ContractRunner<'a> {
253
253
)
254
254
}
255
255
256
- let functions: Vec < _ > = self . contract . functions ( ) . collect ( ) ;
257
- let mut test_results = functions
258
- . par_iter ( )
259
- . filter ( |& & func| func. is_test ( ) && filter. matches_test ( & func. signature ( ) ) )
260
- . map ( |& func| {
261
- let should_fail = func. is_test_fail ( ) ;
262
- let res = if func. is_fuzz_test ( ) {
263
- let runner = test_options. fuzz_runner ( self . name , & func. name ) ;
264
- let fuzz_config = test_options. fuzz_config ( self . name , & func. name ) ;
265
- self . run_fuzz_test ( func, should_fail, runner, setup. clone ( ) , * fuzz_config)
266
- } else {
267
- self . run_test ( func, should_fail, setup. clone ( ) )
268
- } ;
269
- ( func. signature ( ) , res)
270
- } )
271
- . collect :: < BTreeMap < _ , _ > > ( ) ;
256
+ // Filter out functions sequentially since it's very fast and there is no need to do it
257
+ // in parallel.
258
+ let find_timer = Instant :: now ( ) ;
259
+ let functions = self
260
+ . contract
261
+ . functions ( )
262
+ . filter ( |func| func. is_test ( ) || func. is_invariant_test ( ) )
263
+ . map ( |func| ( func. signature ( ) , func) )
264
+ . filter ( |( sig, _func) | filter. matches_test ( sig) )
265
+ . collect :: < Vec < _ > > ( ) ;
266
+ let find_time = find_timer. elapsed ( ) ;
267
+ debug ! (
268
+ "Found {} test functions out of {} in {:?}" ,
269
+ functions. len( ) ,
270
+ self . contract. functions( ) . count( ) ,
271
+ find_time,
272
+ ) ;
272
273
273
- if has_invariants {
274
- let identified_contracts = load_contracts ( setup. traces . clone ( ) , known_contracts) ;
275
- let results: Vec < _ > = functions
276
- . par_iter ( )
277
- . filter ( |& & func| func. is_invariant_test ( ) && filter. matches_test ( & func. signature ( ) ) )
278
- . map ( |& func| {
274
+ let identified_contracts =
275
+ has_invariants. then ( || load_contracts ( setup. traces . clone ( ) , known_contracts) ) ;
276
+ let test_results = functions
277
+ . into_par_iter ( )
278
+ . map ( |( sig, func) | {
279
+ let setup = setup. clone ( ) ;
280
+ let should_fail = func. is_test_fail ( ) ;
281
+ let res = if func. is_invariant_test ( ) {
279
282
let runner = test_options. invariant_runner ( self . name , & func. name ) ;
280
283
let invariant_config = test_options. invariant_config ( self . name , & func. name ) ;
281
- let res = self . run_invariant_test (
284
+ self . run_invariant_test (
282
285
runner,
283
- setup. clone ( ) ,
286
+ setup,
284
287
* invariant_config,
285
288
func,
286
289
known_contracts,
287
- & identified_contracts,
288
- ) ;
289
- ( func. signature ( ) , res)
290
- } )
291
- . collect ( ) ;
292
- test_results. extend ( results) ;
293
- }
290
+ identified_contracts. as_ref ( ) . unwrap ( ) ,
291
+ )
292
+ } else if func. is_fuzz_test ( ) {
293
+ let runner = test_options. fuzz_runner ( self . name , & func. name ) ;
294
+ let fuzz_config = test_options. fuzz_config ( self . name , & func. name ) ;
295
+ self . run_fuzz_test ( func, should_fail, runner, setup, * fuzz_config)
296
+ } else {
297
+ self . run_test ( func, should_fail, setup)
298
+ } ;
299
+ ( sig, res)
300
+ } )
301
+ . collect :: < BTreeMap < _ , _ > > ( ) ;
294
302
295
303
let duration = start. elapsed ( ) ;
296
- if !test_results. is_empty ( ) {
297
- let successful =
298
- test_results. iter ( ) . filter ( |( _, tst) | tst. status == TestStatus :: Success ) . count ( ) ;
299
- info ! (
300
- duration = ?duration,
301
- "done. {}/{} successful" ,
302
- successful,
303
- test_results. len( )
304
- ) ;
305
- }
306
-
307
- SuiteResult :: new ( duration, test_results, warnings)
304
+ let suite_result = SuiteResult :: new ( duration, test_results, warnings) ;
305
+ info ! (
306
+ duration=?suite_result. duration,
307
+ "done. {}/{} successful" ,
308
+ suite_result. passed( ) ,
309
+ suite_result. test_results. len( )
310
+ ) ;
311
+ suite_result
308
312
}
309
313
310
314
/// Runs a single test
0 commit comments