46 lines
951 B
Rust
46 lines
951 B
Rust
|
|
use itertools::Itertools;
|
||
|
|
|
||
|
|
struct PanickingCounter {
|
||
|
|
curr: usize,
|
||
|
|
max: usize,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl Iterator for PanickingCounter {
|
||
|
|
type Item = ();
|
||
|
|
|
||
|
|
fn next(&mut self) -> Option<Self::Item> {
|
||
|
|
self.curr += 1;
|
||
|
|
|
||
|
|
assert_ne!(
|
||
|
|
self.curr, self.max,
|
||
|
|
"Input iterator reached maximum of {} suggesting collection by adaptor",
|
||
|
|
self.max
|
||
|
|
);
|
||
|
|
|
||
|
|
Some(())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fn no_collect_test<A, T>(to_adaptor: T)
|
||
|
|
where A: Iterator, T: Fn(PanickingCounter) -> A
|
||
|
|
{
|
||
|
|
let counter = PanickingCounter { curr: 0, max: 10_000 };
|
||
|
|
let adaptor = to_adaptor(counter);
|
||
|
|
|
||
|
|
for _ in adaptor.take(5) {}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn permutations_no_collect() {
|
||
|
|
no_collect_test(|iter| iter.permutations(5))
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn combinations_no_collect() {
|
||
|
|
no_collect_test(|iter| iter.combinations(5))
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn combinations_with_replacement_no_collect() {
|
||
|
|
no_collect_test(|iter| iter.combinations_with_replacement(5))
|
||
|
|
}
|