]>
Commit | Line | Data |
---|---|---|
5869c6ff XL |
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() { | |
923072b8 FG |
81 | let u = (Box::new(0), Box::new(0)); |
82 | let v: [(Box<_>, Box<_>); 4] = [u.clone(), u.clone(), u.clone(), u]; | |
5869c6ff XL |
83 | let mut i = 0; |
84 | v.iter().rposition(|_elt| { | |
85 | if i == 2 { | |
86 | panic!() | |
87 | } | |
88 | i += 1; | |
89 | false | |
90 | }); | |
91 | } |