From bb3b5574cd931bb961afd6ab6a9c5a56d8482bcb Mon Sep 17 00:00:00 2001 From: Antonio Yang Date: Mon, 10 Jan 2022 14:01:12 +0800 Subject: [PATCH] Include ignore message in libtest output As an example: #[test] #[ignore = "not yet implemented"] fn test_ignored() { ... } Will now render as: running 2 tests test tests::test_ignored ... ignored, not yet implemented test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s --- compiler/rustc_builtin_macros/src/test.rs | 23 ++++++++++++++ compiler/rustc_expand/src/build.rs | 4 +++ library/test/src/console.rs | 19 ++++++++++-- library/test/src/tests.rs | 38 +++++++++++++++++++++++ library/test/src/types.rs | 2 ++ src/librustdoc/doctest.rs | 2 ++ src/tools/compiletest/src/header.rs | 4 +++ 7 files changed, 90 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_builtin_macros/src/test.rs b/compiler/rustc_builtin_macros/src/test.rs index 690879624058b..e658631d09038 100644 --- a/compiler/rustc_builtin_macros/src/test.rs +++ b/compiler/rustc_builtin_macros/src/test.rs @@ -262,6 +262,15 @@ pub fn expand_test_or_bench( "ignore", cx.expr_bool(sp, should_ignore(&cx.sess, &item)), ), + // ignore_message: Some("...") | None + field( + "ignore_message", + if let Some(msg) = should_ignore_message(cx, &item) { + cx.expr_some(sp, cx.expr_str(sp, msg)) + } else { + cx.expr_none(sp) + }, + ), // compile_fail: true | false field("compile_fail", cx.expr_bool(sp, false)), // no_run: true | false @@ -364,6 +373,20 @@ fn should_ignore(sess: &Session, i: &ast::Item) -> bool { sess.contains_name(&i.attrs, sym::ignore) } +fn should_ignore_message(cx: &ExtCtxt<'_>, i: &ast::Item) -> Option { + match cx.sess.find_by_name(&i.attrs, sym::ignore) { + Some(attr) => { + match attr.meta_item_list() { + // Handle #[ignore(bar = "foo")] + Some(_) => None, + // Handle #[ignore] and #[ignore = "message"] + None => attr.value_str(), + } + } + None => None, + } +} + fn should_panic(cx: &ExtCtxt<'_>, i: &ast::Item) -> ShouldPanic { match cx.sess.find_by_name(&i.attrs, sym::should_panic) { Some(attr) => { diff --git a/compiler/rustc_expand/src/build.rs b/compiler/rustc_expand/src/build.rs index 2cc15b3e53f46..b8ed75cb6bb74 100644 --- a/compiler/rustc_expand/src/build.rs +++ b/compiler/rustc_expand/src/build.rs @@ -329,6 +329,10 @@ impl<'a> ExtCtxt<'a> { self.expr_call_global(sp, some, vec![expr]) } + pub fn expr_none(&self, sp: Span) -> P { + let none = self.std_path(&[sym::option, sym::Option, sym::None]); + self.expr_path(self.path_global(sp, none)) + } pub fn expr_tuple(&self, sp: Span, exprs: Vec>) -> P { self.expr(sp, ast::ExprKind::Tup(exprs)) } diff --git a/library/test/src/console.rs b/library/test/src/console.rs index 920f55ad251a6..22fcd77dccc52 100644 --- a/library/test/src/console.rs +++ b/library/test/src/console.rs @@ -103,17 +103,32 @@ impl ConsoleTestState { exec_time: Option<&TestExecTime>, ) -> io::Result<()> { self.write_log(|| { + let TestDesc { + name, + #[cfg(not(bootstrap))] + ignore_message, + .. + } = test; format!( "{} {}", match *result { TestResult::TrOk => "ok".to_owned(), TestResult::TrFailed => "failed".to_owned(), TestResult::TrFailedMsg(ref msg) => format!("failed: {}", msg), - TestResult::TrIgnored => "ignored".to_owned(), + TestResult::TrIgnored => { + #[cfg(not(bootstrap))] + if let Some(msg) = ignore_message { + format!("ignored, {}", msg) + } else { + "ignored".to_owned() + } + #[cfg(bootstrap)] + "ignored".to_owned() + } TestResult::TrBench(ref bs) => fmt_bench_samples(bs), TestResult::TrTimedFail => "failed (time limit exceeded)".to_owned(), }, - test.name, + name, ) })?; if let Some(exec_time) = exec_time { diff --git a/library/test/src/tests.rs b/library/test/src/tests.rs index d566dbc09f434..e99089e453e7f 100644 --- a/library/test/src/tests.rs +++ b/library/test/src/tests.rs @@ -61,6 +61,8 @@ fn one_ignored_one_unignored_test() -> Vec { desc: TestDesc { name: StaticTestName("1"), ignore: true, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -74,6 +76,8 @@ fn one_ignored_one_unignored_test() -> Vec { desc: TestDesc { name: StaticTestName("2"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -95,6 +99,8 @@ pub fn do_not_run_ignored_tests() { desc: TestDesc { name: StaticTestName("whatever"), ignore: true, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -117,6 +123,8 @@ pub fn ignored_tests_result_in_ignored() { desc: TestDesc { name: StaticTestName("whatever"), ignore: true, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -143,6 +151,8 @@ fn test_should_panic() { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::Yes, compile_fail: false, no_run: false, @@ -169,6 +179,8 @@ fn test_should_panic_good_message() { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::YesWithMessage("error message"), compile_fail: false, no_run: false, @@ -200,6 +212,8 @@ fn test_should_panic_bad_message() { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::YesWithMessage(expected), compile_fail: false, no_run: false, @@ -235,6 +249,8 @@ fn test_should_panic_non_string_message_type() { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::YesWithMessage(expected), compile_fail: false, no_run: false, @@ -262,6 +278,8 @@ fn test_should_panic_but_succeeds() { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic, compile_fail: false, no_run: false, @@ -297,6 +315,8 @@ fn report_time_test_template(report_time: bool) -> Option { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -333,6 +353,8 @@ fn time_test_failure_template(test_type: TestType) -> TestResult { desc: TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -373,6 +395,8 @@ fn typed_test_desc(test_type: TestType) -> TestDesc { TestDesc { name: StaticTestName("whatever"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -486,6 +510,8 @@ pub fn exclude_should_panic_option() { desc: TestDesc { name: StaticTestName("3"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::Yes, compile_fail: false, no_run: false, @@ -511,6 +537,8 @@ pub fn exact_filter_match() { desc: TestDesc { name: StaticTestName(name), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -601,6 +629,8 @@ fn sample_tests() -> Vec { desc: TestDesc { name: DynTestName((*name).clone()), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -753,6 +783,8 @@ pub fn test_bench_no_iter() { let desc = TestDesc { name: StaticTestName("f"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -776,6 +808,8 @@ pub fn test_bench_iter() { let desc = TestDesc { name: StaticTestName("f"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -793,6 +827,8 @@ fn should_sort_failures_before_printing_them() { let test_a = TestDesc { name: StaticTestName("a"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, @@ -804,6 +840,8 @@ fn should_sort_failures_before_printing_them() { let test_b = TestDesc { name: StaticTestName("b"), ignore: false, + #[cfg(not(bootstrap))] + ignore_message: None, should_panic: ShouldPanic::No, compile_fail: false, no_run: false, diff --git a/library/test/src/types.rs b/library/test/src/types.rs index 43e5a10ebbe95..cc75220aa0032 100644 --- a/library/test/src/types.rs +++ b/library/test/src/types.rs @@ -117,6 +117,8 @@ pub struct TestId(pub usize); pub struct TestDesc { pub name: TestName, pub ignore: bool, + #[cfg(not(bootstrap))] + pub ignore_message: Option<&'static str>, pub should_panic: options::ShouldPanic, pub compile_fail: bool, pub no_run: bool, diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs index 696397c5f671b..ccdc0e38d7291 100644 --- a/src/librustdoc/doctest.rs +++ b/src/librustdoc/doctest.rs @@ -949,6 +949,8 @@ impl Tester for Collector { Ignore::None => false, Ignore::Some(ref ignores) => ignores.iter().any(|s| target_str.contains(s)), }, + #[cfg(not(bootstrap))] + ignore_message: None, // compiler failures are test failures should_panic: test::ShouldPanic::No, compile_fail: config.compile_fail, diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index 887d27fd6dca4..2c2239f2b83d1 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -806,6 +806,8 @@ pub fn make_test_description( cfg: Option<&str>, ) -> test::TestDesc { let mut ignore = false; + #[cfg(not(bootstrap))] + let ignore_message: Option = None; let mut should_fail = false; let rustc_has_profiler_support = env::var_os("RUSTC_PROFILER_SUPPORT").is_some(); @@ -877,6 +879,8 @@ pub fn make_test_description( test::TestDesc { name, ignore, + #[cfg(not(bootstrap))] + ignore_message, should_panic, compile_fail: false, no_run: false,