Skip to content

Commit bc830a2

Browse files
committed
library/core/tests/iter rearrange & add back missed doc comments
1 parent 1e3a2de commit bc830a2

18 files changed

+274
-270
lines changed

library/core/tests/iter/adapters/chain.rs

+44
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,47 @@ fn test_chain_try_folds() {
226226
iter.nth(14); // skip the first 15, ending in state Back
227227
assert_eq!(iter.try_rfold(7, f), (15..20).try_rfold(7, f));
228228
}
229+
230+
#[test]
231+
fn test_double_ended_chain() {
232+
let xs = [1, 2, 3, 4, 5];
233+
let ys = [7, 9, 11];
234+
let mut it = xs.iter().chain(&ys).rev();
235+
assert_eq!(it.next().unwrap(), &11);
236+
assert_eq!(it.next().unwrap(), &9);
237+
assert_eq!(it.next_back().unwrap(), &1);
238+
assert_eq!(it.next_back().unwrap(), &2);
239+
assert_eq!(it.next_back().unwrap(), &3);
240+
assert_eq!(it.next_back().unwrap(), &4);
241+
assert_eq!(it.next_back().unwrap(), &5);
242+
assert_eq!(it.next_back().unwrap(), &7);
243+
assert_eq!(it.next_back(), None);
244+
245+
// test that .chain() is well behaved with an unfused iterator
246+
struct CrazyIterator(bool);
247+
impl CrazyIterator {
248+
fn new() -> CrazyIterator {
249+
CrazyIterator(false)
250+
}
251+
}
252+
impl Iterator for CrazyIterator {
253+
type Item = i32;
254+
fn next(&mut self) -> Option<i32> {
255+
if self.0 {
256+
Some(99)
257+
} else {
258+
self.0 = true;
259+
None
260+
}
261+
}
262+
}
263+
264+
impl DoubleEndedIterator for CrazyIterator {
265+
fn next_back(&mut self) -> Option<i32> {
266+
self.next()
267+
}
268+
}
269+
270+
assert_eq!(CrazyIterator::new().chain(0..10).rev().last(), Some(0));
271+
assert!((0..10).chain(CrazyIterator::new()).rev().any(|i| i == 0));
272+
}

library/core/tests/iter/adapters/enumerate.rs

+13
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,16 @@ fn test_enumerate_try_folds() {
9292
assert_eq!(iter.try_rfold(0, f), None);
9393
assert_eq!(iter.next_back(), Some((11, 111)));
9494
}
95+
96+
#[test]
97+
fn test_double_ended_enumerate() {
98+
let xs = [1, 2, 3, 4, 5, 6];
99+
let mut it = xs.iter().cloned().enumerate();
100+
assert_eq!(it.next(), Some((0, 1)));
101+
assert_eq!(it.next(), Some((1, 2)));
102+
assert_eq!(it.next_back(), Some((5, 6)));
103+
assert_eq!(it.next_back(), Some((4, 5)));
104+
assert_eq!(it.next_back(), Some((3, 4)));
105+
assert_eq!(it.next_back(), Some((2, 3)));
106+
assert_eq!(it.next(), None);
107+
}

library/core/tests/iter/adapters/filter.rs

+10
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,13 @@ fn test_filter_try_folds() {
4040
assert_eq!(iter.try_rfold(0, i8::checked_add), None);
4141
assert_eq!(iter.next_back(), Some(31));
4242
}
43+
44+
#[test]
45+
fn test_double_ended_filter() {
46+
let xs = [1, 2, 3, 4, 5, 6];
47+
let mut it = xs.iter().filter(|&x| *x & 1 == 0);
48+
assert_eq!(it.next_back().unwrap(), &6);
49+
assert_eq!(it.next_back().unwrap(), &4);
50+
assert_eq!(it.next().unwrap(), &2);
51+
assert_eq!(it.next_back(), None);
52+
}

library/core/tests/iter/adapters/filter_map.rs

