Skip to content

Adjust design of unit tests with non-() type #49909

Closed
@nikomatsakis

Description

@nikomatsakis

Per this comment, we want to alter the design of unit tests with non-() type. The new design is:

  • #[should_panic] can only be applied to tests with () return type and continues to have the same meaning.
  • For non-should-panic tests, the return type T defines the error result using the Termination trait.

Achieving these changes should be relatively straight-forward. Basically the only thing we have to do is to make it an error to apply #[should_panic] unless the test has (). Currently we check that the test has the correct signature here:

rust/src/libsyntax/test.rs

Lines 330 to 355 in 9afed64

fn has_test_signature(cx: &TestCtxt, i: &ast::Item) -> HasTestSignature {
match i.node {
ast::ItemKind::Fn(ref decl, _, _, _, ref generics, _) => {
// If the termination trait is active, the compiler will check that the output
// type implements the `Termination` trait as `libtest` enforces that.
let output_matches = if cx.features.termination_trait_test {
true
} else {
let no_output = match decl.output {
ast::FunctionRetTy::Default(..) => true,
ast::FunctionRetTy::Ty(ref t) if t.node == ast::TyKind::Tup(vec![]) => true,
_ => false
};
no_output && !generics.is_parameterized()
};
if decl.inputs.is_empty() && output_matches {
Yes
} else {
No
}
}
_ => NotEvenAFunction,
}
}

In any case, we just have to extend that function to also check whether there is a should_panic attribute -- if so, we can report an error, sort of like this:

diag.span_err(i.span, "functions used as tests must have signature fn() -> ()");

Metadata

Metadata

Assignees

No one assigned

    Labels

    E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions