]> git.lizzy.rs Git - rust.git/blob - library/core/tests/iter.rs
fmt
[rust.git] / library / core / tests / iter.rs
1 // ignore-tidy-filelength
2
3 use core::cell::Cell;
4 use core::convert::TryFrom;
5 use core::iter::*;
6
7 #[test]
8 fn test_lt() {
9     let empty: [isize; 0] = [];
10     let xs = [1, 2, 3];
11     let ys = [1, 2, 0];
12
13     assert!(!xs.iter().lt(ys.iter()));
14     assert!(!xs.iter().le(ys.iter()));
15     assert!(xs.iter().gt(ys.iter()));
16     assert!(xs.iter().ge(ys.iter()));
17
18     assert!(ys.iter().lt(xs.iter()));
19     assert!(ys.iter().le(xs.iter()));
20     assert!(!ys.iter().gt(xs.iter()));
21     assert!(!ys.iter().ge(xs.iter()));
22
23     assert!(empty.iter().lt(xs.iter()));
24     assert!(empty.iter().le(xs.iter()));
25     assert!(!empty.iter().gt(xs.iter()));
26     assert!(!empty.iter().ge(xs.iter()));
27
28     // Sequence with NaN
29     let u = [1.0f64, 2.0];
30     let v = [0.0f64 / 0.0, 3.0];
31
32     assert!(!u.iter().lt(v.iter()));
33     assert!(!u.iter().le(v.iter()));
34     assert!(!u.iter().gt(v.iter()));
35     assert!(!u.iter().ge(v.iter()));
36
37     let a = [0.0f64 / 0.0];
38     let b = [1.0f64];
39     let c = [2.0f64];
40
41     assert!(a.iter().lt(b.iter()) == (a[0] < b[0]));
42     assert!(a.iter().le(b.iter()) == (a[0] <= b[0]));
43     assert!(a.iter().gt(b.iter()) == (a[0] > b[0]));
44     assert!(a.iter().ge(b.iter()) == (a[0] >= b[0]));
45
46     assert!(c.iter().lt(b.iter()) == (c[0] < b[0]));
47     assert!(c.iter().le(b.iter()) == (c[0] <= b[0]));
48     assert!(c.iter().gt(b.iter()) == (c[0] > b[0]));
49     assert!(c.iter().ge(b.iter()) == (c[0] >= b[0]));
50 }
51
52 #[test]
53 fn test_multi_iter() {
54     let xs = [1, 2, 3, 4];
55     let ys = [4, 3, 2, 1];
56     assert!(xs.iter().eq(ys.iter().rev()));
57     assert!(xs.iter().lt(xs.iter().skip(2)));
58 }
59
60 #[test]
61 fn test_cmp_by() {
62     use core::cmp::Ordering;
63
64     let f = |x: i32, y: i32| (x * x).cmp(&y);
65     let xs = || [1, 2, 3, 4].iter().copied();
66     let ys = || [1, 4, 16].iter().copied();
67
68     assert_eq!(xs().cmp_by(ys(), f), Ordering::Less);
69     assert_eq!(ys().cmp_by(xs(), f), Ordering::Greater);
70     assert_eq!(xs().cmp_by(xs().map(|x| x * x), f), Ordering::Equal);
71     assert_eq!(xs().rev().cmp_by(ys().rev(), f), Ordering::Greater);
72     assert_eq!(xs().cmp_by(ys().rev(), f), Ordering::Less);
73     assert_eq!(xs().cmp_by(ys().take(2), f), Ordering::Greater);
74 }
75
76 #[test]
77 fn test_partial_cmp_by() {
78     use core::cmp::Ordering;
79
80     let f = |x: i32, y: i32| (x * x).partial_cmp(&y);
81     let xs = || [1, 2, 3, 4].iter().copied();
82     let ys = || [1, 4, 16].iter().copied();
83
84     assert_eq!(xs().partial_cmp_by(ys(), f), Some(Ordering::Less));
85     assert_eq!(ys().partial_cmp_by(xs(), f), Some(Ordering::Greater));
86     assert_eq!(xs().partial_cmp_by(xs().map(|x| x * x), f), Some(Ordering::Equal));
87     assert_eq!(xs().rev().partial_cmp_by(ys().rev(), f), Some(Ordering::Greater));
88     assert_eq!(xs().partial_cmp_by(xs().rev(), f), Some(Ordering::Less));
89     assert_eq!(xs().partial_cmp_by(ys().take(2), f), Some(Ordering::Greater));
90
91     let f = |x: f64, y: f64| (x * x).partial_cmp(&y);
92     let xs = || [1.0, 2.0, 3.0, 4.0].iter().copied();
93     let ys = || [1.0, 4.0, f64::NAN, 16.0].iter().copied();
94
95     assert_eq!(xs().partial_cmp_by(ys(), f), None);
96     assert_eq!(ys().partial_cmp_by(xs(), f), Some(Ordering::Greater));
97 }
98
99 #[test]
100 fn test_eq_by() {
101     let f = |x: i32, y: i32| x * x == y;
102     let xs = || [1, 2, 3, 4].iter().copied();
103     let ys = || [1, 4, 9, 16].iter().copied();
104
105     assert!(xs().eq_by(ys(), f));
106     assert!(!ys().eq_by(xs(), f));
107     assert!(!xs().eq_by(xs(), f));
108     assert!(!ys().eq_by(ys(), f));
109
110     assert!(!xs().take(3).eq_by(ys(), f));
111     assert!(!xs().eq_by(ys().take(3), f));
112     assert!(xs().take(3).eq_by(ys().take(3), f));
113 }
114
115 #[test]
116 fn test_counter_from_iter() {
117     let it = (0..).step_by(5).take(10);
118     let xs: Vec<isize> = FromIterator::from_iter(it);
119     assert_eq!(xs, [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]);
120 }
121
122 #[test]
123 fn test_iterator_chain() {
124     let xs = [0, 1, 2, 3, 4, 5];
125     let ys = [30, 40, 50, 60];
126     let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
127     let it = xs.iter().chain(&ys);
128     let mut i = 0;
129     for &x in it {
130         assert_eq!(x, expected[i]);
131         i += 1;
132     }
133     assert_eq!(i, expected.len());
134
135     let ys = (30..).step_by(10).take(4);
136     let it = xs.iter().cloned().chain(ys);
137     let mut i = 0;
138     for x in it {
139         assert_eq!(x, expected[i]);
140         i += 1;
141     }
142     assert_eq!(i, expected.len());
143 }
144
145 #[test]
146 fn test_iterator_chain_nth() {
147     let xs = [0, 1, 2, 3, 4, 5];
148     let ys = [30, 40, 50, 60];
149     let zs = [];
150     let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
151     for (i, x) in expected.iter().enumerate() {
152         assert_eq!(Some(x), xs.iter().chain(&ys).nth(i));
153     }
154     assert_eq!(zs.iter().chain(&xs).nth(0), Some(&0));
155
156     let mut it = xs.iter().chain(&zs);
157     assert_eq!(it.nth(5), Some(&5));
158     assert_eq!(it.next(), None);
159 }
160
161 #[test]
162 fn test_iterator_chain_nth_back() {
163     let xs = [0, 1, 2, 3, 4, 5];
164     let ys = [30, 40, 50, 60];
165     let zs = [];
166     let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
167     for (i, x) in expected.iter().rev().enumerate() {
168         assert_eq!(Some(x), xs.iter().chain(&ys).nth_back(i));
169     }
170     assert_eq!(zs.iter().chain(&xs).nth_back(0), Some(&5));
171
172     let mut it = xs.iter().chain(&zs);
173     assert_eq!(it.nth_back(5), Some(&0));
174     assert_eq!(it.next(), None);
175 }
176
177 #[test]
178 fn test_iterator_chain_last() {
179     let xs = [0, 1, 2, 3, 4, 5];
180     let ys = [30, 40, 50, 60];
181     let zs = [];
182     assert_eq!(xs.iter().chain(&ys).last(), Some(&60));
183     assert_eq!(zs.iter().chain(&ys).last(), Some(&60));
184     assert_eq!(ys.iter().chain(&zs).last(), Some(&60));
185     assert_eq!(zs.iter().chain(&zs).last(), None);
186 }
187
188 #[test]
189 fn test_iterator_chain_count() {
190     let xs = [0, 1, 2, 3, 4, 5];
191     let ys = [30, 40, 50, 60];
192     let zs = [];
193     assert_eq!(xs.iter().chain(&ys).count(), 10);
194     assert_eq!(zs.iter().chain(&ys).count(), 4);
195 }
196
197 #[test]
198 fn test_iterator_chain_find() {
199     let xs = [0, 1, 2, 3, 4, 5];
200     let ys = [30, 40, 50, 60];
201     let mut iter = xs.iter().chain(&ys);
202     assert_eq!(iter.find(|&&i| i == 4), Some(&4));
203     assert_eq!(iter.next(), Some(&5));
204     assert_eq!(iter.find(|&&i| i == 40), Some(&40));
205     assert_eq!(iter.next(), Some(&50));
206     assert_eq!(iter.find(|&&i| i == 100), None);
207     assert_eq!(iter.next(), None);
208 }
209
210 struct Toggle {
211     is_empty: bool,
212 }
213
214 impl Iterator for Toggle {
215     type Item = ();
216
217     // alternates between `None` and `Some(())`
218     fn next(&mut self) -> Option<Self::Item> {
219         if self.is_empty {
220             self.is_empty = false;
221             None
222         } else {
223             self.is_empty = true;
224             Some(())
225         }
226     }
227
228     fn size_hint(&self) -> (usize, Option<usize>) {
229         if self.is_empty { (0, Some(0)) } else { (1, Some(1)) }
230     }
231 }
232
233 impl DoubleEndedIterator for Toggle {
234     fn next_back(&mut self) -> Option<Self::Item> {
235         self.next()
236     }
237 }
238
239 #[test]
240 fn test_iterator_chain_size_hint() {
241     // this chains an iterator of length 0 with an iterator of length 1,
242     // so after calling `.next()` once, the iterator is empty and the
243     // state is `ChainState::Back`. `.size_hint()` should now disregard
244     // the size hint of the left iterator
245     let mut iter = Toggle { is_empty: true }.chain(once(()));
246     assert_eq!(iter.next(), Some(()));
247     assert_eq!(iter.size_hint(), (0, Some(0)));
248
249     let mut iter = once(()).chain(Toggle { is_empty: true });
250     assert_eq!(iter.next_back(), Some(()));
251     assert_eq!(iter.size_hint(), (0, Some(0)));
252 }
253
254 #[test]
255 fn test_iterator_chain_unfused() {
256     // Chain shouldn't be fused in its second iterator, depending on direction
257     let mut iter = NonFused::new(empty()).chain(Toggle { is_empty: true });
258     iter.next().unwrap_none();
259     iter.next().unwrap();
260     iter.next().unwrap_none();
261
262     let mut iter = Toggle { is_empty: true }.chain(NonFused::new(empty()));
263     iter.next_back().unwrap_none();
264     iter.next_back().unwrap();
265     iter.next_back().unwrap_none();
266 }
267
268 #[test]
269 fn test_zip_nth() {
270     let xs = [0, 1, 2, 4, 5];
271     let ys = [10, 11, 12];
272
273     let mut it = xs.iter().zip(&ys);
274     assert_eq!(it.nth(0), Some((&0, &10)));
275     assert_eq!(it.nth(1), Some((&2, &12)));
276     assert_eq!(it.nth(0), None);
277
278     let mut it = xs.iter().zip(&ys);
279     assert_eq!(it.nth(3), None);
280
281     let mut it = ys.iter().zip(&xs);
282     assert_eq!(it.nth(3), None);
283 }
284
285 #[test]
286 fn test_zip_nth_side_effects() {
287     let mut a = Vec::new();
288     let mut b = Vec::new();
289     let value = [1, 2, 3, 4, 5, 6]
290         .iter()
291         .cloned()
292         .map(|n| {
293             a.push(n);
294             n * 10
295         })
296         .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
297             b.push(n * 100);
298             n * 1000
299         }))
300         .skip(1)
301         .nth(3);
302     assert_eq!(value, Some((50, 6000)));
303     assert_eq!(a, vec![1, 2, 3, 4, 5]);
304     assert_eq!(b, vec![200, 300, 400, 500, 600]);
305 }
306
307 #[test]
308 fn test_zip_next_back_side_effects() {
309     let mut a = Vec::new();
310     let mut b = Vec::new();
311     let mut iter = [1, 2, 3, 4, 5, 6]
312         .iter()
313         .cloned()
314         .map(|n| {
315             a.push(n);
316             n * 10
317         })
318         .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
319             b.push(n * 100);
320             n * 1000
321         }));
322
323     // The second iterator is one item longer, so `next_back` is called on it
324     // one more time.
325     assert_eq!(iter.next_back(), Some((60, 7000)));
326     assert_eq!(iter.next_back(), Some((50, 6000)));
327     assert_eq!(iter.next_back(), Some((40, 5000)));
328     assert_eq!(iter.next_back(), Some((30, 4000)));
329     assert_eq!(a, vec![6, 5, 4, 3]);
330     assert_eq!(b, vec![800, 700, 600, 500, 400]);
331 }
332
333 #[test]
334 fn test_zip_nth_back_side_effects() {
335     let mut a = Vec::new();
336     let mut b = Vec::new();
337     let value = [1, 2, 3, 4, 5, 6]
338         .iter()
339         .cloned()
340         .map(|n| {
341             a.push(n);
342             n * 10
343         })
344         .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
345             b.push(n * 100);
346             n * 1000
347         }))
348         .nth_back(3);
349     assert_eq!(value, Some((30, 4000)));
350     assert_eq!(a, vec![6, 5, 4, 3]);
351     assert_eq!(b, vec![800, 700, 600, 500, 400]);
352 }
353
354 #[test]
355 fn test_zip_next_back_side_effects_exhausted() {
356     let mut a = Vec::new();
357     let mut b = Vec::new();
358     let mut iter = [1, 2, 3, 4, 5, 6]
359         .iter()
360         .cloned()
361         .map(|n| {
362             a.push(n);
363             n * 10
364         })
365         .zip([2, 3, 4].iter().cloned().map(|n| {
366             b.push(n * 100);
367             n * 1000
368         }));
369
370     iter.next();
371     iter.next();
372     iter.next();
373     iter.next();
374     assert_eq!(iter.next_back(), None);
375     assert_eq!(a, vec![1, 2, 3, 4, 6, 5]);
376     assert_eq!(b, vec![200, 300, 400]);
377 }
378
379 #[derive(Debug)]
380 struct CountClone(Cell<i32>);
381
382 fn count_clone() -> CountClone {
383     CountClone(Cell::new(0))
384 }
385
386 impl PartialEq<i32> for CountClone {
387     fn eq(&self, rhs: &i32) -> bool {
388         self.0.get() == *rhs
389     }
390 }
391
392 impl Clone for CountClone {
393     fn clone(&self) -> Self {
394         let ret = CountClone(self.0.clone());
395         let n = self.0.get();
396         self.0.set(n + 1);
397         ret
398     }
399 }
400
401 #[test]
402 fn test_zip_cloned_sideffectful() {
403     let xs = [count_clone(), count_clone(), count_clone(), count_clone()];
404     let ys = [count_clone(), count_clone()];
405
406     for _ in xs.iter().cloned().zip(ys.iter().cloned()) {}
407
408     assert_eq!(&xs, &[1, 1, 1, 0][..]);
409     assert_eq!(&ys, &[1, 1][..]);
410
411     let xs = [count_clone(), count_clone()];
412     let ys = [count_clone(), count_clone(), count_clone(), count_clone()];
413
414     for _ in xs.iter().cloned().zip(ys.iter().cloned()) {}
415
416     assert_eq!(&xs, &[1, 1][..]);
417     assert_eq!(&ys, &[1, 1, 0, 0][..]);
418 }
419
420 #[test]
421 fn test_zip_map_sideffectful() {
422     let mut xs = [0; 6];
423     let mut ys = [0; 4];
424
425     for _ in xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)) {}
426
427     assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]);
428     assert_eq!(&ys, &[1, 1, 1, 1]);
429
430     let mut xs = [0; 4];
431     let mut ys = [0; 6];
432
433     for _ in xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)) {}
434
435     assert_eq!(&xs, &[1, 1, 1, 1]);
436     assert_eq!(&ys, &[1, 1, 1, 1, 0, 0]);
437 }
438
439 #[test]
440 fn test_zip_map_rev_sideffectful() {
441     let mut xs = [0; 6];
442     let mut ys = [0; 4];
443
444     {
445         let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1));
446         it.next_back();
447     }
448     assert_eq!(&xs, &[0, 0, 0, 1, 1, 1]);
449     assert_eq!(&ys, &[0, 0, 0, 1]);
450
451     let mut xs = [0; 6];
452     let mut ys = [0; 4];
453
454     {
455         let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1));
456         (&mut it).take(5).count();
457         it.next_back();
458     }
459     assert_eq!(&xs, &[1, 1, 1, 1, 1, 1]);
460     assert_eq!(&ys, &[1, 1, 1, 1]);
461 }
462
463 #[test]
464 fn test_zip_nested_sideffectful() {
465     let mut xs = [0; 6];
466     let ys = [0; 4];
467
468     {
469         // test that it has the side effect nested inside enumerate
470         let it = xs.iter_mut().map(|x| *x = 1).enumerate().zip(&ys);
471         it.count();
472     }
473     assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]);
474 }
475
476 #[test]
477 fn test_zip_nth_back_side_effects_exhausted() {
478     let mut a = Vec::new();
479     let mut b = Vec::new();
480     let mut iter = [1, 2, 3, 4, 5, 6]
481         .iter()
482         .cloned()
483         .map(|n| {
484             a.push(n);
485             n * 10
486         })
487         .zip([2, 3, 4].iter().cloned().map(|n| {
488             b.push(n * 100);
489             n * 1000
490         }));
491
492     iter.next();
493     iter.next();
494     iter.next();
495     iter.next();
496     assert_eq!(iter.nth_back(0), None);
497     assert_eq!(a, vec![1, 2, 3, 4, 6, 5]);
498     assert_eq!(b, vec![200, 300, 400]);
499 }
500
501 #[test]
502 fn test_iterator_step_by() {
503     // Identity
504     let mut it = (0..).step_by(1).take(3);
505     assert_eq!(it.next(), Some(0));
506     assert_eq!(it.next(), Some(1));
507     assert_eq!(it.next(), Some(2));
508     assert_eq!(it.next(), None);
509
510     let mut it = (0..).step_by(3).take(4);
511     assert_eq!(it.next(), Some(0));
512     assert_eq!(it.next(), Some(3));
513     assert_eq!(it.next(), Some(6));
514     assert_eq!(it.next(), Some(9));
515     assert_eq!(it.next(), None);
516
517     let mut it = (0..3).step_by(1);
518     assert_eq!(it.next_back(), Some(2));
519     assert_eq!(it.next_back(), Some(1));
520     assert_eq!(it.next_back(), Some(0));
521     assert_eq!(it.next_back(), None);
522
523     let mut it = (0..11).step_by(3);
524     assert_eq!(it.next_back(), Some(9));
525     assert_eq!(it.next_back(), Some(6));
526     assert_eq!(it.next_back(), Some(3));
527     assert_eq!(it.next_back(), Some(0));
528     assert_eq!(it.next_back(), None);
529 }
530
531 #[test]
532 fn test_iterator_step_by_nth() {
533     let mut it = (0..16).step_by(5);
534     assert_eq!(it.nth(0), Some(0));
535     assert_eq!(it.nth(0), Some(5));
536     assert_eq!(it.nth(0), Some(10));
537     assert_eq!(it.nth(0), Some(15));
538     assert_eq!(it.nth(0), None);
539
540     let it = (0..18).step_by(5);
541     assert_eq!(it.clone().nth(0), Some(0));
542     assert_eq!(it.clone().nth(1), Some(5));
543     assert_eq!(it.clone().nth(2), Some(10));
544     assert_eq!(it.clone().nth(3), Some(15));
545     assert_eq!(it.clone().nth(4), None);
546     assert_eq!(it.clone().nth(42), None);
547 }
548
549 #[test]
550 fn test_iterator_step_by_nth_overflow() {
551     #[cfg(target_pointer_width = "8")]
552     type Bigger = u16;
553     #[cfg(target_pointer_width = "16")]
554     type Bigger = u32;
555     #[cfg(target_pointer_width = "32")]
556     type Bigger = u64;
557     #[cfg(target_pointer_width = "64")]
558     type Bigger = u128;
559
560     #[derive(Clone)]
561     struct Test(Bigger);
562     impl Iterator for &mut Test {
563         type Item = i32;
564         fn next(&mut self) -> Option<Self::Item> {
565             Some(21)
566         }
567         fn nth(&mut self, n: usize) -> Option<Self::Item> {
568             self.0 += n as Bigger + 1;
569             Some(42)
570         }
571     }
572
573     let mut it = Test(0);
574     let root = usize::MAX >> (usize::BITS / 2);
575     let n = root + 20;
576     (&mut it).step_by(n).nth(n);
577     assert_eq!(it.0, n as Bigger * n as Bigger);
578
579     // large step
580     let mut it = Test(0);
581     (&mut it).step_by(usize::MAX).nth(5);
582     assert_eq!(it.0, (usize::MAX as Bigger) * 5);
583
584     // n + 1 overflows
585     let mut it = Test(0);
586     (&mut it).step_by(2).nth(usize::MAX);
587     assert_eq!(it.0, (usize::MAX as Bigger) * 2);
588
589     // n + 1 overflows
590     let mut it = Test(0);
591     (&mut it).step_by(1).nth(usize::MAX);
592     assert_eq!(it.0, (usize::MAX as Bigger) * 1);
593 }
594
595 #[test]
596 fn test_iterator_step_by_nth_try_fold() {
597     let mut it = (0..).step_by(10);
598     assert_eq!(it.try_fold(0, i8::checked_add), None);
599     assert_eq!(it.next(), Some(60));
600     assert_eq!(it.try_fold(0, i8::checked_add), None);
601     assert_eq!(it.next(), Some(90));
602
603     let mut it = (100..).step_by(10);
604     assert_eq!(it.try_fold(50, i8::checked_add), None);
605     assert_eq!(it.next(), Some(110));
606
607     let mut it = (100..=100).step_by(10);
608     assert_eq!(it.next(), Some(100));
609     assert_eq!(it.try_fold(0, i8::checked_add), Some(0));
610 }
611
612 #[test]
613 fn test_iterator_step_by_nth_back() {
614     let mut it = (0..16).step_by(5);
615     assert_eq!(it.nth_back(0), Some(15));
616     assert_eq!(it.nth_back(0), Some(10));
617     assert_eq!(it.nth_back(0), Some(5));
618     assert_eq!(it.nth_back(0), Some(0));
619     assert_eq!(it.nth_back(0), None);
620
621     let mut it = (0..16).step_by(5);
622     assert_eq!(it.next(), Some(0)); // to set `first_take` to `false`
623     assert_eq!(it.nth_back(0), Some(15));
624     assert_eq!(it.nth_back(0), Some(10));
625     assert_eq!(it.nth_back(0), Some(5));
626     assert_eq!(it.nth_back(0), None);
627
628     let it = || (0..18).step_by(5);
629     assert_eq!(it().nth_back(0), Some(15));
630     assert_eq!(it().nth_back(1), Some(10));
631     assert_eq!(it().nth_back(2), Some(5));
632     assert_eq!(it().nth_back(3), Some(0));
633     assert_eq!(it().nth_back(4), None);
634     assert_eq!(it().nth_back(42), None);
635 }
636
637 #[test]
638 fn test_iterator_step_by_nth_try_rfold() {
639     let mut it = (0..100).step_by(10);
640     assert_eq!(it.try_rfold(0, i8::checked_add), None);
641     assert_eq!(it.next_back(), Some(70));
642     assert_eq!(it.next(), Some(0));
643     assert_eq!(it.try_rfold(0, i8::checked_add), None);
644     assert_eq!(it.next_back(), Some(30));
645
646     let mut it = (0..100).step_by(10);
647     assert_eq!(it.try_rfold(50, i8::checked_add), None);
648     assert_eq!(it.next_back(), Some(80));
649
650     let mut it = (100..=100).step_by(10);
651     assert_eq!(it.next_back(), Some(100));
652     assert_eq!(it.try_fold(0, i8::checked_add), Some(0));
653 }
654
655 #[test]
656 #[should_panic]
657 fn test_iterator_step_by_zero() {
658     let mut it = (0..).step_by(0);
659     it.next();
660 }
661
662 #[test]
663 fn test_iterator_step_by_size_hint() {
664     struct StubSizeHint(usize, Option<usize>);
665     impl Iterator for StubSizeHint {
666         type Item = ();
667         fn next(&mut self) -> Option<()> {
668             self.0 -= 1;
669             if let Some(ref mut upper) = self.1 {
670                 *upper -= 1;
671             }
672             Some(())
673         }
674         fn size_hint(&self) -> (usize, Option<usize>) {
675             (self.0, self.1)
676         }
677     }
678
679     // The two checks in each case are needed because the logic
680     // is different before the first call to `next()`.
681
682     let mut it = StubSizeHint(10, Some(10)).step_by(1);
683     assert_eq!(it.size_hint(), (10, Some(10)));
684     it.next();
685     assert_eq!(it.size_hint(), (9, Some(9)));
686
687     // exact multiple
688     let mut it = StubSizeHint(10, Some(10)).step_by(3);
689     assert_eq!(it.size_hint(), (4, Some(4)));
690     it.next();
691     assert_eq!(it.size_hint(), (3, Some(3)));
692
693     // larger base range, but not enough to get another element
694     let mut it = StubSizeHint(12, Some(12)).step_by(3);
695     assert_eq!(it.size_hint(), (4, Some(4)));
696     it.next();
697     assert_eq!(it.size_hint(), (3, Some(3)));
698
699     // smaller base range, so fewer resulting elements
700     let mut it = StubSizeHint(9, Some(9)).step_by(3);
701     assert_eq!(it.size_hint(), (3, Some(3)));
702     it.next();
703     assert_eq!(it.size_hint(), (2, Some(2)));
704
705     // infinite upper bound
706     let mut it = StubSizeHint(usize::MAX, None).step_by(1);
707     assert_eq!(it.size_hint(), (usize::MAX, None));
708     it.next();
709     assert_eq!(it.size_hint(), (usize::MAX - 1, None));
710
711     // still infinite with larger step
712     let mut it = StubSizeHint(7, None).step_by(3);
713     assert_eq!(it.size_hint(), (3, None));
714     it.next();
715     assert_eq!(it.size_hint(), (2, None));
716
717     // propagates ExactSizeIterator
718     let a = [1, 2, 3, 4, 5];
719     let it = a.iter().step_by(2);
720     assert_eq!(it.len(), 3);
721
722     // Cannot be TrustedLen as a step greater than one makes an iterator
723     // with (usize::MAX, None) no longer meet the safety requirements
724     trait TrustedLenCheck {
725         fn test(self) -> bool;
726     }
727     impl<T: Iterator> TrustedLenCheck for T {
728         default fn test(self) -> bool {
729             false
730         }
731     }
732     impl<T: TrustedLen> TrustedLenCheck for T {
733         fn test(self) -> bool {
734             true
735         }
736     }
737     assert!(TrustedLenCheck::test(a.iter()));
738     assert!(!TrustedLenCheck::test(a.iter().step_by(1)));
739 }
740
741 #[test]
742 fn test_filter_map() {
743     let it = (0..).step_by(1).take(10).filter_map(|x| if x % 2 == 0 { Some(x * x) } else { None });
744     assert_eq!(it.collect::<Vec<usize>>(), [0 * 0, 2 * 2, 4 * 4, 6 * 6, 8 * 8]);
745 }
746
747 #[test]
748 fn test_filter_map_fold() {
749     let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8];
750     let ys = [0 * 0, 2 * 2, 4 * 4, 6 * 6, 8 * 8];
751     let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x * x) } else { None });
752     let i = it.fold(0, |i, x| {
753         assert_eq!(x, ys[i]);
754         i + 1
755     });
756     assert_eq!(i, ys.len());
757
758     let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x * x) } else { None });
759     let i = it.rfold(ys.len(), |i, x| {
760         assert_eq!(x, ys[i - 1]);
761         i - 1
762     });
763     assert_eq!(i, 0);
764 }
765
766 #[test]
767 fn test_iterator_enumerate() {
768     let xs = [0, 1, 2, 3, 4, 5];
769     let it = xs.iter().enumerate();
770     for (i, &x) in it {
771         assert_eq!(i, x);
772     }
773 }
774
775 #[test]
776 fn test_iterator_enumerate_nth() {
777     let xs = [0, 1, 2, 3, 4, 5];
778     for (i, &x) in xs.iter().enumerate() {
779         assert_eq!(i, x);
780     }
781
782     let mut it = xs.iter().enumerate();
783     while let Some((i, &x)) = it.nth(0) {
784         assert_eq!(i, x);
785     }
786
787     let mut it = xs.iter().enumerate();
788     while let Some((i, &x)) = it.nth(1) {
789         assert_eq!(i, x);
790     }
791
792     let (i, &x) = xs.iter().enumerate().nth(3).unwrap();
793     assert_eq!(i, x);
794     assert_eq!(i, 3);
795 }
796
797 #[test]
798 fn test_iterator_enumerate_nth_back() {
799     let xs = [0, 1, 2, 3, 4, 5];
800     let mut it = xs.iter().enumerate();
801     while let Some((i, &x)) = it.nth_back(0) {
802         assert_eq!(i, x);
803     }
804
805     let mut it = xs.iter().enumerate();
806     while let Some((i, &x)) = it.nth_back(1) {
807         assert_eq!(i, x);
808     }
809
810     let (i, &x) = xs.iter().enumerate().nth_back(3).unwrap();
811     assert_eq!(i, x);
812     assert_eq!(i, 2);
813 }
814
815 #[test]
816 fn test_iterator_enumerate_count() {
817     let xs = [0, 1, 2, 3, 4, 5];
818     assert_eq!(xs.iter().enumerate().count(), 6);
819 }
820
821 #[test]
822 fn test_iterator_enumerate_fold() {
823     let xs = [0, 1, 2, 3, 4, 5];
824     let mut it = xs.iter().enumerate();
825     // steal a couple to get an interesting offset
826     assert_eq!(it.next(), Some((0, &0)));
827     assert_eq!(it.next(), Some((1, &1)));
828     let i = it.fold(2, |i, (j, &x)| {
829         assert_eq!(i, j);
830         assert_eq!(x, xs[j]);
831         i + 1
832     });
833     assert_eq!(i, xs.len());
834
835     let mut it = xs.iter().enumerate();
836     assert_eq!(it.next(), Some((0, &0)));
837     let i = it.rfold(xs.len() - 1, |i, (j, &x)| {
838         assert_eq!(i, j);
839         assert_eq!(x, xs[j]);
840         i - 1
841     });
842     assert_eq!(i, 0);
843 }
844
845 #[test]
846 fn test_iterator_filter_count() {
847     let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8];
848     assert_eq!(xs.iter().filter(|&&x| x % 2 == 0).count(), 5);
849 }
850
851 #[test]
852 fn test_iterator_filter_fold() {
853     let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8];
854     let ys = [0, 2, 4, 6, 8];
855     let it = xs.iter().filter(|&&x| x % 2 == 0);
856     let i = it.fold(0, |i, &x| {
857         assert_eq!(x, ys[i]);
858         i + 1
859     });
860     assert_eq!(i, ys.len());
861
862     let it = xs.iter().filter(|&&x| x % 2 == 0);
863     let i = it.rfold(ys.len(), |i, &x| {
864         assert_eq!(x, ys[i - 1]);
865         i - 1
866     });
867     assert_eq!(i, 0);
868 }
869
870 #[test]
871 fn test_iterator_peekable() {
872     let xs = vec![0, 1, 2, 3, 4, 5];
873
874     let mut it = xs.iter().cloned().peekable();
875     assert_eq!(it.len(), 6);
876     assert_eq!(it.peek().unwrap(), &0);
877     assert_eq!(it.len(), 6);
878     assert_eq!(it.next().unwrap(), 0);
879     assert_eq!(it.len(), 5);
880     assert_eq!(it.next().unwrap(), 1);
881     assert_eq!(it.len(), 4);
882     assert_eq!(it.next().unwrap(), 2);
883     assert_eq!(it.len(), 3);
884     assert_eq!(it.peek().unwrap(), &3);
885     assert_eq!(it.len(), 3);
886     assert_eq!(it.peek().unwrap(), &3);
887     assert_eq!(it.len(), 3);
888     assert_eq!(it.next().unwrap(), 3);
889     assert_eq!(it.len(), 2);
890     assert_eq!(it.next().unwrap(), 4);
891     assert_eq!(it.len(), 1);
892     assert_eq!(it.peek().unwrap(), &5);
893     assert_eq!(it.len(), 1);
894     assert_eq!(it.next().unwrap(), 5);
895     assert_eq!(it.len(), 0);
896     assert!(it.peek().is_none());
897     assert_eq!(it.len(), 0);
898     assert!(it.next().is_none());
899     assert_eq!(it.len(), 0);
900
901     let mut it = xs.iter().cloned().peekable();
902     assert_eq!(it.len(), 6);
903     assert_eq!(it.peek().unwrap(), &0);
904     assert_eq!(it.len(), 6);
905     assert_eq!(it.next_back().unwrap(), 5);
906     assert_eq!(it.len(), 5);
907     assert_eq!(it.next_back().unwrap(), 4);
908     assert_eq!(it.len(), 4);
909     assert_eq!(it.next_back().unwrap(), 3);
910     assert_eq!(it.len(), 3);
911     assert_eq!(it.peek().unwrap(), &0);
912     assert_eq!(it.len(), 3);
913     assert_eq!(it.peek().unwrap(), &0);
914     assert_eq!(it.len(), 3);
915     assert_eq!(it.next_back().unwrap(), 2);
916     assert_eq!(it.len(), 2);
917     assert_eq!(it.next_back().unwrap(), 1);
918     assert_eq!(it.len(), 1);
919     assert_eq!(it.peek().unwrap(), &0);
920     assert_eq!(it.len(), 1);
921     assert_eq!(it.next_back().unwrap(), 0);
922     assert_eq!(it.len(), 0);
923     assert!(it.peek().is_none());
924     assert_eq!(it.len(), 0);
925     assert!(it.next_back().is_none());
926     assert_eq!(it.len(), 0);
927 }
928
929 #[test]
930 fn test_iterator_peekable_count() {
931     let xs = [0, 1, 2, 3, 4, 5];
932     let ys = [10];
933     let zs: [i32; 0] = [];
934
935     assert_eq!(xs.iter().peekable().count(), 6);
936
937     let mut it = xs.iter().peekable();
938     assert_eq!(it.peek(), Some(&&0));
939     assert_eq!(it.count(), 6);
940
941     assert_eq!(ys.iter().peekable().count(), 1);
942
943     let mut it = ys.iter().peekable();
944     assert_eq!(it.peek(), Some(&&10));
945     assert_eq!(it.count(), 1);
946
947     assert_eq!(zs.iter().peekable().count(), 0);
948
949     let mut it = zs.iter().peekable();
950     assert_eq!(it.peek(), None);
951 }
952
953 #[test]
954 fn test_iterator_peekable_nth() {
955     let xs = [0, 1, 2, 3, 4, 5];
956     let mut it = xs.iter().peekable();
957
958     assert_eq!(it.peek(), Some(&&0));
959     assert_eq!(it.nth(0), Some(&0));
960     assert_eq!(it.peek(), Some(&&1));
961     assert_eq!(it.nth(1), Some(&2));
962     assert_eq!(it.peek(), Some(&&3));
963     assert_eq!(it.nth(2), Some(&5));
964     assert_eq!(it.next(), None);
965 }
966
967 #[test]
968 fn test_iterator_peekable_last() {
969     let xs = [0, 1, 2, 3, 4, 5];
970     let ys = [0];
971
972     let mut it = xs.iter().peekable();
973     assert_eq!(it.peek(), Some(&&0));
974     assert_eq!(it.last(), Some(&5));
975
976     let mut it = ys.iter().peekable();
977     assert_eq!(it.peek(), Some(&&0));
978     assert_eq!(it.last(), Some(&0));
979
980     let mut it = ys.iter().peekable();
981     assert_eq!(it.next(), Some(&0));
982     assert_eq!(it.peek(), None);
983     assert_eq!(it.last(), None);
984 }
985
986 #[test]
987 fn test_iterator_peekable_fold() {
988     let xs = [0, 1, 2, 3, 4, 5];
989     let mut it = xs.iter().peekable();
990     assert_eq!(it.peek(), Some(&&0));
991     let i = it.fold(0, |i, &x| {
992         assert_eq!(x, xs[i]);
993         i + 1
994     });
995     assert_eq!(i, xs.len());
996 }
997
998 #[test]
999 fn test_iterator_peekable_rfold() {
1000     let xs = [0, 1, 2, 3, 4, 5];
1001     let mut it = xs.iter().peekable();
1002     assert_eq!(it.peek(), Some(&&0));
1003     let i = it.rfold(0, |i, &x| {
1004         assert_eq!(x, xs[xs.len() - 1 - i]);
1005         i + 1
1006     });
1007     assert_eq!(i, xs.len());
1008 }
1009
1010 #[test]
1011 fn test_iterator_peekable_next_if_eq() {
1012     // first, try on references
1013     let xs = vec!["Heart", "of", "Gold"];
1014     let mut it = xs.into_iter().peekable();
1015     // try before `peek()`
1016     assert_eq!(it.next_if_eq(&"trillian"), None);
1017     assert_eq!(it.next_if_eq(&"Heart"), Some("Heart"));
1018     // try after peek()
1019     assert_eq!(it.peek(), Some(&"of"));
1020     assert_eq!(it.next_if_eq(&"of"), Some("of"));
1021     assert_eq!(it.next_if_eq(&"zaphod"), None);
1022     // make sure `next()` still behaves
1023     assert_eq!(it.next(), Some("Gold"));
1024
1025     // make sure comparison works for owned values
1026     let xs = vec![String::from("Ludicrous"), "speed".into()];
1027     let mut it = xs.into_iter().peekable();
1028     // make sure basic functionality works
1029     assert_eq!(it.next_if_eq("Ludicrous"), Some("Ludicrous".into()));
1030     assert_eq!(it.next_if_eq("speed"), Some("speed".into()));
1031     assert_eq!(it.next_if_eq(""), None);
1032 }
1033
1034 /// This is an iterator that follows the Iterator contract,
1035 /// but it is not fused. After having returned None once, it will start
1036 /// producing elements if .next() is called again.
1037 pub struct CycleIter<'a, T> {
1038     index: usize,
1039     data: &'a [T],
1040 }
1041
1042 pub fn cycle<T>(data: &[T]) -> CycleIter<'_, T> {
1043     CycleIter { index: 0, data }
1044 }
1045
1046 impl<'a, T> Iterator for CycleIter<'a, T> {
1047     type Item = &'a T;
1048     fn next(&mut self) -> Option<Self::Item> {
1049         let elt = self.data.get(self.index);
1050         self.index += 1;
1051         self.index %= 1 + self.data.len();
1052         elt
1053     }
1054 }
1055
1056 #[test]
1057 fn test_iterator_peekable_remember_peek_none_1() {
1058     // Check that the loop using .peek() terminates
1059     let data = [1, 2, 3];
1060     let mut iter = cycle(&data).peekable();
1061
1062     let mut n = 0;
1063     while let Some(_) = iter.next() {
1064         let is_the_last = iter.peek().is_none();
1065         assert_eq!(is_the_last, n == data.len() - 1);
1066         n += 1;
1067         if n > data.len() {
1068             break;
1069         }
1070     }
1071     assert_eq!(n, data.len());
1072 }
1073
1074 #[test]
1075 fn test_iterator_peekable_remember_peek_none_2() {
1076     let data = [0];
1077     let mut iter = cycle(&data).peekable();
1078     iter.next();
1079     assert_eq!(iter.peek(), None);
1080     assert_eq!(iter.last(), None);
1081 }
1082
1083 #[test]
1084 fn test_iterator_peekable_remember_peek_none_3() {
1085     let data = [0];
1086     let mut iter = cycle(&data).peekable();
1087     iter.peek();
1088     assert_eq!(iter.nth(0), Some(&0));
1089
1090     let mut iter = cycle(&data).peekable();
1091     iter.next();
1092     assert_eq!(iter.peek(), None);
1093     assert_eq!(iter.nth(0), None);
1094 }
1095
1096 #[test]
1097 fn test_iterator_take_while() {
1098     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
1099     let ys = [0, 1, 2, 3, 5, 13];
1100     let it = xs.iter().take_while(|&x| *x < 15);
1101     let mut i = 0;
1102     for x in it {
1103         assert_eq!(*x, ys[i]);
1104         i += 1;
1105     }
1106     assert_eq!(i, ys.len());
1107 }
1108
1109 #[test]
1110 fn test_iterator_skip_while() {
1111     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
1112     let ys = [15, 16, 17, 19];
1113     let it = xs.iter().skip_while(|&x| *x < 15);
1114     let mut i = 0;
1115     for x in it {
1116         assert_eq!(*x, ys[i]);
1117         i += 1;
1118     }
1119     assert_eq!(i, ys.len());
1120 }
1121
1122 #[test]
1123 fn test_iterator_skip_while_fold() {
1124     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
1125     let ys = [15, 16, 17, 19];
1126     let it = xs.iter().skip_while(|&x| *x < 15);
1127     let i = it.fold(0, |i, &x| {
1128         assert_eq!(x, ys[i]);
1129         i + 1
1130     });
1131     assert_eq!(i, ys.len());
1132
1133     let mut it = xs.iter().skip_while(|&x| *x < 15);
1134     assert_eq!(it.next(), Some(&ys[0])); // process skips before folding
1135     let i = it.fold(1, |i, &x| {
1136         assert_eq!(x, ys[i]);
1137         i + 1
1138     });
1139     assert_eq!(i, ys.len());
1140 }
1141
1142 #[test]
1143 fn test_iterator_skip() {
1144     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
1145     let ys = [13, 15, 16, 17, 19, 20, 30];
1146     let mut it = xs.iter().skip(5);
1147     let mut i = 0;
1148     while let Some(&x) = it.next() {
1149         assert_eq!(x, ys[i]);
1150         i += 1;
1151         assert_eq!(it.len(), xs.len() - 5 - i);
1152     }
1153     assert_eq!(i, ys.len());
1154     assert_eq!(it.len(), 0);
1155 }
1156
1157 #[test]
1158 fn test_iterator_skip_doubleended() {
1159     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
1160     let mut it = xs.iter().rev().skip(5);
1161     assert_eq!(it.next(), Some(&15));
1162     assert_eq!(it.by_ref().rev().next(), Some(&0));
1163     assert_eq!(it.next(), Some(&13));
1164     assert_eq!(it.by_ref().rev().next(), Some(&1));
1165     assert_eq!(it.next(), Some(&5));
1166     assert_eq!(it.by_ref().rev().next(), Some(&2));
1167     assert_eq!(it.next(), Some(&3));
1168     assert_eq!(it.next(), None);
1169     let mut it = xs.iter().rev().skip(5).rev();
1170     assert_eq!(it.next(), Some(&0));
1171     assert_eq!(it.rev().next(), Some(&15));
1172     let mut it_base = xs.iter();
1173     {
1174         let mut it = it_base.by_ref().skip(5).rev();
1175         assert_eq!(it.next(), Some(&30));
1176         assert_eq!(it.next(), Some(&20));
1177         assert_eq!(it.next(), Some(&19));
1178         assert_eq!(it.next(), Some(&17));
1179         assert_eq!(it.next(), Some(&16));
1180         assert_eq!(it.next(), Some(&15));
1181         assert_eq!(it.next(), Some(&13));
1182         assert_eq!(it.next(), None);
1183     }
1184     // make sure the skipped parts have not been consumed
1185     assert_eq!(it_base.next(), Some(&0));
1186     assert_eq!(it_base.next(), Some(&1));
1187     assert_eq!(it_base.next(), Some(&2));
1188     assert_eq!(it_base.next(), Some(&3));
1189     assert_eq!(it_base.next(), Some(&5));
1190     assert_eq!(it_base.next(), None);
1191     let it = xs.iter().skip(5).rev();
1192     assert_eq!(it.last(), Some(&13));
1193 }
1194
1195 #[test]
1196 fn test_iterator_skip_nth() {
1197     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
1198
1199     let mut it = xs.iter().skip(0);
1200     assert_eq!(it.nth(0), Some(&0));
1201     assert_eq!(it.nth(1), Some(&2));
1202
1203     let mut it = xs.iter().skip(5);
1204     assert_eq!(it.nth(0), Some(&13));
1205     assert_eq!(it.nth(1), Some(&16));
1206
1207     let mut it = xs.iter().skip(12);
1208     assert_eq!(it.nth(0), None);
1209 }
1210
1211 #[test]
1212 fn test_iterator_skip_count() {
1213     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
1214
1215     assert_eq!(xs.iter().skip(0).count(), 12);
1216     assert_eq!(xs.iter().skip(1).count(), 11);
1217     assert_eq!(xs.iter().skip(11).count(), 1);
1218     assert_eq!(xs.iter().skip(12).count(), 0);
1219     assert_eq!(xs.iter().skip(13).count(), 0);
1220 }
1221
1222 #[test]
1223 fn test_iterator_skip_last() {
1224     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
1225
1226     assert_eq!(xs.iter().skip(0).last(), Some(&30));
1227     assert_eq!(xs.iter().skip(1).last(), Some(&30));
1228     assert_eq!(xs.iter().skip(11).last(), Some(&30));
1229     assert_eq!(xs.iter().skip(12).last(), None);
1230     assert_eq!(xs.iter().skip(13).last(), None);
1231
1232     let mut it = xs.iter().skip(5);
1233     assert_eq!(it.next(), Some(&13));
1234     assert_eq!(it.last(), Some(&30));
1235 }
1236
1237 #[test]
1238 fn test_iterator_skip_fold() {
1239     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
1240     let ys = [13, 15, 16, 17, 19, 20, 30];
1241
1242     let it = xs.iter().skip(5);
1243     let i = it.fold(0, |i, &x| {
1244         assert_eq!(x, ys[i]);
1245         i + 1
1246     });
1247     assert_eq!(i, ys.len());
1248
1249     let mut it = xs.iter().skip(5);
1250     assert_eq!(it.next(), Some(&ys[0])); // process skips before folding
1251     let i = it.fold(1, |i, &x| {
1252         assert_eq!(x, ys[i]);
1253         i + 1
1254     });
1255     assert_eq!(i, ys.len());
1256
1257     let it = xs.iter().skip(5);
1258     let i = it.rfold(ys.len(), |i, &x| {
1259         let i = i - 1;
1260         assert_eq!(x, ys[i]);
1261         i
1262     });
1263     assert_eq!(i, 0);
1264
1265     let mut it = xs.iter().skip(5);
1266     assert_eq!(it.next(), Some(&ys[0])); // process skips before folding
1267     let i = it.rfold(ys.len(), |i, &x| {
1268         let i = i - 1;
1269         assert_eq!(x, ys[i]);
1270         i
1271     });
1272     assert_eq!(i, 1);
1273 }
1274
1275 #[test]
1276 fn test_iterator_take() {
1277     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
1278     let ys = [0, 1, 2, 3, 5];
1279
1280     let mut it = xs.iter().take(ys.len());
1281     let mut i = 0;
1282     assert_eq!(it.len(), ys.len());
1283     while let Some(&x) = it.next() {
1284         assert_eq!(x, ys[i]);
1285         i += 1;
1286         assert_eq!(it.len(), ys.len() - i);
1287     }
1288     assert_eq!(i, ys.len());
1289     assert_eq!(it.len(), 0);
1290
1291     let mut it = xs.iter().take(ys.len());
1292     let mut i = 0;
1293     assert_eq!(it.len(), ys.len());
1294     while let Some(&x) = it.next_back() {
1295         i += 1;
1296         assert_eq!(x, ys[ys.len() - i]);
1297         assert_eq!(it.len(), ys.len() - i);
1298     }
1299     assert_eq!(i, ys.len());
1300     assert_eq!(it.len(), 0);
1301 }
1302
1303 #[test]
1304 fn test_iterator_take_nth() {
1305     let xs = [0, 1, 2, 4, 5];
1306     let mut it = xs.iter();
1307     {
1308         let mut take = it.by_ref().take(3);
1309         let mut i = 0;
1310         while let Some(&x) = take.nth(0) {
1311             assert_eq!(x, i);
1312             i += 1;
1313         }
1314     }
1315     assert_eq!(it.nth(1), Some(&5));
1316     assert_eq!(it.nth(0), None);
1317
1318     let xs = [0, 1, 2, 3, 4];
1319     let mut it = xs.iter().take(7);
1320     let mut i = 1;
1321     while let Some(&x) = it.nth(1) {
1322         assert_eq!(x, i);
1323         i += 2;
1324     }
1325 }
1326
1327 #[test]
1328 fn test_iterator_take_nth_back() {
1329     let xs = [0, 1, 2, 4, 5];
1330     let mut it = xs.iter();
1331     {
1332         let mut take = it.by_ref().take(3);
1333         let mut i = 0;
1334         while let Some(&x) = take.nth_back(0) {
1335             i += 1;
1336             assert_eq!(x, 3 - i);
1337         }
1338     }
1339     assert_eq!(it.nth_back(0), None);
1340
1341     let xs = [0, 1, 2, 3, 4];
1342     let mut it = xs.iter().take(7);
1343     assert_eq!(it.nth_back(1), Some(&3));
1344     assert_eq!(it.nth_back(1), Some(&1));
1345     assert_eq!(it.nth_back(1), None);
1346 }
1347
1348 #[test]
1349 fn test_iterator_take_short() {
1350     let xs = [0, 1, 2, 3];
1351
1352     let mut it = xs.iter().take(5);
1353     let mut i = 0;
1354     assert_eq!(it.len(), xs.len());
1355     while let Some(&x) = it.next() {
1356         assert_eq!(x, xs[i]);
1357         i += 1;
1358         assert_eq!(it.len(), xs.len() - i);
1359     }
1360     assert_eq!(i, xs.len());
1361     assert_eq!(it.len(), 0);
1362
1363     let mut it = xs.iter().take(5);
1364     let mut i = 0;
1365     assert_eq!(it.len(), xs.len());
1366     while let Some(&x) = it.next_back() {
1367         i += 1;
1368         assert_eq!(x, xs[xs.len() - i]);
1369         assert_eq!(it.len(), xs.len() - i);
1370     }
1371     assert_eq!(i, xs.len());
1372     assert_eq!(it.len(), 0);
1373 }
1374
1375 #[test]
1376 fn test_iterator_scan() {
1377     // test the type inference
1378     fn add(old: &mut isize, new: &usize) -> Option<f64> {
1379         *old += *new as isize;
1380         Some(*old as f64)
1381     }
1382     let xs = [0, 1, 2, 3, 4];
1383     let ys = [0f64, 1.0, 3.0, 6.0, 10.0];
1384
1385     let it = xs.iter().scan(0, add);
1386     let mut i = 0;
1387     for x in it {
1388         assert_eq!(x, ys[i]);
1389         i += 1;
1390     }
1391     assert_eq!(i, ys.len());
1392 }
1393
1394 #[test]
1395 fn test_iterator_flat_map() {
1396     let xs = [0, 3, 6];
1397     let ys = [0, 1, 2, 3, 4, 5, 6, 7, 8];
1398     let it = xs.iter().flat_map(|&x| (x..).step_by(1).take(3));
1399     let mut i = 0;
1400     for x in it {
1401         assert_eq!(x, ys[i]);
1402         i += 1;
1403     }
1404     assert_eq!(i, ys.len());
1405 }
1406
1407 /// Tests `FlatMap::fold` with items already picked off the front and back,
1408 /// to make sure all parts of the `FlatMap` are folded correctly.
1409 #[test]
1410 fn test_iterator_flat_map_fold() {
1411     let xs = [0, 3, 6];
1412     let ys = [1, 2, 3, 4, 5, 6, 7];
1413     let mut it = xs.iter().flat_map(|&x| x..x + 3);
1414     assert_eq!(it.next(), Some(0));
1415     assert_eq!(it.next_back(), Some(8));
1416     let i = it.fold(0, |i, x| {
1417         assert_eq!(x, ys[i]);
1418         i + 1
1419     });
1420     assert_eq!(i, ys.len());
1421
1422     let mut it = xs.iter().flat_map(|&x| x..x + 3);
1423     assert_eq!(it.next(), Some(0));
1424     assert_eq!(it.next_back(), Some(8));
1425     let i = it.rfold(ys.len(), |i, x| {
1426         assert_eq!(x, ys[i - 1]);
1427         i - 1
1428     });
1429     assert_eq!(i, 0);
1430 }
1431
1432 #[test]
1433 fn test_iterator_flatten() {
1434     let xs = [0, 3, 6];
1435     let ys = [0, 1, 2, 3, 4, 5, 6, 7, 8];
1436     let it = xs.iter().map(|&x| (x..).step_by(1).take(3)).flatten();
1437     let mut i = 0;
1438     for x in it {
1439         assert_eq!(x, ys[i]);
1440         i += 1;
1441     }
1442     assert_eq!(i, ys.len());
1443 }
1444
1445 /// Tests `Flatten::fold` with items already picked off the front and back,
1446 /// to make sure all parts of the `Flatten` are folded correctly.
1447 #[test]
1448 fn test_iterator_flatten_fold() {
1449     let xs = [0, 3, 6];
1450     let ys = [1, 2, 3, 4, 5, 6, 7];
1451     let mut it = xs.iter().map(|&x| x..x + 3).flatten();
1452     assert_eq!(it.next(), Some(0));
1453     assert_eq!(it.next_back(), Some(8));
1454     let i = it.fold(0, |i, x| {
1455         assert_eq!(x, ys[i]);
1456         i + 1
1457     });
1458     assert_eq!(i, ys.len());
1459
1460     let mut it = xs.iter().map(|&x| x..x + 3).flatten();
1461     assert_eq!(it.next(), Some(0));
1462     assert_eq!(it.next_back(), Some(8));
1463     let i = it.rfold(ys.len(), |i, x| {
1464         assert_eq!(x, ys[i - 1]);
1465         i - 1
1466     });
1467     assert_eq!(i, 0);
1468 }
1469
1470 #[test]
1471 fn test_inspect() {
1472     let xs = [1, 2, 3, 4];
1473     let mut n = 0;
1474
1475     let ys = xs.iter().cloned().inspect(|_| n += 1).collect::<Vec<usize>>();
1476
1477     assert_eq!(n, xs.len());
1478     assert_eq!(&xs[..], &ys[..]);
1479 }
1480
1481 #[test]
1482 fn test_inspect_fold() {
1483     let xs = [1, 2, 3, 4];
1484     let mut n = 0;
1485     {
1486         let it = xs.iter().inspect(|_| n += 1);
1487         let i = it.fold(0, |i, &x| {
1488             assert_eq!(x, xs[i]);
1489             i + 1
1490         });
1491         assert_eq!(i, xs.len());
1492     }
1493     assert_eq!(n, xs.len());
1494
1495     let mut n = 0;
1496     {
1497         let it = xs.iter().inspect(|_| n += 1);
1498         let i = it.rfold(xs.len(), |i, &x| {
1499             assert_eq!(x, xs[i - 1]);
1500             i - 1
1501         });
1502         assert_eq!(i, 0);
1503     }
1504     assert_eq!(n, xs.len());
1505 }
1506
1507 #[test]
1508 fn test_cycle() {
1509     let cycle_len = 3;
1510     let it = (0..).step_by(1).take(cycle_len).cycle();
1511     assert_eq!(it.size_hint(), (usize::MAX, None));
1512     for (i, x) in it.take(100).enumerate() {
1513         assert_eq!(i % cycle_len, x);
1514     }
1515
1516     let mut it = (0..).step_by(1).take(0).cycle();
1517     assert_eq!(it.size_hint(), (0, Some(0)));
1518     assert_eq!(it.next(), None);
1519
1520     assert_eq!(empty::<i32>().cycle().fold(0, |acc, x| acc + x), 0);
1521
1522     assert_eq!(once(1).cycle().skip(1).take(4).fold(0, |acc, x| acc + x), 4);
1523
1524     assert_eq!((0..10).cycle().take(5).sum::<i32>(), 10);
1525     assert_eq!((0..10).cycle().take(15).sum::<i32>(), 55);
1526     assert_eq!((0..10).cycle().take(25).sum::<i32>(), 100);
1527
1528     let mut iter = (0..10).cycle();
1529     iter.nth(14);
1530     assert_eq!(iter.take(8).sum::<i32>(), 38);
1531
1532     let mut iter = (0..10).cycle();
1533     iter.nth(9);
1534     assert_eq!(iter.take(3).sum::<i32>(), 3);
1535 }
1536
1537 #[test]
1538 fn test_iterator_nth() {
1539     let v: &[_] = &[0, 1, 2, 3, 4];
1540     for i in 0..v.len() {
1541         assert_eq!(v.iter().nth(i).unwrap(), &v[i]);
1542     }
1543     assert_eq!(v.iter().nth(v.len()), None);
1544 }
1545
1546 #[test]
1547 fn test_iterator_nth_back() {
1548     let v: &[_] = &[0, 1, 2, 3, 4];
1549     for i in 0..v.len() {
1550         assert_eq!(v.iter().nth_back(i).unwrap(), &v[v.len() - 1 - i]);
1551     }
1552     assert_eq!(v.iter().nth_back(v.len()), None);
1553 }
1554
1555 #[test]
1556 fn test_iterator_rev_nth_back() {
1557     let v: &[_] = &[0, 1, 2, 3, 4];
1558     for i in 0..v.len() {
1559         assert_eq!(v.iter().rev().nth_back(i).unwrap(), &v[i]);
1560     }
1561     assert_eq!(v.iter().rev().nth_back(v.len()), None);
1562 }
1563
1564 #[test]
1565 fn test_iterator_rev_nth() {
1566     let v: &[_] = &[0, 1, 2, 3, 4];
1567     for i in 0..v.len() {
1568         assert_eq!(v.iter().rev().nth(i).unwrap(), &v[v.len() - 1 - i]);
1569     }
1570     assert_eq!(v.iter().rev().nth(v.len()), None);
1571 }
1572
1573 #[test]
1574 fn test_iterator_last() {
1575     let v: &[_] = &[0, 1, 2, 3, 4];
1576     assert_eq!(v.iter().last().unwrap(), &4);
1577     assert_eq!(v[..1].iter().last().unwrap(), &0);
1578 }
1579
1580 #[test]
1581 fn test_iterator_len() {
1582     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1583     assert_eq!(v[..4].iter().count(), 4);
1584     assert_eq!(v[..10].iter().count(), 10);
1585     assert_eq!(v[..0].iter().count(), 0);
1586 }
1587
1588 #[test]
1589 fn test_iterator_sum() {
1590     let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1591     assert_eq!(v[..4].iter().cloned().sum::<i32>(), 6);
1592     assert_eq!(v.iter().cloned().sum::<i32>(), 55);
1593     assert_eq!(v[..0].iter().cloned().sum::<i32>(), 0);
1594 }
1595
1596 #[test]
1597 fn test_iterator_sum_result() {
1598     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
1599     assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Ok(10));
1600     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
1601     assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Err(()));
1602
1603     #[derive(PartialEq, Debug)]
1604     struct S(Result<i32, ()>);
1605
1606     impl Sum<Result<i32, ()>> for S {
1607         fn sum<I: Iterator<Item = Result<i32, ()>>>(mut iter: I) -> Self {
1608             // takes the sum by repeatedly calling `next` on `iter`,
1609             // thus testing that repeated calls to `ResultShunt::try_fold`
1610             // produce the expected results
1611             Self(iter.by_ref().sum())
1612         }
1613     }
1614
1615     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
1616     assert_eq!(v.iter().cloned().sum::<S>(), S(Ok(10)));
1617     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
1618     assert_eq!(v.iter().cloned().sum::<S>(), S(Err(())));
1619 }
1620
1621 #[test]
1622 fn test_iterator_sum_option() {
1623     let v: &[Option<i32>] = &[Some(1), Some(2), Some(3), Some(4)];
1624     assert_eq!(v.iter().cloned().sum::<Option<i32>>(), Some(10));
1625     let v: &[Option<i32>] = &[Some(1), None, Some(3), Some(4)];
1626     assert_eq!(v.iter().cloned().sum::<Option<i32>>(), None);
1627 }
1628
1629 #[test]
1630 fn test_iterator_product() {
1631     let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1632     assert_eq!(v[..4].iter().cloned().product::<i32>(), 0);
1633     assert_eq!(v[1..5].iter().cloned().product::<i32>(), 24);
1634     assert_eq!(v[..0].iter().cloned().product::<i32>(), 1);
1635 }
1636
1637 #[test]
1638 fn test_iterator_product_result() {
1639     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
1640     assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Ok(24));
1641     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
1642     assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Err(()));
1643 }
1644
1645 /// A wrapper struct that implements `Eq` and `Ord` based on the wrapped
1646 /// integer modulo 3. Used to test that `Iterator::max` and `Iterator::min`
1647 /// return the correct element if some of them are equal.
1648 #[derive(Debug)]
1649 struct Mod3(i32);
1650
1651 impl PartialEq for Mod3 {
1652     fn eq(&self, other: &Self) -> bool {
1653         self.0 % 3 == other.0 % 3
1654     }
1655 }
1656
1657 impl Eq for Mod3 {}
1658
1659 impl PartialOrd for Mod3 {
1660     fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
1661         Some(self.cmp(other))
1662     }
1663 }
1664
1665 impl Ord for Mod3 {
1666     fn cmp(&self, other: &Self) -> core::cmp::Ordering {
1667         (self.0 % 3).cmp(&(other.0 % 3))
1668     }
1669 }
1670
1671 #[test]
1672 fn test_iterator_product_option() {
1673     let v: &[Option<i32>] = &[Some(1), Some(2), Some(3), Some(4)];
1674     assert_eq!(v.iter().cloned().product::<Option<i32>>(), Some(24));
1675     let v: &[Option<i32>] = &[Some(1), None, Some(3), Some(4)];
1676     assert_eq!(v.iter().cloned().product::<Option<i32>>(), None);
1677 }
1678
1679 #[test]
1680 fn test_iterator_max() {
1681     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1682     assert_eq!(v[..4].iter().cloned().max(), Some(3));
1683     assert_eq!(v.iter().cloned().max(), Some(10));
1684     assert_eq!(v[..0].iter().cloned().max(), None);
1685     assert_eq!(v.iter().cloned().map(Mod3).max().map(|x| x.0), Some(8));
1686 }
1687
1688 #[test]
1689 fn test_iterator_min() {
1690     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1691     assert_eq!(v[..4].iter().cloned().min(), Some(0));
1692     assert_eq!(v.iter().cloned().min(), Some(0));
1693     assert_eq!(v[..0].iter().cloned().min(), None);
1694     assert_eq!(v.iter().cloned().map(Mod3).min().map(|x| x.0), Some(0));
1695 }
1696
1697 #[test]
1698 fn test_iterator_size_hint() {
1699     let c = (0..).step_by(1);
1700     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
1701     let v2 = &[10, 11, 12];
1702     let vi = v.iter();
1703
1704     assert_eq!((0..).size_hint(), (usize::MAX, None));
1705     assert_eq!(c.size_hint(), (usize::MAX, None));
1706     assert_eq!(vi.clone().size_hint(), (10, Some(10)));
1707
1708     assert_eq!(c.clone().take(5).size_hint(), (5, Some(5)));
1709     assert_eq!(c.clone().skip(5).size_hint().1, None);
1710     assert_eq!(c.clone().take_while(|_| false).size_hint(), (0, None));
1711     assert_eq!(c.clone().map_while(|_| None::<()>).size_hint(), (0, None));
1712     assert_eq!(c.clone().skip_while(|_| false).size_hint(), (0, None));
1713     assert_eq!(c.clone().enumerate().size_hint(), (usize::MAX, None));
1714     assert_eq!(c.clone().chain(vi.clone().cloned()).size_hint(), (usize::MAX, None));
1715     assert_eq!(c.clone().zip(vi.clone()).size_hint(), (10, Some(10)));
1716     assert_eq!(c.clone().scan(0, |_, _| Some(0)).size_hint(), (0, None));
1717     assert_eq!(c.clone().filter(|_| false).size_hint(), (0, None));
1718     assert_eq!(c.clone().map(|_| 0).size_hint(), (usize::MAX, None));
1719     assert_eq!(c.filter_map(|_| Some(0)).size_hint(), (0, None));
1720
1721     assert_eq!(vi.clone().take(5).size_hint(), (5, Some(5)));
1722     assert_eq!(vi.clone().take(12).size_hint(), (10, Some(10)));
1723     assert_eq!(vi.clone().skip(3).size_hint(), (7, Some(7)));
1724     assert_eq!(vi.clone().skip(12).size_hint(), (0, Some(0)));
1725     assert_eq!(vi.clone().take_while(|_| false).size_hint(), (0, Some(10)));
1726     assert_eq!(vi.clone().map_while(|_| None::<()>).size_hint(), (0, Some(10)));
1727     assert_eq!(vi.clone().skip_while(|_| false).size_hint(), (0, Some(10)));
1728     assert_eq!(vi.clone().enumerate().size_hint(), (10, Some(10)));
1729     assert_eq!(vi.clone().chain(v2).size_hint(), (13, Some(13)));
1730     assert_eq!(vi.clone().zip(v2).size_hint(), (3, Some(3)));
1731     assert_eq!(vi.clone().scan(0, |_, _| Some(0)).size_hint(), (0, Some(10)));
1732     assert_eq!(vi.clone().filter(|_| false).size_hint(), (0, Some(10)));
1733     assert_eq!(vi.clone().map(|&i| i + 1).size_hint(), (10, Some(10)));
1734     assert_eq!(vi.filter_map(|_| Some(0)).size_hint(), (0, Some(10)));
1735 }
1736
1737 #[test]
1738 fn test_collect() {
1739     let a = vec![1, 2, 3, 4, 5];
1740     let b: Vec<isize> = a.iter().cloned().collect();
1741     assert!(a == b);
1742 }
1743
1744 #[test]
1745 fn test_all() {
1746     let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]);
1747     assert!(v.iter().all(|&x| x < 10));
1748     assert!(!v.iter().all(|&x| x % 2 == 0));
1749     assert!(!v.iter().all(|&x| x > 100));
1750     assert!(v[..0].iter().all(|_| panic!()));
1751 }
1752
1753 #[test]
1754 fn test_any() {
1755     let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]);
1756     assert!(v.iter().any(|&x| x < 10));
1757     assert!(v.iter().any(|&x| x % 2 == 0));
1758     assert!(!v.iter().any(|&x| x > 100));
1759     assert!(!v[..0].iter().any(|_| panic!()));
1760 }
1761
1762 #[test]
1763 fn test_find() {
1764     let v: &[isize] = &[1, 3, 9, 27, 103, 14, 11];
1765     assert_eq!(*v.iter().find(|&&x| x & 1 == 0).unwrap(), 14);
1766     assert_eq!(*v.iter().find(|&&x| x % 3 == 0).unwrap(), 3);
1767     assert!(v.iter().find(|&&x| x % 12 == 0).is_none());
1768 }
1769
1770 #[test]
1771 fn test_find_map() {
1772     let xs: &[isize] = &[];
1773     assert_eq!(xs.iter().find_map(half_if_even), None);
1774     let xs: &[isize] = &[3, 5];
1775     assert_eq!(xs.iter().find_map(half_if_even), None);
1776     let xs: &[isize] = &[4, 5];
1777     assert_eq!(xs.iter().find_map(half_if_even), Some(2));
1778     let xs: &[isize] = &[3, 6];
1779     assert_eq!(xs.iter().find_map(half_if_even), Some(3));
1780
1781     let xs: &[isize] = &[1, 2, 3, 4, 5, 6, 7];
1782     let mut iter = xs.iter();
1783     assert_eq!(iter.find_map(half_if_even), Some(1));
1784     assert_eq!(iter.find_map(half_if_even), Some(2));
1785     assert_eq!(iter.find_map(half_if_even), Some(3));
1786     assert_eq!(iter.next(), Some(&7));
1787
1788     fn half_if_even(x: &isize) -> Option<isize> {
1789         if x % 2 == 0 { Some(x / 2) } else { None }
1790     }
1791 }
1792
1793 #[test]
1794 fn test_try_find() {
1795     let xs: &[isize] = &[];
1796     assert_eq!(xs.iter().try_find(testfn), Ok(None));
1797     let xs: &[isize] = &[1, 2, 3, 4];
1798     assert_eq!(xs.iter().try_find(testfn), Ok(Some(&2)));
1799     let xs: &[isize] = &[1, 3, 4];
1800     assert_eq!(xs.iter().try_find(testfn), Err(()));
1801
1802     let xs: &[isize] = &[1, 2, 3, 4, 5, 6, 7];
1803     let mut iter = xs.iter();
1804     assert_eq!(iter.try_find(testfn), Ok(Some(&2)));
1805     assert_eq!(iter.try_find(testfn), Err(()));
1806     assert_eq!(iter.next(), Some(&5));
1807
1808     fn testfn(x: &&isize) -> Result<bool, ()> {
1809         if **x == 2 {
1810             return Ok(true);
1811         }
1812         if **x == 4 {
1813             return Err(());
1814         }
1815         Ok(false)
1816     }
1817 }
1818
1819 #[test]
1820 fn test_try_find_api_usability() -> Result<(), Box<dyn std::error::Error>> {
1821     let a = ["1", "2"];
1822
1823     let is_my_num = |s: &str, search: i32| -> Result<bool, std::num::ParseIntError> {
1824         Ok(s.parse::<i32>()? == search)
1825     };
1826
1827     let val = a.iter().try_find(|&&s| is_my_num(s, 2))?;
1828     assert_eq!(val, Some(&"2"));
1829
1830     Ok(())
1831 }
1832
1833 #[test]
1834 fn test_position() {
1835     let v = &[1, 3, 9, 27, 103, 14, 11];
1836     assert_eq!(v.iter().position(|x| *x & 1 == 0).unwrap(), 5);
1837     assert_eq!(v.iter().position(|x| *x % 3 == 0).unwrap(), 1);
1838     assert!(v.iter().position(|x| *x % 12 == 0).is_none());
1839 }
1840
1841 #[test]
1842 fn test_count() {
1843     let xs = &[1, 2, 2, 1, 5, 9, 0, 2];
1844     assert_eq!(xs.iter().filter(|x| **x == 2).count(), 3);
1845     assert_eq!(xs.iter().filter(|x| **x == 5).count(), 1);
1846     assert_eq!(xs.iter().filter(|x| **x == 95).count(), 0);
1847 }
1848
1849 #[test]
1850 fn test_max_by_key() {
1851     let xs: &[isize] = &[-3, 0, 1, 5, -10];
1852     assert_eq!(*xs.iter().max_by_key(|x| x.abs()).unwrap(), -10);
1853 }
1854
1855 #[test]
1856 fn test_max_by() {
1857     let xs: &[isize] = &[-3, 0, 1, 5, -10];
1858     assert_eq!(*xs.iter().max_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), -10);
1859 }
1860
1861 #[test]
1862 fn test_min_by_key() {
1863     let xs: &[isize] = &[-3, 0, 1, 5, -10];
1864     assert_eq!(*xs.iter().min_by_key(|x| x.abs()).unwrap(), 0);
1865 }
1866
1867 #[test]
1868 fn test_min_by() {
1869     let xs: &[isize] = &[-3, 0, 1, 5, -10];
1870     assert_eq!(*xs.iter().min_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), 0);
1871 }
1872
1873 #[test]
1874 fn test_by_ref() {
1875     let mut xs = 0..10;
1876     // sum the first five values
1877     let partial_sum = xs.by_ref().take(5).fold(0, |a, b| a + b);
1878     assert_eq!(partial_sum, 10);
1879     assert_eq!(xs.next(), Some(5));
1880 }
1881
1882 #[test]
1883 fn test_rev() {
1884     let xs = [2, 4, 6, 8, 10, 12, 14, 16];
1885     let mut it = xs.iter();
1886     it.next();
1887     it.next();
1888     assert!(it.rev().cloned().collect::<Vec<isize>>() == vec![16, 14, 12, 10, 8, 6]);
1889 }
1890
1891 #[test]
1892 fn test_copied() {
1893     let xs = [2, 4, 6, 8];
1894
1895     let mut it = xs.iter().copied();
1896     assert_eq!(it.len(), 4);
1897     assert_eq!(it.next(), Some(2));
1898     assert_eq!(it.len(), 3);
1899     assert_eq!(it.next(), Some(4));
1900     assert_eq!(it.len(), 2);
1901     assert_eq!(it.next_back(), Some(8));
1902     assert_eq!(it.len(), 1);
1903     assert_eq!(it.next_back(), Some(6));
1904     assert_eq!(it.len(), 0);
1905     assert_eq!(it.next_back(), None);
1906 }
1907
1908 #[test]
1909 fn test_cloned() {
1910     let xs = [2, 4, 6, 8];
1911
1912     let mut it = xs.iter().cloned();
1913     assert_eq!(it.len(), 4);
1914     assert_eq!(it.next(), Some(2));
1915     assert_eq!(it.len(), 3);
1916     assert_eq!(it.next(), Some(4));
1917     assert_eq!(it.len(), 2);
1918     assert_eq!(it.next_back(), Some(8));
1919     assert_eq!(it.len(), 1);
1920     assert_eq!(it.next_back(), Some(6));
1921     assert_eq!(it.len(), 0);
1922     assert_eq!(it.next_back(), None);
1923 }
1924
1925 #[test]
1926 fn test_cloned_side_effects() {
1927     let mut count = 0;
1928     {
1929         let iter = [1, 2, 3]
1930             .iter()
1931             .map(|x| {
1932                 count += 1;
1933                 x
1934             })
1935             .cloned()
1936             .zip(&[1]);
1937         for _ in iter {}
1938     }
1939     assert_eq!(count, 2);
1940 }
1941
1942 #[test]
1943 fn test_double_ended_map() {
1944     let xs = [1, 2, 3, 4, 5, 6];
1945     let mut it = xs.iter().map(|&x| x * -1);
1946     assert_eq!(it.next(), Some(-1));
1947     assert_eq!(it.next(), Some(-2));
1948     assert_eq!(it.next_back(), Some(-6));
1949     assert_eq!(it.next_back(), Some(-5));
1950     assert_eq!(it.next(), Some(-3));
1951     assert_eq!(it.next_back(), Some(-4));
1952     assert_eq!(it.next(), None);
1953 }
1954
1955 #[test]
1956 fn test_double_ended_enumerate() {
1957     let xs = [1, 2, 3, 4, 5, 6];
1958     let mut it = xs.iter().cloned().enumerate();
1959     assert_eq!(it.next(), Some((0, 1)));
1960     assert_eq!(it.next(), Some((1, 2)));
1961     assert_eq!(it.next_back(), Some((5, 6)));
1962     assert_eq!(it.next_back(), Some((4, 5)));
1963     assert_eq!(it.next_back(), Some((3, 4)));
1964     assert_eq!(it.next_back(), Some((2, 3)));
1965     assert_eq!(it.next(), None);
1966 }
1967
1968 #[test]
1969 fn test_double_ended_zip() {
1970     let xs = [1, 2, 3, 4, 5, 6];
1971     let ys = [1, 2, 3, 7];
1972     let a = xs.iter().cloned();
1973     let b = ys.iter().cloned();
1974     let mut it = a.zip(b);
1975     assert_eq!(it.next(), Some((1, 1)));
1976     assert_eq!(it.next(), Some((2, 2)));
1977     assert_eq!(it.next_back(), Some((4, 7)));
1978     assert_eq!(it.next_back(), Some((3, 3)));
1979     assert_eq!(it.next(), None);
1980 }
1981
1982 #[test]
1983 fn test_double_ended_filter() {
1984     let xs = [1, 2, 3, 4, 5, 6];
1985     let mut it = xs.iter().filter(|&x| *x & 1 == 0);
1986     assert_eq!(it.next_back().unwrap(), &6);
1987     assert_eq!(it.next_back().unwrap(), &4);
1988     assert_eq!(it.next().unwrap(), &2);
1989     assert_eq!(it.next_back(), None);
1990 }
1991
1992 #[test]
1993 fn test_double_ended_filter_map() {
1994     let xs = [1, 2, 3, 4, 5, 6];
1995     let mut it = xs.iter().filter_map(|&x| if x & 1 == 0 { Some(x * 2) } else { None });
1996     assert_eq!(it.next_back().unwrap(), 12);
1997     assert_eq!(it.next_back().unwrap(), 8);
1998     assert_eq!(it.next().unwrap(), 4);
1999     assert_eq!(it.next_back(), None);
2000 }
2001
2002 #[test]
2003 fn test_double_ended_chain() {
2004     let xs = [1, 2, 3, 4, 5];
2005     let ys = [7, 9, 11];
2006     let mut it = xs.iter().chain(&ys).rev();
2007     assert_eq!(it.next().unwrap(), &11);
2008     assert_eq!(it.next().unwrap(), &9);
2009     assert_eq!(it.next_back().unwrap(), &1);
2010     assert_eq!(it.next_back().unwrap(), &2);
2011     assert_eq!(it.next_back().unwrap(), &3);
2012     assert_eq!(it.next_back().unwrap(), &4);
2013     assert_eq!(it.next_back().unwrap(), &5);
2014     assert_eq!(it.next_back().unwrap(), &7);
2015     assert_eq!(it.next_back(), None);
2016
2017     // test that .chain() is well behaved with an unfused iterator
2018     struct CrazyIterator(bool);
2019     impl CrazyIterator {
2020         fn new() -> CrazyIterator {
2021             CrazyIterator(false)
2022         }
2023     }
2024     impl Iterator for CrazyIterator {
2025         type Item = i32;
2026         fn next(&mut self) -> Option<i32> {
2027             if self.0 {
2028                 Some(99)
2029             } else {
2030                 self.0 = true;
2031                 None
2032             }
2033         }
2034     }
2035
2036     impl DoubleEndedIterator for CrazyIterator {
2037         fn next_back(&mut self) -> Option<i32> {
2038             self.next()
2039         }
2040     }
2041
2042     assert_eq!(CrazyIterator::new().chain(0..10).rev().last(), Some(0));
2043     assert!((0..10).chain(CrazyIterator::new()).rev().any(|i| i == 0));
2044 }
2045
2046 #[test]
2047 fn test_rposition() {
2048     fn f(xy: &(isize, char)) -> bool {
2049         let (_x, y) = *xy;
2050         y == 'b'
2051     }
2052     fn g(xy: &(isize, char)) -> bool {
2053         let (_x, y) = *xy;
2054         y == 'd'
2055     }
2056     let v = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'b')];
2057
2058     assert_eq!(v.iter().rposition(f), Some(3));
2059     assert!(v.iter().rposition(g).is_none());
2060 }
2061
2062 #[test]
2063 fn test_rev_rposition() {
2064     let v = [0, 0, 1, 1];
2065     assert_eq!(v.iter().rev().rposition(|&x| x == 1), Some(1));
2066 }
2067
2068 #[test]
2069 #[should_panic]
2070 fn test_rposition_panic() {
2071     let v: [(Box<_>, Box<_>); 4] = [(box 0, box 0), (box 0, box 0), (box 0, box 0), (box 0, box 0)];
2072     let mut i = 0;
2073     v.iter().rposition(|_elt| {
2074         if i == 2 {
2075             panic!()
2076         }
2077         i += 1;
2078         false
2079     });
2080 }
2081
2082 #[test]
2083 fn test_double_ended_flat_map() {
2084     let u = [0, 1];
2085     let v = [5, 6, 7, 8];
2086     let mut it = u.iter().flat_map(|x| &v[*x..v.len()]);
2087     assert_eq!(it.next_back().unwrap(), &8);
2088     assert_eq!(it.next().unwrap(), &5);
2089     assert_eq!(it.next_back().unwrap(), &7);
2090     assert_eq!(it.next_back().unwrap(), &6);
2091     assert_eq!(it.next_back().unwrap(), &8);
2092     assert_eq!(it.next().unwrap(), &6);
2093     assert_eq!(it.next_back().unwrap(), &7);
2094     assert_eq!(it.next_back(), None);
2095     assert_eq!(it.next(), None);
2096     assert_eq!(it.next_back(), None);
2097 }
2098
2099 #[test]
2100 fn test_double_ended_flatten() {
2101     let u = [0, 1];
2102     let v = [5, 6, 7, 8];
2103     let mut it = u.iter().map(|x| &v[*x..v.len()]).flatten();
2104     assert_eq!(it.next_back().unwrap(), &8);
2105     assert_eq!(it.next().unwrap(), &5);
2106     assert_eq!(it.next_back().unwrap(), &7);
2107     assert_eq!(it.next_back().unwrap(), &6);
2108     assert_eq!(it.next_back().unwrap(), &8);
2109     assert_eq!(it.next().unwrap(), &6);
2110     assert_eq!(it.next_back().unwrap(), &7);
2111     assert_eq!(it.next_back(), None);
2112     assert_eq!(it.next(), None);
2113     assert_eq!(it.next_back(), None);
2114 }
2115
2116 #[test]
2117 fn test_double_ended_range() {
2118     assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
2119     for _ in (10..0).rev() {
2120         panic!("unreachable");
2121     }
2122
2123     assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
2124     for _ in (10..0).rev() {
2125         panic!("unreachable");
2126     }
2127 }
2128
2129 #[test]
2130 fn test_range() {
2131     assert_eq!((0..5).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
2132     assert_eq!((-10..-1).collect::<Vec<_>>(), [-10, -9, -8, -7, -6, -5, -4, -3, -2]);
2133     assert_eq!((0..5).rev().collect::<Vec<_>>(), [4, 3, 2, 1, 0]);
2134     assert_eq!((200..-5).count(), 0);
2135     assert_eq!((200..-5).rev().count(), 0);
2136     assert_eq!((200..200).count(), 0);
2137     assert_eq!((200..200).rev().count(), 0);
2138
2139     assert_eq!((0..100).size_hint(), (100, Some(100)));
2140     // this test is only meaningful when sizeof usize < sizeof u64
2141     assert_eq!((usize::MAX - 1..usize::MAX).size_hint(), (1, Some(1)));
2142     assert_eq!((-10..-1).size_hint(), (9, Some(9)));
2143     assert_eq!((-1..-10).size_hint(), (0, Some(0)));
2144
2145     assert_eq!((-70..58).size_hint(), (128, Some(128)));
2146     assert_eq!((-128..127).size_hint(), (255, Some(255)));
2147     assert_eq!(
2148         (-2..isize::MAX).size_hint(),
2149         (isize::MAX as usize + 2, Some(isize::MAX as usize + 2))
2150     );
2151 }
2152
2153 #[test]
2154 fn test_char_range() {
2155     use std::char;
2156     // Miri is too slow
2157     let from = if cfg!(miri) { char::from_u32(0xD800 - 10).unwrap() } else { '\0' };
2158     let to = if cfg!(miri) { char::from_u32(0xDFFF + 10).unwrap() } else { char::MAX };
2159     assert!((from..=to).eq((from as u32..=to as u32).filter_map(char::from_u32)));
2160     assert!((from..=to).rev().eq((from as u32..=to as u32).filter_map(char::from_u32).rev()));
2161
2162     assert_eq!(('\u{D7FF}'..='\u{E000}').count(), 2);
2163     assert_eq!(('\u{D7FF}'..='\u{E000}').size_hint(), (2, Some(2)));
2164     assert_eq!(('\u{D7FF}'..'\u{E000}').count(), 1);
2165     assert_eq!(('\u{D7FF}'..'\u{E000}').size_hint(), (1, Some(1)));
2166 }
2167
2168 #[test]
2169 fn test_range_exhaustion() {
2170     let mut r = 10..10;
2171     assert!(r.is_empty());
2172     assert_eq!(r.next(), None);
2173     assert_eq!(r.next_back(), None);
2174     assert_eq!(r, 10..10);
2175
2176     let mut r = 10..12;
2177     assert_eq!(r.next(), Some(10));
2178     assert_eq!(r.next(), Some(11));
2179     assert!(r.is_empty());
2180     assert_eq!(r, 12..12);
2181     assert_eq!(r.next(), None);
2182
2183     let mut r = 10..12;
2184     assert_eq!(r.next_back(), Some(11));
2185     assert_eq!(r.next_back(), Some(10));
2186     assert!(r.is_empty());
2187     assert_eq!(r, 10..10);
2188     assert_eq!(r.next_back(), None);
2189
2190     let mut r = 100..10;
2191     assert!(r.is_empty());
2192     assert_eq!(r.next(), None);
2193     assert_eq!(r.next_back(), None);
2194     assert_eq!(r, 100..10);
2195 }
2196
2197 #[test]
2198 fn test_range_inclusive_exhaustion() {
2199     let mut r = 10..=10;
2200     assert_eq!(r.next(), Some(10));
2201     assert!(r.is_empty());
2202     assert_eq!(r.next(), None);
2203     assert_eq!(r.next(), None);
2204
2205     assert_eq!(*r.start(), 10);
2206     assert_eq!(*r.end(), 10);
2207     assert_ne!(r, 10..=10);
2208
2209     let mut r = 10..=10;
2210     assert_eq!(r.next_back(), Some(10));
2211     assert!(r.is_empty());
2212     assert_eq!(r.next_back(), None);
2213
2214     assert_eq!(*r.start(), 10);
2215     assert_eq!(*r.end(), 10);
2216     assert_ne!(r, 10..=10);
2217
2218     let mut r = 10..=12;
2219     assert_eq!(r.next(), Some(10));
2220     assert_eq!(r.next(), Some(11));
2221     assert_eq!(r.next(), Some(12));
2222     assert!(r.is_empty());
2223     assert_eq!(r.next(), None);
2224
2225     let mut r = 10..=12;
2226     assert_eq!(r.next_back(), Some(12));
2227     assert_eq!(r.next_back(), Some(11));
2228     assert_eq!(r.next_back(), Some(10));
2229     assert!(r.is_empty());
2230     assert_eq!(r.next_back(), None);
2231
2232     let mut r = 10..=12;
2233     assert_eq!(r.nth(2), Some(12));
2234     assert!(r.is_empty());
2235     assert_eq!(r.next(), None);
2236
2237     let mut r = 10..=12;
2238     assert_eq!(r.nth(5), None);
2239     assert!(r.is_empty());
2240     assert_eq!(r.next(), None);
2241
2242     let mut r = 100..=10;
2243     assert_eq!(r.next(), None);
2244     assert!(r.is_empty());
2245     assert_eq!(r.next(), None);
2246     assert_eq!(r.next(), None);
2247     assert_eq!(r, 100..=10);
2248
2249     let mut r = 100..=10;
2250     assert_eq!(r.next_back(), None);
2251     assert!(r.is_empty());
2252     assert_eq!(r.next_back(), None);
2253     assert_eq!(r.next_back(), None);
2254     assert_eq!(r, 100..=10);
2255 }
2256
2257 #[test]
2258 fn test_range_nth() {
2259     assert_eq!((10..15).nth(0), Some(10));
2260     assert_eq!((10..15).nth(1), Some(11));
2261     assert_eq!((10..15).nth(4), Some(14));
2262     assert_eq!((10..15).nth(5), None);
2263
2264     let mut r = 10..20;
2265     assert_eq!(r.nth(2), Some(12));
2266     assert_eq!(r, 13..20);
2267     assert_eq!(r.nth(2), Some(15));
2268     assert_eq!(r, 16..20);
2269     assert_eq!(r.nth(10), None);
2270     assert_eq!(r, 20..20);
2271 }
2272
2273 #[test]
2274 fn test_range_nth_back() {
2275     assert_eq!((10..15).nth_back(0), Some(14));
2276     assert_eq!((10..15).nth_back(1), Some(13));
2277     assert_eq!((10..15).nth_back(4), Some(10));
2278     assert_eq!((10..15).nth_back(5), None);
2279     assert_eq!((-120..80_i8).nth_back(199), Some(-120));
2280
2281     let mut r = 10..20;
2282     assert_eq!(r.nth_back(2), Some(17));
2283     assert_eq!(r, 10..17);
2284     assert_eq!(r.nth_back(2), Some(14));
2285     assert_eq!(r, 10..14);
2286     assert_eq!(r.nth_back(10), None);
2287     assert_eq!(r, 10..10);
2288 }
2289
2290 #[test]
2291 fn test_range_from_nth() {
2292     assert_eq!((10..).nth(0), Some(10));
2293     assert_eq!((10..).nth(1), Some(11));
2294     assert_eq!((10..).nth(4), Some(14));
2295
2296     let mut r = 10..;
2297     assert_eq!(r.nth(2), Some(12));
2298     assert_eq!(r, 13..);
2299     assert_eq!(r.nth(2), Some(15));
2300     assert_eq!(r, 16..);
2301     assert_eq!(r.nth(10), Some(26));
2302     assert_eq!(r, 27..);
2303
2304     assert_eq!((0..).size_hint(), (usize::MAX, None));
2305 }
2306
2307 fn is_trusted_len<I: TrustedLen>(_: I) {}
2308
2309 #[test]
2310 fn test_range_from_take() {
2311     let mut it = (0..).take(3);
2312     assert_eq!(it.next(), Some(0));
2313     assert_eq!(it.next(), Some(1));
2314     assert_eq!(it.next(), Some(2));
2315     assert_eq!(it.next(), None);
2316     is_trusted_len((0..).take(3));
2317     assert_eq!((0..).take(3).size_hint(), (3, Some(3)));
2318     assert_eq!((0..).take(0).size_hint(), (0, Some(0)));
2319     assert_eq!((0..).take(usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX)));
2320 }
2321
2322 #[test]
2323 fn test_range_from_take_collect() {
2324     let v: Vec<_> = (0..).take(3).collect();
2325     assert_eq!(v, vec![0, 1, 2]);
2326 }
2327
2328 #[test]
2329 fn test_range_inclusive_nth() {
2330     assert_eq!((10..=15).nth(0), Some(10));
2331     assert_eq!((10..=15).nth(1), Some(11));
2332     assert_eq!((10..=15).nth(5), Some(15));
2333     assert_eq!((10..=15).nth(6), None);
2334
2335     let mut exhausted_via_next = 10_u8..=20;
2336     while exhausted_via_next.next().is_some() {}
2337
2338     let mut r = 10_u8..=20;
2339     assert_eq!(r.nth(2), Some(12));
2340     assert_eq!(r, 13..=20);
2341     assert_eq!(r.nth(2), Some(15));
2342     assert_eq!(r, 16..=20);
2343     assert_eq!(r.is_empty(), false);
2344     assert_eq!(ExactSizeIterator::is_empty(&r), false);
2345     assert_eq!(r.nth(10), None);
2346     assert_eq!(r.is_empty(), true);
2347     assert_eq!(r, exhausted_via_next);
2348     assert_eq!(ExactSizeIterator::is_empty(&r), true);
2349 }
2350
2351 #[test]
2352 fn test_range_inclusive_nth_back() {
2353     assert_eq!((10..=15).nth_back(0), Some(15));
2354     assert_eq!((10..=15).nth_back(1), Some(14));
2355     assert_eq!((10..=15).nth_back(5), Some(10));
2356     assert_eq!((10..=15).nth_back(6), None);
2357     assert_eq!((-120..=80_i8).nth_back(200), Some(-120));
2358
2359     let mut exhausted_via_next_back = 10_u8..=20;
2360     while exhausted_via_next_back.next_back().is_some() {}
2361
2362     let mut r = 10_u8..=20;
2363     assert_eq!(r.nth_back(2), Some(18));
2364     assert_eq!(r, 10..=17);
2365     assert_eq!(r.nth_back(2), Some(15));
2366     assert_eq!(r, 10..=14);
2367     assert_eq!(r.is_empty(), false);
2368     assert_eq!(ExactSizeIterator::is_empty(&r), false);
2369     assert_eq!(r.nth_back(10), None);
2370     assert_eq!(r.is_empty(), true);
2371     assert_eq!(r, exhausted_via_next_back);
2372     assert_eq!(ExactSizeIterator::is_empty(&r), true);
2373 }
2374
2375 #[test]
2376 fn test_range_len() {
2377     assert_eq!((0..10_u8).len(), 10);
2378     assert_eq!((9..10_u8).len(), 1);
2379     assert_eq!((10..10_u8).len(), 0);
2380     assert_eq!((11..10_u8).len(), 0);
2381     assert_eq!((100..10_u8).len(), 0);
2382 }
2383
2384 #[test]
2385 fn test_range_inclusive_len() {
2386     assert_eq!((0..=10_u8).len(), 11);
2387     assert_eq!((9..=10_u8).len(), 2);
2388     assert_eq!((10..=10_u8).len(), 1);
2389     assert_eq!((11..=10_u8).len(), 0);
2390     assert_eq!((100..=10_u8).len(), 0);
2391 }
2392
2393 #[test]
2394 fn test_range_step() {
2395     #![allow(deprecated)]
2396
2397     assert_eq!((0..20).step_by(5).collect::<Vec<isize>>(), [0, 5, 10, 15]);
2398     assert_eq!((1..21).rev().step_by(5).collect::<Vec<isize>>(), [20, 15, 10, 5]);
2399     assert_eq!((1..21).rev().step_by(6).collect::<Vec<isize>>(), [20, 14, 8, 2]);
2400     assert_eq!((200..255).step_by(50).collect::<Vec<u8>>(), [200, 250]);
2401     assert_eq!((200..-5).step_by(1).collect::<Vec<isize>>(), []);
2402     assert_eq!((200..200).step_by(1).collect::<Vec<isize>>(), []);
2403
2404     assert_eq!((0..20).step_by(1).size_hint(), (20, Some(20)));
2405     assert_eq!((0..20).step_by(21).size_hint(), (1, Some(1)));
2406     assert_eq!((0..20).step_by(5).size_hint(), (4, Some(4)));
2407     assert_eq!((1..21).rev().step_by(5).size_hint(), (4, Some(4)));
2408     assert_eq!((1..21).rev().step_by(6).size_hint(), (4, Some(4)));
2409     assert_eq!((20..-5).step_by(1).size_hint(), (0, Some(0)));
2410     assert_eq!((20..20).step_by(1).size_hint(), (0, Some(0)));
2411     assert_eq!((i8::MIN..i8::MAX).step_by(-(i8::MIN as i32) as usize).size_hint(), (2, Some(2)));
2412     assert_eq!((i16::MIN..i16::MAX).step_by(i16::MAX as usize).size_hint(), (3, Some(3)));
2413     assert_eq!((isize::MIN..isize::MAX).step_by(1).size_hint(), (usize::MAX, Some(usize::MAX)));
2414 }
2415
2416 #[test]
2417 fn test_step_by_skip() {
2418     assert_eq!((0..640).step_by(128).skip(1).collect::<Vec<_>>(), [128, 256, 384, 512]);
2419     assert_eq!((0..=50).step_by(10).nth(3), Some(30));
2420     assert_eq!((200..=255u8).step_by(10).nth(3), Some(230));
2421 }
2422
2423 #[test]
2424 fn test_range_inclusive_step() {
2425     assert_eq!((0..=50).step_by(10).collect::<Vec<_>>(), [0, 10, 20, 30, 40, 50]);
2426     assert_eq!((0..=5).step_by(1).collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5]);
2427     assert_eq!((200..=255u8).step_by(10).collect::<Vec<_>>(), [200, 210, 220, 230, 240, 250]);
2428     assert_eq!((250..=255u8).step_by(1).collect::<Vec<_>>(), [250, 251, 252, 253, 254, 255]);
2429 }
2430
2431 #[test]
2432 fn test_range_last_max() {
2433     assert_eq!((0..20).last(), Some(19));
2434     assert_eq!((-20..0).last(), Some(-1));
2435     assert_eq!((5..5).last(), None);
2436
2437     assert_eq!((0..20).max(), Some(19));
2438     assert_eq!((-20..0).max(), Some(-1));
2439     assert_eq!((5..5).max(), None);
2440 }
2441
2442 #[test]
2443 fn test_range_inclusive_last_max() {
2444     assert_eq!((0..=20).last(), Some(20));
2445     assert_eq!((-20..=0).last(), Some(0));
2446     assert_eq!((5..=5).last(), Some(5));
2447     let mut r = 10..=10;
2448     r.next();
2449     assert_eq!(r.last(), None);
2450
2451     assert_eq!((0..=20).max(), Some(20));
2452     assert_eq!((-20..=0).max(), Some(0));
2453     assert_eq!((5..=5).max(), Some(5));
2454     let mut r = 10..=10;
2455     r.next();
2456     assert_eq!(r.max(), None);
2457 }
2458
2459 #[test]
2460 fn test_range_min() {
2461     assert_eq!((0..20).min(), Some(0));
2462     assert_eq!((-20..0).min(), Some(-20));
2463     assert_eq!((5..5).min(), None);
2464 }
2465
2466 #[test]
2467 fn test_range_inclusive_min() {
2468     assert_eq!((0..=20).min(), Some(0));
2469     assert_eq!((-20..=0).min(), Some(-20));
2470     assert_eq!((5..=5).min(), Some(5));
2471     let mut r = 10..=10;
2472     r.next();
2473     assert_eq!(r.min(), None);
2474 }
2475
2476 #[test]
2477 fn test_range_inclusive_folds() {
2478     assert_eq!((1..=10).sum::<i32>(), 55);
2479     assert_eq!((1..=10).rev().sum::<i32>(), 55);
2480
2481     let mut it = 44..=50;
2482     assert_eq!(it.try_fold(0, i8::checked_add), None);
2483     assert_eq!(it, 47..=50);
2484     assert_eq!(it.try_fold(0, i8::checked_add), None);
2485     assert_eq!(it, 50..=50);
2486     assert_eq!(it.try_fold(0, i8::checked_add), Some(50));
2487     assert!(it.is_empty());
2488     assert_eq!(it.try_fold(0, i8::checked_add), Some(0));
2489     assert!(it.is_empty());
2490
2491     let mut it = 40..=47;
2492     assert_eq!(it.try_rfold(0, i8::checked_add), None);
2493     assert_eq!(it, 40..=44);
2494     assert_eq!(it.try_rfold(0, i8::checked_add), None);
2495     assert_eq!(it, 40..=41);
2496     assert_eq!(it.try_rfold(0, i8::checked_add), Some(81));
2497     assert!(it.is_empty());
2498     assert_eq!(it.try_rfold(0, i8::checked_add), Some(0));
2499     assert!(it.is_empty());
2500
2501     let mut it = 10..=20;
2502     assert_eq!(it.try_fold(0, |a, b| Some(a + b)), Some(165));
2503     assert!(it.is_empty());
2504     assert_eq!(it.try_fold(0, |a, b| Some(a + b)), Some(0));
2505     assert!(it.is_empty());
2506
2507     let mut it = 10..=20;
2508     assert_eq!(it.try_rfold(0, |a, b| Some(a + b)), Some(165));
2509     assert!(it.is_empty());
2510     assert_eq!(it.try_rfold(0, |a, b| Some(a + b)), Some(0));
2511     assert!(it.is_empty());
2512 }
2513
2514 #[test]
2515 fn test_range_size_hint() {
2516     assert_eq!((0..0usize).size_hint(), (0, Some(0)));
2517     assert_eq!((0..100usize).size_hint(), (100, Some(100)));
2518     assert_eq!((0..usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX)));
2519
2520     let umax = u128::try_from(usize::MAX).unwrap();
2521     assert_eq!((0..0u128).size_hint(), (0, Some(0)));
2522     assert_eq!((0..100u128).size_hint(), (100, Some(100)));
2523     assert_eq!((0..umax).size_hint(), (usize::MAX, Some(usize::MAX)));
2524     assert_eq!((0..umax + 1).size_hint(), (usize::MAX, None));
2525
2526     assert_eq!((0..0isize).size_hint(), (0, Some(0)));
2527     assert_eq!((-100..100isize).size_hint(), (200, Some(200)));
2528     assert_eq!((isize::MIN..isize::MAX).size_hint(), (usize::MAX, Some(usize::MAX)));
2529
2530     let imin = i128::try_from(isize::MIN).unwrap();
2531     let imax = i128::try_from(isize::MAX).unwrap();
2532     assert_eq!((0..0i128).size_hint(), (0, Some(0)));
2533     assert_eq!((-100..100i128).size_hint(), (200, Some(200)));
2534     assert_eq!((imin..imax).size_hint(), (usize::MAX, Some(usize::MAX)));
2535     assert_eq!((imin..imax + 1).size_hint(), (usize::MAX, None));
2536 }
2537
2538 #[test]
2539 fn test_range_inclusive_size_hint() {
2540     assert_eq!((1..=0usize).size_hint(), (0, Some(0)));
2541     assert_eq!((0..=0usize).size_hint(), (1, Some(1)));
2542     assert_eq!((0..=100usize).size_hint(), (101, Some(101)));
2543     assert_eq!((0..=usize::MAX - 1).size_hint(), (usize::MAX, Some(usize::MAX)));
2544     assert_eq!((0..=usize::MAX).size_hint(), (usize::MAX, None));
2545
2546     let umax = u128::try_from(usize::MAX).unwrap();
2547     assert_eq!((1..=0u128).size_hint(), (0, Some(0)));
2548     assert_eq!((0..=0u128).size_hint(), (1, Some(1)));
2549     assert_eq!((0..=100u128).size_hint(), (101, Some(101)));
2550     assert_eq!((0..=umax - 1).size_hint(), (usize::MAX, Some(usize::MAX)));
2551     assert_eq!((0..=umax).size_hint(), (usize::MAX, None));
2552     assert_eq!((0..=umax + 1).size_hint(), (usize::MAX, None));
2553
2554     assert_eq!((0..=-1isize).size_hint(), (0, Some(0)));
2555     assert_eq!((0..=0isize).size_hint(), (1, Some(1)));
2556     assert_eq!((-100..=100isize).size_hint(), (201, Some(201)));
2557     assert_eq!((isize::MIN..=isize::MAX - 1).size_hint(), (usize::MAX, Some(usize::MAX)));
2558     assert_eq!((isize::MIN..=isize::MAX).size_hint(), (usize::MAX, None));
2559
2560     let imin = i128::try_from(isize::MIN).unwrap();
2561     let imax = i128::try_from(isize::MAX).unwrap();
2562     assert_eq!((0..=-1i128).size_hint(), (0, Some(0)));
2563     assert_eq!((0..=0i128).size_hint(), (1, Some(1)));
2564     assert_eq!((-100..=100i128).size_hint(), (201, Some(201)));
2565     assert_eq!((imin..=imax - 1).size_hint(), (usize::MAX, Some(usize::MAX)));
2566     assert_eq!((imin..=imax).size_hint(), (usize::MAX, None));
2567     assert_eq!((imin..=imax + 1).size_hint(), (usize::MAX, None));
2568 }
2569
2570 #[test]
2571 fn test_repeat() {
2572     let mut it = repeat(42);
2573     assert_eq!(it.next(), Some(42));
2574     assert_eq!(it.next(), Some(42));
2575     assert_eq!(it.next(), Some(42));
2576     assert_eq!(repeat(42).size_hint(), (usize::MAX, None));
2577 }
2578
2579 #[test]
2580 fn test_repeat_take() {
2581     let mut it = repeat(42).take(3);
2582     assert_eq!(it.next(), Some(42));
2583     assert_eq!(it.next(), Some(42));
2584     assert_eq!(it.next(), Some(42));
2585     assert_eq!(it.next(), None);
2586     is_trusted_len(repeat(42).take(3));
2587     assert_eq!(repeat(42).take(3).size_hint(), (3, Some(3)));
2588     assert_eq!(repeat(42).take(0).size_hint(), (0, Some(0)));
2589     assert_eq!(repeat(42).take(usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX)));
2590 }
2591
2592 #[test]
2593 fn test_repeat_take_collect() {
2594     let v: Vec<_> = repeat(42).take(3).collect();
2595     assert_eq!(v, vec![42, 42, 42]);
2596 }
2597
2598 #[test]
2599 fn test_repeat_with() {
2600     #[derive(PartialEq, Debug)]
2601     struct NotClone(usize);
2602     let mut it = repeat_with(|| NotClone(42));
2603     assert_eq!(it.next(), Some(NotClone(42)));
2604     assert_eq!(it.next(), Some(NotClone(42)));
2605     assert_eq!(it.next(), Some(NotClone(42)));
2606     assert_eq!(repeat_with(|| NotClone(42)).size_hint(), (usize::MAX, None));
2607 }
2608
2609 #[test]
2610 fn test_repeat_with_take() {
2611     let mut it = repeat_with(|| 42).take(3);
2612     assert_eq!(it.next(), Some(42));
2613     assert_eq!(it.next(), Some(42));
2614     assert_eq!(it.next(), Some(42));
2615     assert_eq!(it.next(), None);
2616     is_trusted_len(repeat_with(|| 42).take(3));
2617     assert_eq!(repeat_with(|| 42).take(3).size_hint(), (3, Some(3)));
2618     assert_eq!(repeat_with(|| 42).take(0).size_hint(), (0, Some(0)));
2619     assert_eq!(repeat_with(|| 42).take(usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX)));
2620 }
2621
2622 #[test]
2623 fn test_repeat_with_take_collect() {
2624     let mut curr = 1;
2625     let v: Vec<_> = repeat_with(|| {
2626         let tmp = curr;
2627         curr *= 2;
2628         tmp
2629     })
2630     .take(5)
2631     .collect();
2632     assert_eq!(v, vec![1, 2, 4, 8, 16]);
2633 }
2634
2635 #[test]
2636 fn test_successors() {
2637     let mut powers_of_10 = successors(Some(1_u16), |n| n.checked_mul(10));
2638     assert_eq!(powers_of_10.by_ref().collect::<Vec<_>>(), &[1, 10, 100, 1_000, 10_000]);
2639     assert_eq!(powers_of_10.next(), None);
2640
2641     let mut empty = successors(None::<u32>, |_| unimplemented!());
2642     assert_eq!(empty.next(), None);
2643     assert_eq!(empty.next(), None);
2644 }
2645
2646 #[test]
2647 fn test_fuse() {
2648     let mut it = 0..3;
2649     assert_eq!(it.len(), 3);
2650     assert_eq!(it.next(), Some(0));
2651     assert_eq!(it.len(), 2);
2652     assert_eq!(it.next(), Some(1));
2653     assert_eq!(it.len(), 1);
2654     assert_eq!(it.next(), Some(2));
2655     assert_eq!(it.len(), 0);
2656     assert_eq!(it.next(), None);
2657     assert_eq!(it.len(), 0);
2658     assert_eq!(it.next(), None);
2659     assert_eq!(it.len(), 0);
2660     assert_eq!(it.next(), None);
2661     assert_eq!(it.len(), 0);
2662 }
2663
2664 #[test]
2665 fn test_fuse_nth() {
2666     let xs = [0, 1, 2];
2667     let mut it = xs.iter();
2668
2669     assert_eq!(it.len(), 3);
2670     assert_eq!(it.nth(2), Some(&2));
2671     assert_eq!(it.len(), 0);
2672     assert_eq!(it.nth(2), None);
2673     assert_eq!(it.len(), 0);
2674 }
2675
2676 #[test]
2677 fn test_fuse_last() {
2678     let xs = [0, 1, 2];
2679     let it = xs.iter();
2680
2681     assert_eq!(it.len(), 3);
2682     assert_eq!(it.last(), Some(&2));
2683 }
2684
2685 #[test]
2686 fn test_fuse_count() {
2687     let xs = [0, 1, 2];
2688     let it = xs.iter();
2689
2690     assert_eq!(it.len(), 3);
2691     assert_eq!(it.count(), 3);
2692     // Can't check len now because count consumes.
2693 }
2694
2695 #[test]
2696 fn test_fuse_fold() {
2697     let xs = [0, 1, 2];
2698     let it = xs.iter(); // `FusedIterator`
2699     let i = it.fuse().fold(0, |i, &x| {
2700         assert_eq!(x, xs[i]);
2701         i + 1
2702     });
2703     assert_eq!(i, xs.len());
2704
2705     let it = xs.iter(); // `FusedIterator`
2706     let i = it.fuse().rfold(xs.len(), |i, &x| {
2707         assert_eq!(x, xs[i - 1]);
2708         i - 1
2709     });
2710     assert_eq!(i, 0);
2711
2712     let it = xs.iter().scan((), |_, &x| Some(x)); // `!FusedIterator`
2713     let i = it.fuse().fold(0, |i, x| {
2714         assert_eq!(x, xs[i]);
2715         i + 1
2716     });
2717     assert_eq!(i, xs.len());
2718 }
2719
2720 #[test]
2721 fn test_once() {
2722     let mut it = once(42);
2723     assert_eq!(it.next(), Some(42));
2724     assert_eq!(it.next(), None);
2725 }
2726
2727 #[test]
2728 fn test_once_with() {
2729     let count = Cell::new(0);
2730     let mut it = once_with(|| {
2731         count.set(count.get() + 1);
2732         42
2733     });
2734
2735     assert_eq!(count.get(), 0);
2736     assert_eq!(it.next(), Some(42));
2737     assert_eq!(count.get(), 1);
2738     assert_eq!(it.next(), None);
2739     assert_eq!(count.get(), 1);
2740     assert_eq!(it.next(), None);
2741     assert_eq!(count.get(), 1);
2742 }
2743
2744 #[test]
2745 fn test_empty() {
2746     let mut it = empty::<i32>();
2747     assert_eq!(it.next(), None);
2748 }
2749
2750 #[test]
2751 fn test_chain_fold() {
2752     let xs = [1, 2, 3];
2753     let ys = [1, 2, 0];
2754
2755     let mut iter = xs.iter().chain(&ys);
2756     iter.next();
2757     let mut result = Vec::new();
2758     iter.fold((), |(), &elt| result.push(elt));
2759     assert_eq!(&[2, 3, 1, 2, 0], &result[..]);
2760 }
2761
2762 #[test]
2763 fn test_steps_between() {
2764     assert_eq!(Step::steps_between(&20_u8, &200_u8), Some(180_usize));
2765     assert_eq!(Step::steps_between(&-20_i8, &80_i8), Some(100_usize));
2766     assert_eq!(Step::steps_between(&-120_i8, &80_i8), Some(200_usize));
2767     assert_eq!(Step::steps_between(&20_u32, &4_000_100_u32), Some(4_000_080_usize));
2768     assert_eq!(Step::steps_between(&-20_i32, &80_i32), Some(100_usize));
2769     assert_eq!(Step::steps_between(&-2_000_030_i32, &2_000_050_i32), Some(4_000_080_usize));
2770
2771     // Skip u64/i64 to avoid differences with 32-bit vs 64-bit platforms
2772
2773     assert_eq!(Step::steps_between(&20_u128, &200_u128), Some(180_usize));
2774     assert_eq!(Step::steps_between(&-20_i128, &80_i128), Some(100_usize));
2775     if cfg!(target_pointer_width = "64") {
2776         assert_eq!(Step::steps_between(&10_u128, &0x1_0000_0000_0000_0009_u128), Some(usize::MAX));
2777     }
2778     assert_eq!(Step::steps_between(&10_u128, &0x1_0000_0000_0000_000a_u128), None);
2779     assert_eq!(Step::steps_between(&10_i128, &0x1_0000_0000_0000_000a_i128), None);
2780     assert_eq!(
2781         Step::steps_between(&-0x1_0000_0000_0000_0000_i128, &0x1_0000_0000_0000_0000_i128,),
2782         None,
2783     );
2784 }
2785
2786 #[test]
2787 fn test_step_forward() {
2788     assert_eq!(Step::forward_checked(55_u8, 200_usize), Some(255_u8));
2789     assert_eq!(Step::forward_checked(252_u8, 200_usize), None);
2790     assert_eq!(Step::forward_checked(0_u8, 256_usize), None);
2791     assert_eq!(Step::forward_checked(-110_i8, 200_usize), Some(90_i8));
2792     assert_eq!(Step::forward_checked(-110_i8, 248_usize), None);
2793     assert_eq!(Step::forward_checked(-126_i8, 256_usize), None);
2794
2795     assert_eq!(Step::forward_checked(35_u16, 100_usize), Some(135_u16));
2796     assert_eq!(Step::forward_checked(35_u16, 65500_usize), Some(u16::MAX));
2797     assert_eq!(Step::forward_checked(36_u16, 65500_usize), None);
2798     assert_eq!(Step::forward_checked(-110_i16, 200_usize), Some(90_i16));
2799     assert_eq!(Step::forward_checked(-20_030_i16, 50_050_usize), Some(30_020_i16));
2800     assert_eq!(Step::forward_checked(-10_i16, 40_000_usize), None);
2801     assert_eq!(Step::forward_checked(-10_i16, 70_000_usize), None);
2802
2803     assert_eq!(Step::forward_checked(10_u128, 70_000_usize), Some(70_010_u128));
2804     assert_eq!(Step::forward_checked(10_i128, 70_030_usize), Some(70_040_i128));
2805     assert_eq!(
2806         Step::forward_checked(0xffff_ffff_ffff_ffff__ffff_ffff_ffff_ff00_u128, 0xff_usize),
2807         Some(u128::MAX),
2808     );
2809     assert_eq!(
2810         Step::forward_checked(0xffff_ffff_ffff_ffff__ffff_ffff_ffff_ff00_u128, 0x100_usize),
2811         None
2812     );
2813     assert_eq!(
2814         Step::forward_checked(0x7fff_ffff_ffff_ffff__ffff_ffff_ffff_ff00_i128, 0xff_usize),
2815         Some(i128::MAX),
2816     );
2817     assert_eq!(
2818         Step::forward_checked(0x7fff_ffff_ffff_ffff__ffff_ffff_ffff_ff00_i128, 0x100_usize),
2819         None
2820     );
2821 }
2822
2823 #[test]
2824 fn test_step_backward() {
2825     assert_eq!(Step::backward_checked(255_u8, 200_usize), Some(55_u8));
2826     assert_eq!(Step::backward_checked(100_u8, 200_usize), None);
2827     assert_eq!(Step::backward_checked(255_u8, 256_usize), None);
2828     assert_eq!(Step::backward_checked(90_i8, 200_usize), Some(-110_i8));
2829     assert_eq!(Step::backward_checked(110_i8, 248_usize), None);
2830     assert_eq!(Step::backward_checked(127_i8, 256_usize), None);
2831
2832     assert_eq!(Step::backward_checked(135_u16, 100_usize), Some(35_u16));
2833     assert_eq!(Step::backward_checked(u16::MAX, 65500_usize), Some(35_u16));
2834     assert_eq!(Step::backward_checked(10_u16, 11_usize), None);
2835     assert_eq!(Step::backward_checked(90_i16, 200_usize), Some(-110_i16));
2836     assert_eq!(Step::backward_checked(30_020_i16, 50_050_usize), Some(-20_030_i16));
2837     assert_eq!(Step::backward_checked(-10_i16, 40_000_usize), None);
2838     assert_eq!(Step::backward_checked(-10_i16, 70_000_usize), None);
2839
2840     assert_eq!(Step::backward_checked(70_010_u128, 70_000_usize), Some(10_u128));
2841     assert_eq!(Step::backward_checked(70_020_i128, 70_030_usize), Some(-10_i128));
2842     assert_eq!(Step::backward_checked(10_u128, 7_usize), Some(3_u128));
2843     assert_eq!(Step::backward_checked(10_u128, 11_usize), None);
2844     assert_eq!(
2845         Step::backward_checked(-0x7fff_ffff_ffff_ffff__ffff_ffff_ffff_ff00_i128, 0x100_usize),
2846         Some(i128::MIN)
2847     );
2848 }
2849
2850 #[test]
2851 fn test_rev_try_folds() {
2852     let f = &|acc, x| i32::checked_add(2 * acc, x);
2853     assert_eq!((1..10).rev().try_fold(7, f), (1..10).try_rfold(7, f));
2854     assert_eq!((1..10).rev().try_rfold(7, f), (1..10).try_fold(7, f));
2855
2856     let a = [10, 20, 30, 40, 100, 60, 70, 80, 90];
2857     let mut iter = a.iter().rev();
2858     assert_eq!(iter.try_fold(0_i8, |acc, &x| acc.checked_add(x)), None);
2859     assert_eq!(iter.next(), Some(&70));
2860     let mut iter = a.iter().rev();
2861     assert_eq!(iter.try_rfold(0_i8, |acc, &x| acc.checked_add(x)), None);
2862     assert_eq!(iter.next_back(), Some(&60));
2863 }
2864
2865 #[test]
2866 fn test_cloned_try_folds() {
2867     let a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
2868     let f = &|acc, x| i32::checked_add(2 * acc, x);
2869     let f_ref = &|acc, &x| i32::checked_add(2 * acc, x);
2870     assert_eq!(a.iter().cloned().try_fold(7, f), a.iter().try_fold(7, f_ref));
2871     assert_eq!(a.iter().cloned().try_rfold(7, f), a.iter().try_rfold(7, f_ref));
2872
2873     let a = [10, 20, 30, 40, 100, 60, 70, 80, 90];
2874     let mut iter = a.iter().cloned();
2875     assert_eq!(iter.try_fold(0_i8, |acc, x| acc.checked_add(x)), None);
2876     assert_eq!(iter.next(), Some(60));
2877     let mut iter = a.iter().cloned();
2878     assert_eq!(iter.try_rfold(0_i8, |acc, x| acc.checked_add(x)), None);
2879     assert_eq!(iter.next_back(), Some(70));
2880 }
2881
2882 #[test]
2883 fn test_chain_try_folds() {
2884     let c = || (0..10).chain(10..20);
2885
2886     let f = &|acc, x| i32::checked_add(2 * acc, x);
2887     assert_eq!(c().try_fold(7, f), (0..20).try_fold(7, f));
2888     assert_eq!(c().try_rfold(7, f), (0..20).rev().try_fold(7, f));
2889
2890     let mut iter = c();
2891     assert_eq!(iter.position(|x| x == 5), Some(5));
2892     assert_eq!(iter.next(), Some(6), "stopped in front, state Both");
2893     assert_eq!(iter.position(|x| x == 13), Some(6));
2894     assert_eq!(iter.next(), Some(14), "stopped in back, state Back");
2895     assert_eq!(iter.try_fold(0, |acc, x| Some(acc + x)), Some((15..20).sum()));
2896
2897     let mut iter = c().rev(); // use rev to access try_rfold
2898     assert_eq!(iter.position(|x| x == 15), Some(4));
2899     assert_eq!(iter.next(), Some(14), "stopped in back, state Both");
2900     assert_eq!(iter.position(|x| x == 5), Some(8));
2901     assert_eq!(iter.next(), Some(4), "stopped in front, state Front");
2902     assert_eq!(iter.try_fold(0, |acc, x| Some(acc + x)), Some((0..4).sum()));
2903
2904     let mut iter = c();
2905     iter.by_ref().rev().nth(14); // skip the last 15, ending in state Front
2906     assert_eq!(iter.try_fold(7, f), (0..5).try_fold(7, f));
2907
2908     let mut iter = c();
2909     iter.nth(14); // skip the first 15, ending in state Back
2910     assert_eq!(iter.try_rfold(7, f), (15..20).try_rfold(7, f));
2911 }
2912
2913 #[test]
2914 fn test_map_try_folds() {
2915     let f = &|acc, x| i32::checked_add(2 * acc, x);
2916     assert_eq!((0..10).map(|x| x + 3).try_fold(7, f), (3..13).try_fold(7, f));
2917     assert_eq!((0..10).map(|x| x + 3).try_rfold(7, f), (3..13).try_rfold(7, f));
2918
2919     let mut iter = (0..40).map(|x| x + 10);
2920     assert_eq!(iter.try_fold(0, i8::checked_add), None);
2921     assert_eq!(iter.next(), Some(20));
2922     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
2923     assert_eq!(iter.next_back(), Some(46));
2924 }
2925
2926 #[test]
2927 fn test_filter_try_folds() {
2928     fn p(&x: &i32) -> bool {
2929         0 <= x && x < 10
2930     }
2931     let f = &|acc, x| i32::checked_add(2 * acc, x);
2932     assert_eq!((-10..20).filter(p).try_fold(7, f), (0..10).try_fold(7, f));
2933     assert_eq!((-10..20).filter(p).try_rfold(7, f), (0..10).try_rfold(7, f));
2934
2935     let mut iter = (0..40).filter(|&x| x % 2 == 1);
2936     assert_eq!(iter.try_fold(0, i8::checked_add), None);
2937     assert_eq!(iter.next(), Some(25));
2938     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
2939     assert_eq!(iter.next_back(), Some(31));
2940 }
2941
2942 #[test]
2943 fn test_filter_map_try_folds() {
2944     let mp = &|x| if 0 <= x && x < 10 { Some(x * 2) } else { None };
2945     let f = &|acc, x| i32::checked_add(2 * acc, x);
2946     assert_eq!((-9..20).filter_map(mp).try_fold(7, f), (0..10).map(|x| 2 * x).try_fold(7, f));
2947     assert_eq!((-9..20).filter_map(mp).try_rfold(7, f), (0..10).map(|x| 2 * x).try_rfold(7, f));
2948
2949     let mut iter = (0..40).filter_map(|x| if x % 2 == 1 { None } else { Some(x * 2 + 10) });
2950     assert_eq!(iter.try_fold(0, i8::checked_add), None);
2951     assert_eq!(iter.next(), Some(38));
2952     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
2953     assert_eq!(iter.next_back(), Some(78));
2954 }
2955
2956 #[test]
2957 fn test_enumerate_try_folds() {
2958     let f = &|acc, (i, x)| usize::checked_add(2 * acc, x / (i + 1) + i);
2959     assert_eq!((9..18).enumerate().try_fold(7, f), (0..9).map(|i| (i, i + 9)).try_fold(7, f));
2960     assert_eq!((9..18).enumerate().try_rfold(7, f), (0..9).map(|i| (i, i + 9)).try_rfold(7, f));
2961
2962     let mut iter = (100..200).enumerate();
2963     let f = &|acc, (i, x)| u8::checked_add(acc, u8::checked_div(x, i as u8 + 1)?);
2964     assert_eq!(iter.try_fold(0, f), None);
2965     assert_eq!(iter.next(), Some((7, 107)));
2966     assert_eq!(iter.try_rfold(0, f), None);
2967     assert_eq!(iter.next_back(), Some((11, 111)));
2968 }
2969
2970 #[test]
2971 fn test_peek_try_folds() {
2972     let f = &|acc, x| i32::checked_add(2 * acc, x);
2973
2974     assert_eq!((1..20).peekable().try_fold(7, f), (1..20).try_fold(7, f));
2975     assert_eq!((1..20).peekable().try_rfold(7, f), (1..20).try_rfold(7, f));
2976
2977     let mut iter = (1..20).peekable();
2978     assert_eq!(iter.peek(), Some(&1));
2979     assert_eq!(iter.try_fold(7, f), (1..20).try_fold(7, f));
2980
2981     let mut iter = (1..20).peekable();
2982     assert_eq!(iter.peek(), Some(&1));
2983     assert_eq!(iter.try_rfold(7, f), (1..20).try_rfold(7, f));
2984
2985     let mut iter = [100, 20, 30, 40, 50, 60, 70].iter().cloned().peekable();
2986     assert_eq!(iter.peek(), Some(&100));
2987     assert_eq!(iter.try_fold(0, i8::checked_add), None);
2988     assert_eq!(iter.peek(), Some(&40));
2989
2990     let mut iter = [100, 20, 30, 40, 50, 60, 70].iter().cloned().peekable();
2991     assert_eq!(iter.peek(), Some(&100));
2992     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
2993     assert_eq!(iter.peek(), Some(&100));
2994     assert_eq!(iter.next_back(), Some(50));
2995
2996     let mut iter = (2..5).peekable();
2997     assert_eq!(iter.peek(), Some(&2));
2998     assert_eq!(iter.try_for_each(Err), Err(2));
2999     assert_eq!(iter.peek(), Some(&3));
3000     assert_eq!(iter.try_for_each(Err), Err(3));
3001     assert_eq!(iter.peek(), Some(&4));
3002     assert_eq!(iter.try_for_each(Err), Err(4));
3003     assert_eq!(iter.peek(), None);
3004     assert_eq!(iter.try_for_each(Err), Ok(()));
3005
3006     let mut iter = (2..5).peekable();
3007     assert_eq!(iter.peek(), Some(&2));
3008     assert_eq!(iter.try_rfold((), |(), x| Err(x)), Err(4));
3009     assert_eq!(iter.peek(), Some(&2));
3010     assert_eq!(iter.try_rfold((), |(), x| Err(x)), Err(3));
3011     assert_eq!(iter.peek(), Some(&2));
3012     assert_eq!(iter.try_rfold((), |(), x| Err(x)), Err(2));
3013     assert_eq!(iter.peek(), None);
3014     assert_eq!(iter.try_rfold((), |(), x| Err(x)), Ok(()));
3015 }
3016
3017 #[test]
3018 fn test_skip_while_try_fold() {
3019     let f = &|acc, x| i32::checked_add(2 * acc, x);
3020     fn p(&x: &i32) -> bool {
3021         (x % 10) <= 5
3022     }
3023     assert_eq!((1..20).skip_while(p).try_fold(7, f), (6..20).try_fold(7, f));
3024     let mut iter = (1..20).skip_while(p);
3025     assert_eq!(iter.nth(5), Some(11));
3026     assert_eq!(iter.try_fold(7, f), (12..20).try_fold(7, f));
3027
3028     let mut iter = (0..50).skip_while(|&x| (x % 20) < 15);
3029     assert_eq!(iter.try_fold(0, i8::checked_add), None);
3030     assert_eq!(iter.next(), Some(23));
3031 }
3032
3033 #[test]
3034 fn test_take_while_folds() {
3035     let f = &|acc, x| i32::checked_add(2 * acc, x);
3036     assert_eq!((1..20).take_while(|&x| x != 10).try_fold(7, f), (1..10).try_fold(7, f));
3037     let mut iter = (1..20).take_while(|&x| x != 10);
3038     assert_eq!(iter.try_fold(0, |x, y| Some(x + y)), Some((1..10).sum()));
3039     assert_eq!(iter.next(), None, "flag should be set");
3040     let iter = (1..20).take_while(|&x| x != 10);
3041     assert_eq!(iter.fold(0, |x, y| x + y), (1..10).sum());
3042
3043     let mut iter = (10..50).take_while(|&x| x != 40);
3044     assert_eq!(iter.try_fold(0, i8::checked_add), None);
3045     assert_eq!(iter.next(), Some(20));
3046 }
3047
3048 #[test]
3049 fn test_skip_try_folds() {
3050     let f = &|acc, x| i32::checked_add(2 * acc, x);
3051     assert_eq!((1..20).skip(9).try_fold(7, f), (10..20).try_fold(7, f));
3052     assert_eq!((1..20).skip(9).try_rfold(7, f), (10..20).try_rfold(7, f));
3053
3054     let mut iter = (0..30).skip(10);
3055     assert_eq!(iter.try_fold(0, i8::checked_add), None);
3056     assert_eq!(iter.next(), Some(20));
3057     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
3058     assert_eq!(iter.next_back(), Some(24));
3059 }
3060
3061 #[test]
3062 fn test_skip_nth_back() {
3063     let xs = [0, 1, 2, 3, 4, 5];
3064     let mut it = xs.iter().skip(2);
3065     assert_eq!(it.nth_back(0), Some(&5));
3066     assert_eq!(it.nth_back(1), Some(&3));
3067     assert_eq!(it.nth_back(0), Some(&2));
3068     assert_eq!(it.nth_back(0), None);
3069
3070     let ys = [2, 3, 4, 5];
3071     let mut ity = ys.iter();
3072     let mut it = xs.iter().skip(2);
3073     assert_eq!(it.nth_back(1), ity.nth_back(1));
3074     assert_eq!(it.clone().nth(0), ity.clone().nth(0));
3075     assert_eq!(it.nth_back(0), ity.nth_back(0));
3076     assert_eq!(it.clone().nth(0), ity.clone().nth(0));
3077     assert_eq!(it.nth_back(0), ity.nth_back(0));
3078     assert_eq!(it.clone().nth(0), ity.clone().nth(0));
3079     assert_eq!(it.nth_back(0), ity.nth_back(0));
3080     assert_eq!(it.clone().nth(0), ity.clone().nth(0));
3081
3082     let mut it = xs.iter().skip(2);
3083     assert_eq!(it.nth_back(4), None);
3084     assert_eq!(it.nth_back(0), None);
3085
3086     let mut it = xs.iter();
3087     it.by_ref().skip(2).nth_back(3);
3088     assert_eq!(it.next_back(), Some(&1));
3089
3090     let mut it = xs.iter();
3091     it.by_ref().skip(2).nth_back(10);
3092     assert_eq!(it.next_back(), Some(&1));
3093 }
3094
3095 #[test]
3096 fn test_take_try_folds() {
3097     let f = &|acc, x| i32::checked_add(2 * acc, x);
3098     assert_eq!((10..30).take(10).try_fold(7, f), (10..20).try_fold(7, f));
3099     assert_eq!((10..30).take(10).try_rfold(7, f), (10..20).try_rfold(7, f));
3100
3101     let mut iter = (10..30).take(20);
3102     assert_eq!(iter.try_fold(0, i8::checked_add), None);
3103     assert_eq!(iter.next(), Some(20));
3104     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
3105     assert_eq!(iter.next_back(), Some(24));
3106
3107     let mut iter = (2..20).take(3);
3108     assert_eq!(iter.try_for_each(Err), Err(2));
3109     assert_eq!(iter.try_for_each(Err), Err(3));
3110     assert_eq!(iter.try_for_each(Err), Err(4));
3111     assert_eq!(iter.try_for_each(Err), Ok(()));
3112
3113     let mut iter = (2..20).take(3).rev();
3114     assert_eq!(iter.try_for_each(Err), Err(4));
3115     assert_eq!(iter.try_for_each(Err), Err(3));
3116     assert_eq!(iter.try_for_each(Err), Err(2));
3117     assert_eq!(iter.try_for_each(Err), Ok(()));
3118 }
3119
3120 #[test]
3121 fn test_flat_map_try_folds() {
3122     let f = &|acc, x| i32::checked_add(acc * 2 / 3, x);
3123     let mr = &|x| (5 * x)..(5 * x + 5);
3124     assert_eq!((0..10).flat_map(mr).try_fold(7, f), (0..50).try_fold(7, f));
3125     assert_eq!((0..10).flat_map(mr).try_rfold(7, f), (0..50).try_rfold(7, f));
3126     let mut iter = (0..10).flat_map(mr);
3127     iter.next();
3128     iter.next_back(); // have front and back iters in progress
3129     assert_eq!(iter.try_rfold(7, f), (1..49).try_rfold(7, f));
3130
3131     let mut iter = (0..10).flat_map(|x| (4 * x)..(4 * x + 4));
3132     assert_eq!(iter.try_fold(0, i8::checked_add), None);
3133     assert_eq!(iter.next(), Some(17));
3134     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
3135     assert_eq!(iter.next_back(), Some(35));
3136 }
3137
3138 #[test]
3139 fn test_flatten_try_folds() {
3140     let f = &|acc, x| i32::checked_add(acc * 2 / 3, x);
3141     let mr = &|x| (5 * x)..(5 * x + 5);
3142     assert_eq!((0..10).map(mr).flatten().try_fold(7, f), (0..50).try_fold(7, f));
3143     assert_eq!((0..10).map(mr).flatten().try_rfold(7, f), (0..50).try_rfold(7, f));
3144     let mut iter = (0..10).map(mr).flatten();
3145     iter.next();
3146     iter.next_back(); // have front and back iters in progress
3147     assert_eq!(iter.try_rfold(7, f), (1..49).try_rfold(7, f));
3148
3149     let mut iter = (0..10).map(|x| (4 * x)..(4 * x + 4)).flatten();
3150     assert_eq!(iter.try_fold(0, i8::checked_add), None);
3151     assert_eq!(iter.next(), Some(17));
3152     assert_eq!(iter.try_rfold(0, i8::checked_add), None);
3153     assert_eq!(iter.next_back(), Some(35));
3154 }
3155
3156 #[test]
3157 fn test_functor_laws() {
3158     // identity:
3159     fn identity<T>(x: T) -> T {
3160         x
3161     }
3162     assert_eq!((0..10).map(identity).sum::<usize>(), (0..10).sum());
3163
3164     // composition:
3165     fn f(x: usize) -> usize {
3166         x + 3
3167     }
3168     fn g(x: usize) -> usize {
3169         x * 2
3170     }
3171     fn h(x: usize) -> usize {
3172         g(f(x))
3173     }
3174     assert_eq!((0..10).map(f).map(g).sum::<usize>(), (0..10).map(h).sum());
3175 }
3176
3177 #[test]
3178 fn test_monad_laws_left_identity() {
3179     fn f(x: usize) -> impl Iterator<Item = usize> {
3180         (0..10).map(move |y| x * y)
3181     }
3182     assert_eq!(once(42).flat_map(f.clone()).sum::<usize>(), f(42).sum());
3183 }
3184
3185 #[test]
3186 fn test_monad_laws_right_identity() {
3187     assert_eq!((0..10).flat_map(|x| once(x)).sum::<usize>(), (0..10).sum());
3188 }
3189
3190 #[test]
3191 fn test_monad_laws_associativity() {
3192     fn f(x: usize) -> impl Iterator<Item = usize> {
3193         0..x
3194     }
3195     fn g(x: usize) -> impl Iterator<Item = usize> {
3196         (0..x).rev()
3197     }
3198     assert_eq!(
3199         (0..10).flat_map(f).flat_map(g).sum::<usize>(),
3200         (0..10).flat_map(|x| f(x).flat_map(g)).sum::<usize>()
3201     );
3202 }
3203
3204 #[test]
3205 fn test_is_sorted() {
3206     assert!([1, 2, 2, 9].iter().is_sorted());
3207     assert!(![1, 3, 2].iter().is_sorted());
3208     assert!([0].iter().is_sorted());
3209     assert!(std::iter::empty::<i32>().is_sorted());
3210     assert!(![0.0, 1.0, f32::NAN].iter().is_sorted());
3211     assert!([-2, -1, 0, 3].iter().is_sorted());
3212     assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs()));
3213     assert!(!["c", "bb", "aaa"].iter().is_sorted());
3214     assert!(["c", "bb", "aaa"].iter().is_sorted_by_key(|s| s.len()));
3215 }
3216
3217 #[test]
3218 fn test_partition() {
3219     fn check(xs: &mut [i32], ref p: impl Fn(&i32) -> bool, expected: usize) {
3220         let i = xs.iter_mut().partition_in_place(p);
3221         assert_eq!(expected, i);
3222         assert!(xs[..i].iter().all(p));
3223         assert!(!xs[i..].iter().any(p));
3224         assert!(xs.iter().is_partitioned(p));
3225         if i == 0 || i == xs.len() {
3226             assert!(xs.iter().rev().is_partitioned(p));
3227         } else {
3228             assert!(!xs.iter().rev().is_partitioned(p));
3229         }
3230     }
3231
3232     check(&mut [], |_| true, 0);
3233     check(&mut [], |_| false, 0);
3234
3235     check(&mut [0], |_| true, 1);
3236     check(&mut [0], |_| false, 0);
3237
3238     check(&mut [-1, 1], |&x| x > 0, 1);
3239     check(&mut [-1, 1], |&x| x < 0, 1);
3240
3241     let ref mut xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3242     check(xs, |_| true, 10);
3243     check(xs, |_| false, 0);
3244     check(xs, |&x| x % 2 == 0, 5); // evens
3245     check(xs, |&x| x % 2 == 1, 5); // odds
3246     check(xs, |&x| x % 3 == 0, 4); // multiple of 3
3247     check(xs, |&x| x % 4 == 0, 3); // multiple of 4
3248     check(xs, |&x| x % 5 == 0, 2); // multiple of 5
3249     check(xs, |&x| x < 3, 3); // small
3250     check(xs, |&x| x > 6, 3); // large
3251 }
3252
3253 /// An iterator that panics whenever `next` or next_back` is called
3254 /// after `None` has already been returned. This does not violate
3255 /// `Iterator`'s contract. Used to test that iterator adaptors don't
3256 /// poll their inner iterators after exhausting them.
3257 struct NonFused<I> {
3258     iter: I,
3259     done: bool,
3260 }
3261
3262 impl<I> NonFused<I> {
3263     fn new(iter: I) -> Self {
3264         Self { iter, done: false }
3265     }
3266 }
3267
3268 impl<I> Iterator for NonFused<I>
3269 where
3270     I: Iterator,
3271 {
3272     type Item = I::Item;
3273
3274     fn next(&mut self) -> Option<Self::Item> {
3275         assert!(!self.done, "this iterator has already returned None");
3276         self.iter.next().or_else(|| {
3277             self.done = true;
3278             None
3279         })
3280     }
3281 }
3282
3283 impl<I> DoubleEndedIterator for NonFused<I>
3284 where
3285     I: DoubleEndedIterator,
3286 {
3287     fn next_back(&mut self) -> Option<Self::Item> {
3288         assert!(!self.done, "this iterator has already returned None");
3289         self.iter.next_back().or_else(|| {
3290             self.done = true;
3291             None
3292         })
3293     }
3294 }
3295
3296 #[test]
3297 fn test_peekable_non_fused() {
3298     let mut iter = NonFused::new(empty::<i32>()).peekable();
3299
3300     assert_eq!(iter.peek(), None);
3301     assert_eq!(iter.next_back(), None);
3302 }
3303
3304 #[test]
3305 fn test_flatten_non_fused_outer() {
3306     let mut iter = NonFused::new(once(0..2)).flatten();
3307
3308     assert_eq!(iter.next_back(), Some(1));
3309     assert_eq!(iter.next(), Some(0));
3310     assert_eq!(iter.next(), None);
3311 }
3312
3313 #[test]
3314 fn test_flatten_non_fused_inner() {
3315     let mut iter = once(0..1).chain(once(1..3)).flat_map(NonFused::new);
3316
3317     assert_eq!(iter.next_back(), Some(2));
3318     assert_eq!(iter.next(), Some(0));
3319     assert_eq!(iter.next(), Some(1));
3320     assert_eq!(iter.next(), None);
3321 }