+24
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,27 @@ fn test_filter_map_fold() {
2424
});
2525
assert_eq!(i, 0);
2626
}
27+
28+
#[test]
29+
fn test_filter_map_try_folds() {
30+
let mp = &|x| if 0 <= x && x < 10 { Some(x * 2) } else { None };
31+
let f = &|acc, x| i32::checked_add(2 * acc, x);
32+
assert_eq!((-9..20).filter_map(mp).try_fold(7, f), (0..10).map(|x| 2 * x).try_fold(7, f));
33+
assert_eq!((-9..20).filter_map(mp).try_rfold(7, f), (0..10).map(|x| 2 * x).try_rfold(7, f));
34+
35+
let mut iter = (0..40).filter_map(|x| if x % 2 == 1 { None } else { Some(x * 2 + 10) });
36+
assert_eq!(iter.try_fold(0, i8::checked_add), None);
37+
assert_eq!(iter.next(), Some(38));
38+
assert_eq!(iter.try_rfold(0, i8::checked_add), None);
39+
assert_eq!(iter.next_back(), Some(78));
40+
}
41+
42+
#[test]
43+
fn test_double_ended_filter_map() {
44+
let xs = [1, 2, 3, 4, 5, 6];
45+
let mut it = xs.iter().filter_map(|&x| if x & 1 == 0 { Some(x * 2) } else { None });
46+
assert_eq!(it.next_back().unwrap(), 12);
47+
assert_eq!(it.next_back().unwrap(), 8);
48+
assert_eq!(it.next().unwrap(), 4);
49+
assert_eq!(it.next_back(), None);
50+
}

library/core/tests/iter/adapters/flat_map.rs

+19
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ fn test_iterator_flat_map() {
1313
assert_eq!(i, ys.len());
1414
}
1515

16+
/// Tests `FlatMap::fold` with items already picked off the front and back,
17+
/// to make sure all parts of the `FlatMap` are folded correctly.
1618
#[test]
1719
fn test_iterator_flat_map_fold() {
1820
let xs = [0, 3, 6];
@@ -53,3 +55,20 @@ fn test_flat_map_try_folds() {
5355
assert_eq!(iter.try_rfold(0, i8::checked_add), None);
5456
assert_eq!(iter.next_back(), Some(35));
5557
}
58+
59+
#[test]
60+
fn test_double_ended_flat_map() {
61+
let u = [0, 1];
62+
let v = [5, 6, 7, 8];
63+
let mut it = u.iter().flat_map(|x| &v[*x..v.len()]);
64+
assert_eq!(it.next_back().unwrap(), &8);
65+
assert_eq!(it.next().unwrap(), &5);
66+
assert_eq!(it.next_back().unwrap(), &7);
67+
assert_eq!(it.next_back().unwrap(), &6);
68+
assert_eq!(it.next_back().unwrap(), &8);
69+
assert_eq!(it.next().unwrap(), &6);
70+
assert_eq!(it.next_back().unwrap(), &7);
71+
assert_eq!(it.next_back(), None);
72+
assert_eq!(it.next(), None);
73+
assert_eq!(it.next_back(), None);
74+
}

library/core/tests/iter/adapters/flatten.rs

+19
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ fn test_iterator_flatten() {
1414
assert_eq!(i, ys.len());
1515
}
1616

17+
/// Tests `Flatten::fold` with items already picked off the front and back,
18+
/// to make sure all parts of the `Flatten` are folded correctly.
1719
#[test]
1820
fn test_iterator_flatten_fold() {
1921
let xs = [0, 3, 6];
@@ -73,3 +75,20 @@ fn test_flatten_non_fused_inner() {
7375
assert_eq!(iter.next(), Some(1));
7476
assert_eq!(iter.next(), None);
7577
}
78+
79+
#[test]
80+
fn test_double_ended_flatten() {
81+
let u = [0, 1];
82+
let v = [5, 6, 7, 8];
83+
let mut it = u.iter().map(|x| &v[*x..v.len()]).flatten();
84+
assert_eq!(it.next_back().unwrap(), &8);
85+
assert_eq!(it.next().unwrap(), &5);
86+
assert_eq!(it.next_back().unwrap(), &7);
87+
assert_eq!(it.next_back().unwrap(), &6);
88+
assert_eq!(it.next_back().unwrap(), &8);
89+
assert_eq!(it.next().unwrap(), &6);
90+
assert_eq!(it.next_back().unwrap(), &7);
91+
assert_eq!(it.next_back(), None);
92+
assert_eq!(it.next(), None);
93+
assert_eq!(it.next_back(), None);
94+
}

library/core/tests/iter/adapters/fuse.rs

+18
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,21 @@ fn test_fuse_fold() {
5555
});
5656
assert_eq!(i, xs.len());
5757
}
58+
59+
#[test]
60+
fn test_fuse() {
61+
let mut it = 0..3;
62+
assert_eq!(it.len(), 3);
63+
assert_eq!(it.next(), Some(0));
64+
assert_eq!(it.len(), 2);
65+
assert_eq!(it.next(), Some(1));
66+
assert_eq!(it.len(), 1);
67+
assert_eq!(it.next(), Some(2));
68+
assert_eq!(it.len(), 0);
69+
assert_eq!(it.next(), None);
70+
assert_eq!(it.len(), 0);
71+
assert_eq!(it.next(), None);
72+
assert_eq!(it.len(), 0);
73+
assert_eq!(it.next(), None);
74+
assert_eq!(it.len(), 0);
75+
}

