1 #![allow(clippy::uninlined_format_args)]
2 
3 use syn::punctuated::{Pair, Punctuated};
4 use syn::Token;
5 
6 #[macro_use]
7 mod macros;
8 
9 macro_rules! check_exact_size_iterator {
10     ($iter:expr) => {{
11         let iter = $iter;
12         let size_hint = iter.size_hint();
13         let len = iter.len();
14         let count = iter.count();
15         assert_eq!(len, count);
16         assert_eq!(size_hint, (count, Some(count)));
17     }};
18 }
19 
20 #[test]
pairs()21 fn pairs() {
22     let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4);
23 
24     check_exact_size_iterator!(p.pairs());
25     check_exact_size_iterator!(p.pairs_mut());
26     check_exact_size_iterator!(p.into_pairs());
27 
28     let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4);
29 
30     assert_eq!(p.pairs().next_back().map(Pair::into_value), Some(&4));
31     assert_eq!(
32         p.pairs_mut().next_back().map(Pair::into_value),
33         Some(&mut 4)
34     );
35     assert_eq!(p.into_pairs().next_back().map(Pair::into_value), Some(4));
36 }
37 
38 #[test]
iter()39 fn iter() {
40     let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4);
41 
42     check_exact_size_iterator!(p.iter());
43     check_exact_size_iterator!(p.iter_mut());
44     check_exact_size_iterator!(p.into_iter());
45 
46     let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4);
47 
48     assert_eq!(p.iter().next_back(), Some(&4));
49     assert_eq!(p.iter_mut().next_back(), Some(&mut 4));
50     assert_eq!(p.into_iter().next_back(), Some(4));
51 }
52 
53 #[test]
may_dangle()54 fn may_dangle() {
55     let p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4);
56     for element in &p {
57         if *element == 2 {
58             drop(p);
59             break;
60         }
61     }
62 
63     let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4);
64     for element in &mut p {
65         if *element == 2 {
66             drop(p);
67             break;
68         }
69     }
70 }
71