#![allow(clippy::unnecessary_fold)]
mod common;
use ::lender::prelude::*;
use common::*;
#[test]
fn peekable_basic() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
assert_eq!(peekable.peek(), Some(&&1));
assert_eq!(peekable.next(), Some(&1));
assert_eq!(peekable.peek(), Some(&&2));
assert_eq!(peekable.next(), Some(&2));
assert_eq!(peekable.peek(), Some(&&3));
assert_eq!(peekable.next(), Some(&3));
assert_eq!(peekable.peek(), None);
assert_eq!(peekable.next(), None);
}
#[test]
fn peekable_peek_mut() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert!(peekable.peek_mut().is_some());
assert_eq!(peekable.next(), Some(&1));
assert_eq!(peekable.next(), Some(&2));
}
#[test]
fn peekable_next_if() {
let mut peekable = VecLender::new(vec![1, 2, 3, 4]).peekable();
assert_eq!(peekable.next_if(|x| **x == 1), Some(&1));
assert_eq!(peekable.next_if(|x| **x == 10), None);
assert_eq!(peekable.peek(), Some(&&2));
assert_eq!(peekable.next(), Some(&2));
}
#[test]
fn peekable_next_if_eq() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.next_if_eq(&&1), Some(&1));
assert_eq!(peekable.next_if_eq(&&10), None);
assert_eq!(peekable.next(), Some(&2));
}
#[test]
fn peekable_empty() {
let mut peekable = VecLender::new(vec![]).peekable();
assert_eq!(peekable.peek(), None);
assert_eq!(peekable.next(), None);
}
#[test]
fn peekable_count() {
let mut peekable = VecLender::new(vec![1, 2, 3, 4, 5]).peekable();
peekable.peek(); assert_eq!(peekable.count(), 5);
}
#[test]
fn peekable_nth() {
let mut peekable = VecLender::new(vec![1, 2, 3, 4, 5]).peekable();
assert_eq!(peekable.nth(2), Some(&3));
assert_eq!(peekable.next(), Some(&4));
}
#[test]
fn peekable_last() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.last(), Some(&3));
}
#[test]
fn peekable_fold() {
let sum = VecLender::new(vec![1, 2, 3, 4])
.peekable()
.fold(0, |acc, x| acc + *x);
assert_eq!(sum, 10);
}
#[test]
fn peekable_size_hint() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.size_hint(), (3, Some(3)));
peekable.peek();
assert_eq!(peekable.size_hint(), (3, Some(3)));
peekable.next();
assert_eq!(peekable.size_hint(), (2, Some(2)));
}
#[test]
fn peekable_into_inner() {
let peekable = VecLender::new(vec![1, 2, 3]).peekable();
let inner = peekable.into_inner();
assert_eq!(inner.data, vec![1, 2, 3]);
}
#[test]
fn peekable_peek_multiple() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
assert_eq!(peekable.peek(), Some(&&1)); assert_eq!(peekable.next(), Some(&1));
assert_eq!(peekable.peek(), Some(&&2));
}
#[test]
fn peekable_peek_mut_additional() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert!(peekable.peek_mut().is_some());
assert_eq!(peekable.next(), Some(&1));
assert_eq!(peekable.next(), Some(&2)); }
#[test]
fn peekable_next_if_additional() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.next_if(|x| **x < 2), Some(&1));
assert_eq!(peekable.next_if(|x| **x < 2), None); assert_eq!(peekable.next(), Some(&2));
}
#[test]
fn peekable_next_if_eq_additional() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.next_if_eq(&&1), Some(&1));
assert_eq!(peekable.next_if_eq(&&1), None); assert_eq!(peekable.next_if_eq(&&2), Some(&2));
}
#[test]
fn peekable_fold_additional() {
let sum = VecLender::new(vec![1, 2, 3])
.peekable()
.fold(0, |acc, x| acc + *x);
assert_eq!(sum, 6);
}
#[test]
fn peekable_try_fold_additional() {
let result: Option<i32> = VecLender::new(vec![1, 2, 3])
.peekable()
.try_fold(0, |acc, x| Some(acc + *x));
assert_eq!(result, Some(6));
}
#[test]
fn peekable_size_hint_after_peek() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.size_hint(), (3, Some(3)));
peekable.peek();
assert_eq!(peekable.size_hint(), (3, Some(3)));
peekable.next();
assert_eq!(peekable.size_hint(), (2, Some(2)));
}
#[test]
fn peekable_nth_zero_with_peeked() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
assert_eq!(peekable.nth(0), Some(&1));
assert_eq!(peekable.next(), Some(&2));
}
#[test]
fn peekable_last_with_peeked_only() {
let mut peekable = VecLender::new(vec![1]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
assert_eq!(peekable.last(), Some(&1));
}
#[test]
fn peekable_next_back_with_peeked_exhausted() {
use lender::DoubleEndedLender;
let mut peekable = VecLender::new(vec![1]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
assert_eq!(peekable.next_back(), Some(&1));
assert_eq!(peekable.next(), None);
}
#[test]
fn peekable_rfold_with_peeked() {
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
let result = peekable.rfold(Vec::new(), |mut acc, &x| {
acc.push(x);
acc
});
assert_eq!(result, vec![3, 2, 1]);
}
#[test]
fn peekable_try_rfold_with_peeked_complete() {
use lender::DoubleEndedLender;
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
let result: Option<Vec<i32>> = peekable.try_rfold(Vec::new(), |mut acc, &x| {
acc.push(x);
Some(acc)
});
assert_eq!(result, Some(vec![3, 2, 1]));
}
#[test]
fn peekable_try_rfold_with_peeked_break() {
use lender::DoubleEndedLender;
let mut peekable = VecLender::new(vec![1, 2, 3]).peekable();
assert_eq!(peekable.peek(), Some(&&1));
let result: Option<i32> =
peekable.try_rfold(0, |acc, &x| if x == 2 { None } else { Some(acc + x) });
assert_eq!(result, None);
assert_eq!(peekable.next(), Some(&1));
assert_eq!(peekable.next(), None);
}
#[test]
fn chunk_basic() {
let mut lender = VecLender::new(vec![1, 2, 3, 4, 5]);
let mut chunk = lender.next_chunk(3);
assert_eq!(chunk.next(), Some(&1));
assert_eq!(chunk.next(), Some(&2));
assert_eq!(chunk.next(), Some(&3));
assert_eq!(chunk.next(), None);
assert_eq!(lender.next(), Some(&4));
assert_eq!(lender.next(), Some(&5));
}
#[test]
fn chunk_larger_than_remaining() {
let mut lender = VecLender::new(vec![1, 2]);
let mut chunk = lender.next_chunk(5);
assert_eq!(chunk.next(), Some(&1));
assert_eq!(chunk.next(), Some(&2));
assert_eq!(chunk.next(), None);
}
#[test]
fn chunk_empty_lender() {
let mut lender = VecLender::new(vec![]);
let mut chunk = lender.next_chunk(3);
assert_eq!(chunk.next(), None);
}
#[test]
fn chunk_size_hint() {
let mut chunky = VecLender::new(vec![1, 2, 3, 4, 5]).chunky(3);
let chunk = chunky.next().unwrap();
assert_eq!(chunk.size_hint(), (3, Some(3)));
}
#[test]
fn chunk_into_parts() {
let mut chunky = VecLender::new(vec![1, 2, 3]).chunky(2);
let chunk = chunky.next().unwrap();
let (lender, remaining) = chunk.into_parts();
assert_eq!(remaining, 2);
assert_eq!(lender.count(), 3); }
#[test]
fn chunky_basic() {
let mut chunky = VecLender::new(vec![1, 2, 3, 4, 5, 6]).chunky(2);
let mut chunk1 = chunky.next().unwrap();
assert_eq!(chunk1.next(), Some(&1));
assert_eq!(chunk1.next(), Some(&2));
assert_eq!(chunk1.next(), None);
let mut chunk2 = chunky.next().unwrap();
assert_eq!(chunk2.next(), Some(&3));
assert_eq!(chunk2.next(), Some(&4));
assert_eq!(chunk2.next(), None);
let mut chunk3 = chunky.next().unwrap();
assert_eq!(chunk3.next(), Some(&5));
assert_eq!(chunk3.next(), Some(&6));
assert_eq!(chunk3.next(), None);
assert!(chunky.next().is_none());
}
#[test]
fn chunky_uneven() {
let mut chunky = VecLender::new(vec![1, 2, 3, 4, 5]).chunky(2);
let mut chunk1 = chunky.next().unwrap();
assert_eq!(chunk1.next(), Some(&1));
assert_eq!(chunk1.next(), Some(&2));
assert_eq!(chunk1.next(), None);
let mut chunk2 = chunky.next().unwrap();
assert_eq!(chunk2.next(), Some(&3));
assert_eq!(chunk2.next(), Some(&4));
assert_eq!(chunk2.next(), None);
let mut chunk3 = chunky.next().unwrap();
assert_eq!(chunk3.next(), Some(&5));
assert_eq!(chunk3.next(), None);
assert!(chunky.next().is_none());
}
#[test]
fn chunky_size_hint() {
let chunky = VecLender::new(vec![1, 2, 3, 4, 5, 6]).chunky(2);
assert_eq!(chunky.size_hint(), (3, Some(3)));
let chunky2 = VecLender::new(vec![1, 2, 3, 4, 5]).chunky(2);
assert_eq!(chunky2.size_hint(), (3, Some(3))); }
#[test]
fn chunky_count() {
let chunky = VecLender::new(vec![1, 2, 3, 4, 5, 6, 7]).chunky(3);
assert_eq!(chunky.count(), 3); }
#[test]
fn chunky_fold() {
let num_chunks = VecLender::new(vec![1, 2, 3, 4, 5])
.chunky(2)
.fold(0, |acc, _chunk| acc + 1);
assert_eq!(num_chunks, 3);
}
#[test]
fn chunky_size_hint_decreases() {
let mut chunky = VecLender::new(vec![1, 2, 3, 4, 5, 6]).chunky(2);
assert_eq!(chunky.size_hint(), (3, Some(3)));
chunky.next();
assert_eq!(chunky.size_hint(), (2, Some(2)));
chunky.next();
assert_eq!(chunky.size_hint(), (1, Some(1)));
chunky.next();
assert_eq!(chunky.size_hint(), (0, Some(0)));
let chunky2 = VecLender::new(vec![1, 2, 3, 4, 5]).chunky(2);
assert_eq!(chunky2.size_hint(), (3, Some(3)));
}
#[test]
fn chunky_try_fold() {
let result: Option<i32> =
VecLender::new(vec![1, 2, 3, 4, 5, 6])
.chunky(2)
.try_fold(0, |acc, mut chunk| {
if let Some(first) = chunk.next() {
Some(acc + first)
} else {
Some(acc)
}
});
assert_eq!(result, Some(6)); }
#[test]
fn chunky_try_fold_full_consumption() {
let result: Option<i32> =
VecLender::new(vec![1, 2, 3, 4, 5, 6])
.chunky(2)
.try_fold(0, |acc, chunk| {
let chunk_sum = chunk.fold(0, |a, x| a + x);
Some(acc + chunk_sum)
});
assert_eq!(result, Some(21));
}
#[test]
fn chunky_into_parts() {
let chunky = VecLender::new(vec![1, 2, 3]).chunky(2);
let (lender, chunk_size) = chunky.into_parts();
assert_eq!(chunk_size, 2);
assert_eq!(lender.count(), 3);
}
#[test]
fn chunky_into_inner() {
let chunky = VecLender::new(vec![1, 2, 3]).chunky(2);
let lender = chunky.into_inner();
assert_eq!(lender.count(), 3);
}
#[test]
#[should_panic(expected = "chunk size must be non-zero")]
fn chunky_zero_panics() {
let _ = VecLender::new(vec![1, 2, 3]).chunky(0);
}