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