diff options
| author | Tim Vermeulen <tvermeulen@me.com> | 2020-02-05 00:09:11 +0100 |
|---|---|---|
| committer | Tim Vermeulen <tvermeulen@me.com> | 2020-03-17 00:03:43 +0100 |
| commit | 8cf33b0d9d0d4948790ce2ea7f7bf786fb7759f1 (patch) | |
| tree | 1ee4ccaef55685be968c7c73337a934af5116eff /src/libcore | |
| parent | cff1182bcdf0f35cdb65d4560270b6afed856064 (diff) | |
| download | rust-8cf33b0d9d0d4948790ce2ea7f7bf786fb7759f1.tar.gz rust-8cf33b0d9d0d4948790ce2ea7f7bf786fb7759f1.zip | |
Add tests
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/tests/iter.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs index 5b41ef35065..98e3eeb982b 100644 --- a/src/libcore/tests/iter.rs +++ b/src/libcore/tests/iter.rs @@ -1,3 +1,5 @@ +// ignore-tidy-filelength + use core::cell::Cell; use core::convert::TryFrom; use core::iter::*; @@ -2940,3 +2942,73 @@ fn test_partition() { check(xs, |&x| x < 3, 3); // small check(xs, |&x| x > 6, 3); // large } + +/// An iterator that panics whenever `next` or next_back` is called +/// after `None` has already been returned. This does not violate +/// `Iterator`'s contract. Used to test that iterator adaptors don't +/// poll their inner iterators after exhausting them. +struct NonFused<I> { + iter: I, + done: bool, +} + +impl<I> NonFused<I> { + fn new(iter: I) -> Self { + Self { iter, done: false } + } +} + +impl<I> Iterator for NonFused<I> +where + I: Iterator, +{ + type Item = I::Item; + + fn next(&mut self) -> Option<Self::Item> { + assert!(!self.done, "this iterator has already returned None"); + self.iter.next().or_else(|| { + self.done = true; + None + }) + } +} + +impl<I> DoubleEndedIterator for NonFused<I> +where + I: DoubleEndedIterator, +{ + fn next_back(&mut self) -> Option<Self::Item> { + assert!(!self.done, "this iterator has already returned None"); + self.iter.next_back().or_else(|| { + self.done = true; + None + }) + } +} + +#[test] +fn test_peekable_non_fused() { + let mut iter = NonFused::new(empty::<i32>()).peekable(); + + assert_eq!(iter.peek(), None); + assert_eq!(iter.next_back(), None); +} + +#[test] +fn test_flatten_non_fused_outer() { + let mut iter = NonFused::new(once(0..2)).flatten(); + + assert_eq!(iter.next_back(), Some(1)); + assert_eq!(iter.next(), Some(0)); + assert_eq!(iter.next(), None); +} + +#[test] +fn test_flatten_non_fused_inner() { + let mut iter = once(0..1).chain(once(1..3)).flat_map(NonFused::new); + + assert_eq!(iter.next_back(), Some(2)); + assert_eq!(iter.next(), Some(0)); + assert_eq!(iter.next(), Some(1)); + assert_eq!(iter.next(), None); +} |
