//! This checks the output of `--print=crate-root-lint-levels` extern crate run_make_support; use std::collections::HashSet; use std::iter::FromIterator; use run_make_support::rustc; struct CrateRootLintLevels { args: &'static [&'static str], contains: Contains, } struct Contains { contains: &'static [&'static str], doesnt_contain: &'static [&'static str], } fn main() { check(CrateRootLintLevels { args: &[], contains: Contains { contains: &[ "unexpected_cfgs=allow", "unused_mut=expect", "warnings=warn", "stable_features=warn", "unknown_lints=warn", ], doesnt_contain: &["unexpected_cfgs=warn", "unused_mut=warn"], }, }); check(CrateRootLintLevels { args: &["-Wunexpected_cfgs"], contains: Contains { contains: &["unexpected_cfgs=allow", "warnings=warn"], doesnt_contain: &["unexpected_cfgs=warn"], }, }); check(CrateRootLintLevels { args: &["-Dwarnings"], contains: Contains { contains: &[ "unexpected_cfgs=allow", "warnings=deny", "stable_features=deny", "unknown_lints=deny", ], doesnt_contain: &["warnings=warn"], }, }); check(CrateRootLintLevels { args: &["-Dstable_features"], contains: Contains { contains: &["warnings=warn", "stable_features=deny", "unexpected_cfgs=allow"], doesnt_contain: &["warnings=deny"], }, }); check(CrateRootLintLevels { args: &["-Dwarnings", "--force-warn=stable_features"], contains: Contains { contains: &["warnings=deny", "stable_features=force-warn", "unknown_lints=deny"], doesnt_contain: &["warnings=warn"], }, }); check(CrateRootLintLevels { args: &["-Dwarnings", "--cap-lints=warn"], contains: Contains { contains: &[ "unexpected_cfgs=allow", "warnings=warn", "stable_features=warn", "unknown_lints=warn", ], doesnt_contain: &["warnings=deny"], }, }); } #[track_caller] fn check(CrateRootLintLevels { args, contains }: CrateRootLintLevels) { let output = rustc() .input("lib.rs") .arg("-Zunstable-options") .print("crate-root-lint-levels") .args(args) .run(); let stdout = output.stdout_utf8(); let mut found = HashSet::::new(); for l in stdout.lines() { assert!(l == l.trim()); if let Some((left, right)) = l.split_once('=') { assert!(!left.contains("\"")); assert!(!right.contains("\"")); } else { assert!(l.contains('=')); } assert!(found.insert(l.to_string()), "{}", &l); } let Contains { contains, doesnt_contain } = contains; { let should_found = HashSet::::from_iter(contains.iter().map(|s| s.to_string())); let diff: Vec<_> = should_found.difference(&found).collect(); assert!(diff.is_empty(), "should found: {:?}, didn't found {:?}", &should_found, &diff); } { let should_not_find = HashSet::::from_iter(doesnt_contain.iter().map(|s| s.to_string())); let diff: Vec<_> = should_not_find.intersection(&found).collect(); assert!(diff.is_empty(), "should not find {:?}, did found {:?}", &should_not_find, &diff); } }