174522d2cSopenharmony_ciuse std::{ 274522d2cSopenharmony_ci fs, 374522d2cSopenharmony_ci ffi::OsStr, 474522d2cSopenharmony_ci io, 574522d2cSopenharmony_ci path::Path, 674522d2cSopenharmony_ci}; 774522d2cSopenharmony_ci 874522d2cSopenharmony_ciuse walkdir::WalkDir; 974522d2cSopenharmony_ci 1074522d2cSopenharmony_ci#[test] 1174522d2cSopenharmony_cifn fail() { 1274522d2cSopenharmony_ci prepare_stderr_files("tests/compile-fail").unwrap(); 1374522d2cSopenharmony_ci 1474522d2cSopenharmony_ci let t = trybuild::TestCases::new(); 1574522d2cSopenharmony_ci t.compile_fail("tests/compile-fail/**/*.rs"); 1674522d2cSopenharmony_ci} 1774522d2cSopenharmony_ci 1874522d2cSopenharmony_ci#[test] 1974522d2cSopenharmony_cifn pass() { 2074522d2cSopenharmony_ci let t = trybuild::TestCases::new(); 2174522d2cSopenharmony_ci t.pass("tests/compile-pass/**/*.rs"); 2274522d2cSopenharmony_ci} 2374522d2cSopenharmony_ci 2474522d2cSopenharmony_ci// Compiler messages may change between versions 2574522d2cSopenharmony_ci// We don't want to have to track these too closely for `bitflags`, but 2674522d2cSopenharmony_ci// having some message to check makes sure user-facing errors are sensical. 2774522d2cSopenharmony_ci// 2874522d2cSopenharmony_ci// The approach we use is to run the test on all compilers, but only check stderr 2974522d2cSopenharmony_ci// output on beta (which is the next stable release). We do this by default ignoring 3074522d2cSopenharmony_ci// any `.stderr` files in the `compile-fail` directory, and copying `.stderr.beta` files 3174522d2cSopenharmony_ci// when we happen to be running on a beta compiler. 3274522d2cSopenharmony_cifn prepare_stderr_files(path: impl AsRef<Path>) -> io::Result<()> { 3374522d2cSopenharmony_ci for entry in WalkDir::new(path) { 3474522d2cSopenharmony_ci let entry = entry?; 3574522d2cSopenharmony_ci 3674522d2cSopenharmony_ci if entry.path().extension().and_then(OsStr::to_str) == Some("beta") { 3774522d2cSopenharmony_ci let renamed = entry.path().with_extension(""); 3874522d2cSopenharmony_ci 3974522d2cSopenharmony_ci // Unconditionally remove a corresponding `.stderr` file for a `.stderr.beta` 4074522d2cSopenharmony_ci // file if it exists. On `beta` compilers, we'll recreate it. On other compilers, 4174522d2cSopenharmony_ci // we don't want to end up checking it anyways. 4274522d2cSopenharmony_ci if renamed.exists() { 4374522d2cSopenharmony_ci fs::remove_file(&renamed)?; 4474522d2cSopenharmony_ci } 4574522d2cSopenharmony_ci 4674522d2cSopenharmony_ci rename_beta_stderr(entry.path(), renamed)?; 4774522d2cSopenharmony_ci } 4874522d2cSopenharmony_ci } 4974522d2cSopenharmony_ci 5074522d2cSopenharmony_ci Ok(()) 5174522d2cSopenharmony_ci} 5274522d2cSopenharmony_ci 5374522d2cSopenharmony_ci#[rustversion::beta] 5474522d2cSopenharmony_cifn rename_beta_stderr(from: impl AsRef<Path>, to: impl AsRef<Path>) -> io::Result<()> { 5574522d2cSopenharmony_ci fs::copy(from, to)?; 5674522d2cSopenharmony_ci 5774522d2cSopenharmony_ci Ok(()) 5874522d2cSopenharmony_ci} 5974522d2cSopenharmony_ci 6074522d2cSopenharmony_ci#[rustversion::not(beta)] 6174522d2cSopenharmony_cifn rename_beta_stderr(_: impl AsRef<Path>, _: impl AsRef<Path>) -> io::Result<()> { 6274522d2cSopenharmony_ci Ok(()) 6374522d2cSopenharmony_ci} 64