diff --git a/Cargo.lock b/Cargo.lock index ca69fe8a..7b603d0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -651,7 +651,7 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.16.1" +version = "0.16.2" dependencies = [ "annotate-snippets", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index fa28c1e3..b902b00c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ui_test" -version = "0.16.1" +version = "0.16.2" edition = "2021" license = "MIT OR Apache-2.0" description = "A test framework for testing rustc diagnostics output" diff --git a/src/config/args.rs b/src/config/args.rs index 67e243a3..26a7c59f 100644 --- a/src/config/args.rs +++ b/src/config/args.rs @@ -1,9 +1,9 @@ //! Default argument processing when `ui_test` is used //! as a test driver. -use std::num::NonZeroUsize; +use std::{borrow::Cow, num::NonZeroUsize}; -use color_eyre::eyre::{bail, eyre, Result}; +use color_eyre::eyre::{bail, ensure, eyre, Result}; /// Plain arguments if `ui_test` is used as a binary. #[derive(Debug)] @@ -20,6 +20,9 @@ pub struct Args { /// The number of threads to use pub threads: NonZeroUsize, + + /// Skip tests whose names contain any of these entries. + pub skip: Vec, } impl Args { @@ -29,6 +32,7 @@ impl Args { filters: vec![], quiet: false, check: false, + skip: vec![], threads: match std::env::var_os("RUST_TEST_THREADS") { None => std::thread::available_parallelism()?, Some(n) => n @@ -37,7 +41,8 @@ impl Args { .parse()?, }, }; - for arg in std::env::args().skip(1) { + let mut iter = std::env::args().skip(1); + while let Some(arg) = iter.next() { if arg == "--" { continue; } @@ -45,12 +50,17 @@ impl Args { args.quiet = true; } else if arg == "--check" { args.check = true; + } else if let Some(skip) = parse_value("--skip", &arg, &mut iter)? { + args.skip.push(skip.into_owned()); } else if arg == "--help" { - bail!("available flags: --quiet, --check, --test-threads=n") - } else if let Some(n) = arg.strip_prefix("--test-threads=") { + bail!("available flags: --quiet, --check, --test-threads=n, --skip") + } else if let Some(n) = parse_value("--test-threads", &arg, &mut iter)? { args.threads = n.parse()?; } else if arg.starts_with("--") { - bail!("unknown command line flag `{arg}`"); + bail!( + "unknown command line flag `{arg}`: {:?}", + std::env::args().collect::>() + ); } else { args.filters.push(arg); } @@ -58,3 +68,25 @@ impl Args { Ok(args) } } + +fn parse_value<'a>( + name: &str, + arg: &'a str, + iter: &mut impl Iterator, +) -> Result>> { + let with_eq = match arg.strip_prefix(name) { + Some(s) => s, + None => return Ok(None), + }; + if let Some(n) = with_eq.strip_prefix('=') { + Ok(Some(n.into())) + } else { + ensure!(with_eq.is_empty(), "`{name}` can only be followed by `=`"); + + if let Some(next) = iter.next() { + Ok(Some(next.into())) + } else { + bail!("`name` must be followed by a value") + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 8184c39f..b0b501fe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -250,7 +250,12 @@ pub fn run_tests_generic( for entry in entries { todo.push_back((entry, config)); } - } else if file_filter(&path, &args, config) { + } else if !args + .skip + .iter() + .any(|skip| path.display().to_string().contains(skip)) + && file_filter(&path, &args, config) + { let status = status_emitter.register_test(path); // Forward .rs files to the test workers. submit.send((status, config)).unwrap(); diff --git a/tests/integrations/basic-bin/Cargo.lock b/tests/integrations/basic-bin/Cargo.lock index 5488e026..018e709f 100644 --- a/tests/integrations/basic-bin/Cargo.lock +++ b/tests/integrations/basic-bin/Cargo.lock @@ -697,7 +697,7 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.16.1" +version = "0.16.2" dependencies = [ "annotate-snippets", "anyhow", diff --git a/tests/integrations/basic-fail-mode/Cargo.lock b/tests/integrations/basic-fail-mode/Cargo.lock index 07392fd6..74c4139c 100644 --- a/tests/integrations/basic-fail-mode/Cargo.lock +++ b/tests/integrations/basic-fail-mode/Cargo.lock @@ -697,7 +697,7 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.16.1" +version = "0.16.2" dependencies = [ "annotate-snippets", "anyhow", diff --git a/tests/integrations/basic-fail/Cargo.lock b/tests/integrations/basic-fail/Cargo.lock index fc2fe867..706632d1 100644 --- a/tests/integrations/basic-fail/Cargo.lock +++ b/tests/integrations/basic-fail/Cargo.lock @@ -697,7 +697,7 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.16.1" +version = "0.16.2" dependencies = [ "annotate-snippets", "anyhow", diff --git a/tests/integrations/basic/Cargo.lock b/tests/integrations/basic/Cargo.lock index 0139089d..dc058c19 100644 --- a/tests/integrations/basic/Cargo.lock +++ b/tests/integrations/basic/Cargo.lock @@ -697,7 +697,7 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.16.1" +version = "0.16.2" dependencies = [ "annotate-snippets", "anyhow",