blob: 6ad5d011d8b71217661425aa02cae205d4746735 [file] [log] [blame]
//@no-rustfix: name conflicts
#![allow(dead_code)]
#![warn(clippy::redundant_test_prefix)]
fn main() {
// Normal function, no redundant prefix.
}
fn f1() {
// Normal function, no redundant prefix.
}
fn test_f2() {
// Has prefix, but no `#[test]` attribute, ignore.
}
#[test]
fn test_f3() {
//~^ redundant_test_prefix
// Has prefix, has `#[test]` attribute. Not within a `#[cfg(test)]`.
// No collision with other functions, should emit warning.
}
#[cfg(test)]
#[test]
fn test_f4() {
//~^ redundant_test_prefix
// Has prefix, has `#[test]` attribute, within a `#[cfg(test)]`.
// No collision with other functions, should emit warning.
}
fn f5() {}
#[cfg(test)]
#[test]
fn test_f5() {
//~^ redundant_test_prefix
// Has prefix, has `#[test]` attribute, within a `#[cfg(test)]`.
// Collision with existing function.
}
mod m1 {
pub fn f6() {}
pub fn f7() {}
}
#[cfg(test)]
#[test]
fn test_f6() {
//~^ redundant_test_prefix
use m1::f6;
f6();
// Has prefix, has `#[test]` attribute, within a `#[cfg(test)]`.
// No collision, but has a function call that will result in recursion.
}
#[cfg(test)]
#[test]
fn test_f8() {
//~^ redundant_test_prefix
use m1::f7;
f7();
// Has prefix, has `#[test]` attribute, within a `#[cfg(test)]`.
// No collision, has function call, but it will not result in recursion.
}
// Although there's no direct call of `f` in the test, name collision still exists,
// since all `m3` functions are imported and then `map` is used to call `f`.
mod m2 {
mod m3 {
pub fn f(_: i32) -> i32 {
0
}
}
use m3::*;
#[cfg(test)]
#[test]
fn test_f() {
//~^ redundant_test_prefix
let a = Some(3);
let _ = a.map(f);
}
}
mod m3 {
fn test_m3_1() {
// Has prefix, but no `#[test]` attribute, ignore.
}
#[test]
fn test_m3_2() {
//~^ redundant_test_prefix
// Has prefix, has `#[test]` attribute. Not within a `#[cfg(test)]`.
// No collision with other functions, should emit warning.
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_foo() {
//~^ redundant_test_prefix
}
#[test]
fn test_foo_with_call() {
//~^ redundant_test_prefix
main();
}
#[test]
fn test_f1() {
//~^ redundant_test_prefix
}
#[test]
fn test_f2() {
//~^ redundant_test_prefix
}
#[test]
fn test_f3() {
//~^ redundant_test_prefix
}
#[test]
fn test_f4() {
//~^ redundant_test_prefix
}
#[test]
fn test_f5() {
//~^ redundant_test_prefix
}
#[test]
fn test_f6() {
//~^ redundant_test_prefix
}
#[test]
fn test_1() {
//~^ redundant_test_prefix
// `1` is invalid function name, so suggestion to rename is emitted
}
#[test]
fn test_const() {
//~^ redundant_test_prefix
// `const` is reserved keyword, so suggestion to rename is emitted
}
#[test]
fn test_async() {
//~^ redundant_test_prefix
// `async` is reserved keyword, so suggestion to rename is emitted
}
#[test]
fn test_yield() {
//~^ redundant_test_prefix
// `yield` is reserved keyword for future use, so suggestion to rename is emitted
}
#[test]
fn test_() {
//~^ redundant_test_prefix
// `` is invalid function name, so suggestion to rename is emitted
}
}
mod tests_no_annotations {
use super::*;
#[test]
fn test_foo() {
//~^ redundant_test_prefix
}
#[test]
fn test_foo_with_call() {
//~^ redundant_test_prefix
main();
}
#[test]
fn test_f1() {
//~^ redundant_test_prefix
}
#[test]
fn test_f2() {
//~^ redundant_test_prefix
}
#[test]
fn test_f3() {
//~^ redundant_test_prefix
}
#[test]
fn test_f4() {
//~^ redundant_test_prefix
}
#[test]
fn test_f5() {
//~^ redundant_test_prefix
}
#[test]
fn test_f6() {
//~^ redundant_test_prefix
}
#[test]
fn test_1() {
//~^ redundant_test_prefix
// `1` is invalid function name, so suggestion to rename is emitted
}
#[test]
fn test_const() {
//~^ redundant_test_prefix
// `const` is reserved keyword, so suggestion to rename is emitted
}
#[test]
fn test_async() {
//~^ redundant_test_prefix
// `async` is reserved keyword, so suggestion to rename is emitted
}
#[test]
fn test_yield() {
//~^ redundant_test_prefix
// `yield` is reserved keyword for future use, so suggestion to rename is emitted
}
#[test]
fn test_() {
//~^ redundant_test_prefix
// `` is invalid function name, so suggestion to rename is emitted
}
}
// This test is inspired by real test in `clippy_utils/src/sugg.rs`.
// The `is_in_test_function()` checks whether any identifier within a given node's parents is
// marked with `#[test]` attribute. Thus flagging false positives when nested functions are
// prefixed with `test_`. Therefore `is_test_function()` has been defined in `clippy_utils`,
// allowing to select only functions that are immediately marked with `#[test]` annotation.
//
// This test case ensures that for such nested functions no error is emitted.
#[test]
fn not_op() {
fn test_not(foo: bool) {
assert!(foo);
}
// Use helper function
test_not(true);
test_not(false);
}