use std::path::{Path, PathBuf}; use glob::glob; const COMPILE_FAIL_TESTS: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/ui/compile-fail/**/*.rs"); const COMPILE_PASS_TESTS: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/ui/compile-pass/**/*.rs"); fn matches(path: &Path, pat: &[String]) -> bool { pat.iter() .any(|pat| path.as_os_str().to_string_lossy().contains(pat)) } fn get_filter() -> Vec { std::env::var("EXCLUDE_UI_TESTS") .unwrap_or_default() .split(',') .map(|v| v.trim()) .filter(|v| !v.is_empty()) .map(String::from) .collect::>() } fn get_tests<'a>(path_pattern: &str, filter: &'a [String]) -> impl Iterator + 'a { glob(path_pattern) .unwrap() .map(Result::unwrap) .filter(move |path| !matches(path, filter)) } #[test] fn ui() { let filter = get_filter(); let t = trybuild::TestCases::new(); get_tests(COMPILE_FAIL_TESTS, &filter).for_each(|test| t.compile_fail(test)); get_tests(COMPILE_PASS_TESTS, &filter).for_each(|test| t.pass(test)); }