1#![allow(clippy::uninlined_format_args)]
2
3use syn::punctuated::{Pair, Punctuated};
4use syn::Token;
5
6#[macro_use]
7mod macros;
8
9macro_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]
21fn 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]
39fn 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]
54fn 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