#![allow( clippy::map_unwrap_or, clippy::needless_lifetimes, clippy::uninlined_format_args )] use syn::punctuated::{Pair, Punctuated}; use syn::{parse_quote, GenericParam, Generics, Lifetime, LifetimeParam, Token}; #[macro_use] mod macros; macro_rules! check_exact_size_iterator { ($iter:expr) => {{ let iter = $iter; let size_hint = iter.size_hint(); let len = iter.len(); let count = iter.count(); assert_eq!(len, count); assert_eq!(size_hint, (count, Some(count))); }}; } #[test] fn pairs() { let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); check_exact_size_iterator!(p.pairs()); check_exact_size_iterator!(p.pairs_mut()); check_exact_size_iterator!(p.into_pairs()); let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); assert_eq!(p.pairs().next_back().map(Pair::into_value), Some(&4)); assert_eq!( p.pairs_mut().next_back().map(Pair::into_value), Some(&mut 4) ); assert_eq!(p.into_pairs().next_back().map(Pair::into_value), Some(4)); } #[test] fn iter() { let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); check_exact_size_iterator!(p.iter()); check_exact_size_iterator!(p.iter_mut()); check_exact_size_iterator!(p.into_iter()); let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); assert_eq!(p.iter().next_back(), Some(&4)); assert_eq!(p.iter_mut().next_back(), Some(&mut 4)); assert_eq!(p.into_iter().next_back(), Some(4)); } #[test] fn may_dangle() { let p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); for element in &p { if *element == 2 { drop(p); break; } } let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); for element in &mut p { if *element == 2 { drop(p); break; } } } // Regression test for https://github.com/dtolnay/syn/issues/1718 #[test] fn no_opaque_drop() { let mut generics = Generics::default(); let _ = generics .lifetimes() .next() .map(|param| param.lifetime.clone()) .unwrap_or_else(|| { let lifetime: Lifetime = parse_quote!('a); generics.params.insert( 0, GenericParam::Lifetime(LifetimeParam::new(lifetime.clone())), ); lifetime }); }