40
40
#![ feature( panic_unwind) ]
41
41
#![ feature( staged_api) ]
42
42
43
+ extern crate glob;
43
44
extern crate getopts;
44
45
extern crate term;
45
46
#[ cfg( unix) ]
@@ -339,6 +340,7 @@ pub struct TestOpts {
339
340
pub list : bool ,
340
341
pub filter : Option < String > ,
341
342
pub filter_exact : bool ,
343
+ pub filter_glob : bool ,
342
344
pub run_ignored : bool ,
343
345
pub run_tests : bool ,
344
346
pub bench_benchmarks : bool ,
@@ -358,6 +360,7 @@ impl TestOpts {
358
360
list : false ,
359
361
filter : None ,
360
362
filter_exact : false ,
363
+ filter_glob : false ,
361
364
run_ignored : false ,
362
365
run_tests : false ,
363
366
bench_benchmarks : false ,
@@ -392,6 +395,7 @@ fn optgroups() -> getopts::Options {
392
395
be used multiple times)", "FILTER" )
393
396
. optflag ( "q" , "quiet" , "Display one character per test instead of one line" )
394
397
. optflag ( "" , "exact" , "Exactly match filters rather than by substring" )
398
+ . optflag ( "g" , "glob" , "Use glob patterns for matching test names" )
395
399
. optopt ( "" , "color" , "Configure coloring of output:
396
400
auto = colorize if stdout is a tty and tests are run on serially (default);
397
401
always = always colorize output;
@@ -445,7 +449,11 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
445
449
return None ;
446
450
}
447
451
452
+ let mut glob = matches. opt_present ( "glob" ) ;
448
453
let filter = if !matches. free . is_empty ( ) {
454
+ if matches. free [ 0 ] . chars ( ) . any ( |c| [ '*' , '?' , '[' ] . contains ( & c) ) {
455
+ glob = true ;
456
+ }
449
457
Some ( matches. free [ 0 ] . clone ( ) )
450
458
} else {
451
459
None
@@ -500,6 +508,7 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
500
508
list,
501
509
filter,
502
510
filter_exact : exact,
511
+ filter_glob : glob,
503
512
run_ignored,
504
513
run_tests,
505
514
bench_benchmarks,
@@ -1324,9 +1333,17 @@ pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescA
1324
1333
filtered = match opts. filter {
1325
1334
None => filtered,
1326
1335
Some ( ref filter) => {
1336
+ let glob = if opts. filter_glob && !opts. filter_exact {
1337
+ glob:: Pattern :: new ( filter) . ok ( )
1338
+ } else {
1339
+ None
1340
+ } ;
1341
+
1327
1342
filtered. into_iter ( )
1328
1343
. filter ( |test| {
1329
- if opts. filter_exact {
1344
+ if let Some ( ref glob) = glob {
1345
+ glob. matches ( & test. desc . name . as_slice ( ) )
1346
+ } else if opts. filter_exact {
1330
1347
test. desc . name . as_slice ( ) == & filter[ ..]
1331
1348
} else {
1332
1349
test. desc . name . as_slice ( ) . contains ( & filter[ ..] )
@@ -1339,6 +1356,12 @@ pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescA
1339
1356
// Skip tests that match any of the skip filters
1340
1357
filtered = filtered. into_iter ( )
1341
1358
. filter ( |t| !opts. skip . iter ( ) . any ( |sf| {
1359
+ if opts. filter_glob && !opts. filter_exact {
1360
+ if let Ok ( glob) = glob:: Pattern :: new ( sf) {
1361
+ return glob. matches ( & t. desc . name . as_slice ( ) ) ;
1362
+ }
1363
+ }
1364
+
1342
1365
if opts. filter_exact {
1343
1366
t. desc . name . as_slice ( ) == & sf[ ..]
1344
1367
} else {
@@ -1920,7 +1943,7 @@ mod tests {
1920
1943
}
1921
1944
1922
1945
#[ test]
1923
- pub fn exact_filter_match ( ) {
1946
+ pub fn filter_type_match ( ) {
1924
1947
fn tests ( ) -> Vec < TestDescAndFn > {
1925
1948
vec ! [ "base" ,
1926
1949
"base::test" ,
@@ -1989,6 +2012,36 @@ mod tests {
1989
2012
..TestOpts :: new ( )
1990
2013
} , tests ( ) ) ;
1991
2014
assert_eq ! ( exact. len( ) , 1 ) ;
2015
+
2016
+ let exact = filter_tests ( & TestOpts {
2017
+ filter : Some ( "b" . into ( ) ) ,
2018
+ filter_glob : true , ..TestOpts :: new ( )
2019
+ } , tests ( ) ) ;
2020
+ assert_eq ! ( exact. len( ) , 0 ) ;
2021
+
2022
+ let exact = filter_tests ( & TestOpts {
2023
+ filter : Some ( "base" . into ( ) ) ,
2024
+ filter_glob : true , ..TestOpts :: new ( )
2025
+ } , tests ( ) ) ;
2026
+ assert_eq ! ( exact. len( ) , 1 ) ;
2027
+
2028
+ let exact = filter_tests ( & TestOpts {
2029
+ filter : Some ( "base*" . into ( ) ) ,
2030
+ filter_glob : true , ..TestOpts :: new ( )
2031
+ } , tests ( ) ) ;
2032
+ assert_eq ! ( exact. len( ) , 4 ) ;
2033
+
2034
+ let exact = filter_tests ( & TestOpts {
2035
+ filter : Some ( "base::test?" . into ( ) ) ,
2036
+ filter_glob : true , ..TestOpts :: new ( )
2037
+ } , tests ( ) ) ;
2038
+ assert_eq ! ( exact. len( ) , 2 ) ;
2039
+
2040
+ let exact = filter_tests ( & TestOpts {
2041
+ filter : Some ( "base::test[2-9]" . into ( ) ) ,
2042
+ filter_glob : true , ..TestOpts :: new ( )
2043
+ } , tests ( ) ) ;
2044
+ assert_eq ! ( exact. len( ) , 1 ) ;
1992
2045
}
1993
2046
1994
2047
#[ test]
0 commit comments