Skip to content

Commit 3ce9700

Browse files
committed
library/core/test/iter.rs split attempt 2
1 parent 202720b commit 3ce9700

33 files changed

+3574
-3681
lines changed

library/core/tests/iter.rs

-3,681
This file was deleted.
+217
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
use super::*;
2+
use core::iter::*;
3+
4+
#[test]
5+
fn test_iterator_chain() {
6+
let xs = [0, 1, 2, 3, 4, 5];
7+
let ys = [30, 40, 50, 60];
8+
let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
9+
let it = xs.iter().chain(&ys);
10+
let mut i = 0;
11+
for &x in it {
12+
assert_eq!(x, expected[i]);
13+
i += 1;
14+
}
15+
assert_eq!(i, expected.len());
16+
17+
let ys = (30..).step_by(10).take(4);
18+
let it = xs.iter().cloned().chain(ys);
19+
let mut i = 0;
20+
for x in it {
21+
assert_eq!(x, expected[i]);
22+
i += 1;
23+
}
24+
assert_eq!(i, expected.len());
25+
}
26+
#[test]
27+
fn test_iterator_chain_advance_by() {
28+
fn test_chain(xs: &[i32], ys: &[i32]) {
29+
let len = xs.len() + ys.len();
30+
31+
for i in 0..xs.len() {
32+
let mut iter = Unfuse::new(xs).chain(Unfuse::new(ys));
33+
iter.advance_by(i).unwrap();
34+
assert_eq!(iter.next(), Some(&xs[i]));
35+
assert_eq!(iter.advance_by(100), Err(len - i - 1));
36+
}
37+
38+
for i in 0..ys.len() {
39+
let mut iter = Unfuse::new(xs).chain(Unfuse::new(ys));
40+
iter.advance_by(xs.len() + i).unwrap();
41+
assert_eq!(iter.next(), Some(&ys[i]));
42+
assert_eq!(iter.advance_by(100), Err(ys.len() - i - 1));
43+
}
44+
45+
let mut iter = xs.iter().chain(ys);
46+
iter.advance_by(len).unwrap();
47+
assert_eq!(iter.next(), None);
48+
49+
let mut iter = xs.iter().chain(ys);
50+
assert_eq!(iter.advance_by(len + 1), Err(len));
51+
}
52+
53+
test_chain(&[], &[]);
54+
test_chain(&[], &[0, 1, 2, 3, 4, 5]);
55+
test_chain(&[0, 1, 2, 3, 4, 5], &[]);
56+
test_chain(&[0, 1, 2, 3, 4, 5], &[30, 40, 50, 60]);
57+
}
58+
#[test]
59+
fn test_iterator_chain_advance_back_by() {
60+
fn test_chain(xs: &[i32], ys: &[i32]) {
61+
let len = xs.len() + ys.len();
62+
63+
for i in 0..ys.len() {
64+
let mut iter = Unfuse::new(xs).chain(Unfuse::new(ys));
65+
iter.advance_back_by(i).unwrap();
66+
assert_eq!(iter.next_back(), Some(&ys[ys.len() - i - 1]));
67+
assert_eq!(iter.advance_back_by(100), Err(len - i - 1));
68+
}
69+
70+
for i in 0..xs.len() {
71+
let mut iter = Unfuse::new(xs).chain(Unfuse::new(ys));
72+
iter.advance_back_by(ys.len() + i).unwrap();
73+
assert_eq!(iter.next_back(), Some(&xs[xs.len() - i - 1]));
74+
assert_eq!(iter.advance_back_by(100), Err(xs.len() - i - 1));
75+
}
76+
77+
let mut iter = xs.iter().chain(ys);
78+
iter.advance_back_by(len).unwrap();
79+
assert_eq!(iter.next_back(), None);
80+
81+
let mut iter = xs.iter().chain(ys);
82+
assert_eq!(iter.advance_back_by(len + 1), Err(len));
83+
}
84+
85+
test_chain(&[], &[]);
86+
test_chain(&[], &[0, 1, 2, 3, 4, 5]);
87+
test_chain(&[0, 1, 2, 3, 4, 5], &[]);
88+
test_chain(&[0, 1, 2, 3, 4, 5], &[30, 40, 50, 60]);
89+
}
90+
#[test]
91+
fn test_iterator_chain_nth() {
92+
let xs = [0, 1, 2, 3, 4, 5];
93+
let ys = [30, 40, 50, 60];
94+
let zs = [];
95+
let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
96+
for (i, x) in expected.iter().enumerate() {
97+
assert_eq!(Some(x), xs.iter().chain(&ys).nth(i));
98+
}
99+
assert_eq!(zs.iter().chain(&xs).nth(0), Some(&0));
100+
101+
let mut it = xs.iter().chain(&zs);
102+
assert_eq!(it.nth(5), Some(&5));
103+
assert_eq!(it.next(), None);
104+
}
105+
#[test]
106+
fn test_iterator_chain_nth_back() {
107+
let xs = [0, 1, 2, 3, 4, 5];
108+
let ys = [30, 40, 50, 60];
109+
let zs = [];
110+
let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
111+
for (i, x) in expected.iter().rev().enumerate() {
112+
assert_eq!(Some(x), xs.iter().chain(&ys).nth_back(i));
113+
}
114+
assert_eq!(zs.iter().chain(&xs).nth_back(0), Some(&5));
115+
116+
let mut it = xs.iter().chain(&zs);
117+
assert_eq!(it.nth_back(5), Some(&0));
118+
assert_eq!(it.next(), None);
119+
}
120+
#[test]
121+
fn test_iterator_chain_last() {
122+
let xs = [0, 1, 2, 3, 4, 5];
123+
let ys = [30, 40, 50, 60];
124+
let zs = [];
125+
assert_eq!(xs.iter().chain(&ys).last(), Some(&60));
126+
assert_eq!(zs.iter().chain(&ys).last(), Some(&60));
127+
assert_eq!(ys.iter().chain(&zs).last(), Some(&60));
128+
assert_eq!(zs.iter().chain(&zs).last(), None);
129+
}
130+
#[test]
131+
fn test_iterator_chain_count() {
132+
let xs = [0, 1, 2, 3, 4, 5];
133+
let ys = [30, 40, 50, 60];
134+
let zs = [];
135+
assert_eq!(xs.iter().chain(&ys).count(), 10);
136+
assert_eq!(zs.iter().chain(&ys).count(), 4);
137+
}
138+
#[test]
139+
fn test_iterator_chain_find() {
140+
let xs = [0, 1, 2, 3, 4, 5];
141+
let ys = [30, 40, 50, 60];
142+
let mut iter = xs.iter().chain(&ys);
143+
assert_eq!(iter.find(|&&i| i == 4), Some(&4));
144+
assert_eq!(iter.next(), Some(&5));
145+
assert_eq!(iter.find(|&&i| i == 40), Some(&40));
146+
assert_eq!(iter.next(), Some(&50));
147+
assert_eq!(iter.find(|&&i| i == 100), None);
148+
assert_eq!(iter.next(), None);
149+
}
150+
#[test]
151+
fn test_iterator_chain_size_hint() {
152+
// this chains an iterator of length 0 with an iterator of length 1,
153+
// so after calling `.next()` once, the iterator is empty and the
154+
// state is `ChainState::Back`. `.size_hint()` should now disregard
155+
// the size hint of the left iterator
156+
let mut iter = Toggle { is_empty: true }.chain(once(()));
157+
assert_eq!(iter.next(), Some(()));
158+
assert_eq!(iter.size_hint(), (0, Some(0)));
159+
160+
let mut iter = once(()).chain(Toggle { is_empty: true });
161+
assert_eq!(iter.next_back(), Some(()));
162+
assert_eq!(iter.size_hint(), (0, Some(0)));
163+
}
164+
#[test]
165+
fn test_iterator_chain_unfused() {
166+
// Chain shouldn't be fused in its second iterator, depending on direction
167+
let mut iter = NonFused::new(empty()).chain(Toggle { is_empty: true });
168+
iter.next().unwrap_none();
169+
iter.next().unwrap();
170+
iter.next().unwrap_none();
171+
172+
let mut iter = Toggle { is_empty: true }.chain(NonFused::new(empty()));
173+
iter.next_back().unwrap_none();
174+
iter.next_back().unwrap();
175+
iter.next_back().unwrap_none();
176+
}
177+
#[test]
178+
fn test_chain_fold() {
179+
let xs = [1, 2, 3];
180+
let ys = [1, 2, 0];
181+
182+
let mut iter = xs.iter().chain(&ys);
183+
iter.next();
184+
let mut result = Vec::new();
185+
iter.fold((), |(), &elt| result.push(elt));
186+
assert_eq!(&[2, 3, 1, 2, 0], &result[..]);
187+
}
188+
#[test]
189+
fn test_chain_try_folds() {
190+
let c = || (0..10).chain(10..20);
191+
192+
let f = &|acc, x| i32::checked_add(2 * acc, x);
193+
assert_eq!(c().try_fold(7, f), (0..20).try_fold(7, f));
194+
assert_eq!(c().try_rfold(7, f), (0..20).rev().try_fold(7, f));
195+
196+
let mut iter = c();
197+
assert_eq!(iter.position(|x| x == 5), Some(5));
198+
assert_eq!(iter.next(), Some(6), "stopped in front, state Both");
199+
assert_eq!(iter.position(|x| x == 13), Some(6));
200+
assert_eq!(iter.next(), Some(14), "stopped in back, state Back");
201+
assert_eq!(iter.try_fold(0, |acc, x| Some(acc + x)), Some((15..20).sum()));
202+
203+
let mut iter = c().rev(); // use rev to access try_rfold
204+
assert_eq!(iter.position(|x| x == 15), Some(4));
205+
assert_eq!(iter.next(), Some(14), "stopped in back, state Both");
206+
assert_eq!(iter.position(|x| x == 5), Some(8));
207+
assert_eq!(iter.next(), Some(4), "stopped in front, state Front");
208+
assert_eq!(iter.try_fold(0, |acc, x| Some(acc + x)), Some((0..4).sum()));
209+
210+
let mut iter = c();
211+
iter.by_ref().rev().nth(14); // skip the last 15, ending in state Front
212+
assert_eq!(iter.try_fold(7, f), (0..5).try_fold(7, f));
213+
214+
let mut iter = c();
215+
iter.nth(14); // skip the first 15, ending in state Back
216+
assert_eq!(iter.try_rfold(7, f), (15..20).try_rfold(7, f));
217+
}
+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use core::iter::*;
2+
3+
#[test]
4+
fn test_cloned() {
5+
let xs = [2, 4, 6, 8];
6+
7+
let mut it = xs.iter().cloned();
8+
assert_eq!(it.len(), 4);
9+
assert_eq!(it.next(), Some(2));
10+
assert_eq!(it.len(), 3);
11+
assert_eq!(it.next(), Some(4));
12+
assert_eq!(it.len(), 2);
13+
assert_eq!(it.next_back(), Some(8));
14+
assert_eq!(it.len(), 1);
15+
assert_eq!(it.next_back(), Some(6));
16+
assert_eq!(it.len(), 0);
17+
assert_eq!(it.next_back(), None);
18+
}
19+
#[test]
20+
fn test_cloned_side_effects() {
21+
let mut count = 0;
22+
{
23+
let iter = [1, 2, 3]
24+
.iter()
25+
.map(|x| {
26+
count += 1;
27+
x
28+
})
29+
.cloned()
30+
.zip(&[1]);
31+
for _ in iter {}
32+
}
33+
assert_eq!(count, 2);
34+
}
35+
#[test]
36+
fn test_cloned_try_folds() {
37+
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
38+
let f = &|acc, x| i32::checked_add(2 * acc, x);
39+
let f_ref = &|acc, &x| i32::checked_add(2 * acc, x);
40+
assert_eq!(a.iter().cloned().try_fold(7, f), a.iter().try_fold(7, f_ref));
41+
assert_eq!(a.iter().cloned().try_rfold(7, f), a.iter().try_rfold(7, f_ref));
42+
43+
let a = [10, 20, 30, 40, 100, 60, 70, 80, 90];
44+
let mut iter = a.iter().cloned();
45+
assert_eq!(iter.try_fold(0_i8, |acc, x| acc.checked_add(x)), None);
46+
assert_eq!(iter.next(), Some(60));
47+
let mut iter = a.iter().cloned();
48+
assert_eq!(iter.try_rfold(0_i8, |acc, x| acc.checked_add(x)), None);
49+
assert_eq!(iter.next_back(), Some(70));
50+
}
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use core::iter::*;
2+
3+
#[test]
4+
fn test_copied() {
5+
let xs = [2, 4, 6, 8];
6+
7+
let mut it = xs.iter().copied();
8+
assert_eq!(it.len(), 4);
9+
assert_eq!(it.next(), Some(2));
10+
assert_eq!(it.len(), 3);
11+
assert_eq!(it.next(), Some(4));
12+
assert_eq!(it.len(), 2);
13+
assert_eq!(it.next_back(), Some(8));
14+
assert_eq!(it.len(), 1);
15+
assert_eq!(it.next_back(), Some(6));
16+
assert_eq!(it.len(), 0);
17+
assert_eq!(it.next_back(), None);
18+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use core::iter::*;
2+
3+
#[test]
4+
fn test_cycle() {
5+
let cycle_len = 3;
6+
let it = (0..).step_by(1).take(cycle_len).cycle();
7+
assert_eq!(it.size_hint(), (usize::MAX, None));
8+
for (i, x) in it.take(100).enumerate() {
9+
assert_eq!(i % cycle_len, x);
10+
}
11+
12+
let mut it = (0..).step_by(1).take(0).cycle();
13+
assert_eq!(it.size_hint(), (0, Some(0)));
14+
assert_eq!(it.next(), None);
15+
16+
assert_eq!(empty::<i32>().cycle().fold(0, |acc, x| acc + x), 0);
17+
18+
assert_eq!(once(1).cycle().skip(1).take(4).fold(0, |acc, x| acc + x), 4);
19+
20+
assert_eq!((0..10).cycle().take(5).sum::<i32>(), 10);
21+
assert_eq!((0..10).cycle().take(15).sum::<i32>(), 55);
22+
assert_eq!((0..10).cycle().take(25).sum::<i32>(), 100);
23+
24+
let mut iter = (0..10).cycle();
25+
iter.nth(14);
26+
assert_eq!(iter.take(8).sum::<i32>(), 38);
27+
28+
let mut iter = (0..10).cycle();
29+
iter.nth(9);
30+
assert_eq!(iter.take(3).sum::<i32>(), 3);
31+
}

0 commit comments

Comments
 (0)