| 1 | use itertools::Itertools; |
| 2 | |
| 3 | struct PanickingCounter { |
| 4 | curr: usize, |
| 5 | max: usize, |
| 6 | } |
| 7 | |
| 8 | impl Iterator for PanickingCounter { |
| 9 | type Item = (); |
| 10 | |
| 11 | fn next(&mut self) -> Option<Self::Item> { |
| 12 | self.curr += 1; |
| 13 | |
| 14 | assert_ne!( |
| 15 | self.curr, self.max, |
| 16 | "Input iterator reached maximum of {} suggesting collection by adaptor" , |
| 17 | self.max |
| 18 | ); |
| 19 | |
| 20 | Some(()) |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | fn no_collect_test<A, T>(to_adaptor: T) |
| 25 | where A: Iterator, T: Fn(PanickingCounter) -> A |
| 26 | { |
| 27 | let counter = PanickingCounter { curr: 0, max: 10_000 }; |
| 28 | let adaptor = to_adaptor(counter); |
| 29 | |
| 30 | for _ in adaptor.take(5) {} |
| 31 | } |
| 32 | |
| 33 | #[test] |
| 34 | fn permutations_no_collect() { |
| 35 | no_collect_test(|iter| iter.permutations(5)) |
| 36 | } |
| 37 | |
| 38 | #[test] |
| 39 | fn combinations_no_collect() { |
| 40 | no_collect_test(|iter| iter.combinations(5)) |
| 41 | } |
| 42 | |
| 43 | #[test] |
| 44 | fn combinations_with_replacement_no_collect() { |
| 45 | no_collect_test(|iter| iter.combinations_with_replacement(5)) |
| 46 | } |