blob: ed02d01e9ca1b377bd7973d0d3950da87d9ecb8c [file] [log] [blame]
Joel Galensonf9c300d2021-09-22 14:30:25 -07001use std::{
2 fs,
3 ffi::OsStr,
4 io,
5 path::Path,
6};
7
8use walkdir::WalkDir;
9
10#[test]
11fn 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]
19fn 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.
32fn 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]
54fn 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)]
61fn rename_beta_stderr(_: impl AsRef<Path>, _: impl AsRef<Path>) -> io::Result<()> {
62 Ok(())
63}