forked from rust-lang/rust
-
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#10543 - blyxyas:tests_outside_test_module, r=…
…flip1995 Add `tests_outside_test_module` lint Adds `tests_outside_test_module` from rust-lang#10506. This PR **doesn't** close the issue, just resolves task 1. changelog: [`tests_outside_test_module`]: The lint has been added
- Loading branch information
Showing
6 changed files
with
104 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
use clippy_utils::{diagnostics::span_lint_and_note, is_in_cfg_test, is_in_test_function}; | ||
use rustc_hir::{intravisit::FnKind, Body, FnDecl}; | ||
use rustc_lint::{LateContext, LateLintPass}; | ||
use rustc_session::{declare_lint_pass, declare_tool_lint}; | ||
use rustc_span::{def_id::LocalDefId, Span}; | ||
|
||
declare_clippy_lint! { | ||
/// ### What it does | ||
/// Triggers when a testing function (marked with the `#[test]` attribute) isn't inside a testing module | ||
/// (marked with `#[cfg(test)]`). | ||
/// ### Why is this bad? | ||
/// The idiomatic (and more performant) way of writing tests is inside a testing module (flagged with `#[cfg(test)]`), | ||
/// having test functions outside of this module is confusing and may lead to them being "hidden". | ||
/// ### Example | ||
/// ```rust | ||
/// #[test] | ||
/// fn my_cool_test() { | ||
/// // [...] | ||
/// } | ||
/// | ||
/// #[cfg(test)] | ||
/// mod tests { | ||
/// // [...] | ||
/// } | ||
/// | ||
/// ``` | ||
/// Use instead: | ||
/// ```rust | ||
/// #[cfg(test)] | ||
/// mod tests { | ||
/// #[test] | ||
/// fn my_cool_test() { | ||
/// // [...] | ||
/// } | ||
/// } | ||
/// ``` | ||
#[clippy::version = "1.70.0"] | ||
pub TESTS_OUTSIDE_TEST_MODULE, | ||
restriction, | ||
"A test function is outside the testing module." | ||
} | ||
|
||
declare_lint_pass!(TestsOutsideTestModule => [TESTS_OUTSIDE_TEST_MODULE]); | ||
|
||
impl LateLintPass<'_> for TestsOutsideTestModule { | ||
fn check_fn( | ||
&mut self, | ||
cx: &LateContext<'_>, | ||
kind: FnKind<'_>, | ||
_: &FnDecl<'_>, | ||
body: &Body<'_>, | ||
sp: Span, | ||
_: LocalDefId, | ||
) { | ||
if_chain! { | ||
if !matches!(kind, FnKind::Closure); | ||
if is_in_test_function(cx.tcx, body.id().hir_id); | ||
if !is_in_cfg_test(cx.tcx, body.id().hir_id); | ||
then { | ||
span_lint_and_note( | ||
cx, | ||
TESTS_OUTSIDE_TEST_MODULE, | ||
sp, | ||
"this function marked with #[test] is outside a #[cfg(test)] module", | ||
None, | ||
"move it to a testing module marked with #[cfg(test)]", | ||
); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// compile-flags: --test | ||
#![allow(unused)] | ||
#![warn(clippy::tests_outside_test_module)] | ||
|
||
fn main() { | ||
// test code goes here | ||
} | ||
|
||
// Should lint | ||
#[test] | ||
fn my_test() {} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
// Should not lint | ||
#[test] | ||
fn my_test() {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
error: this function marked with #[test] is outside a #[cfg(test)] module | ||
--> $DIR/tests_outside_test_module.rs:11:1 | ||
| | ||
LL | fn my_test() {} | ||
| ^^^^^^^^^^^^^^^ | ||
| | ||
= note: move it to a testing module marked with #[cfg(test)] | ||
= note: `-D clippy::tests-outside-test-module` implied by `-D warnings` | ||
|
||
error: aborting due to previous error | ||
|