use alloc::{vec, vec::Vec};
use core::{iter, ops::Range};
use super ::{convert, FallibleIterator, IntoFallible};
#[ test]
fn all() {
assert!(convert([0 , 1 , 2 , 3 ].iter().map(Ok::<&u32, ()>))
.all(|&i| Ok(i < 4 ))
.unwrap());
assert!(!convert([0 , 1 , 2 , 4 ].iter().map(Ok::<&u32, ()>))
.all(|&i| Ok(i < 4 ))
.unwrap());
assert!(convert([0 , 1 , 2 , 4 ].iter().map(Ok::<&u32, ()>))
.all(|_| Err(()))
.is_err());
}
#[ test]
fn any() {
assert!(convert([0 , 1 , 2 , 3 ].iter().map(Ok::<&u32, ()>))
.any(|&i| Ok(i == 3 ))
.unwrap());
assert!(!convert([0 , 1 , 2 , 4 ].iter().map(Ok::<&u32, ()>))
.any(|&i| Ok(i == 3 ))
.unwrap());
assert!(convert([0 , 1 , 2 , 4 ].iter().map(Ok::<&u32, ()>))
.any(|_| Err(()))
.is_err());
}
#[ test]
fn chain() {
let a = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, ()>));
let b = convert(vec![4 , 5 , 6 , 7 ].into_iter().map(Ok::<u32, ()>));
let it = a.chain(b);
assert_eq!(it.collect::<Vec<_>>().unwrap(), [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ]);
let a = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, ()>));
let b = convert(vec![4 , 5 , 6 , 7 ].into_iter().map(Ok::<u32, ()>));
let it = a.chain(b).rev();
assert_eq!(it.collect::<Vec<_>>().unwrap(), [7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ]);
}
#[ test]
fn count() {
assert_eq!(
convert([0 , 1 , 2 , 3 ].iter().map(Ok::<&u32, ()>))
.count()
.unwrap(),
4
);
let it = Some(Ok(1 )).into_iter().chain(iter::repeat(Err(())));
assert!(convert(it).count().is_err());
}
#[ test]
fn enumerate() {
let it = convert(vec![5 , 6 , 7 , 8 ].into_iter().map(Ok::<u32, ()>)).enumerate();
assert_eq!(
it.collect::<Vec<_>>().unwrap(),
[(0 , 5 ), (1 , 6 ), (2 , 7 ), (3 , 8 )]
);
}
#[ test]
fn filter() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, u32>));
let it = it.filter(|&x| if x % 2 == 0 { Ok(x % 3 == 0 ) } else { Err(x) });
assert_eq!(it.clone().collect::<Vec<_>>(), Err(1 ));
assert_eq!(it.rev().collect::<Vec<_>>(), Err(3 ));
let it = convert(vec![0 , 2 , 4 , 6 ].into_iter().map(Ok::<u32, u32>));
let it = it.filter(|&x| if x % 2 == 0 { Ok(x % 3 == 0 ) } else { Err(x) });
assert_eq!(it.clone().collect::<Vec<_>>(), Ok(vec![0 , 6 ]));
assert_eq!(it.rev().collect::<Vec<_>>(), Ok(vec![6 , 0 ]))
}
#[ test]
fn filter_map() {
fn twos_and_threes(x: u32) -> Result<Option<u32>, u32> {
if x % 2 == 0 {
Ok(Some(x + 10 ))
} else if x % 3 == 0 {
Ok(None)
} else {
Err(x)
}
}
let it = convert(vec![0 , 1 , 2 , 3 , 4 , 5 , 6 ].into_iter().map(Ok::<u32, u32>))
.filter_map(twos_and_threes);
assert_eq!(it.clone().collect::<Vec<_>>(), Err(1 ));
assert_eq!(it.rev().collect::<Vec<_>>(), Err(5 ));
let it =
convert(vec![0 , 2 , 3 , 4 , 6 ].into_iter().map(Ok::<u32, u32>)).filter_map(twos_and_threes);
assert_eq!(it.clone().collect::<Vec<_>>(), Ok(vec![10 , 12 , 14 , 16 ]));
assert_eq!(it.rev().collect::<Vec<_>>(), Ok(vec![16 , 14 , 12 , 10 ]));
}
#[ test]
fn find() {
let mut it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, u32>));
assert_eq!(it.find(|x| Ok(x % 2 == 1 )), Ok(Some(1 )));
assert_eq!(it.next(), Ok(Some(2 )));
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, u32>));
assert_eq!(
it.clone()
.find(|&x| if x == 2 { Err(29 ) } else { Ok(false ) }),
Err(29 )
);
assert_eq!(
it.clone()
.find(|&x| if x == 2 { Err(29 ) } else { Ok(true ) }),
Ok(Some(0 ))
);
assert_eq!(
it.clone()
.rev()
.find(|&x| if x == 2 { Err(29 ) } else { Ok(false ) }),
Err(29 )
);
assert_eq!(
it.rev().find(|&x| if x == 2 { Err(29 ) } else { Ok(true ) }),
Ok(Some(3 ))
);
}
#[ test]
fn fold() {
fn add_smol(a: u32, b: u32) -> Result<u32, u32> {
if b <= 2 {
Ok(a + b)
} else {
Err(b)
}
}
let it = convert(vec![0 , 1 , 3 , 2 ].into_iter().map(Ok::<u32, u32>));
assert_eq!(it.fold(0 , add_smol), Err(3 ));
let it = convert(vec![0 , 1 , 2 , 1 ].into_iter().map(Ok::<u32, u32>));
assert_eq!(it.fold(0 , add_smol), Ok(4 ));
}
#[ test]
fn for_each() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, ()>));
let mut acc = vec![];
it.for_each(|n| {
acc.push(n);
Ok(())
})
.unwrap();
assert_eq!(acc, vec![0 , 1 , 2 , 3 ]);
}
#[ test]
fn iterator() {
let it = convert(
"ab cd"
.chars()
.map(|c| if c.is_whitespace() { Err(()) } else { Ok(c) }),
);
assert!(it.clone().count().is_err());
assert!(it.clone().rev().count().is_err());
assert_eq!(it.clone().iterator().count(), 5 );
assert_eq!(it.clone().iterator().rev().count(), 5 );
}
#[ test]
fn last() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<u32, ()>));
assert_eq!(it.last().unwrap(), Some(3 ));
}
#[ test]
fn map() {
let it = convert(vec![0 , 1 , 2 , 3 , 4 ].into_iter().map(Ok::<u32, ()>)).map(|n| Ok(n * 2 ));
fn assert_debug(_: &impl core::fmt::Debug) {}
assert_debug(&it);
assert_eq!(it.clone().collect::<Vec<_>>().unwrap(), [0 , 2 , 4 , 6 , 8 ]);
assert_eq!(it.rev().collect::<Vec<_>>().unwrap(), [8 , 6 , 4 , 2 , 0 ]);
let it = convert(vec![0 , 1 , 2 , 3 , 4 ].into_iter().map(Ok::<u32, ()>)).map(|n| {
if n == 2 {
Err(())
} else {
Ok(n * 2 )
}
});
{
let mut it = it.clone();
assert_eq!(it.next(), Ok(Some(0 )));
assert_eq!(it.next(), Ok(Some(2 )));
assert_eq!(it.next(), Err(()));
}
{
let mut it = it.rev();
assert_eq!(it.next(), Ok(Some(8 )));
assert_eq!(it.next(), Ok(Some(6 )));
assert_eq!(it.next(), Err(()));
}
}
#[ test]
fn map_err() {
let it = convert(
vec![0 , 1 , 2 , 3 ]
.into_iter()
.map(|n| if n % 2 == 0 { Ok(n) } else { Err(n) }),
);
assert_eq!(it.clone().collect::<Vec<_>>(), Err(1 ));
assert_eq!(it.rev().collect::<Vec<_>>(), Err(3 ));
}
#[ test]
fn max() {
let it = convert(vec![0 , 3 , 1 , -10 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.max().unwrap(), Some(3 ));
}
#[ test]
fn max_by_key() {
let it = convert(vec![0 , 3 , 1 , -10 ].into_iter().map(Ok::<i32, i32>));
assert_eq!(it.clone().max_by_key(|&i| Ok(-i)), Ok(Some(-10 )));
// Exercise failure both on the first item, and later.
assert_eq!(it.clone().max_by_key(|&i| Err::<i32, _>(i)), Err(0 ));
assert_eq!(
it.max_by_key(|&i| if i > 0 { Err(i) } else { Ok(-i) }),
Err(3 )
);
}
#[ test]
fn max_by() {
let it = convert(vec![0 , 3 , 1 , -10 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.max_by(|a, b| Ok(b.cmp(a))), Ok(Some(-10 )));
}
#[ test]
fn min() {
let it = convert(vec![0 , 3 , -10 , 1 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.min().unwrap(), Some(-10 ));
}
#[ test]
fn min_by_key() {
let it = convert(vec![0 , 3 , 1 , -10 ].into_iter().map(Ok::<i32, i32>));
assert_eq!(it.clone().min_by_key(|&i| Ok(-i)), Ok(Some(3 )));
// Exercise failure both on the first item, and later.
assert_eq!(it.clone().min_by_key(|&i| Err::<i32, _>(i)), Err(0 ));
assert_eq!(
it.min_by_key(|&i| if i > 0 { Err(i) } else { Ok(-i) }),
Err(3 )
);
}
#[ test]
fn min_by() {
let it = convert(vec![0 , 3 , 1 , -10 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.min_by(|a, b| Ok(b.cmp(a))), Ok(Some(3 )));
}
#[ test]
fn nth() {
let mut it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.nth(1 ).unwrap(), Some(1 ));
assert_eq!(it.nth(0 ).unwrap(), Some(2 ));
assert_eq!(it.nth(2 ).unwrap(), None);
}
#[ test]
fn peekable() {
let mut it = convert(vec![0 , 1 ].into_iter().map(Ok::<i32, ()>)).peekable();
assert_eq!(it.peek().unwrap(), Some(&0 ));
assert_eq!(it.peek().unwrap(), Some(&0 ));
assert_eq!(it.next().unwrap(), Some(0 ));
assert_eq!(it.next().unwrap(), Some(1 ));
assert_eq!(it.peek().unwrap(), None);
assert_eq!(it.next().unwrap(), None);
}
#[ test]
fn position() {
let mut it = convert(vec![1 , 2 , 3 , 4 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.position(|n| Ok(n == 2 )).unwrap(), Some(1 ));
assert_eq!(it.position(|n| Ok(n == 3 )).unwrap(), Some(0 ));
assert_eq!(it.position(|n| Ok(n == 5 )).unwrap(), None);
let mut it = convert(vec![1 , 2 , 3 , 4 ].into_iter().map(Ok::<i32, i32>));
assert_eq!(
it.clone()
.position(|n| if n == 3 { Err(42 ) } else { Ok(n == 2 ) }),
Ok(Some(1 ))
);
assert_eq!(
it.position(|n| if n == 3 { Err(42 ) } else { Ok(n == 4 ) }),
Err(42 )
);
}
#[ test]
fn scan() {
let it = convert(vec![1 , 2 , 3 , 4 ].into_iter().map(Ok::<i32, ()>)).scan(0 , |st, v| {
if v > 3 {
Ok(None)
} else {
*st += v;
Ok(Some(-*st))
}
});
assert_eq!(it.collect::<Vec<_>>(), Ok(vec![-1 , -3 , -6 ]));
}
#[ test]
fn skip() {
let it = convert(vec![1 , 2 , 3 , 4 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(it.clone().skip(0 ).collect::<Vec<_>>(), Ok(vec![1 , 2 , 3 , 4 ]));
assert_eq!(it.clone().skip(2 ).collect::<Vec<_>>(), Ok(vec![3 , 4 ]));
assert_eq!(it.skip(4 ).collect::<Vec<_>>(), Ok(vec![]));
}
#[ test]
fn skip_while() {
let it = convert(vec![1 , 2 , 3 , 4 , 1 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(
it.clone().skip_while(|x| Ok(*x < 1 )).collect::<Vec<_>>(),
Ok(vec![1 , 2 , 3 , 4 , 1 ])
);
assert_eq!(
it.clone().skip_while(|x| Ok(*x < 3 )).collect::<Vec<_>>(),
Ok(vec![3 , 4 , 1 ])
);
assert_eq!(
it.skip_while(|x| Ok(*x < 5 )).collect::<Vec<_>>(),
Ok(vec![])
);
}
#[ test]
fn step_by() {
let it = convert(
vec![0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
.into_iter()
.map(Ok::<i32, ()>),
)
.step_by(3 );
assert_eq!(it.collect::<Vec<_>>(), Ok(vec![0 , 3 , 6 ]));
}
#[ test]
fn take() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>)).take(2 );
assert_eq!(it.collect::<Vec<_>>().unwrap(), [0 , 1 ]);
}
#[ test]
fn take_while() {
let it = convert(vec![0 , 1 , 2 , 3 , 0 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(
it.clone().take_while(|x| Ok(*x < 0 )).collect::<Vec<_>>(),
Ok(vec![])
);
assert_eq!(
it.clone().take_while(|x| Ok(*x < 2 )).collect::<Vec<_>>(),
Ok(vec![0 , 1 ])
);
assert_eq!(
it.take_while(|x| Ok(*x < 4 )).collect::<Vec<_>>(),
Ok(vec![0 , 1 , 2 , 3 , 0 ])
);
}
#[ test]
fn flat_map() {
let it = convert(vec![0 ..1 , 0 ..0 , 1 ..5 ].into_iter().map(Ok::<Range<i32>, ()>))
.flat_map(|r| Ok(convert(r.map(Ok::<i32, ()>))));
assert_eq!(it.collect::<Vec<_>>(), Ok(vec![0 , 1 , 2 , 3 , 4 ]));
}
#[ test]
fn flatten() {
let it = convert(
vec![0 ..1 , 0 ..0 , 1 ..5 ]
.into_iter()
.map(|r| convert(r.map(Ok::<i32, ()>)))
.map(Ok::<_, ()>),
)
.flatten();
assert_eq!(it.collect::<Vec<_>>(), Ok(vec![0 , 1 , 2 , 3 , 4 ]));
}
#[ test]
fn inspect() {
let mut buf = vec![];
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>)).inspect(|&v| {
buf.push(v);
Ok(())
});
it.count().unwrap();
assert_eq!(buf, vec![0 , 1 , 2 , 3 ]);
}
#[ test]
fn partition() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>));
let (even, odd): (Vec<i32>, Vec<i32>) = it.partition(|i| Ok(*i % 2 == 0 )).unwrap();
assert_eq!(even, vec![0 , 2 ]);
assert_eq!(odd, vec![1 , 3 ]);
}
#[ test]
fn find_map() {
let mut it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>));
assert_eq!(
it.find_map(|v| match v {
2 => Ok(Some("hi" )),
_ => Ok(None),
}),
Ok(Some("hi" ))
);
}
#[ test]
fn unzip() {
let it = convert(
vec![(0 , 0 ), (1 , -1 ), (2 , -2 ), (3 , -3 )]
.into_iter()
.map(Ok::<_, ()>),
);
let (pos, neg): (Vec<i32>, Vec<i32>) = it.unzip().unwrap();
assert_eq!(pos, vec![0 , 1 , 2 , 3 ]);
assert_eq!(neg, vec![0 , -1 , -2 , -3 ]);
}
#[ test]
fn cycle() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>)).cycle();
assert_eq!(it.take(6 ).collect::<Vec<_>>(), Ok(vec![0 , 1 , 2 , 3 , 0 , 1 ]));
}
#[ test]
fn unwrap() {
let it = convert(vec![0 , 1 , 2 , 3 ].into_iter().map(Ok::<i32, ()>)).unwrap();
assert_eq!(it.collect::<Vec<_>>(), vec![0 , 1 , 2 , 3 ]);
}
#[ test]
#[ should_panic]
fn unwrap_panic() {
let _ = convert(vec![Ok(0 ), Err(())].into_iter())
.unwrap()
.collect::<Vec<_>>();
}
#[ test]
fn wrap_std_iter_into_fallible() {
let it = IntoFallible::from(vec![0 , 1 , 2 , 3 ].into_iter());
assert_eq!(it.collect::<Vec<_>>().unwrap(), vec![0 , 1 , 2 , 3 ]);
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-18)
¤
*© Formatika GbR, Deutschland