1 use std::{
2 fs,
3 ffi::OsStr,
4 io,
5 path::Path,
6 };
7
8 use walkdir::WalkDir;
9
10 #[test]
fail()11 fn fail() {
12 prepare_stderr_files("tests/compile-fail").unwrap();
13
14 let t = trybuild::TestCases::new();
15 t.compile_fail("tests/compile-fail/**/*.rs");
16 }
17
18 #[test]
pass()19 fn pass() {
20 let t = trybuild::TestCases::new();
21 t.pass("tests/compile-pass/**/*.rs");
22 }
23
24 // Compiler messages may change between versions
25 // We don't want to have to track these too closely for `bitflags`, but
26 // having some message to check makes sure user-facing errors are sensical.
27 //
28 // The approach we use is to run the test on all compilers, but only check stderr
29 // output on beta (which is the next stable release). We do this by default ignoring
30 // any `.stderr` files in the `compile-fail` directory, and copying `.stderr.beta` files
31 // when we happen to be running on a beta compiler.
prepare_stderr_files(path: impl AsRef<Path>) -> io::Result<()>32 fn prepare_stderr_files(path: impl AsRef<Path>) -> io::Result<()> {
33 for entry in WalkDir::new(path) {
34 let entry = entry?;
35
36 if entry.path().extension().and_then(OsStr::to_str) == Some("beta") {
37 let renamed = entry.path().with_extension("");
38
39 // Unconditionally remove a corresponding `.stderr` file for a `.stderr.beta`
40 // file if it exists. On `beta` compilers, we'll recreate it. On other compilers,
41 // we don't want to end up checking it anyways.
42 if renamed.exists() {
43 fs::remove_file(&renamed)?;
44 }
45
46 rename_beta_stderr(entry.path(), renamed)?;
47 }
48 }
49
50 Ok(())
51 }
52
53 #[rustversion::beta]
rename_beta_stderr(from: impl AsRef<Path>, to: impl AsRef<Path>) -> io::Result<()>54 fn rename_beta_stderr(from: impl AsRef<Path>, to: impl AsRef<Path>) -> io::Result<()> {
55 fs::copy(from, to)?;
56
57 Ok(())
58 }
59
60 #[rustversion::not(beta)]
rename_beta_stderr(_: impl AsRef<Path>, _: impl AsRef<Path>) -> io::Result<()>61 fn rename_beta_stderr(_: impl AsRef<Path>, _: impl AsRef<Path>) -> io::Result<()> {
62 Ok(())
63 }
64