3
3
extern crate compiletest_rs as compiletest;
4
4
extern crate test;
5
5
6
+ use std:: io;
6
7
use std:: ffi:: OsStr ;
7
8
use std:: fs;
8
- use std:: error:: Error ;
9
9
use std:: env:: { set_var, var} ;
10
10
use std:: path:: { Path , PathBuf } ;
11
11
@@ -33,7 +33,7 @@ fn rustc_lib_path() -> PathBuf {
33
33
option_env ! ( "RUSTC_LIB_PATH" ) . unwrap ( ) . into ( )
34
34
}
35
35
36
- fn config ( mode : & str , dir : & str ) -> compiletest:: Config {
36
+ fn config ( mode : & str , dir : PathBuf ) -> compiletest:: Config {
37
37
let mut config = compiletest:: Config :: default ( ) ;
38
38
39
39
let cfg_mode = mode. parse ( ) . expect ( "Invalid mode" ) ;
@@ -59,25 +59,25 @@ fn config(mode: &str, dir: &str) -> compiletest::Config {
59
59
path. push ( "target/debug/test_build_base" ) ;
60
60
path
61
61
} ;
62
- config. src_base = PathBuf :: from ( format ! ( "tests/{}" , dir) ) ;
62
+ config. src_base = dir;
63
63
config. rustc_path = clippy_driver_path ( ) ;
64
64
config
65
65
}
66
66
67
- fn run_mode ( mode : & str , dir : & str ) {
67
+ fn run_mode ( mode : & str , dir : PathBuf ) {
68
68
compiletest:: run_tests ( & config ( mode, dir) ) ;
69
69
}
70
70
71
- fn run_ui_toml ( ) -> Result < ( ) , Box < Error > > {
72
- let base = PathBuf :: from ( "tests/ui-toml/" ) . canonicalize ( ) ?;
73
- for dir in fs:: read_dir ( & base) ? {
71
+ fn run_ui_toml_tests ( config : & compiletest:: Config , mut tests : Vec < test:: TestDescAndFn > ) -> Result < bool , io:: Error > {
72
+ let mut result = true ;
73
+ let opts = compiletest:: test_opts ( config) ;
74
+ for dir in fs:: read_dir ( & config. src_base ) ? {
74
75
let dir = dir?;
75
76
if !dir. file_type ( ) ?. is_dir ( ) {
76
77
continue ;
77
78
}
78
79
let dir_path = dir. path ( ) ;
79
80
set_var ( "CARGO_MANIFEST_DIR" , & dir_path) ;
80
- let config = config ( "ui" , "ui-toml" ) ;
81
81
for file in fs:: read_dir ( & dir_path) ? {
82
82
let file = file?;
83
83
let file_path = file. path ( ) ;
@@ -89,13 +89,34 @@ fn run_ui_toml() -> Result<(), Box<Error>> {
89
89
}
90
90
let paths = compiletest:: common:: TestPaths {
91
91
file : file_path,
92
- base : base . clone ( ) ,
92
+ base : config . src_base . clone ( ) ,
93
93
relative_dir : dir_path. file_name ( ) . unwrap ( ) . into ( ) ,
94
94
} ;
95
- compiletest:: runtest:: run ( config. clone ( ) , & paths) ;
95
+ let test_name = compiletest:: make_test_name ( & config, & paths) ;
96
+ let index = tests. iter ( )
97
+ . position ( |test| test. desc . name == test_name)
98
+ . expect ( "The test should be in there" ) ;
99
+ result &= test:: run_tests_console (
100
+ & opts,
101
+ vec ! [ tests. swap_remove( index) ] ) ?;
102
+ }
103
+ }
104
+ Ok ( result)
105
+ }
106
+
107
+ fn run_ui_toml ( ) {
108
+ let path = PathBuf :: from ( "tests/ui-toml" ) . canonicalize ( ) . unwrap ( ) ;
109
+ let config = config ( "ui" , path) ;
110
+ let tests = compiletest:: make_tests ( & config) ;
111
+
112
+ let res = run_ui_toml_tests ( & config, tests) ;
113
+ match res {
114
+ Ok ( true ) => { }
115
+ Ok ( false ) => panic ! ( "Some tests failed" ) ,
116
+ Err ( e) => {
117
+ println ! ( "I/O failure during tests: {:?}" , e) ;
96
118
}
97
119
}
98
- Ok ( ( ) )
99
120
}
100
121
101
122
fn prepare_env ( ) {
@@ -107,7 +128,7 @@ fn prepare_env() {
107
128
#[ test]
108
129
fn compile_test ( ) {
109
130
prepare_env ( ) ;
110
- run_mode ( "run-pass" , "run-pass" ) ;
111
- run_mode ( "ui" , "ui" ) ;
112
- run_ui_toml ( ) . unwrap ( ) ;
131
+ run_mode ( "run-pass" , "tests/ run-pass" . into ( ) ) ;
132
+ run_mode ( "ui" , "tests/ ui" . into ( ) ) ;
133
+ run_ui_toml ( ) ;
113
134
}
0 commit comments