]> git.lizzy.rs Git - rust.git/blob - src/libcore/tests/iter.rs
Rollup merge of #44562 - eddyb:ugh-rustdoc, r=nikomatsakis
[rust.git] / src / libcore / tests / iter.rs
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use core::iter::*;
12 use core::{i8, i16, isize};
13 use core::usize;
14
15 #[test]
16 fn test_lt() {
17     let empty: [isize; 0] = [];
18     let xs = [1,2,3];
19     let ys = [1,2,0];
20
21     assert!(!xs.iter().lt(ys.iter()));
22     assert!(!xs.iter().le(ys.iter()));
23     assert!( xs.iter().gt(ys.iter()));
24     assert!( xs.iter().ge(ys.iter()));
25
26     assert!( ys.iter().lt(xs.iter()));
27     assert!( ys.iter().le(xs.iter()));
28     assert!(!ys.iter().gt(xs.iter()));
29     assert!(!ys.iter().ge(xs.iter()));
30
31     assert!( empty.iter().lt(xs.iter()));
32     assert!( empty.iter().le(xs.iter()));
33     assert!(!empty.iter().gt(xs.iter()));
34     assert!(!empty.iter().ge(xs.iter()));
35
36     // Sequence with NaN
37     let u = [1.0f64, 2.0];
38     let v = [0.0f64/0.0, 3.0];
39
40     assert!(!u.iter().lt(v.iter()));
41     assert!(!u.iter().le(v.iter()));
42     assert!(!u.iter().gt(v.iter()));
43     assert!(!u.iter().ge(v.iter()));
44
45     let a = [0.0f64/0.0];
46     let b = [1.0f64];
47     let c = [2.0f64];
48
49     assert!(a.iter().lt(b.iter()) == (a[0] <  b[0]));
50     assert!(a.iter().le(b.iter()) == (a[0] <= b[0]));
51     assert!(a.iter().gt(b.iter()) == (a[0] >  b[0]));
52     assert!(a.iter().ge(b.iter()) == (a[0] >= b[0]));
53
54     assert!(c.iter().lt(b.iter()) == (c[0] <  b[0]));
55     assert!(c.iter().le(b.iter()) == (c[0] <= b[0]));
56     assert!(c.iter().gt(b.iter()) == (c[0] >  b[0]));
57     assert!(c.iter().ge(b.iter()) == (c[0] >= b[0]));
58 }
59
60 #[test]
61 fn test_multi_iter() {
62     let xs = [1,2,3,4];
63     let ys = [4,3,2,1];
64     assert!(xs.iter().eq(ys.iter().rev()));
65     assert!(xs.iter().lt(xs.iter().skip(2)));
66 }
67
68 #[test]
69 fn test_counter_from_iter() {
70     let it = (0..).step_by(5).take(10);
71     let xs: Vec<isize> = FromIterator::from_iter(it);
72     assert_eq!(xs, [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]);
73 }
74
75 #[test]
76 fn test_iterator_chain() {
77     let xs = [0, 1, 2, 3, 4, 5];
78     let ys = [30, 40, 50, 60];
79     let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
80     let it = xs.iter().chain(&ys);
81     let mut i = 0;
82     for &x in it {
83         assert_eq!(x, expected[i]);
84         i += 1;
85     }
86     assert_eq!(i, expected.len());
87
88     let ys = (30..).step_by(10).take(4);
89     let it = xs.iter().cloned().chain(ys);
90     let mut i = 0;
91     for x in it {
92         assert_eq!(x, expected[i]);
93         i += 1;
94     }
95     assert_eq!(i, expected.len());
96 }
97
98 #[test]
99 fn test_iterator_chain_nth() {
100     let xs = [0, 1, 2, 3, 4, 5];
101     let ys = [30, 40, 50, 60];
102     let zs = [];
103     let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
104     for (i, x) in expected.iter().enumerate() {
105         assert_eq!(Some(x), xs.iter().chain(&ys).nth(i));
106     }
107     assert_eq!(zs.iter().chain(&xs).nth(0), Some(&0));
108
109     let mut it = xs.iter().chain(&zs);
110     assert_eq!(it.nth(5), Some(&5));
111     assert_eq!(it.next(), None);
112 }
113
114 #[test]
115 fn test_iterator_chain_last() {
116     let xs = [0, 1, 2, 3, 4, 5];
117     let ys = [30, 40, 50, 60];
118     let zs = [];
119     assert_eq!(xs.iter().chain(&ys).last(), Some(&60));
120     assert_eq!(zs.iter().chain(&ys).last(), Some(&60));
121     assert_eq!(ys.iter().chain(&zs).last(), Some(&60));
122     assert_eq!(zs.iter().chain(&zs).last(), None);
123 }
124
125 #[test]
126 fn test_iterator_chain_count() {
127     let xs = [0, 1, 2, 3, 4, 5];
128     let ys = [30, 40, 50, 60];
129     let zs = [];
130     assert_eq!(xs.iter().chain(&ys).count(), 10);
131     assert_eq!(zs.iter().chain(&ys).count(), 4);
132 }
133
134 #[test]
135 fn test_iterator_chain_find() {
136     let xs = [0, 1, 2, 3, 4, 5];
137     let ys = [30, 40, 50, 60];
138     let mut iter = xs.iter().chain(&ys);
139     assert_eq!(iter.find(|&&i| i == 4), Some(&4));
140     assert_eq!(iter.next(), Some(&5));
141     assert_eq!(iter.find(|&&i| i == 40), Some(&40));
142     assert_eq!(iter.next(), Some(&50));
143     assert_eq!(iter.find(|&&i| i == 100), None);
144     assert_eq!(iter.next(), None);
145 }
146
147 #[test]
148 fn test_iterator_step_by() {
149     // Identity
150     let mut it = (0..).step_by(1).take(3);
151     assert_eq!(it.next(), Some(0));
152     assert_eq!(it.next(), Some(1));
153     assert_eq!(it.next(), Some(2));
154     assert_eq!(it.next(), None);
155
156     let mut it = (0..).step_by(3).take(4);
157     assert_eq!(it.next(), Some(0));
158     assert_eq!(it.next(), Some(3));
159     assert_eq!(it.next(), Some(6));
160     assert_eq!(it.next(), Some(9));
161     assert_eq!(it.next(), None);
162 }
163
164 #[test]
165 #[should_panic]
166 fn test_iterator_step_by_zero() {
167     let mut it = (0..).step_by(0);
168     it.next();
169 }
170
171 #[test]
172 fn test_iterator_step_by_size_hint() {
173     struct StubSizeHint(usize, Option<usize>);
174     impl Iterator for StubSizeHint {
175         type Item = ();
176         fn next(&mut self) -> Option<()> {
177             self.0 -= 1;
178             if let Some(ref mut upper) = self.1 {
179                 *upper -= 1;
180             }
181             Some(())
182         }
183         fn size_hint(&self) -> (usize, Option<usize>) {
184             (self.0, self.1)
185         }
186     }
187
188     // The two checks in each case are needed because the logic
189     // is different before the first call to `next()`.
190
191     let mut it = StubSizeHint(10, Some(10)).step_by(1);
192     assert_eq!(it.size_hint(), (10, Some(10)));
193     it.next();
194     assert_eq!(it.size_hint(), (9, Some(9)));
195
196     // exact multiple
197     let mut it = StubSizeHint(10, Some(10)).step_by(3);
198     assert_eq!(it.size_hint(), (4, Some(4)));
199     it.next();
200     assert_eq!(it.size_hint(), (3, Some(3)));
201
202     // larger base range, but not enough to get another element
203     let mut it = StubSizeHint(12, Some(12)).step_by(3);
204     assert_eq!(it.size_hint(), (4, Some(4)));
205     it.next();
206     assert_eq!(it.size_hint(), (3, Some(3)));
207
208     // smaller base range, so fewer resulting elements
209     let mut it = StubSizeHint(9, Some(9)).step_by(3);
210     assert_eq!(it.size_hint(), (3, Some(3)));
211     it.next();
212     assert_eq!(it.size_hint(), (2, Some(2)));
213
214     // infinite upper bound
215     let mut it = StubSizeHint(usize::MAX, None).step_by(1);
216     assert_eq!(it.size_hint(), (usize::MAX, None));
217     it.next();
218     assert_eq!(it.size_hint(), (usize::MAX-1, None));
219
220     // still infinite with larger step
221     let mut it = StubSizeHint(7, None).step_by(3);
222     assert_eq!(it.size_hint(), (3, None));
223     it.next();
224     assert_eq!(it.size_hint(), (2, None));
225
226     // propagates ExactSizeIterator
227     let a = [1,2,3,4,5];
228     let it = a.iter().step_by(2);
229     assert_eq!(it.len(), 3);
230
231     // Cannot be TrustedLen as a step greater than one makes an iterator
232     // with (usize::MAX, None) no longer meet the safety requirements
233     trait TrustedLenCheck { fn test(self) -> bool; }
234     impl<T:Iterator> TrustedLenCheck for T {
235         default fn test(self) -> bool { false }
236     }
237     impl<T:TrustedLen> TrustedLenCheck for T {
238         fn test(self) -> bool { true }
239     }
240     assert!(TrustedLenCheck::test(a.iter()));
241     assert!(!TrustedLenCheck::test(a.iter().step_by(1)));
242 }
243
244 #[test]
245 fn test_filter_map() {
246     let it = (0..).step_by(1).take(10)
247         .filter_map(|x| if x % 2 == 0 { Some(x*x) } else { None });
248     assert_eq!(it.collect::<Vec<usize>>(), [0*0, 2*2, 4*4, 6*6, 8*8]);
249 }
250
251 #[test]
252 fn test_iterator_enumerate() {
253     let xs = [0, 1, 2, 3, 4, 5];
254     let it = xs.iter().enumerate();
255     for (i, &x) in it {
256         assert_eq!(i, x);
257     }
258 }
259
260 #[test]
261 fn test_iterator_enumerate_nth() {
262     let xs = [0, 1, 2, 3, 4, 5];
263     for (i, &x) in xs.iter().enumerate() {
264         assert_eq!(i, x);
265     }
266
267     let mut it = xs.iter().enumerate();
268     while let Some((i, &x)) = it.nth(0) {
269         assert_eq!(i, x);
270     }
271
272     let mut it = xs.iter().enumerate();
273     while let Some((i, &x)) = it.nth(1) {
274         assert_eq!(i, x);
275     }
276
277     let (i, &x) = xs.iter().enumerate().nth(3).unwrap();
278     assert_eq!(i, x);
279     assert_eq!(i, 3);
280 }
281
282 #[test]
283 fn test_iterator_enumerate_count() {
284     let xs = [0, 1, 2, 3, 4, 5];
285     assert_eq!(xs.iter().count(), 6);
286 }
287
288 #[test]
289 fn test_iterator_filter_count() {
290     let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8];
291     assert_eq!(xs.iter().filter(|&&x| x % 2 == 0).count(), 5);
292 }
293
294 #[test]
295 fn test_iterator_peekable() {
296     let xs = vec![0, 1, 2, 3, 4, 5];
297     let mut it = xs.iter().cloned().peekable();
298
299     assert_eq!(it.len(), 6);
300     assert_eq!(it.peek().unwrap(), &0);
301     assert_eq!(it.len(), 6);
302     assert_eq!(it.next().unwrap(), 0);
303     assert_eq!(it.len(), 5);
304     assert_eq!(it.next().unwrap(), 1);
305     assert_eq!(it.len(), 4);
306     assert_eq!(it.next().unwrap(), 2);
307     assert_eq!(it.len(), 3);
308     assert_eq!(it.peek().unwrap(), &3);
309     assert_eq!(it.len(), 3);
310     assert_eq!(it.peek().unwrap(), &3);
311     assert_eq!(it.len(), 3);
312     assert_eq!(it.next().unwrap(), 3);
313     assert_eq!(it.len(), 2);
314     assert_eq!(it.next().unwrap(), 4);
315     assert_eq!(it.len(), 1);
316     assert_eq!(it.peek().unwrap(), &5);
317     assert_eq!(it.len(), 1);
318     assert_eq!(it.next().unwrap(), 5);
319     assert_eq!(it.len(), 0);
320     assert!(it.peek().is_none());
321     assert_eq!(it.len(), 0);
322     assert!(it.next().is_none());
323     assert_eq!(it.len(), 0);
324 }
325
326 #[test]
327 fn test_iterator_peekable_count() {
328     let xs = [0, 1, 2, 3, 4, 5];
329     let ys = [10];
330     let zs: [i32; 0] = [];
331
332     assert_eq!(xs.iter().peekable().count(), 6);
333
334     let mut it = xs.iter().peekable();
335     assert_eq!(it.peek(), Some(&&0));
336     assert_eq!(it.count(), 6);
337
338     assert_eq!(ys.iter().peekable().count(), 1);
339
340     let mut it = ys.iter().peekable();
341     assert_eq!(it.peek(), Some(&&10));
342     assert_eq!(it.count(), 1);
343
344     assert_eq!(zs.iter().peekable().count(), 0);
345
346     let mut it = zs.iter().peekable();
347     assert_eq!(it.peek(), None);
348
349 }
350
351 #[test]
352 fn test_iterator_peekable_nth() {
353     let xs = [0, 1, 2, 3, 4, 5];
354     let mut it = xs.iter().peekable();
355
356     assert_eq!(it.peek(), Some(&&0));
357     assert_eq!(it.nth(0), Some(&0));
358     assert_eq!(it.peek(), Some(&&1));
359     assert_eq!(it.nth(1), Some(&2));
360     assert_eq!(it.peek(), Some(&&3));
361     assert_eq!(it.nth(2), Some(&5));
362     assert_eq!(it.next(), None);
363 }
364
365 #[test]
366 fn test_iterator_peekable_last() {
367     let xs = [0, 1, 2, 3, 4, 5];
368     let ys = [0];
369
370     let mut it = xs.iter().peekable();
371     assert_eq!(it.peek(), Some(&&0));
372     assert_eq!(it.last(), Some(&5));
373
374     let mut it = ys.iter().peekable();
375     assert_eq!(it.peek(), Some(&&0));
376     assert_eq!(it.last(), Some(&0));
377
378     let mut it = ys.iter().peekable();
379     assert_eq!(it.next(), Some(&0));
380     assert_eq!(it.peek(), None);
381     assert_eq!(it.last(), None);
382 }
383
384 /// This is an iterator that follows the Iterator contract,
385 /// but it is not fused. After having returned None once, it will start
386 /// producing elements if .next() is called again.
387 pub struct CycleIter<'a, T: 'a> {
388     index: usize,
389     data: &'a [T],
390 }
391
392 pub fn cycle<T>(data: &[T]) -> CycleIter<T> {
393     CycleIter {
394         index: 0,
395         data,
396     }
397 }
398
399 impl<'a, T> Iterator for CycleIter<'a, T> {
400     type Item = &'a T;
401     fn next(&mut self) -> Option<Self::Item> {
402         let elt = self.data.get(self.index);
403         self.index += 1;
404         self.index %= 1 + self.data.len();
405         elt
406     }
407 }
408
409 #[test]
410 fn test_iterator_peekable_remember_peek_none_1() {
411     // Check that the loop using .peek() terminates
412     let data = [1, 2, 3];
413     let mut iter = cycle(&data).peekable();
414
415     let mut n = 0;
416     while let Some(_) = iter.next() {
417         let is_the_last = iter.peek().is_none();
418         assert_eq!(is_the_last, n == data.len() - 1);
419         n += 1;
420         if n > data.len() { break; }
421     }
422     assert_eq!(n, data.len());
423 }
424
425 #[test]
426 fn test_iterator_peekable_remember_peek_none_2() {
427     let data = [0];
428     let mut iter = cycle(&data).peekable();
429     iter.next();
430     assert_eq!(iter.peek(), None);
431     assert_eq!(iter.last(), None);
432 }
433
434 #[test]
435 fn test_iterator_peekable_remember_peek_none_3() {
436     let data = [0];
437     let mut iter = cycle(&data).peekable();
438     iter.peek();
439     assert_eq!(iter.nth(0), Some(&0));
440
441     let mut iter = cycle(&data).peekable();
442     iter.next();
443     assert_eq!(iter.peek(), None);
444     assert_eq!(iter.nth(0), None);
445 }
446
447 #[test]
448 fn test_iterator_take_while() {
449     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
450     let ys = [0, 1, 2, 3, 5, 13];
451     let it = xs.iter().take_while(|&x| *x < 15);
452     let mut i = 0;
453     for x in it {
454         assert_eq!(*x, ys[i]);
455         i += 1;
456     }
457     assert_eq!(i, ys.len());
458 }
459
460 #[test]
461 fn test_iterator_skip_while() {
462     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
463     let ys = [15, 16, 17, 19];
464     let it = xs.iter().skip_while(|&x| *x < 15);
465     let mut i = 0;
466     for x in it {
467         assert_eq!(*x, ys[i]);
468         i += 1;
469     }
470     assert_eq!(i, ys.len());
471 }
472
473 #[test]
474 fn test_iterator_skip() {
475     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
476     let ys = [13, 15, 16, 17, 19, 20, 30];
477     let mut it = xs.iter().skip(5);
478     let mut i = 0;
479     while let Some(&x) = it.next() {
480         assert_eq!(x, ys[i]);
481         i += 1;
482         assert_eq!(it.len(), xs.len()-5-i);
483     }
484     assert_eq!(i, ys.len());
485     assert_eq!(it.len(), 0);
486 }
487
488 #[test]
489 fn test_iterator_skip_doubleended() {
490     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
491     let mut it = xs.iter().rev().skip(5);
492     assert_eq!(it.next(), Some(&15));
493     assert_eq!(it.by_ref().rev().next(), Some(&0));
494     assert_eq!(it.next(), Some(&13));
495     assert_eq!(it.by_ref().rev().next(), Some(&1));
496     assert_eq!(it.next(), Some(&5));
497     assert_eq!(it.by_ref().rev().next(), Some(&2));
498     assert_eq!(it.next(), Some(&3));
499     assert_eq!(it.next(), None);
500     let mut it = xs.iter().rev().skip(5).rev();
501     assert_eq!(it.next(), Some(&0));
502     assert_eq!(it.rev().next(), Some(&15));
503     let mut it_base = xs.iter();
504     {
505         let mut it = it_base.by_ref().skip(5).rev();
506         assert_eq!(it.next(), Some(&30));
507         assert_eq!(it.next(), Some(&20));
508         assert_eq!(it.next(), Some(&19));
509         assert_eq!(it.next(), Some(&17));
510         assert_eq!(it.next(), Some(&16));
511         assert_eq!(it.next(), Some(&15));
512         assert_eq!(it.next(), Some(&13));
513         assert_eq!(it.next(), None);
514     }
515     // make sure the skipped parts have not been consumed
516     assert_eq!(it_base.next(), Some(&0));
517     assert_eq!(it_base.next(), Some(&1));
518     assert_eq!(it_base.next(), Some(&2));
519     assert_eq!(it_base.next(), Some(&3));
520     assert_eq!(it_base.next(), Some(&5));
521     assert_eq!(it_base.next(), None);
522     let it = xs.iter().skip(5).rev();
523     assert_eq!(it.last(), Some(&13));
524 }
525
526 #[test]
527 fn test_iterator_skip_nth() {
528     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
529
530     let mut it = xs.iter().skip(0);
531     assert_eq!(it.nth(0), Some(&0));
532     assert_eq!(it.nth(1), Some(&2));
533
534     let mut it = xs.iter().skip(5);
535     assert_eq!(it.nth(0), Some(&13));
536     assert_eq!(it.nth(1), Some(&16));
537
538     let mut it = xs.iter().skip(12);
539     assert_eq!(it.nth(0), None);
540
541 }
542
543 #[test]
544 fn test_iterator_skip_count() {
545     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
546
547     assert_eq!(xs.iter().skip(0).count(), 12);
548     assert_eq!(xs.iter().skip(1).count(), 11);
549     assert_eq!(xs.iter().skip(11).count(), 1);
550     assert_eq!(xs.iter().skip(12).count(), 0);
551     assert_eq!(xs.iter().skip(13).count(), 0);
552 }
553
554 #[test]
555 fn test_iterator_skip_last() {
556     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
557
558     assert_eq!(xs.iter().skip(0).last(), Some(&30));
559     assert_eq!(xs.iter().skip(1).last(), Some(&30));
560     assert_eq!(xs.iter().skip(11).last(), Some(&30));
561     assert_eq!(xs.iter().skip(12).last(), None);
562     assert_eq!(xs.iter().skip(13).last(), None);
563
564     let mut it = xs.iter().skip(5);
565     assert_eq!(it.next(), Some(&13));
566     assert_eq!(it.last(), Some(&30));
567 }
568
569 #[test]
570 fn test_iterator_take() {
571     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19];
572     let ys = [0, 1, 2, 3, 5];
573     let mut it = xs.iter().take(5);
574     let mut i = 0;
575     assert_eq!(it.len(), 5);
576     while let Some(&x) = it.next() {
577         assert_eq!(x, ys[i]);
578         i += 1;
579         assert_eq!(it.len(), 5-i);
580     }
581     assert_eq!(i, ys.len());
582     assert_eq!(it.len(), 0);
583 }
584
585 #[test]
586 fn test_iterator_take_nth() {
587     let xs = [0, 1, 2, 4, 5];
588     let mut it = xs.iter();
589     {
590         let mut take = it.by_ref().take(3);
591         let mut i = 0;
592         while let Some(&x) = take.nth(0) {
593             assert_eq!(x, i);
594             i += 1;
595         }
596     }
597     assert_eq!(it.nth(1), Some(&5));
598     assert_eq!(it.nth(0), None);
599
600     let xs = [0, 1, 2, 3, 4];
601     let mut it = xs.iter().take(7);
602     let mut i = 1;
603     while let Some(&x) = it.nth(1) {
604         assert_eq!(x, i);
605         i += 2;
606     }
607 }
608
609 #[test]
610 fn test_iterator_take_short() {
611     let xs = [0, 1, 2, 3];
612     let ys = [0, 1, 2, 3];
613     let mut it = xs.iter().take(5);
614     let mut i = 0;
615     assert_eq!(it.len(), 4);
616     while let Some(&x) = it.next() {
617         assert_eq!(x, ys[i]);
618         i += 1;
619         assert_eq!(it.len(), 4-i);
620     }
621     assert_eq!(i, ys.len());
622     assert_eq!(it.len(), 0);
623 }
624
625 #[test]
626 fn test_iterator_scan() {
627     // test the type inference
628     fn add(old: &mut isize, new: &usize) -> Option<f64> {
629         *old += *new as isize;
630         Some(*old as f64)
631     }
632     let xs = [0, 1, 2, 3, 4];
633     let ys = [0f64, 1.0, 3.0, 6.0, 10.0];
634
635     let it = xs.iter().scan(0, add);
636     let mut i = 0;
637     for x in it {
638         assert_eq!(x, ys[i]);
639         i += 1;
640     }
641     assert_eq!(i, ys.len());
642 }
643
644 #[test]
645 fn test_iterator_flat_map() {
646     let xs = [0, 3, 6];
647     let ys = [0, 1, 2, 3, 4, 5, 6, 7, 8];
648     let it = xs.iter().flat_map(|&x| (x..).step_by(1).take(3));
649     let mut i = 0;
650     for x in it {
651         assert_eq!(x, ys[i]);
652         i += 1;
653     }
654     assert_eq!(i, ys.len());
655 }
656
657 /// Test `FlatMap::fold` with items already picked off the front and back,
658 /// to make sure all parts of the `FlatMap` are folded correctly.
659 #[test]
660 fn test_iterator_flat_map_fold() {
661     let xs = [0, 3, 6];
662     let ys = [1, 2, 3, 4, 5, 6, 7];
663     let mut it = xs.iter().flat_map(|&x| x..x+3);
664     it.next();
665     it.next_back();
666     let i = it.fold(0, |i, x| {
667         assert_eq!(x, ys[i]);
668         i + 1
669     });
670     assert_eq!(i, ys.len());
671 }
672
673 #[test]
674 fn test_inspect() {
675     let xs = [1, 2, 3, 4];
676     let mut n = 0;
677
678     let ys = xs.iter()
679                .cloned()
680                .inspect(|_| n += 1)
681                .collect::<Vec<usize>>();
682
683     assert_eq!(n, xs.len());
684     assert_eq!(&xs[..], &ys[..]);
685 }
686
687 #[test]
688 fn test_cycle() {
689     let cycle_len = 3;
690     let it = (0..).step_by(1).take(cycle_len).cycle();
691     assert_eq!(it.size_hint(), (usize::MAX, None));
692     for (i, x) in it.take(100).enumerate() {
693         assert_eq!(i % cycle_len, x);
694     }
695
696     let mut it = (0..).step_by(1).take(0).cycle();
697     assert_eq!(it.size_hint(), (0, Some(0)));
698     assert_eq!(it.next(), None);
699 }
700
701 #[test]
702 fn test_iterator_nth() {
703     let v: &[_] = &[0, 1, 2, 3, 4];
704     for i in 0..v.len() {
705         assert_eq!(v.iter().nth(i).unwrap(), &v[i]);
706     }
707     assert_eq!(v.iter().nth(v.len()), None);
708 }
709
710 #[test]
711 fn test_iterator_last() {
712     let v: &[_] = &[0, 1, 2, 3, 4];
713     assert_eq!(v.iter().last().unwrap(), &4);
714     assert_eq!(v[..1].iter().last().unwrap(), &0);
715 }
716
717 #[test]
718 fn test_iterator_len() {
719     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
720     assert_eq!(v[..4].iter().count(), 4);
721     assert_eq!(v[..10].iter().count(), 10);
722     assert_eq!(v[..0].iter().count(), 0);
723 }
724
725 #[test]
726 fn test_iterator_sum() {
727     let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
728     assert_eq!(v[..4].iter().cloned().sum::<i32>(), 6);
729     assert_eq!(v.iter().cloned().sum::<i32>(), 55);
730     assert_eq!(v[..0].iter().cloned().sum::<i32>(), 0);
731 }
732
733 #[test]
734 fn test_iterator_sum_result() {
735     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
736     assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Ok(10));
737     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
738     assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Err(()));
739 }
740
741 #[test]
742 fn test_iterator_product() {
743     let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
744     assert_eq!(v[..4].iter().cloned().product::<i32>(), 0);
745     assert_eq!(v[1..5].iter().cloned().product::<i32>(), 24);
746     assert_eq!(v[..0].iter().cloned().product::<i32>(), 1);
747 }
748
749 #[test]
750 fn test_iterator_product_result() {
751     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
752     assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Ok(24));
753     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
754     assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Err(()));
755 }
756
757 #[test]
758 fn test_iterator_max() {
759     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
760     assert_eq!(v[..4].iter().cloned().max(), Some(3));
761     assert_eq!(v.iter().cloned().max(), Some(10));
762     assert_eq!(v[..0].iter().cloned().max(), None);
763 }
764
765 #[test]
766 fn test_iterator_min() {
767     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
768     assert_eq!(v[..4].iter().cloned().min(), Some(0));
769     assert_eq!(v.iter().cloned().min(), Some(0));
770     assert_eq!(v[..0].iter().cloned().min(), None);
771 }
772
773 #[test]
774 fn test_iterator_size_hint() {
775     let c = (0..).step_by(1);
776     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
777     let v2 = &[10, 11, 12];
778     let vi = v.iter();
779
780     assert_eq!((0..).size_hint(), (usize::MAX, None));
781     assert_eq!(c.size_hint(), (usize::MAX, None));
782     assert_eq!(vi.clone().size_hint(), (10, Some(10)));
783
784     assert_eq!(c.clone().take(5).size_hint(), (5, Some(5)));
785     assert_eq!(c.clone().skip(5).size_hint().1, None);
786     assert_eq!(c.clone().take_while(|_| false).size_hint(), (0, None));
787     assert_eq!(c.clone().skip_while(|_| false).size_hint(), (0, None));
788     assert_eq!(c.clone().enumerate().size_hint(), (usize::MAX, None));
789     assert_eq!(c.clone().chain(vi.clone().cloned()).size_hint(), (usize::MAX, None));
790     assert_eq!(c.clone().zip(vi.clone()).size_hint(), (10, Some(10)));
791     assert_eq!(c.clone().scan(0, |_,_| Some(0)).size_hint(), (0, None));
792     assert_eq!(c.clone().filter(|_| false).size_hint(), (0, None));
793     assert_eq!(c.clone().map(|_| 0).size_hint(), (usize::MAX, None));
794     assert_eq!(c.filter_map(|_| Some(0)).size_hint(), (0, None));
795
796     assert_eq!(vi.clone().take(5).size_hint(), (5, Some(5)));
797     assert_eq!(vi.clone().take(12).size_hint(), (10, Some(10)));
798     assert_eq!(vi.clone().skip(3).size_hint(), (7, Some(7)));
799     assert_eq!(vi.clone().skip(12).size_hint(), (0, Some(0)));
800     assert_eq!(vi.clone().take_while(|_| false).size_hint(), (0, Some(10)));
801     assert_eq!(vi.clone().skip_while(|_| false).size_hint(), (0, Some(10)));
802     assert_eq!(vi.clone().enumerate().size_hint(), (10, Some(10)));
803     assert_eq!(vi.clone().chain(v2).size_hint(), (13, Some(13)));
804     assert_eq!(vi.clone().zip(v2).size_hint(), (3, Some(3)));
805     assert_eq!(vi.clone().scan(0, |_,_| Some(0)).size_hint(), (0, Some(10)));
806     assert_eq!(vi.clone().filter(|_| false).size_hint(), (0, Some(10)));
807     assert_eq!(vi.clone().map(|&i| i+1).size_hint(), (10, Some(10)));
808     assert_eq!(vi.filter_map(|_| Some(0)).size_hint(), (0, Some(10)));
809 }
810
811 #[test]
812 fn test_collect() {
813     let a = vec![1, 2, 3, 4, 5];
814     let b: Vec<isize> = a.iter().cloned().collect();
815     assert!(a == b);
816 }
817
818 #[test]
819 fn test_all() {
820     let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]);
821     assert!(v.iter().all(|&x| x < 10));
822     assert!(!v.iter().all(|&x| x % 2 == 0));
823     assert!(!v.iter().all(|&x| x > 100));
824     assert!(v[..0].iter().all(|_| panic!()));
825 }
826
827 #[test]
828 fn test_any() {
829     let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]);
830     assert!(v.iter().any(|&x| x < 10));
831     assert!(v.iter().any(|&x| x % 2 == 0));
832     assert!(!v.iter().any(|&x| x > 100));
833     assert!(!v[..0].iter().any(|_| panic!()));
834 }
835
836 #[test]
837 fn test_find() {
838     let v: &[isize] = &[1, 3, 9, 27, 103, 14, 11];
839     assert_eq!(*v.iter().find(|&&x| x & 1 == 0).unwrap(), 14);
840     assert_eq!(*v.iter().find(|&&x| x % 3 == 0).unwrap(), 3);
841     assert!(v.iter().find(|&&x| x % 12 == 0).is_none());
842 }
843
844 #[test]
845 fn test_position() {
846     let v = &[1, 3, 9, 27, 103, 14, 11];
847     assert_eq!(v.iter().position(|x| *x & 1 == 0).unwrap(), 5);
848     assert_eq!(v.iter().position(|x| *x % 3 == 0).unwrap(), 1);
849     assert!(v.iter().position(|x| *x % 12 == 0).is_none());
850 }
851
852 #[test]
853 fn test_count() {
854     let xs = &[1, 2, 2, 1, 5, 9, 0, 2];
855     assert_eq!(xs.iter().filter(|x| **x == 2).count(), 3);
856     assert_eq!(xs.iter().filter(|x| **x == 5).count(), 1);
857     assert_eq!(xs.iter().filter(|x| **x == 95).count(), 0);
858 }
859
860 #[test]
861 fn test_max_by_key() {
862     let xs: &[isize] = &[-3, 0, 1, 5, -10];
863     assert_eq!(*xs.iter().max_by_key(|x| x.abs()).unwrap(), -10);
864 }
865
866 #[test]
867 fn test_max_by() {
868     let xs: &[isize] = &[-3, 0, 1, 5, -10];
869     assert_eq!(*xs.iter().max_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), -10);
870 }
871
872 #[test]
873 fn test_min_by_key() {
874     let xs: &[isize] = &[-3, 0, 1, 5, -10];
875     assert_eq!(*xs.iter().min_by_key(|x| x.abs()).unwrap(), 0);
876 }
877
878 #[test]
879 fn test_min_by() {
880     let xs: &[isize] = &[-3, 0, 1, 5, -10];
881     assert_eq!(*xs.iter().min_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), 0);
882 }
883
884 #[test]
885 fn test_by_ref() {
886     let mut xs = 0..10;
887     // sum the first five values
888     let partial_sum = xs.by_ref().take(5).fold(0, |a, b| a + b);
889     assert_eq!(partial_sum, 10);
890     assert_eq!(xs.next(), Some(5));
891 }
892
893 #[test]
894 fn test_rev() {
895     let xs = [2, 4, 6, 8, 10, 12, 14, 16];
896     let mut it = xs.iter();
897     it.next();
898     it.next();
899     assert!(it.rev().cloned().collect::<Vec<isize>>() ==
900             vec![16, 14, 12, 10, 8, 6]);
901 }
902
903 #[test]
904 fn test_cloned() {
905     let xs = [2, 4, 6, 8];
906
907     let mut it = xs.iter().cloned();
908     assert_eq!(it.len(), 4);
909     assert_eq!(it.next(), Some(2));
910     assert_eq!(it.len(), 3);
911     assert_eq!(it.next(), Some(4));
912     assert_eq!(it.len(), 2);
913     assert_eq!(it.next_back(), Some(8));
914     assert_eq!(it.len(), 1);
915     assert_eq!(it.next_back(), Some(6));
916     assert_eq!(it.len(), 0);
917     assert_eq!(it.next_back(), None);
918 }
919
920 #[test]
921 fn test_double_ended_map() {
922     let xs = [1, 2, 3, 4, 5, 6];
923     let mut it = xs.iter().map(|&x| x * -1);
924     assert_eq!(it.next(), Some(-1));
925     assert_eq!(it.next(), Some(-2));
926     assert_eq!(it.next_back(), Some(-6));
927     assert_eq!(it.next_back(), Some(-5));
928     assert_eq!(it.next(), Some(-3));
929     assert_eq!(it.next_back(), Some(-4));
930     assert_eq!(it.next(), None);
931 }
932
933 #[test]
934 fn test_double_ended_enumerate() {
935     let xs = [1, 2, 3, 4, 5, 6];
936     let mut it = xs.iter().cloned().enumerate();
937     assert_eq!(it.next(), Some((0, 1)));
938     assert_eq!(it.next(), Some((1, 2)));
939     assert_eq!(it.next_back(), Some((5, 6)));
940     assert_eq!(it.next_back(), Some((4, 5)));
941     assert_eq!(it.next_back(), Some((3, 4)));
942     assert_eq!(it.next_back(), Some((2, 3)));
943     assert_eq!(it.next(), None);
944 }
945
946 #[test]
947 fn test_double_ended_zip() {
948     let xs = [1, 2, 3, 4, 5, 6];
949     let ys = [1, 2, 3, 7];
950     let a = xs.iter().cloned();
951     let b = ys.iter().cloned();
952     let mut it = a.zip(b);
953     assert_eq!(it.next(), Some((1, 1)));
954     assert_eq!(it.next(), Some((2, 2)));
955     assert_eq!(it.next_back(), Some((4, 7)));
956     assert_eq!(it.next_back(), Some((3, 3)));
957     assert_eq!(it.next(), None);
958 }
959
960 #[test]
961 fn test_double_ended_filter() {
962     let xs = [1, 2, 3, 4, 5, 6];
963     let mut it = xs.iter().filter(|&x| *x & 1 == 0);
964     assert_eq!(it.next_back().unwrap(), &6);
965     assert_eq!(it.next_back().unwrap(), &4);
966     assert_eq!(it.next().unwrap(), &2);
967     assert_eq!(it.next_back(), None);
968 }
969
970 #[test]
971 fn test_double_ended_filter_map() {
972     let xs = [1, 2, 3, 4, 5, 6];
973     let mut it = xs.iter().filter_map(|&x| if x & 1 == 0 { Some(x * 2) } else { None });
974     assert_eq!(it.next_back().unwrap(), 12);
975     assert_eq!(it.next_back().unwrap(), 8);
976     assert_eq!(it.next().unwrap(), 4);
977     assert_eq!(it.next_back(), None);
978 }
979
980 #[test]
981 fn test_double_ended_chain() {
982     let xs = [1, 2, 3, 4, 5];
983     let ys = [7, 9, 11];
984     let mut it = xs.iter().chain(&ys).rev();
985     assert_eq!(it.next().unwrap(), &11);
986     assert_eq!(it.next().unwrap(), &9);
987     assert_eq!(it.next_back().unwrap(), &1);
988     assert_eq!(it.next_back().unwrap(), &2);
989     assert_eq!(it.next_back().unwrap(), &3);
990     assert_eq!(it.next_back().unwrap(), &4);
991     assert_eq!(it.next_back().unwrap(), &5);
992     assert_eq!(it.next_back().unwrap(), &7);
993     assert_eq!(it.next_back(), None);
994
995
996     // test that .chain() is well behaved with an unfused iterator
997     struct CrazyIterator(bool);
998     impl CrazyIterator { fn new() -> CrazyIterator { CrazyIterator(false) } }
999     impl Iterator for CrazyIterator {
1000         type Item = i32;
1001         fn next(&mut self) -> Option<i32> {
1002             if self.0 { Some(99) } else { self.0 = true; None }
1003         }
1004     }
1005
1006     impl DoubleEndedIterator for CrazyIterator {
1007         fn next_back(&mut self) -> Option<i32> {
1008             self.next()
1009         }
1010     }
1011
1012     assert_eq!(CrazyIterator::new().chain(0..10).rev().last(), Some(0));
1013     assert!((0..10).chain(CrazyIterator::new()).rev().any(|i| i == 0));
1014 }
1015
1016 #[test]
1017 fn test_rposition() {
1018     fn f(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'b' }
1019     fn g(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'd' }
1020     let v = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'b')];
1021
1022     assert_eq!(v.iter().rposition(f), Some(3));
1023     assert!(v.iter().rposition(g).is_none());
1024 }
1025
1026 #[test]
1027 #[should_panic]
1028 fn test_rposition_panic() {
1029     let v: [(Box<_>, Box<_>); 4] =
1030         [(box 0, box 0), (box 0, box 0),
1031          (box 0, box 0), (box 0, box 0)];
1032     let mut i = 0;
1033     v.iter().rposition(|_elt| {
1034         if i == 2 {
1035             panic!()
1036         }
1037         i += 1;
1038         false
1039     });
1040 }
1041
1042
1043 #[test]
1044 fn test_double_ended_flat_map() {
1045     let u = [0,1];
1046     let v = [5,6,7,8];
1047     let mut it = u.iter().flat_map(|x| &v[*x..v.len()]);
1048     assert_eq!(it.next_back().unwrap(), &8);
1049     assert_eq!(it.next().unwrap(),      &5);
1050     assert_eq!(it.next_back().unwrap(), &7);
1051     assert_eq!(it.next_back().unwrap(), &6);
1052     assert_eq!(it.next_back().unwrap(), &8);
1053     assert_eq!(it.next().unwrap(),      &6);
1054     assert_eq!(it.next_back().unwrap(), &7);
1055     assert_eq!(it.next_back(), None);
1056     assert_eq!(it.next(),      None);
1057     assert_eq!(it.next_back(), None);
1058 }
1059
1060 #[test]
1061 fn test_double_ended_range() {
1062     assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
1063     for _ in (10..0).rev() {
1064         panic!("unreachable");
1065     }
1066
1067     assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
1068     for _ in (10..0).rev() {
1069         panic!("unreachable");
1070     }
1071 }
1072
1073 #[test]
1074 fn test_range() {
1075     assert_eq!((0..5).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
1076     assert_eq!((-10..-1).collect::<Vec<_>>(), [-10, -9, -8, -7, -6, -5, -4, -3, -2]);
1077     assert_eq!((0..5).rev().collect::<Vec<_>>(), [4, 3, 2, 1, 0]);
1078     assert_eq!((200..-5).count(), 0);
1079     assert_eq!((200..-5).rev().count(), 0);
1080     assert_eq!((200..200).count(), 0);
1081     assert_eq!((200..200).rev().count(), 0);
1082
1083     assert_eq!((0..100).size_hint(), (100, Some(100)));
1084     // this test is only meaningful when sizeof usize < sizeof u64
1085     assert_eq!((usize::MAX - 1..usize::MAX).size_hint(), (1, Some(1)));
1086     assert_eq!((-10..-1).size_hint(), (9, Some(9)));
1087     assert_eq!((-1..-10).size_hint(), (0, Some(0)));
1088
1089     assert_eq!((-70..58).size_hint(), (128, Some(128)));
1090     assert_eq!((-128..127).size_hint(), (255, Some(255)));
1091     assert_eq!((-2..isize::MAX).size_hint(),
1092                (isize::MAX as usize + 2, Some(isize::MAX as usize + 2)));
1093 }
1094
1095 #[test]
1096 fn test_range_inclusive_exhaustion() {
1097     let mut r = 10...10;
1098     assert_eq!(r.next(), Some(10));
1099     assert_eq!(r, 1...0);
1100
1101     let mut r = 10...10;
1102     assert_eq!(r.next_back(), Some(10));
1103     assert_eq!(r, 1...0);
1104
1105     let mut r = 10...12;
1106     assert_eq!(r.nth(2), Some(12));
1107     assert_eq!(r, 1...0);
1108
1109     let mut r = 10...12;
1110     assert_eq!(r.nth(5), None);
1111     assert_eq!(r, 1...0);
1112
1113 }
1114
1115 #[test]
1116 fn test_range_nth() {
1117     assert_eq!((10..15).nth(0), Some(10));
1118     assert_eq!((10..15).nth(1), Some(11));
1119     assert_eq!((10..15).nth(4), Some(14));
1120     assert_eq!((10..15).nth(5), None);
1121
1122     let mut r = 10..20;
1123     assert_eq!(r.nth(2), Some(12));
1124     assert_eq!(r, 13..20);
1125     assert_eq!(r.nth(2), Some(15));
1126     assert_eq!(r, 16..20);
1127     assert_eq!(r.nth(10), None);
1128     assert_eq!(r, 20..20);
1129 }
1130
1131 #[test]
1132 fn test_range_from_nth() {
1133     assert_eq!((10..).nth(0), Some(10));
1134     assert_eq!((10..).nth(1), Some(11));
1135     assert_eq!((10..).nth(4), Some(14));
1136
1137     let mut r = 10..;
1138     assert_eq!(r.nth(2), Some(12));
1139     assert_eq!(r, 13..);
1140     assert_eq!(r.nth(2), Some(15));
1141     assert_eq!(r, 16..);
1142     assert_eq!(r.nth(10), Some(26));
1143     assert_eq!(r, 27..);
1144 }
1145
1146 #[test]
1147 fn test_range_inclusive_nth() {
1148     assert_eq!((10...15).nth(0), Some(10));
1149     assert_eq!((10...15).nth(1), Some(11));
1150     assert_eq!((10...15).nth(5), Some(15));
1151     assert_eq!((10...15).nth(6), None);
1152
1153     let mut r = 10_u8...20;
1154     assert_eq!(r.nth(2), Some(12));
1155     assert_eq!(r, 13...20);
1156     assert_eq!(r.nth(2), Some(15));
1157     assert_eq!(r, 16...20);
1158     assert_eq!(r.is_empty(), false);
1159     assert_eq!(r.nth(10), None);
1160     assert_eq!(r.is_empty(), true);
1161     assert_eq!(r, 1...0);  // We may not want to document/promise this detail
1162 }
1163
1164 #[test]
1165 fn test_range_step() {
1166     #![allow(deprecated)]
1167
1168     assert_eq!((0..20).step_by(5).collect::<Vec<isize>>(), [0, 5, 10, 15]);
1169     assert_eq!((1..21).rev().step_by(5).collect::<Vec<isize>>(), [20, 15, 10, 5]);
1170     assert_eq!((1..21).rev().step_by(6).collect::<Vec<isize>>(), [20, 14, 8, 2]);
1171     assert_eq!((200..255).step_by(50).collect::<Vec<u8>>(), [200, 250]);
1172     assert_eq!((200..-5).step_by(1).collect::<Vec<isize>>(), []);
1173     assert_eq!((200..200).step_by(1).collect::<Vec<isize>>(), []);
1174
1175     assert_eq!((0..20).step_by(1).size_hint(), (20, Some(20)));
1176     assert_eq!((0..20).step_by(21).size_hint(), (1, Some(1)));
1177     assert_eq!((0..20).step_by(5).size_hint(), (4, Some(4)));
1178     assert_eq!((1..21).rev().step_by(5).size_hint(), (4, Some(4)));
1179     assert_eq!((1..21).rev().step_by(6).size_hint(), (4, Some(4)));
1180     assert_eq!((20..-5).step_by(1).size_hint(), (0, Some(0)));
1181     assert_eq!((20..20).step_by(1).size_hint(), (0, Some(0)));
1182     assert_eq!((i8::MIN..i8::MAX).step_by(-(i8::MIN as i32) as usize).size_hint(), (2, Some(2)));
1183     assert_eq!((i16::MIN..i16::MAX).step_by(i16::MAX as usize).size_hint(), (3, Some(3)));
1184     assert_eq!((isize::MIN..isize::MAX).step_by(1).size_hint(), (usize::MAX, Some(usize::MAX)));
1185 }
1186
1187 #[test]
1188 fn test_repeat() {
1189     let mut it = repeat(42);
1190     assert_eq!(it.next(), Some(42));
1191     assert_eq!(it.next(), Some(42));
1192     assert_eq!(it.next(), Some(42));
1193 }
1194
1195 #[test]
1196 fn test_fuse() {
1197     let mut it = 0..3;
1198     assert_eq!(it.len(), 3);
1199     assert_eq!(it.next(), Some(0));
1200     assert_eq!(it.len(), 2);
1201     assert_eq!(it.next(), Some(1));
1202     assert_eq!(it.len(), 1);
1203     assert_eq!(it.next(), Some(2));
1204     assert_eq!(it.len(), 0);
1205     assert_eq!(it.next(), None);
1206     assert_eq!(it.len(), 0);
1207     assert_eq!(it.next(), None);
1208     assert_eq!(it.len(), 0);
1209     assert_eq!(it.next(), None);
1210     assert_eq!(it.len(), 0);
1211 }
1212
1213 #[test]
1214 fn test_fuse_nth() {
1215     let xs = [0, 1, 2];
1216     let mut it = xs.iter();
1217
1218     assert_eq!(it.len(), 3);
1219     assert_eq!(it.nth(2), Some(&2));
1220     assert_eq!(it.len(), 0);
1221     assert_eq!(it.nth(2), None);
1222     assert_eq!(it.len(), 0);
1223 }
1224
1225 #[test]
1226 fn test_fuse_last() {
1227     let xs = [0, 1, 2];
1228     let it = xs.iter();
1229
1230     assert_eq!(it.len(), 3);
1231     assert_eq!(it.last(), Some(&2));
1232 }
1233
1234 #[test]
1235 fn test_fuse_count() {
1236     let xs = [0, 1, 2];
1237     let it = xs.iter();
1238
1239     assert_eq!(it.len(), 3);
1240     assert_eq!(it.count(), 3);
1241     // Can't check len now because count consumes.
1242 }
1243
1244 #[test]
1245 fn test_once() {
1246     let mut it = once(42);
1247     assert_eq!(it.next(), Some(42));
1248     assert_eq!(it.next(), None);
1249 }
1250
1251 #[test]
1252 fn test_empty() {
1253     let mut it = empty::<i32>();
1254     assert_eq!(it.next(), None);
1255 }
1256
1257 #[test]
1258 fn test_chain_fold() {
1259     let xs = [1, 2, 3];
1260     let ys = [1, 2, 0];
1261
1262     let mut iter = xs.iter().chain(&ys);
1263     iter.next();
1264     let mut result = Vec::new();
1265     iter.fold((), |(), &elt| result.push(elt));
1266     assert_eq!(&[2, 3, 1, 2, 0], &result[..]);
1267 }
1268
1269 #[test]
1270 fn test_step_replace_unsigned() {
1271     let mut x = 4u32;
1272     let y = x.replace_zero();
1273     assert_eq!(x, 0);
1274     assert_eq!(y, 4);
1275
1276     x = 5;
1277     let y = x.replace_one();
1278     assert_eq!(x, 1);
1279     assert_eq!(y, 5);
1280 }
1281
1282 #[test]
1283 fn test_step_replace_signed() {
1284     let mut x = 4i32;
1285     let y = x.replace_zero();
1286     assert_eq!(x, 0);
1287     assert_eq!(y, 4);
1288
1289     x = 5;
1290     let y = x.replace_one();
1291     assert_eq!(x, 1);
1292     assert_eq!(y, 5);
1293 }
1294
1295 #[test]
1296 fn test_step_replace_no_between() {
1297     let mut x = 4u128;
1298     let y = x.replace_zero();
1299     assert_eq!(x, 0);
1300     assert_eq!(y, 4);
1301
1302     x = 5;
1303     let y = x.replace_one();
1304     assert_eq!(x, 1);
1305     assert_eq!(y, 5);
1306 }