#![allow(clippy::unnecessary_fold)]
mod common;
use ::lender::prelude::*;
use common::*;
#[test]
fn chain_basic_forward_iteration() {
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4]));
assert_eq!(chained.next(), Some(&1));
assert_eq!(chained.next(), Some(&2));
assert_eq!(chained.next(), Some(&3));
assert_eq!(chained.next(), Some(&4));
assert_eq!(chained.next(), None);
assert_eq!(chained.next(), None);
}
#[test]
fn chain_double_ended_iteration() {
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4]));
assert_eq!(chained.next_back(), Some(&4));
assert_eq!(chained.next_back(), Some(&3));
assert_eq!(chained.next_back(), Some(&2));
assert_eq!(chained.next_back(), Some(&1));
assert_eq!(chained.next_back(), None);
}
#[test]
fn chain_mixed_forward_backward() {
let mut chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5, 6]));
assert_eq!(chained.next(), Some(&1));
assert_eq!(chained.next_back(), Some(&6));
assert_eq!(chained.next(), Some(&2));
assert_eq!(chained.next_back(), Some(&5));
assert_eq!(chained.next(), Some(&3));
assert_eq!(chained.next_back(), Some(&4));
assert_eq!(chained.next(), None);
assert_eq!(chained.next_back(), None);
}
#[test]
fn chain_empty_first_lender() {
let mut chained = VecLender::new(vec![]).chain(VecLender::new(vec![1, 2]));
assert_eq!(chained.next(), Some(&1));
assert_eq!(chained.next(), Some(&2));
assert_eq!(chained.next(), None);
}
#[test]
fn chain_empty_second_lender() {
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![]));
assert_eq!(chained.next(), Some(&1));
assert_eq!(chained.next(), Some(&2));
assert_eq!(chained.next(), None);
}
#[test]
fn chain_both_empty() {
let mut chained = VecLender::new(vec![]).chain(VecLender::new(vec![]));
assert_eq!(chained.next(), None);
assert_eq!(chained.next_back(), None);
}
#[test]
fn chain_count() {
let chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5]));
assert_eq!(chained.count(), 5);
let chained_empty = VecLender::new(vec![]).chain(VecLender::new(vec![]));
assert_eq!(chained_empty.count(), 0);
}
#[test]
fn chain_nth() {
let mut chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5, 6]));
assert_eq!(chained.nth(0), Some(&1));
assert_eq!(chained.nth(1), Some(&3));
assert_eq!(chained.nth(1), Some(&5));
assert_eq!(chained.nth(0), Some(&6));
assert_eq!(chained.nth(0), None);
}
#[test]
fn chain_nth_crossing_boundary() {
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4, 5]));
assert_eq!(chained.nth(3), Some(&4)); assert_eq!(chained.next(), Some(&5));
assert_eq!(chained.next(), None);
}
#[test]
fn chain_nth_back() {
let mut chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5, 6]));
assert_eq!(chained.nth_back(0), Some(&6));
assert_eq!(chained.nth_back(1), Some(&4));
assert_eq!(chained.nth_back(1), Some(&2));
assert_eq!(chained.nth_back(0), Some(&1));
assert_eq!(chained.nth_back(0), None);
}
#[test]
fn chain_last() {
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4]));
assert_eq!(chained.last(), Some(&4));
let mut chained2 = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![]));
assert_eq!(chained2.last(), Some(&2));
let mut chained3 = VecLender::new(vec![]).chain(VecLender::new(vec![]));
assert_eq!(chained3.last(), None);
}
#[test]
fn chain_find() {
let mut chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5, 6]));
assert_eq!(chained.find(|x| **x == 2), Some(&2));
assert_eq!(chained.find(|x| **x > 4), Some(&5));
}
#[test]
fn chain_rfind() {
let mut chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5, 6]));
assert_eq!(chained.rfind(|x| **x == 5), Some(&5));
assert_eq!(chained.rfind(|x| **x < 3), Some(&2));
}
#[test]
fn chain_size_hint() {
let chained = VecLender::new(vec![1, 2, 3]).chain(VecLender::new(vec![4, 5]));
assert_eq!(chained.size_hint(), (5, Some(5)));
let chained_empty = VecLender::new(vec![]).chain(VecLender::new(vec![]));
assert_eq!(chained_empty.size_hint(), (0, Some(0)));
}
#[test]
fn chain_fold() {
let sum = VecLender::new(vec![1, 2, 3])
.chain(VecLender::new(vec![4, 5, 6]))
.fold(0, |acc, x| acc + *x);
assert_eq!(sum, 21); }
#[test]
fn chain_rfold() {
let mut order = Vec::new();
VecLender::new(vec![1, 2, 3])
.chain(VecLender::new(vec![4, 5, 6]))
.rfold((), |(), x| order.push(*x));
assert_eq!(order, vec![6, 5, 4, 3, 2, 1]);
}
#[test]
fn chain_into_inner() {
let chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4]));
let (a, b) = chained.into_inner();
assert_eq!(a.data, vec![1, 2]);
assert_eq!(b.data, vec![3, 4]);
}
#[test]
fn advance_by_chain_additional() {
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4]));
assert_eq!(chained.advance_by(3), Ok(())); assert_eq!(chained.next(), Some(&4));
}
#[test]
fn advance_back_by_chain_additional() {
use lender::DoubleEndedLender;
let mut chained = VecLender::new(vec![1, 2]).chain(VecLender::new(vec![3, 4]));
assert_eq!(chained.advance_back_by(3), Ok(())); assert_eq!(chained.next(), Some(&1));
}
struct UnfusedLender {
values: Vec<i32>,
index: usize,
skip_next: bool,
}
impl UnfusedLender {
fn new(values: Vec<i32>) -> Self {
Self {
values,
index: 0,
skip_next: false,
}
}
}
impl<'lend> Lending<'lend> for UnfusedLender {
type Lend = i32;
}
impl Lender for UnfusedLender {
check_covariance!();
fn next(&mut self) -> Option<Lend<'_, Self>> {
if self.skip_next {
self.skip_next = false;
return None; }
if self.index < self.values.len() {
let val = self.values[self.index];
self.index += 1;
self.skip_next = true;
Some(val)
} else {
None
}
}
}
#[test]
fn fuse_basic_iteration() {
let mut fused = VecLender::new(vec![1, 2, 3]).fuse();
assert_eq!(fused.next(), Some(&1));
assert_eq!(fused.next(), Some(&2));
assert_eq!(fused.next(), Some(&3));
assert_eq!(fused.next(), None);
assert_eq!(fused.next(), None);
assert_eq!(fused.next(), None);
}
#[test]
fn fuse_guarantees_none_after_exhaustion() {
let mut fused = UnfusedLender::new(vec![1, 2, 3]).fuse();
assert_eq!(fused.next(), Some(1));
assert_eq!(fused.next(), None);
assert_eq!(fused.next(), None);
assert_eq!(fused.next(), None);
}
#[test]
fn fuse_double_ended() {
let mut fused = VecLender::new(vec![1, 2, 3, 4]).fuse();
assert_eq!(fused.next(), Some(&1));
assert_eq!(fused.next_back(), Some(&4));
assert_eq!(fused.next(), Some(&2));
assert_eq!(fused.next_back(), Some(&3));
assert_eq!(fused.next(), None);
assert_eq!(fused.next_back(), None);
assert_eq!(fused.next(), None);
assert_eq!(fused.next_back(), None);
}
#[test]
fn fuse_nth() {
let mut fused = VecLender::new(vec![1, 2, 3, 4, 5]).fuse();
assert_eq!(fused.nth(2), Some(&3));
assert_eq!(fused.nth(0), Some(&4));
assert_eq!(fused.nth(0), Some(&5));
assert_eq!(fused.nth(0), None);
assert_eq!(fused.nth(0), None);
}
#[test]
fn fuse_nth_back() {
let mut fused = VecLender::new(vec![1, 2, 3, 4, 5]).fuse();
assert_eq!(fused.nth_back(1), Some(&4));
assert_eq!(fused.nth_back(0), Some(&3));
assert_eq!(fused.nth_back(0), Some(&2));
assert_eq!(fused.nth_back(0), Some(&1));
assert_eq!(fused.nth_back(0), None);
assert_eq!(fused.nth_back(0), None);
}
#[test]
fn fuse_last() {
let mut fused = VecLender::new(vec![1, 2, 3]).fuse();
assert_eq!(fused.last(), Some(&3));
let mut fused2 = VecLender::new(vec![]).fuse();
assert_eq!(fused2.last(), None);
assert_eq!(fused2.last(), None);
}
#[test]
fn fuse_count() {
let fused = VecLender::new(vec![1, 2, 3, 4, 5]).fuse();
assert_eq!(fused.count(), 5);
let fused_empty = VecLender::new(vec![]).fuse();
assert_eq!(fused_empty.count(), 0);
}
#[test]
fn fuse_size_hint() {
let fused = VecLender::new(vec![1, 2, 3]).fuse();
assert_eq!(fused.size_hint(), (3, Some(3)));
let fused_empty = VecLender::new(vec![]).fuse();
assert_eq!(fused_empty.size_hint(), (0, Some(0)));
}
#[test]
fn fuse_size_hint_after_exhaustion() {
let mut fused = VecLender::new(vec![1, 2]).fuse();
assert_eq!(fused.size_hint(), (2, Some(2)));
fused.next();
assert_eq!(fused.size_hint(), (1, Some(1)));
fused.next();
assert_eq!(fused.size_hint(), (0, Some(0)));
fused.next(); assert_eq!(fused.size_hint(), (0, Some(0)));
}
#[test]
fn fuse_fold() {
let sum = VecLender::new(vec![1, 2, 3, 4])
.fuse()
.fold(0, |acc, x| acc + *x);
assert_eq!(sum, 10);
}
#[test]
fn fuse_rfold() {
let mut order = Vec::new();
VecLender::new(vec![1, 2, 3])
.fuse()
.rfold((), |(), x| order.push(*x));
assert_eq!(order, vec![3, 2, 1]);
}
#[test]
fn fuse_find() {
let mut fused = VecLender::new(vec![1, 2, 3, 4, 5]).fuse();
assert_eq!(fused.find(|x| **x > 2), Some(&3));
assert_eq!(fused.find(|x| **x > 4), Some(&5));
assert_eq!(fused.find(|x| **x > 10), None);
assert_eq!(fused.next(), None);
}
#[test]
fn fuse_rfind() {
let mut fused = VecLender::new(vec![1, 2, 3, 4, 5]).fuse();
assert_eq!(fused.rfind(|x| **x < 4), Some(&3));
assert_eq!(fused.rfind(|x| **x < 2), Some(&1));
assert_eq!(fused.rfind(|x| **x < 0), None);
assert_eq!(fused.next_back(), None);
}
#[test]
fn fuse_exact_size() {
use lender::ExactSizeLender;
let mut fused = VecLender::new(vec![1, 2, 3]).fuse();
assert_eq!(fused.len(), 3);
assert!(!fused.is_empty());
fused.next();
assert_eq!(fused.len(), 2);
fused.next();
fused.next();
assert_eq!(fused.len(), 0);
assert!(fused.is_empty());
fused.next();
assert_eq!(fused.len(), 0);
assert!(fused.is_empty());
}
#[test]
fn fuse_into_inner() {
let fused = VecLender::new(vec![1, 2, 3]).fuse();
let inner = fused.into_inner();
assert_eq!(inner.data, vec![1, 2, 3]);
}
#[test]
fn fuse_after_none() {
struct FlickeringLender {
count: i32,
}
impl<'lend> Lending<'lend> for FlickeringLender {
type Lend = i32;
}
impl Lender for FlickeringLender {
lender::check_covariance!();
fn next(&mut self) -> Option<Lend<'_, Self>> {
self.count += 1;
if self.count == 2 {
None } else if self.count <= 4 {
Some(self.count)
} else {
None
}
}
}
let mut fused = FlickeringLender { count: 0 }.fuse();
assert_eq!(fused.next(), Some(1));
assert_eq!(fused.next(), None); assert_eq!(fused.next(), None); assert_eq!(fused.next(), None); }
#[test]
fn cycle_basic() {
let mut cycled = VecLender::new(vec![1, 2, 3]).cycle();
assert_eq!(cycled.next(), Some(&1));
assert_eq!(cycled.next(), Some(&2));
assert_eq!(cycled.next(), Some(&3));
assert_eq!(cycled.next(), Some(&1));
assert_eq!(cycled.next(), Some(&2));
assert_eq!(cycled.next(), Some(&3));
assert_eq!(cycled.next(), Some(&1));
}
#[test]
fn cycle_single_element() {
let mut cycled = VecLender::new(vec![42]).cycle();
for _ in 0..10 {
assert_eq!(cycled.next(), Some(&42));
}
}
#[test]
fn cycle_empty() {
let mut cycled = VecLender::new(vec![]).cycle();
assert_eq!(cycled.next(), None);
assert_eq!(cycled.next(), None);
assert_eq!(cycled.next(), None);
}
#[test]
fn cycle_size_hint() {
let cycled = VecLender::new(vec![1, 2, 3]).cycle();
let (lower, upper) = cycled.size_hint();
assert_eq!(lower, usize::MAX);
assert_eq!(upper, None);
let cycled_empty = VecLender::new(vec![]).cycle();
assert_eq!(cycled_empty.size_hint(), (0, Some(0)));
}
#[test]
fn cycle_multiple_rounds() {
let mut cycle = VecLender::new(vec![1, 2]).cycle();
assert_eq!(cycle.next(), Some(&1));
assert_eq!(cycle.next(), Some(&2));
assert_eq!(cycle.next(), Some(&1)); assert_eq!(cycle.next(), Some(&2));
assert_eq!(cycle.next(), Some(&1)); }
#[test]
fn cycle_size_hint_additional() {
let empty_cycle = VecLender::new(Vec::<i32>::new()).cycle();
assert_eq!(empty_cycle.size_hint(), (0, Some(0)));
let cycle = VecLender::new(vec![1, 2]).cycle();
assert_eq!(cycle.size_hint(), (usize::MAX, None)); }
#[test]
fn cycle_try_fold_additional() {
let result: Option<i32> = VecLender::new(vec![1, 2])
.cycle()
.take(5)
.try_fold(0, |acc, x| Some(acc + *x));
assert_eq!(result, Some(7));
}
#[test]
fn cycle_advance_by_within_first_cycle() {
let mut cycled = VecLender::new(vec![1, 2, 3]).cycle();
assert_eq!(cycled.advance_by(2), Ok(()));
assert_eq!(cycled.next(), Some(&3));
}
#[test]
fn cycle_advance_by_across_cycles() {
let mut cycled = VecLender::new(vec![1, 2, 3]).cycle();
assert_eq!(cycled.advance_by(5), Ok(()));
assert_eq!(cycled.next(), Some(&3));
}
#[test]
fn cycle_advance_by_exact_cycle_boundary() {
let mut cycled = VecLender::new(vec![1, 2, 3]).cycle();
assert_eq!(cycled.advance_by(3), Ok(()));
assert_eq!(cycled.next(), Some(&1));
}
#[test]
fn cycle_advance_by_empty() {
use core::num::NonZeroUsize;
let mut cycled = VecLender::new(vec![]).cycle();
assert_eq!(cycled.advance_by(0), Ok(()));
assert_eq!(cycled.advance_by(1), Err(NonZeroUsize::new(1).unwrap()));
}
#[test]
fn rev_basic() {
let mut reversed = VecLender::new(vec![1, 2, 3]).rev();
assert_eq!(reversed.next(), Some(&3));
assert_eq!(reversed.next(), Some(&2));
assert_eq!(reversed.next(), Some(&1));
assert_eq!(reversed.next(), None);
}
#[test]
fn rev_double_ended() {
let mut reversed = VecLender::new(vec![1, 2, 3]).rev();
assert_eq!(reversed.next_back(), Some(&1));
assert_eq!(reversed.next_back(), Some(&2));
}
#[test]
fn rev_fold() {
let mut order = Vec::new();
VecLender::new(vec![1, 2, 3])
.rev()
.fold((), |(), x| order.push(*x));
assert_eq!(order, vec![3, 2, 1]);
}
#[test]
fn rev_rfold() {
let mut order = Vec::new();
VecLender::new(vec![1, 2, 3])
.rev()
.rfold((), |(), x| order.push(*x));
assert_eq!(order, vec![1, 2, 3]);
}
#[test]
fn rev_nth() {
let mut reversed = VecLender::new(vec![1, 2, 3, 4, 5]).rev();
assert_eq!(reversed.nth(2), Some(&3));
}
#[test]
fn rev_nth_back() {
let mut reversed = VecLender::new(vec![1, 2, 3, 4, 5]).rev();
assert_eq!(reversed.nth_back(1), Some(&2));
}
#[test]
fn rev_double_rev() {
let mut lender = VecLender::new(vec![1, 2, 3]).rev().rev();
assert_eq!(lender.next(), Some(&1));
assert_eq!(lender.next(), Some(&2));
assert_eq!(lender.next(), Some(&3));
}
#[test]
fn rev_try_fold_additional() {
let result: Option<i32> = VecLender::new(vec![1, 2, 3])
.rev()
.try_fold(0, |acc, x| Some(acc + *x));
assert_eq!(result, Some(6));
}
#[test]
fn rev_try_rfold_additional() {
let result: Option<i32> = VecLender::new(vec![1, 2, 3])
.rev()
.try_rfold(0, |acc, x| Some(acc + *x));
assert_eq!(result, Some(6));
}