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] |
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] |
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] |
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 | |