library/core/tests/iter/adapters/intersperse.rs

+23
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,26 @@ fn test_intersperse_collect_string() {
129129
.collect::<String>();
130130
assert_eq!(contents_string, "1, 2, 3");
131131
}
132+
133+
#[test]
134+
fn test_try_fold_specialization_intersperse_err() {
135+
let orig_iter = ["a", "b"].iter().copied().intersperse("-");
136+
137+
// Abort after the first item.
138+
let mut iter = orig_iter.clone();
139+
iter.try_for_each(|_| None::<()>);
140+
assert_eq!(iter.next(), Some("-"));
141+
assert_eq!(iter.next(), Some("b"));
142+
assert_eq!(iter.next(), None);
143+
144+
// Abort after the second item.
145+
let mut iter = orig_iter.clone();
146+
iter.try_for_each(|item| if item == "-" { None } else { Some(()) });
147+
assert_eq!(iter.next(), Some("b"));
148+
assert_eq!(iter.next(), None);
149+
150+
// Abort after the third item.
151+
let mut iter = orig_iter.clone();
152+
iter.try_for_each(|item| if item == "b" { None } else { Some(()) });
153+
assert_eq!(iter.next(), None);
154+
}
+10-34
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,5 @@
11
use core::iter::*;
22

3-
#[test]
4-
fn test_find_map() {
5-
let xs: &[isize] = &[];
6-
assert_eq!(xs.iter().find_map(half_if_even), None);
7-
let xs: &[isize] = &[3, 5];
8-
assert_eq!(xs.iter().find_map(half_if_even), None);
9-
let xs: &[isize] = &[4, 5];
10-
assert_eq!(xs.iter().find_map(half_if_even), Some(2));
11-
let xs: &[isize] = &[3, 6];
12-
assert_eq!(xs.iter().find_map(half_if_even), Some(3));
13-
14-
let xs: &[isize] = &[1, 2, 3, 4, 5, 6, 7];
15-
let mut iter = xs.iter();
16-
assert_eq!(iter.find_map(half_if_even), Some(1));
17-
assert_eq!(iter.find_map(half_if_even), Some(2));
18-
assert_eq!(iter.find_map(half_if_even), Some(3));
19-
assert_eq!(iter.next(), Some(&7));
20-
21-
fn half_if_even(x: &isize) -> Option<isize> {
22-
if x % 2 == 0 { Some(x / 2) } else { None }
23-
}
24-
}
25-
263
#[test]
274
fn test_map_try_folds() {
285
let f = &|acc, x| i32::checked_add(2 * acc, x);
@@ -37,15 +14,14 @@ fn test_map_try_folds() {
3714
}
3815

3916
#[test]
40-
fn test_filter_map_try_folds() {
41-
let mp = &|x| if 0 <= x && x < 10 { Some(x * 2) } else { None };
42-
let f = &|acc, x| i32::checked_add(2 * acc, x);
43-
assert_eq!((-9..20).filter_map(mp).try_fold(7, f), (0..10).map(|x| 2 * x).try_fold(7, f));
44-
assert_eq!((-9..20).filter_map(mp).try_rfold(7, f), (0..10).map(|x| 2 * x).try_rfold(7, f));
45-
46-
let mut iter = (0..40).filter_map(|x| if x % 2 == 1 { None } else { Some(x * 2 + 10) });
47-
assert_eq!(iter.try_fold(0, i8::checked_add), None);
48-
assert_eq!(iter.next(), Some(38));
49-
assert_eq!(iter.try_rfold(0, i8::checked_add), None);
50-
assert_eq!(iter.next_back(), Some(78));
17+
fn test_double_ended_map() {
18+
let xs = [1, 2, 3, 4, 5, 6];
19+
let mut it = xs.iter().map(|&x| x * -1);
20+
assert_eq!(it.next(), Some(-1));
21+
assert_eq!(it.next(), Some(-2));
22+
assert_eq!(it.next_back(), Some(-6));
23+
assert_eq!(it.next_back(), Some(-5));
24+
assert_eq!(it.next(), Some(-3));
25+
assert_eq!(it.next_back(), Some(-4));
26+
assert_eq!(it.next(), None);
5127
}

library/core/tests/iter/adapters/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ mod peekable;
1515
mod scan;
1616
mod skip;
1717
mod skip_while;
18-
mod step;
1918
mod step_by;
2019
mod take;
2120
mod take_while;

library/core/tests/iter/adapters/zip.rs

+14
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,17 @@ fn test_zip_trusted_random_access_composition() {
231231
assert_trusted_random_access(&z2);
232232
assert_eq!(z2.next().unwrap(), ((1, 1), 1));
233233
}
234+
235+
#[test]
236+
fn test_double_ended_zip() {
237+
let xs = [1, 2, 3, 4, 5, 6];
238+
let ys = [1, 2, 3, 7];
239+
let a = xs.iter().cloned();
240+
let b = ys.iter().cloned();
241+
let mut it = a.zip(b);
242+
assert_eq!(it.next(), Some((1, 1)));
243+
assert_eq!(it.next(), Some((2, 2)));
244+
assert_eq!(it.next_back(), Some((4, 7)));
245+
assert_eq!(it.next_back(), Some((3, 3)));
246+
assert_eq!(it.next(), None);
247+
}

library/core/tests/iter/mod.rs

-23
Original file line numberDiff line numberDiff line change
@@ -83,26 +83,3 @@ pub fn extend_for_unit() {
8383
}
8484
assert_eq!(x, 5);
8585
}
86-
87-
#[test]
88-
fn test_try_fold_specialization_intersperse_err() {
89-
let orig_iter = ["a", "b"].iter().copied().intersperse("-");
90-
91-
// Abort after the first item.
92-
let mut iter = orig_iter.clone();
93-
iter.try_for_each(|_| None::<()>);
94-
assert_eq!(iter.next(), Some("-"));
95-
assert_eq!(iter.next(), Some("b"));
96-
assert_eq!(iter.next(), None);
97-
98-
// Abort after the second item.
99-
let mut iter = orig_iter.clone();
100-
iter.try_for_each(|item| if item == "-" { None } else { Some(()) });
101-
assert_eq!(iter.next(), Some("b"));
102-
assert_eq!(iter.next(), None);
103-
104-
// Abort after the third item.
105-
let mut iter = orig_iter.clone();
106-
iter.try_for_each(|item| if item == "b" { None } else { Some(()) });
107-
assert_eq!(iter.next(), None);
108-
}

library/core/tests/iter/range.rs

+13
Original file line numberDiff line numberDiff line change
@@ -431,3 +431,16 @@ fn test_range_inclusive_size_hint() {
431431
assert_eq!((imin..=imax).size_hint(), (usize::MAX, None));
432432
assert_eq!((imin..=imax + 1).size_hint(), (usize::MAX, None));
433433
}
434+
435+
#[test]
436+
fn test_double_ended_range() {
437+
assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
438+
for _ in (10..0).rev() {
439+
panic!("unreachable");
440+
}
441+
442+
assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
443+
for _ in (10..0).rev() {
444+
panic!("unreachable");
445+
}
446+
}

0 commit comments

Comments
 (0)