| #![warn(clippy::assert_is_empty)] |
| #![allow(clippy::useless_vec)] |
| #![allow(clippy::const_is_empty, clippy::needless_ifs)] |
| |
| fn main() { |
| let vec = vec![1, 2, 3]; |
| assert_eq!(vec, [] as [i32; 0]); |
| //~^ assert_is_empty |
| assert_ne!(vec, [] as [i32; 0]); |
| //~^ assert_is_empty |
| debug_assert_eq!(vec, [] as [i32; 0]); |
| //~^ assert_is_empty |
| debug_assert_ne!(vec, [] as [i32; 0]); |
| //~^ assert_is_empty |
| |
| let vec_ref = &vec; |
| assert_eq!(vec_ref.as_slice(), []); |
| //~^ assert_is_empty |
| assert_ne!(vec_ref.as_slice(), []); |
| //~^ assert_is_empty |
| |
| let vec_mut_ref = &mut vec![1, 2, 3]; |
| assert_eq!(vec_mut_ref.as_slice(), []); |
| //~^ assert_is_empty |
| |
| let slice: &[i32] = &[1, 2, 3]; |
| assert_eq!(slice, []); |
| //~^ assert_is_empty |
| assert_ne!(slice, []); |
| //~^ assert_is_empty |
| |
| let array = [1, 2, 3]; |
| assert_eq!(array.as_slice(), []); |
| //~^ assert_is_empty |
| assert_ne!(array.as_slice(), []); |
| //~^ assert_is_empty |
| |
| let array_ref = &array; |
| assert_eq!(array_ref.as_slice(), []); |
| //~^ assert_is_empty |
| |
| let string = String::from("foo"); |
| assert_eq!(string, ""); |
| //~^ assert_is_empty |
| assert_ne!(string, ""); |
| //~^ assert_is_empty |
| |
| let str_ref = "foo"; |
| assert_eq!(str_ref, ""); |
| //~^ assert_is_empty |
| assert_ne!(str_ref, ""); |
| //~^ assert_is_empty |
| |
| // Don't lint: has assert message. |
| assert!(vec.is_empty(), "items should be empty"); |
| assert!(!vec.is_empty(), "items should not be empty"); |
| assert!(vec.is_empty(), "unexpected values: {vec:?}"); |
| assert!(!vec.is_empty(), "unexpected values: {vec:?}"); |
| |
| // Common chained assertion shape. The first assertion can hide the value |
| // that the second assertion would otherwise help diagnose. |
| let items = vec!["baz"]; |
| assert_ne!(items, [] as [&str; 0]); |
| //~^ assert_is_empty |
| assert_eq!(items[0], "bar"); |
| |
| // Don't lint: the outer `assert!` is written here, but the condition comes |
| // from a macro expansion. Rewriting the expanded condition span would make |
| // the suggestion point at generated code rather than source code. |
| macro_rules! is_empty { |
| ($value:expr) => { |
| $value.is_empty() |
| }; |
| } |
| assert!(is_empty!(vec)); |
| |
| // Don't lint: the `assert!` itself comes from a macro expansion. The lint |
| // only rewrites assert calls that are present at the call site. |
| macro_rules! assert_empty { |
| ($value:expr) => { |
| assert!($value.is_empty()) |
| }; |
| } |
| assert_empty!(vec); |
| |
| // Don't lint: not an assert macro. |
| if vec.is_empty() {} |
| if !vec.is_empty() {} |
| |
| // Don't lint: maps do not have a compact empty literal suggestion. This is |
| // a conservative call; comparing against `HashMap::new()` may be worth |
| // revisiting if the type inference cost and constructor path are acceptable |
| // for aliases, custom hashers, and similar map types. |
| let map = std::collections::HashMap::<i32, i32>::new(); |
| assert!(map.is_empty()); |
| assert!(!map.is_empty()); |
| |
| // Don't lint: assert_eq! would require Debug and PartialEq for the element type. |
| struct NotDebugOrPartialEq; |
| let not_debug_or_partial_eq = vec![NotDebugOrPartialEq]; |
| assert!(not_debug_or_partial_eq.is_empty()); |
| |
| #[derive(Debug)] |
| struct NotPartialEq; |
| let not_partial_eq = vec![NotPartialEq]; |
| assert!(not_partial_eq.is_empty()); |
| |
| #[derive(PartialEq)] |
| struct NotDebug; |
| let not_debug = vec![NotDebug]; |
| assert!(not_debug.is_empty()); |
| } |