]> git.lizzy.rs Git - rust.git/blob - src/libcore/tests/iter.rs
rustdoc: pretty-print Unevaluated expressions in types.
[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]
658 fn test_inspect() {
659     let xs = [1, 2, 3, 4];
660     let mut n = 0;
661
662     let ys = xs.iter()
663                .cloned()
664                .inspect(|_| n += 1)
665                .collect::<Vec<usize>>();
666
667     assert_eq!(n, xs.len());
668     assert_eq!(&xs[..], &ys[..]);
669 }
670
671 #[test]
672 fn test_cycle() {
673     let cycle_len = 3;
674     let it = (0..).step_by(1).take(cycle_len).cycle();
675     assert_eq!(it.size_hint(), (usize::MAX, None));
676     for (i, x) in it.take(100).enumerate() {
677         assert_eq!(i % cycle_len, x);
678     }
679
680     let mut it = (0..).step_by(1).take(0).cycle();
681     assert_eq!(it.size_hint(), (0, Some(0)));
682     assert_eq!(it.next(), None);
683 }
684
685 #[test]
686 fn test_iterator_nth() {
687     let v: &[_] = &[0, 1, 2, 3, 4];
688     for i in 0..v.len() {
689         assert_eq!(v.iter().nth(i).unwrap(), &v[i]);
690     }
691     assert_eq!(v.iter().nth(v.len()), None);
692 }
693
694 #[test]
695 fn test_iterator_last() {
696     let v: &[_] = &[0, 1, 2, 3, 4];
697     assert_eq!(v.iter().last().unwrap(), &4);
698     assert_eq!(v[..1].iter().last().unwrap(), &0);
699 }
700
701 #[test]
702 fn test_iterator_len() {
703     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
704     assert_eq!(v[..4].iter().count(), 4);
705     assert_eq!(v[..10].iter().count(), 10);
706     assert_eq!(v[..0].iter().count(), 0);
707 }
708
709 #[test]
710 fn test_iterator_sum() {
711     let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
712     assert_eq!(v[..4].iter().cloned().sum::<i32>(), 6);
713     assert_eq!(v.iter().cloned().sum::<i32>(), 55);
714     assert_eq!(v[..0].iter().cloned().sum::<i32>(), 0);
715 }
716
717 #[test]
718 fn test_iterator_sum_result() {
719     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
720     assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Ok(10));
721     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
722     assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Err(()));
723 }
724
725 #[test]
726 fn test_iterator_product() {
727     let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
728     assert_eq!(v[..4].iter().cloned().product::<i32>(), 0);
729     assert_eq!(v[1..5].iter().cloned().product::<i32>(), 24);
730     assert_eq!(v[..0].iter().cloned().product::<i32>(), 1);
731 }
732
733 #[test]
734 fn test_iterator_product_result() {
735     let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)];
736     assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Ok(24));
737     let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)];
738     assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Err(()));
739 }
740
741 #[test]
742 fn test_iterator_max() {
743     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
744     assert_eq!(v[..4].iter().cloned().max(), Some(3));
745     assert_eq!(v.iter().cloned().max(), Some(10));
746     assert_eq!(v[..0].iter().cloned().max(), None);
747 }
748
749 #[test]
750 fn test_iterator_min() {
751     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
752     assert_eq!(v[..4].iter().cloned().min(), Some(0));
753     assert_eq!(v.iter().cloned().min(), Some(0));
754     assert_eq!(v[..0].iter().cloned().min(), None);
755 }
756
757 #[test]
758 fn test_iterator_size_hint() {
759     let c = (0..).step_by(1);
760     let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
761     let v2 = &[10, 11, 12];
762     let vi = v.iter();
763
764     assert_eq!((0..).size_hint(), (usize::MAX, None));
765     assert_eq!(c.size_hint(), (usize::MAX, None));
766     assert_eq!(vi.clone().size_hint(), (10, Some(10)));
767
768     assert_eq!(c.clone().take(5).size_hint(), (5, Some(5)));
769     assert_eq!(c.clone().skip(5).size_hint().1, None);
770     assert_eq!(c.clone().take_while(|_| false).size_hint(), (0, None));
771     assert_eq!(c.clone().skip_while(|_| false).size_hint(), (0, None));
772     assert_eq!(c.clone().enumerate().size_hint(), (usize::MAX, None));
773     assert_eq!(c.clone().chain(vi.clone().cloned()).size_hint(), (usize::MAX, None));
774     assert_eq!(c.clone().zip(vi.clone()).size_hint(), (10, Some(10)));
775     assert_eq!(c.clone().scan(0, |_,_| Some(0)).size_hint(), (0, None));
776     assert_eq!(c.clone().filter(|_| false).size_hint(), (0, None));
777     assert_eq!(c.clone().map(|_| 0).size_hint(), (usize::MAX, None));
778     assert_eq!(c.filter_map(|_| Some(0)).size_hint(), (0, None));
779
780     assert_eq!(vi.clone().take(5).size_hint(), (5, Some(5)));
781     assert_eq!(vi.clone().take(12).size_hint(), (10, Some(10)));
782     assert_eq!(vi.clone().skip(3).size_hint(), (7, Some(7)));
783     assert_eq!(vi.clone().skip(12).size_hint(), (0, Some(0)));
784     assert_eq!(vi.clone().take_while(|_| false).size_hint(), (0, Some(10)));
785     assert_eq!(vi.clone().skip_while(|_| false).size_hint(), (0, Some(10)));
786     assert_eq!(vi.clone().enumerate().size_hint(), (10, Some(10)));
787     assert_eq!(vi.clone().chain(v2).size_hint(), (13, Some(13)));
788     assert_eq!(vi.clone().zip(v2).size_hint(), (3, Some(3)));
789     assert_eq!(vi.clone().scan(0, |_,_| Some(0)).size_hint(), (0, Some(10)));
790     assert_eq!(vi.clone().filter(|_| false).size_hint(), (0, Some(10)));
791     assert_eq!(vi.clone().map(|&i| i+1).size_hint(), (10, Some(10)));
792     assert_eq!(vi.filter_map(|_| Some(0)).size_hint(), (0, Some(10)));
793 }
794
795 #[test]
796 fn test_collect() {
797     let a = vec![1, 2, 3, 4, 5];
798     let b: Vec<isize> = a.iter().cloned().collect();
799     assert!(a == b);
800 }
801
802 #[test]
803 fn test_all() {
804     let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]);
805     assert!(v.iter().all(|&x| x < 10));
806     assert!(!v.iter().all(|&x| x % 2 == 0));
807     assert!(!v.iter().all(|&x| x > 100));
808     assert!(v[..0].iter().all(|_| panic!()));
809 }
810
811 #[test]
812 fn test_any() {
813     let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]);
814     assert!(v.iter().any(|&x| x < 10));
815     assert!(v.iter().any(|&x| x % 2 == 0));
816     assert!(!v.iter().any(|&x| x > 100));
817     assert!(!v[..0].iter().any(|_| panic!()));
818 }
819
820 #[test]
821 fn test_find() {
822     let v: &[isize] = &[1, 3, 9, 27, 103, 14, 11];
823     assert_eq!(*v.iter().find(|&&x| x & 1 == 0).unwrap(), 14);
824     assert_eq!(*v.iter().find(|&&x| x % 3 == 0).unwrap(), 3);
825     assert!(v.iter().find(|&&x| x % 12 == 0).is_none());
826 }
827
828 #[test]
829 fn test_position() {
830     let v = &[1, 3, 9, 27, 103, 14, 11];
831     assert_eq!(v.iter().position(|x| *x & 1 == 0).unwrap(), 5);
832     assert_eq!(v.iter().position(|x| *x % 3 == 0).unwrap(), 1);
833     assert!(v.iter().position(|x| *x % 12 == 0).is_none());
834 }
835
836 #[test]
837 fn test_count() {
838     let xs = &[1, 2, 2, 1, 5, 9, 0, 2];
839     assert_eq!(xs.iter().filter(|x| **x == 2).count(), 3);
840     assert_eq!(xs.iter().filter(|x| **x == 5).count(), 1);
841     assert_eq!(xs.iter().filter(|x| **x == 95).count(), 0);
842 }
843
844 #[test]
845 fn test_max_by_key() {
846     let xs: &[isize] = &[-3, 0, 1, 5, -10];
847     assert_eq!(*xs.iter().max_by_key(|x| x.abs()).unwrap(), -10);
848 }
849
850 #[test]
851 fn test_max_by() {
852     let xs: &[isize] = &[-3, 0, 1, 5, -10];
853     assert_eq!(*xs.iter().max_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), -10);
854 }
855
856 #[test]
857 fn test_min_by_key() {
858     let xs: &[isize] = &[-3, 0, 1, 5, -10];
859     assert_eq!(*xs.iter().min_by_key(|x| x.abs()).unwrap(), 0);
860 }
861
862 #[test]
863 fn test_min_by() {
864     let xs: &[isize] = &[-3, 0, 1, 5, -10];
865     assert_eq!(*xs.iter().min_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), 0);
866 }
867
868 #[test]
869 fn test_by_ref() {
870     let mut xs = 0..10;
871     // sum the first five values
872     let partial_sum = xs.by_ref().take(5).fold(0, |a, b| a + b);
873     assert_eq!(partial_sum, 10);
874     assert_eq!(xs.next(), Some(5));
875 }
876
877 #[test]
878 fn test_rev() {
879     let xs = [2, 4, 6, 8, 10, 12, 14, 16];
880     let mut it = xs.iter();
881     it.next();
882     it.next();
883     assert!(it.rev().cloned().collect::<Vec<isize>>() ==
884             vec![16, 14, 12, 10, 8, 6]);
885 }
886
887 #[test]
888 fn test_cloned() {
889     let xs = [2, 4, 6, 8];
890
891     let mut it = xs.iter().cloned();
892     assert_eq!(it.len(), 4);
893     assert_eq!(it.next(), Some(2));
894     assert_eq!(it.len(), 3);
895     assert_eq!(it.next(), Some(4));
896     assert_eq!(it.len(), 2);
897     assert_eq!(it.next_back(), Some(8));
898     assert_eq!(it.len(), 1);
899     assert_eq!(it.next_back(), Some(6));
900     assert_eq!(it.len(), 0);
901     assert_eq!(it.next_back(), None);
902 }
903
904 #[test]
905 fn test_double_ended_map() {
906     let xs = [1, 2, 3, 4, 5, 6];
907     let mut it = xs.iter().map(|&x| x * -1);
908     assert_eq!(it.next(), Some(-1));
909     assert_eq!(it.next(), Some(-2));
910     assert_eq!(it.next_back(), Some(-6));
911     assert_eq!(it.next_back(), Some(-5));
912     assert_eq!(it.next(), Some(-3));
913     assert_eq!(it.next_back(), Some(-4));
914     assert_eq!(it.next(), None);
915 }
916
917 #[test]
918 fn test_double_ended_enumerate() {
919     let xs = [1, 2, 3, 4, 5, 6];
920     let mut it = xs.iter().cloned().enumerate();
921     assert_eq!(it.next(), Some((0, 1)));
922     assert_eq!(it.next(), Some((1, 2)));
923     assert_eq!(it.next_back(), Some((5, 6)));
924     assert_eq!(it.next_back(), Some((4, 5)));
925     assert_eq!(it.next_back(), Some((3, 4)));
926     assert_eq!(it.next_back(), Some((2, 3)));
927     assert_eq!(it.next(), None);
928 }
929
930 #[test]
931 fn test_double_ended_zip() {
932     let xs = [1, 2, 3, 4, 5, 6];
933     let ys = [1, 2, 3, 7];
934     let a = xs.iter().cloned();
935     let b = ys.iter().cloned();
936     let mut it = a.zip(b);
937     assert_eq!(it.next(), Some((1, 1)));
938     assert_eq!(it.next(), Some((2, 2)));
939     assert_eq!(it.next_back(), Some((4, 7)));
940     assert_eq!(it.next_back(), Some((3, 3)));
941     assert_eq!(it.next(), None);
942 }
943
944 #[test]
945 fn test_double_ended_filter() {
946     let xs = [1, 2, 3, 4, 5, 6];
947     let mut it = xs.iter().filter(|&x| *x & 1 == 0);
948     assert_eq!(it.next_back().unwrap(), &6);
949     assert_eq!(it.next_back().unwrap(), &4);
950     assert_eq!(it.next().unwrap(), &2);
951     assert_eq!(it.next_back(), None);
952 }
953
954 #[test]
955 fn test_double_ended_filter_map() {
956     let xs = [1, 2, 3, 4, 5, 6];
957     let mut it = xs.iter().filter_map(|&x| if x & 1 == 0 { Some(x * 2) } else { None });
958     assert_eq!(it.next_back().unwrap(), 12);
959     assert_eq!(it.next_back().unwrap(), 8);
960     assert_eq!(it.next().unwrap(), 4);
961     assert_eq!(it.next_back(), None);
962 }
963
964 #[test]
965 fn test_double_ended_chain() {
966     let xs = [1, 2, 3, 4, 5];
967     let ys = [7, 9, 11];
968     let mut it = xs.iter().chain(&ys).rev();
969     assert_eq!(it.next().unwrap(), &11);
970     assert_eq!(it.next().unwrap(), &9);
971     assert_eq!(it.next_back().unwrap(), &1);
972     assert_eq!(it.next_back().unwrap(), &2);
973     assert_eq!(it.next_back().unwrap(), &3);
974     assert_eq!(it.next_back().unwrap(), &4);
975     assert_eq!(it.next_back().unwrap(), &5);
976     assert_eq!(it.next_back().unwrap(), &7);
977     assert_eq!(it.next_back(), None);
978
979
980     // test that .chain() is well behaved with an unfused iterator
981     struct CrazyIterator(bool);
982     impl CrazyIterator { fn new() -> CrazyIterator { CrazyIterator(false) } }
983     impl Iterator for CrazyIterator {
984         type Item = i32;
985         fn next(&mut self) -> Option<i32> {
986             if self.0 { Some(99) } else { self.0 = true; None }
987         }
988     }
989
990     impl DoubleEndedIterator for CrazyIterator {
991         fn next_back(&mut self) -> Option<i32> {
992             self.next()
993         }
994     }
995
996     assert_eq!(CrazyIterator::new().chain(0..10).rev().last(), Some(0));
997     assert!((0..10).chain(CrazyIterator::new()).rev().any(|i| i == 0));
998 }
999
1000 #[test]
1001 fn test_rposition() {
1002     fn f(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'b' }
1003     fn g(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'd' }
1004     let v = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'b')];
1005
1006     assert_eq!(v.iter().rposition(f), Some(3));
1007     assert!(v.iter().rposition(g).is_none());
1008 }
1009
1010 #[test]
1011 #[should_panic]
1012 fn test_rposition_panic() {
1013     let v: [(Box<_>, Box<_>); 4] =
1014         [(box 0, box 0), (box 0, box 0),
1015          (box 0, box 0), (box 0, box 0)];
1016     let mut i = 0;
1017     v.iter().rposition(|_elt| {
1018         if i == 2 {
1019             panic!()
1020         }
1021         i += 1;
1022         false
1023     });
1024 }
1025
1026
1027 #[test]
1028 fn test_double_ended_flat_map() {
1029     let u = [0,1];
1030     let v = [5,6,7,8];
1031     let mut it = u.iter().flat_map(|x| &v[*x..v.len()]);
1032     assert_eq!(it.next_back().unwrap(), &8);
1033     assert_eq!(it.next().unwrap(),      &5);
1034     assert_eq!(it.next_back().unwrap(), &7);
1035     assert_eq!(it.next_back().unwrap(), &6);
1036     assert_eq!(it.next_back().unwrap(), &8);
1037     assert_eq!(it.next().unwrap(),      &6);
1038     assert_eq!(it.next_back().unwrap(), &7);
1039     assert_eq!(it.next_back(), None);
1040     assert_eq!(it.next(),      None);
1041     assert_eq!(it.next_back(), None);
1042 }
1043
1044 #[test]
1045 fn test_double_ended_range() {
1046     assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
1047     for _ in (10..0).rev() {
1048         panic!("unreachable");
1049     }
1050
1051     assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]);
1052     for _ in (10..0).rev() {
1053         panic!("unreachable");
1054     }
1055 }
1056
1057 #[test]
1058 fn test_range() {
1059     assert_eq!((0..5).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
1060     assert_eq!((-10..-1).collect::<Vec<_>>(), [-10, -9, -8, -7, -6, -5, -4, -3, -2]);
1061     assert_eq!((0..5).rev().collect::<Vec<_>>(), [4, 3, 2, 1, 0]);
1062     assert_eq!((200..-5).count(), 0);
1063     assert_eq!((200..-5).rev().count(), 0);
1064     assert_eq!((200..200).count(), 0);
1065     assert_eq!((200..200).rev().count(), 0);
1066
1067     assert_eq!((0..100).size_hint(), (100, Some(100)));
1068     // this test is only meaningful when sizeof usize < sizeof u64
1069     assert_eq!((usize::MAX - 1..usize::MAX).size_hint(), (1, Some(1)));
1070     assert_eq!((-10..-1).size_hint(), (9, Some(9)));
1071     assert_eq!((-1..-10).size_hint(), (0, Some(0)));
1072
1073     assert_eq!((-70..58).size_hint(), (128, Some(128)));
1074     assert_eq!((-128..127).size_hint(), (255, Some(255)));
1075     assert_eq!((-2..isize::MAX).size_hint(),
1076                (isize::MAX as usize + 2, Some(isize::MAX as usize + 2)));
1077 }
1078
1079 #[test]
1080 fn test_range_inclusive_exhaustion() {
1081     let mut r = 10...10;
1082     assert_eq!(r.next(), Some(10));
1083     assert_eq!(r, 1...0);
1084
1085     let mut r = 10...10;
1086     assert_eq!(r.next_back(), Some(10));
1087     assert_eq!(r, 1...0);
1088
1089     let mut r = 10...12;
1090     assert_eq!(r.nth(2), Some(12));
1091     assert_eq!(r, 1...0);
1092
1093     let mut r = 10...12;
1094     assert_eq!(r.nth(5), None);
1095     assert_eq!(r, 1...0);
1096
1097 }
1098
1099 #[test]
1100 fn test_range_nth() {
1101     assert_eq!((10..15).nth(0), Some(10));
1102     assert_eq!((10..15).nth(1), Some(11));
1103     assert_eq!((10..15).nth(4), Some(14));
1104     assert_eq!((10..15).nth(5), None);
1105
1106     let mut r = 10..20;
1107     assert_eq!(r.nth(2), Some(12));
1108     assert_eq!(r, 13..20);
1109     assert_eq!(r.nth(2), Some(15));
1110     assert_eq!(r, 16..20);
1111     assert_eq!(r.nth(10), None);
1112     assert_eq!(r, 20..20);
1113 }
1114
1115 #[test]
1116 fn test_range_from_nth() {
1117     assert_eq!((10..).nth(0), Some(10));
1118     assert_eq!((10..).nth(1), Some(11));
1119     assert_eq!((10..).nth(4), Some(14));
1120
1121     let mut r = 10..;
1122     assert_eq!(r.nth(2), Some(12));
1123     assert_eq!(r, 13..);
1124     assert_eq!(r.nth(2), Some(15));
1125     assert_eq!(r, 16..);
1126     assert_eq!(r.nth(10), Some(26));
1127     assert_eq!(r, 27..);
1128 }
1129
1130 #[test]
1131 fn test_range_inclusive_nth() {
1132     assert_eq!((10...15).nth(0), Some(10));
1133     assert_eq!((10...15).nth(1), Some(11));
1134     assert_eq!((10...15).nth(5), Some(15));
1135     assert_eq!((10...15).nth(6), None);
1136
1137     let mut r = 10_u8...20;
1138     assert_eq!(r.nth(2), Some(12));
1139     assert_eq!(r, 13...20);
1140     assert_eq!(r.nth(2), Some(15));
1141     assert_eq!(r, 16...20);
1142     assert_eq!(r.is_empty(), false);
1143     assert_eq!(r.nth(10), None);
1144     assert_eq!(r.is_empty(), true);
1145     assert_eq!(r, 1...0);  // We may not want to document/promise this detail
1146 }
1147
1148 #[test]
1149 fn test_range_step() {
1150     #![allow(deprecated)]
1151
1152     assert_eq!((0..20).step_by(5).collect::<Vec<isize>>(), [0, 5, 10, 15]);
1153     assert_eq!((1..21).rev().step_by(5).collect::<Vec<isize>>(), [20, 15, 10, 5]);
1154     assert_eq!((1..21).rev().step_by(6).collect::<Vec<isize>>(), [20, 14, 8, 2]);
1155     assert_eq!((200..255).step_by(50).collect::<Vec<u8>>(), [200, 250]);
1156     assert_eq!((200..-5).step_by(1).collect::<Vec<isize>>(), []);
1157     assert_eq!((200..200).step_by(1).collect::<Vec<isize>>(), []);
1158
1159     assert_eq!((0..20).step_by(1).size_hint(), (20, Some(20)));
1160     assert_eq!((0..20).step_by(21).size_hint(), (1, Some(1)));
1161     assert_eq!((0..20).step_by(5).size_hint(), (4, Some(4)));
1162     assert_eq!((1..21).rev().step_by(5).size_hint(), (4, Some(4)));
1163     assert_eq!((1..21).rev().step_by(6).size_hint(), (4, Some(4)));
1164     assert_eq!((20..-5).step_by(1).size_hint(), (0, Some(0)));
1165     assert_eq!((20..20).step_by(1).size_hint(), (0, Some(0)));
1166     assert_eq!((i8::MIN..i8::MAX).step_by(-(i8::MIN as i32) as usize).size_hint(), (2, Some(2)));
1167     assert_eq!((i16::MIN..i16::MAX).step_by(i16::MAX as usize).size_hint(), (3, Some(3)));
1168     assert_eq!((isize::MIN..isize::MAX).step_by(1).size_hint(), (usize::MAX, Some(usize::MAX)));
1169 }
1170
1171 #[test]
1172 fn test_repeat() {
1173     let mut it = repeat(42);
1174     assert_eq!(it.next(), Some(42));
1175     assert_eq!(it.next(), Some(42));
1176     assert_eq!(it.next(), Some(42));
1177 }
1178
1179 #[test]
1180 fn test_fuse() {
1181     let mut it = 0..3;
1182     assert_eq!(it.len(), 3);
1183     assert_eq!(it.next(), Some(0));
1184     assert_eq!(it.len(), 2);
1185     assert_eq!(it.next(), Some(1));
1186     assert_eq!(it.len(), 1);
1187     assert_eq!(it.next(), Some(2));
1188     assert_eq!(it.len(), 0);
1189     assert_eq!(it.next(), None);
1190     assert_eq!(it.len(), 0);
1191     assert_eq!(it.next(), None);
1192     assert_eq!(it.len(), 0);
1193     assert_eq!(it.next(), None);
1194     assert_eq!(it.len(), 0);
1195 }
1196
1197 #[test]
1198 fn test_fuse_nth() {
1199     let xs = [0, 1, 2];
1200     let mut it = xs.iter();
1201
1202     assert_eq!(it.len(), 3);
1203     assert_eq!(it.nth(2), Some(&2));
1204     assert_eq!(it.len(), 0);
1205     assert_eq!(it.nth(2), None);
1206     assert_eq!(it.len(), 0);
1207 }
1208
1209 #[test]
1210 fn test_fuse_last() {
1211     let xs = [0, 1, 2];
1212     let it = xs.iter();
1213
1214     assert_eq!(it.len(), 3);
1215     assert_eq!(it.last(), Some(&2));
1216 }
1217
1218 #[test]
1219 fn test_fuse_count() {
1220     let xs = [0, 1, 2];
1221     let it = xs.iter();
1222
1223     assert_eq!(it.len(), 3);
1224     assert_eq!(it.count(), 3);
1225     // Can't check len now because count consumes.
1226 }
1227
1228 #[test]
1229 fn test_once() {
1230     let mut it = once(42);
1231     assert_eq!(it.next(), Some(42));
1232     assert_eq!(it.next(), None);
1233 }
1234
1235 #[test]
1236 fn test_empty() {
1237     let mut it = empty::<i32>();
1238     assert_eq!(it.next(), None);
1239 }
1240
1241 #[test]
1242 fn test_chain_fold() {
1243     let xs = [1, 2, 3];
1244     let ys = [1, 2, 0];
1245
1246     let mut iter = xs.iter().chain(&ys);
1247     iter.next();
1248     let mut result = Vec::new();
1249     iter.fold((), |(), &elt| result.push(elt));
1250     assert_eq!(&[2, 3, 1, 2, 0], &result[..]);
1251 }
1252
1253 #[test]
1254 fn test_step_replace_unsigned() {
1255     let mut x = 4u32;
1256     let y = x.replace_zero();
1257     assert_eq!(x, 0);
1258     assert_eq!(y, 4);
1259
1260     x = 5;
1261     let y = x.replace_one();
1262     assert_eq!(x, 1);
1263     assert_eq!(y, 5);
1264 }
1265
1266 #[test]
1267 fn test_step_replace_signed() {
1268     let mut x = 4i32;
1269     let y = x.replace_zero();
1270     assert_eq!(x, 0);
1271     assert_eq!(y, 4);
1272
1273     x = 5;
1274     let y = x.replace_one();
1275     assert_eq!(x, 1);
1276     assert_eq!(y, 5);
1277 }
1278
1279 #[test]
1280 fn test_step_replace_no_between() {
1281     let mut x = 4u128;
1282     let y = x.replace_zero();
1283     assert_eq!(x, 0);
1284     assert_eq!(y, 4);
1285
1286     x = 5;
1287     let y = x.replace_one();
1288     assert_eq!(x, 1);
1289     assert_eq!(y, 5);
1290 }