]> git.proxmox.com Git - rustc.git/blob - library/core/tests/iter/traits/double_ended.rs
New upstream version 1.51.0+dfsg1
[rustc.git] / library / core / tests / iter / traits / double_ended.rs
1 //! Note
2 //! ----
3 //! You're probably viewing this file because you're adding a test (or you might
4 //! just be browsing, in that case, hey there!).
5 //!
6 //! If you've made a test that happens to use one of DoubleEnded's methods, but
7 //! it tests another adapter or trait, you should *add it to the adapter or
8 //! trait's test file*.
9 //!
10 //! Some examples would be `adapters::cloned::test_cloned_try_folds` or
11 //! `adapters::flat_map::test_double_ended_flat_map`, which use `try_fold` and
12 //! `next_back`, but test their own adapter.
13
14 #[test]
15 fn test_iterator_rev_nth_back() {
16 let v: &[_] = &[0, 1, 2, 3, 4];
17 for i in 0..v.len() {
18 assert_eq!(v.iter().rev().nth_back(i).unwrap(), &v[i]);
19 }
20 assert_eq!(v.iter().rev().nth_back(v.len()), None);
21 }
22
23 #[test]
24 fn test_iterator_rev_nth() {
25 let v: &[_] = &[0, 1, 2, 3, 4];
26 for i in 0..v.len() {
27 assert_eq!(v.iter().rev().nth(i).unwrap(), &v[v.len() - 1 - i]);
28 }
29 assert_eq!(v.iter().rev().nth(v.len()), None);
30 }
31
32 #[test]
33 fn test_rev() {
34 let xs = [2, 4, 6, 8, 10, 12, 14, 16];
35 let mut it = xs.iter();
36 it.next();
37 it.next();
38 assert!(it.rev().cloned().collect::<Vec<isize>>() == vec![16, 14, 12, 10, 8, 6]);
39 }
40
41 #[test]
42 fn test_rev_try_folds() {
43 let f = &|acc, x| i32::checked_add(2 * acc, x);
44 assert_eq!((1..10).rev().try_fold(7, f), (1..10).try_rfold(7, f));
45 assert_eq!((1..10).rev().try_rfold(7, f), (1..10).try_fold(7, f));
46
47 let a = [10, 20, 30, 40, 100, 60, 70, 80, 90];
48 let mut iter = a.iter().rev();
49 assert_eq!(iter.try_fold(0_i8, |acc, &x| acc.checked_add(x)), None);
50 assert_eq!(iter.next(), Some(&70));
51 let mut iter = a.iter().rev();
52 assert_eq!(iter.try_rfold(0_i8, |acc, &x| acc.checked_add(x)), None);
53 assert_eq!(iter.next_back(), Some(&60));
54 }
55
56 #[test]
57 fn test_rposition() {
58 fn f(xy: &(isize, char)) -> bool {
59 let (_x, y) = *xy;
60 y == 'b'
61 }
62 fn g(xy: &(isize, char)) -> bool {
63 let (_x, y) = *xy;
64 y == 'd'
65 }
66 let v = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'b')];
67
68 assert_eq!(v.iter().rposition(f), Some(3));
69 assert!(v.iter().rposition(g).is_none());
70 }
71
72 #[test]
73 fn test_rev_rposition() {
74 let v = [0, 0, 1, 1];
75 assert_eq!(v.iter().rev().rposition(|&x| x == 1), Some(1));
76 }
77
78 #[test]
79 #[should_panic]
80 fn test_rposition_panic() {
81 let v: [(Box<_>, Box<_>); 4] = [(box 0, box 0), (box 0, box 0), (box 0, box 0), (box 0, box 0)];
82 let mut i = 0;
83 v.iter().rposition(|_elt| {
84 if i == 2 {
85 panic!()
86 }
87 i += 1;
88 false
89 });
90 }