Skip to content

Commit 1d27a50

Browse files
committed
Test with non-fused iterators
1 parent bcacfe1 commit 1d27a50

File tree

1 file changed

+41
-4
lines changed

1 file changed

+41
-4
lines changed

library/core/tests/iter.rs

+41-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,43 @@ use core::cell::Cell;
44
use core::convert::TryFrom;
55
use core::iter::*;
66

7+
/// An iterator wrapper that panics whenever `next` or `next_back` is called
8+
/// after `None` has been returned.
9+
struct Unfuse<I> {
10+
iter: I,
11+
exhausted: bool,
12+
}
13+
14+
fn unfuse<I: IntoIterator>(iter: I) -> Unfuse<I::IntoIter> {
15+
Unfuse { iter: iter.into_iter(), exhausted: false }
16+
}
17+
18+
impl<I> Iterator for Unfuse<I>
19+
where
20+
I: Iterator,
21+
{
22+
type Item = I::Item;
23+
24+
fn next(&mut self) -> Option<Self::Item> {
25+
assert!(!self.exhausted);
26+
let next = self.iter.next();
27+
self.exhausted = next.is_none();
28+
next
29+
}
30+
}
31+
32+
impl<I> DoubleEndedIterator for Unfuse<I>
33+
where
34+
I: DoubleEndedIterator,
35+
{
36+
fn next_back(&mut self) -> Option<Self::Item> {
37+
assert!(!self.exhausted);
38+
let next = self.iter.next_back();
39+
self.exhausted = next.is_none();
40+
next
41+
}
42+
}
43+
744
#[test]
845
fn test_lt() {
946
let empty: [isize; 0] = [];
@@ -148,14 +185,14 @@ fn test_iterator_chain_advance_by() {
148185
let len = xs.len() + ys.len();
149186

150187
for i in 0..xs.len() {
151-
let mut iter = xs.iter().chain(ys);
188+
let mut iter = unfuse(xs).chain(unfuse(ys));
152189
iter.advance_by(i).unwrap();
153190
assert_eq!(iter.next(), Some(&xs[i]));
154191
assert_eq!(iter.advance_by(100), Err(len - i - 1));
155192
}
156193

157194
for i in 0..ys.len() {
158-
let mut iter = xs.iter().chain(ys);
195+
let mut iter = unfuse(xs).chain(unfuse(ys));
159196
iter.advance_by(xs.len() + i).unwrap();
160197
assert_eq!(iter.next(), Some(&ys[i]));
161198
assert_eq!(iter.advance_by(100), Err(ys.len() - i - 1));
@@ -181,14 +218,14 @@ fn test_iterator_chain_advance_back_by() {
181218
let len = xs.len() + ys.len();
182219

183220
for i in 0..ys.len() {
184-
let mut iter = xs.iter().chain(ys);
221+
let mut iter = unfuse(xs).chain(unfuse(ys));
185222
iter.advance_back_by(i).unwrap();
186223
assert_eq!(iter.next_back(), Some(&ys[ys.len() - i - 1]));
187224
assert_eq!(iter.advance_back_by(100), Err(len - i - 1));
188225
}
189226

190227
for i in 0..xs.len() {
191-
let mut iter = xs.iter().chain(ys);
228+
let mut iter = unfuse(xs).chain(unfuse(ys));
192229
iter.advance_back_by(ys.len() + i).unwrap();
193230
assert_eq!(iter.next_back(), Some(&xs[xs.len() - i - 1]));
194231
assert_eq!(iter.advance_back_by(100), Err(xs.len() - i - 1));

0 commit comments

Comments
 (0)