]> git.lizzy.rs Git - rust.git/blob - src/libcoretest/iter.rs
Merge pull request #20510 from tshepang/patch-6
[rust.git] / src / libcoretest / 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::iter::order::*;
13 use core::iter::MinMaxResult::*;
14 use core::num::SignedInt;
15 use core::uint;
16 use core::cmp;
17 use core::ops::Slice;
18
19 use test::Bencher;
20
21 #[test]
22 fn test_lt() {
23     let empty: [int; 0] = [];
24     let xs = [1i,2,3];
25     let ys = [1i,2,0];
26
27     assert!(!lt(xs.iter(), ys.iter()));
28     assert!(!le(xs.iter(), ys.iter()));
29     assert!( gt(xs.iter(), ys.iter()));
30     assert!( ge(xs.iter(), ys.iter()));
31
32     assert!( lt(ys.iter(), xs.iter()));
33     assert!( le(ys.iter(), xs.iter()));
34     assert!(!gt(ys.iter(), xs.iter()));
35     assert!(!ge(ys.iter(), xs.iter()));
36
37     assert!( lt(empty.iter(), xs.iter()));
38     assert!( le(empty.iter(), xs.iter()));
39     assert!(!gt(empty.iter(), xs.iter()));
40     assert!(!ge(empty.iter(), xs.iter()));
41
42     // Sequence with NaN
43     let u = [1.0f64, 2.0];
44     let v = [0.0f64/0.0, 3.0];
45
46     assert!(!lt(u.iter(), v.iter()));
47     assert!(!le(u.iter(), v.iter()));
48     assert!(!gt(u.iter(), v.iter()));
49     assert!(!ge(u.iter(), v.iter()));
50
51     let a = [0.0f64/0.0];
52     let b = [1.0f64];
53     let c = [2.0f64];
54
55     assert!(lt(a.iter(), b.iter()) == (a[0] <  b[0]));
56     assert!(le(a.iter(), b.iter()) == (a[0] <= b[0]));
57     assert!(gt(a.iter(), b.iter()) == (a[0] >  b[0]));
58     assert!(ge(a.iter(), b.iter()) == (a[0] >= b[0]));
59
60     assert!(lt(c.iter(), b.iter()) == (c[0] <  b[0]));
61     assert!(le(c.iter(), b.iter()) == (c[0] <= b[0]));
62     assert!(gt(c.iter(), b.iter()) == (c[0] >  b[0]));
63     assert!(ge(c.iter(), b.iter()) == (c[0] >= b[0]));
64 }
65
66 #[test]
67 fn test_multi_iter() {
68     let xs = [1i,2,3,4];
69     let ys = [4i,3,2,1];
70     assert!(eq(xs.iter(), ys.iter().rev()));
71     assert!(lt(xs.iter(), xs.iter().skip(2)));
72 }
73
74 #[test]
75 fn test_counter_from_iter() {
76     let it = count(0i, 5).take(10);
77     let xs: Vec<int> = FromIterator::from_iter(it);
78     assert!(xs == vec![0, 5, 10, 15, 20, 25, 30, 35, 40, 45]);
79 }
80
81 #[test]
82 fn test_iterator_chain() {
83     let xs = [0u, 1, 2, 3, 4, 5];
84     let ys = [30u, 40, 50, 60];
85     let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
86     let mut it = xs.iter().chain(ys.iter());
87     let mut i = 0;
88     for &x in it {
89         assert_eq!(x, expected[i]);
90         i += 1;
91     }
92     assert_eq!(i, expected.len());
93
94     let ys = count(30u, 10).take(4);
95     let mut it = xs.iter().map(|&x| x).chain(ys);
96     let mut i = 0;
97     for x in it {
98         assert_eq!(x, expected[i]);
99         i += 1;
100     }
101     assert_eq!(i, expected.len());
102 }
103
104 #[test]
105 fn test_filter_map() {
106     let it = count(0u, 1u).take(10)
107         .filter_map(|x| if x % 2 == 0 { Some(x*x) } else { None });
108     assert!(it.collect::<Vec<uint>>() == vec![0*0, 2*2, 4*4, 6*6, 8*8]);
109 }
110
111 #[test]
112 fn test_iterator_enumerate() {
113     let xs = [0u, 1, 2, 3, 4, 5];
114     let mut it = xs.iter().enumerate();
115     for (i, &x) in it {
116         assert_eq!(i, x);
117     }
118 }
119
120 #[test]
121 fn test_iterator_peekable() {
122     let xs = vec![0u, 1, 2, 3, 4, 5];
123     let mut it = xs.iter().map(|&x|x).peekable();
124     assert_eq!(it.peek().unwrap(), &0);
125     assert_eq!(it.next().unwrap(), 0);
126     assert_eq!(it.next().unwrap(), 1);
127     assert_eq!(it.next().unwrap(), 2);
128     assert_eq!(it.peek().unwrap(), &3);
129     assert_eq!(it.peek().unwrap(), &3);
130     assert_eq!(it.next().unwrap(), 3);
131     assert_eq!(it.next().unwrap(), 4);
132     assert_eq!(it.peek().unwrap(), &5);
133     assert_eq!(it.next().unwrap(), 5);
134     assert!(it.peek().is_none());
135     assert!(it.next().is_none());
136 }
137
138 #[test]
139 fn test_iterator_take_while() {
140     let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
141     let ys = [0u, 1, 2, 3, 5, 13];
142     let mut it = xs.iter().take_while(|&x| *x < 15u);
143     let mut i = 0;
144     for x in it {
145         assert_eq!(*x, ys[i]);
146         i += 1;
147     }
148     assert_eq!(i, ys.len());
149 }
150
151 #[test]
152 fn test_iterator_skip_while() {
153     let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
154     let ys = [15, 16, 17, 19];
155     let mut it = xs.iter().skip_while(|&x| *x < 15u);
156     let mut i = 0;
157     for x in it {
158         assert_eq!(*x, ys[i]);
159         i += 1;
160     }
161     assert_eq!(i, ys.len());
162 }
163
164 #[test]
165 fn test_iterator_skip() {
166     let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
167     let ys = [13, 15, 16, 17, 19, 20, 30];
168     let mut it = xs.iter().skip(5);
169     let mut i = 0;
170     for &x in it {
171         assert_eq!(x, ys[i]);
172         i += 1;
173     }
174     assert_eq!(i, ys.len());
175 }
176
177 #[test]
178 fn test_iterator_take() {
179     let xs = [0u, 1, 2, 3, 5, 13, 15, 16, 17, 19];
180     let ys = [0u, 1, 2, 3, 5];
181     let mut it = xs.iter().take(5);
182     let mut i = 0;
183     for &x in it {
184         assert_eq!(x, ys[i]);
185         i += 1;
186     }
187     assert_eq!(i, ys.len());
188 }
189
190 #[test]
191 fn test_iterator_scan() {
192     // test the type inference
193     fn add(old: &mut int, new: &uint) -> Option<f64> {
194         *old += *new as int;
195         Some(*old as f64)
196     }
197     let xs = [0u, 1, 2, 3, 4];
198     let ys = [0f64, 1.0, 3.0, 6.0, 10.0];
199
200     let mut it = xs.iter().scan(0, add);
201     let mut i = 0;
202     for x in it {
203         assert_eq!(x, ys[i]);
204         i += 1;
205     }
206     assert_eq!(i, ys.len());
207 }
208
209 #[test]
210 fn test_iterator_flat_map() {
211     let xs = [0u, 3, 6];
212     let ys = [0u, 1, 2, 3, 4, 5, 6, 7, 8];
213     let mut it = xs.iter().flat_map(|&x| count(x, 1).take(3));
214     let mut i = 0;
215     for x in it {
216         assert_eq!(x, ys[i]);
217         i += 1;
218     }
219     assert_eq!(i, ys.len());
220 }
221
222 #[test]
223 fn test_inspect() {
224     let xs = [1u, 2, 3, 4];
225     let mut n = 0u;
226
227     let ys = xs.iter()
228                .map(|&x| x)
229                .inspect(|_| n += 1)
230                .collect::<Vec<uint>>();
231
232     assert_eq!(n, xs.len());
233     assert_eq!(xs[], ys[]);
234 }
235
236 #[test]
237 fn test_unfoldr() {
238     fn count(st: &mut uint) -> Option<uint> {
239         if *st < 10 {
240             let ret = Some(*st);
241             *st += 1;
242             ret
243         } else {
244             None
245         }
246     }
247
248     let mut it = Unfold::new(0, count);
249     let mut i = 0;
250     for counted in it {
251         assert_eq!(counted, i);
252         i += 1;
253     }
254     assert_eq!(i, 10);
255 }
256
257 #[test]
258 fn test_cycle() {
259     let cycle_len = 3;
260     let it = count(0u, 1).take(cycle_len).cycle();
261     assert_eq!(it.size_hint(), (uint::MAX, None));
262     for (i, x) in it.take(100).enumerate() {
263         assert_eq!(i % cycle_len, x);
264     }
265
266     let mut it = count(0u, 1).take(0).cycle();
267     assert_eq!(it.size_hint(), (0, Some(0)));
268     assert_eq!(it.next(), None);
269 }
270
271 #[test]
272 fn test_iterator_nth() {
273     let v: &[_] = &[0i, 1, 2, 3, 4];
274     for i in range(0u, v.len()) {
275         assert_eq!(v.iter().nth(i).unwrap(), &v[i]);
276     }
277     assert_eq!(v.iter().nth(v.len()), None);
278 }
279
280 #[test]
281 fn test_iterator_last() {
282     let v: &[_] = &[0i, 1, 2, 3, 4];
283     assert_eq!(v.iter().last().unwrap(), &4);
284     assert_eq!(v[0..1].iter().last().unwrap(), &0);
285 }
286
287 #[test]
288 fn test_iterator_len() {
289     let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
290     assert_eq!(v[0..4].iter().count(), 4);
291     assert_eq!(v[0..10].iter().count(), 10);
292     assert_eq!(v[0..0].iter().count(), 0);
293 }
294
295 #[test]
296 fn test_iterator_sum() {
297     let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
298     assert_eq!(v[0..4].iter().map(|&x| x).sum(), 6);
299     assert_eq!(v.iter().map(|&x| x).sum(), 55);
300     assert_eq!(v[0..0].iter().map(|&x| x).sum(), 0);
301 }
302
303 #[test]
304 fn test_iterator_product() {
305     let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
306     assert_eq!(v[0..4].iter().map(|&x| x).product(), 0);
307     assert_eq!(v[1..5].iter().map(|&x| x).product(), 24);
308     assert_eq!(v[0..0].iter().map(|&x| x).product(), 1);
309 }
310
311 #[test]
312 fn test_iterator_max() {
313     let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
314     assert_eq!(v[0..4].iter().map(|&x| x).max(), Some(3));
315     assert_eq!(v.iter().map(|&x| x).max(), Some(10));
316     assert_eq!(v[0..0].iter().map(|&x| x).max(), None);
317 }
318
319 #[test]
320 fn test_iterator_min() {
321     let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
322     assert_eq!(v[0..4].iter().map(|&x| x).min(), Some(0));
323     assert_eq!(v.iter().map(|&x| x).min(), Some(0));
324     assert_eq!(v[0..0].iter().map(|&x| x).min(), None);
325 }
326
327 #[test]
328 fn test_iterator_size_hint() {
329     let c = count(0i, 1);
330     let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9];
331     let v2 = &[10i, 11, 12];
332     let vi = v.iter();
333
334     assert_eq!(c.size_hint(), (uint::MAX, None));
335     assert_eq!(vi.size_hint(), (10, Some(10)));
336
337     assert_eq!(c.take(5).size_hint(), (5, Some(5)));
338     assert_eq!(c.skip(5).size_hint().1, None);
339     assert_eq!(c.take_while(|_| false).size_hint(), (0, None));
340     assert_eq!(c.skip_while(|_| false).size_hint(), (0, None));
341     assert_eq!(c.enumerate().size_hint(), (uint::MAX, None));
342     assert_eq!(c.chain(vi.map(|&i| i)).size_hint(), (uint::MAX, None));
343     assert_eq!(c.zip(vi).size_hint(), (10, Some(10)));
344     assert_eq!(c.scan(0i, |_,_| Some(0i)).size_hint(), (0, None));
345     assert_eq!(c.filter(|_| false).size_hint(), (0, None));
346     assert_eq!(c.map(|_| 0i).size_hint(), (uint::MAX, None));
347     assert_eq!(c.filter_map(|_| Some(0i)).size_hint(), (0, None));
348
349     assert_eq!(vi.take(5).size_hint(), (5, Some(5)));
350     assert_eq!(vi.take(12).size_hint(), (10, Some(10)));
351     assert_eq!(vi.skip(3).size_hint(), (7, Some(7)));
352     assert_eq!(vi.skip(12).size_hint(), (0, Some(0)));
353     assert_eq!(vi.take_while(|_| false).size_hint(), (0, Some(10)));
354     assert_eq!(vi.skip_while(|_| false).size_hint(), (0, Some(10)));
355     assert_eq!(vi.enumerate().size_hint(), (10, Some(10)));
356     assert_eq!(vi.chain(v2.iter()).size_hint(), (13, Some(13)));
357     assert_eq!(vi.zip(v2.iter()).size_hint(), (3, Some(3)));
358     assert_eq!(vi.scan(0i, |_,_| Some(0i)).size_hint(), (0, Some(10)));
359     assert_eq!(vi.filter(|_| false).size_hint(), (0, Some(10)));
360     assert_eq!(vi.map(|&i| i+1).size_hint(), (10, Some(10)));
361     assert_eq!(vi.filter_map(|_| Some(0i)).size_hint(), (0, Some(10)));
362 }
363
364 #[test]
365 fn test_collect() {
366     let a = vec![1i, 2, 3, 4, 5];
367     let b: Vec<int> = a.iter().map(|&x| x).collect();
368     assert!(a == b);
369 }
370
371 #[test]
372 fn test_all() {
373     let v: Box<[int]> = box [1i, 2, 3, 4, 5];
374     assert!(v.iter().all(|&x| x < 10));
375     assert!(!v.iter().all(|&x| x % 2 == 0));
376     assert!(!v.iter().all(|&x| x > 100));
377     assert!(v.slice_or_fail(&0, &0).iter().all(|_| panic!()));
378 }
379
380 #[test]
381 fn test_any() {
382     let v: Box<[int]> = box [1i, 2, 3, 4, 5];
383     assert!(v.iter().any(|&x| x < 10));
384     assert!(v.iter().any(|&x| x % 2 == 0));
385     assert!(!v.iter().any(|&x| x > 100));
386     assert!(!v.slice_or_fail(&0, &0).iter().any(|_| panic!()));
387 }
388
389 #[test]
390 fn test_find() {
391     let v: &[int] = &[1i, 3, 9, 27, 103, 14, 11];
392     assert_eq!(*v.iter().find(|&&x| x & 1 == 0).unwrap(), 14);
393     assert_eq!(*v.iter().find(|&&x| x % 3 == 0).unwrap(), 3);
394     assert!(v.iter().find(|&&x| x % 12 == 0).is_none());
395 }
396
397 #[test]
398 fn test_position() {
399     let v = &[1i, 3, 9, 27, 103, 14, 11];
400     assert_eq!(v.iter().position(|x| *x & 1 == 0).unwrap(), 5);
401     assert_eq!(v.iter().position(|x| *x % 3 == 0).unwrap(), 1);
402     assert!(v.iter().position(|x| *x % 12 == 0).is_none());
403 }
404
405 #[test]
406 fn test_count() {
407     let xs = &[1i, 2, 2, 1, 5, 9, 0, 2];
408     assert_eq!(xs.iter().filter(|x| **x == 2).count(), 3);
409     assert_eq!(xs.iter().filter(|x| **x == 5).count(), 1);
410     assert_eq!(xs.iter().filter(|x| **x == 95).count(), 0);
411 }
412
413 #[test]
414 fn test_max_by() {
415     let xs: &[int] = &[-3i, 0, 1, 5, -10];
416     assert_eq!(*xs.iter().max_by(|x| x.abs()).unwrap(), -10);
417 }
418
419 #[test]
420 fn test_min_by() {
421     let xs: &[int] = &[-3i, 0, 1, 5, -10];
422     assert_eq!(*xs.iter().min_by(|x| x.abs()).unwrap(), 0);
423 }
424
425 #[test]
426 fn test_by_ref() {
427     let mut xs = range(0i, 10);
428     // sum the first five values
429     let partial_sum = xs.by_ref().take(5).fold(0, |a, b| a + b);
430     assert_eq!(partial_sum, 10);
431     assert_eq!(xs.next(), Some(5));
432 }
433
434 #[test]
435 fn test_rev() {
436     let xs = [2i, 4, 6, 8, 10, 12, 14, 16];
437     let mut it = xs.iter();
438     it.next();
439     it.next();
440     assert!(it.rev().map(|&x| x).collect::<Vec<int>>() ==
441             vec![16, 14, 12, 10, 8, 6]);
442 }
443
444 #[test]
445 fn test_cloned() {
446     let xs = [2u8, 4, 6, 8];
447
448     let mut it = xs.iter().cloned();
449     assert_eq!(it.len(), 4);
450     assert_eq!(it.next(), Some(2));
451     assert_eq!(it.len(), 3);
452     assert_eq!(it.next(), Some(4));
453     assert_eq!(it.len(), 2);
454     assert_eq!(it.next_back(), Some(8));
455     assert_eq!(it.len(), 1);
456     assert_eq!(it.next_back(), Some(6));
457     assert_eq!(it.len(), 0);
458     assert_eq!(it.next_back(), None);
459 }
460
461 #[test]
462 fn test_double_ended_map() {
463     let xs = [1i, 2, 3, 4, 5, 6];
464     let mut it = xs.iter().map(|&x| x * -1);
465     assert_eq!(it.next(), Some(-1));
466     assert_eq!(it.next(), Some(-2));
467     assert_eq!(it.next_back(), Some(-6));
468     assert_eq!(it.next_back(), Some(-5));
469     assert_eq!(it.next(), Some(-3));
470     assert_eq!(it.next_back(), Some(-4));
471     assert_eq!(it.next(), None);
472 }
473
474 #[test]
475 fn test_double_ended_enumerate() {
476     let xs = [1i, 2, 3, 4, 5, 6];
477     let mut it = xs.iter().map(|&x| x).enumerate();
478     assert_eq!(it.next(), Some((0, 1)));
479     assert_eq!(it.next(), Some((1, 2)));
480     assert_eq!(it.next_back(), Some((5, 6)));
481     assert_eq!(it.next_back(), Some((4, 5)));
482     assert_eq!(it.next_back(), Some((3, 4)));
483     assert_eq!(it.next_back(), Some((2, 3)));
484     assert_eq!(it.next(), None);
485 }
486
487 #[test]
488 fn test_double_ended_zip() {
489     let xs = [1i, 2, 3, 4, 5, 6];
490     let ys = [1i, 2, 3, 7];
491     let a = xs.iter().map(|&x| x);
492     let b = ys.iter().map(|&x| x);
493     let mut it = a.zip(b);
494     assert_eq!(it.next(), Some((1, 1)));
495     assert_eq!(it.next(), Some((2, 2)));
496     assert_eq!(it.next_back(), Some((4, 7)));
497     assert_eq!(it.next_back(), Some((3, 3)));
498     assert_eq!(it.next(), None);
499 }
500
501 #[test]
502 fn test_double_ended_filter() {
503     let xs = [1i, 2, 3, 4, 5, 6];
504     let mut it = xs.iter().filter(|&x| *x & 1 == 0);
505     assert_eq!(it.next_back().unwrap(), &6);
506     assert_eq!(it.next_back().unwrap(), &4);
507     assert_eq!(it.next().unwrap(), &2);
508     assert_eq!(it.next_back(), None);
509 }
510
511 #[test]
512 fn test_double_ended_filter_map() {
513     let xs = [1i, 2, 3, 4, 5, 6];
514     let mut it = xs.iter().filter_map(|&x| if x & 1 == 0 { Some(x * 2) } else { None });
515     assert_eq!(it.next_back().unwrap(), 12);
516     assert_eq!(it.next_back().unwrap(), 8);
517     assert_eq!(it.next().unwrap(), 4);
518     assert_eq!(it.next_back(), None);
519 }
520
521 #[test]
522 fn test_double_ended_chain() {
523     let xs = [1i, 2, 3, 4, 5];
524     let ys = [7i, 9, 11];
525     let mut it = xs.iter().chain(ys.iter()).rev();
526     assert_eq!(it.next().unwrap(), &11);
527     assert_eq!(it.next().unwrap(), &9);
528     assert_eq!(it.next_back().unwrap(), &1);
529     assert_eq!(it.next_back().unwrap(), &2);
530     assert_eq!(it.next_back().unwrap(), &3);
531     assert_eq!(it.next_back().unwrap(), &4);
532     assert_eq!(it.next_back().unwrap(), &5);
533     assert_eq!(it.next_back().unwrap(), &7);
534     assert_eq!(it.next_back(), None);
535 }
536
537 #[test]
538 fn test_rposition() {
539     fn f(xy: &(int, char)) -> bool { let (_x, y) = *xy; y == 'b' }
540     fn g(xy: &(int, char)) -> bool { let (_x, y) = *xy; y == 'd' }
541     let v = [(0i, 'a'), (1, 'b'), (2, 'c'), (3, 'b')];
542
543     assert_eq!(v.iter().rposition(f), Some(3u));
544     assert!(v.iter().rposition(g).is_none());
545 }
546
547 #[test]
548 #[should_fail]
549 fn test_rposition_panic() {
550     let v = [(box 0i, box 0i), (box 0i, box 0i),
551              (box 0i, box 0i), (box 0i, box 0i)];
552     let mut i = 0i;
553     v.iter().rposition(|_elt| {
554         if i == 2 {
555             panic!()
556         }
557         i += 1;
558         false
559     });
560 }
561
562
563 #[cfg(test)]
564 fn check_randacc_iter<A, T>(a: T, len: uint) where
565     A: PartialEq,
566     T: Clone + RandomAccessIterator + Iterator<Item=A>,
567 {
568     let mut b = a.clone();
569     assert_eq!(len, b.indexable());
570     let mut n = 0u;
571     for (i, elt) in a.enumerate() {
572         assert!(Some(elt) == b.idx(i));
573         n += 1;
574     }
575     assert_eq!(n, len);
576     assert!(None == b.idx(n));
577     // call recursively to check after picking off an element
578     if len > 0 {
579         b.next();
580         check_randacc_iter(b, len-1);
581     }
582 }
583
584
585 #[test]
586 fn test_double_ended_flat_map() {
587     let u = [0u,1];
588     let v = [5u,6,7,8];
589     let mut it = u.iter().flat_map(|x| v[*x..v.len()].iter());
590     assert_eq!(it.next_back().unwrap(), &8);
591     assert_eq!(it.next().unwrap(),      &5);
592     assert_eq!(it.next_back().unwrap(), &7);
593     assert_eq!(it.next_back().unwrap(), &6);
594     assert_eq!(it.next_back().unwrap(), &8);
595     assert_eq!(it.next().unwrap(),      &6);
596     assert_eq!(it.next_back().unwrap(), &7);
597     assert_eq!(it.next_back(), None);
598     assert_eq!(it.next(),      None);
599     assert_eq!(it.next_back(), None);
600 }
601
602 #[test]
603 fn test_random_access_chain() {
604     let xs = [1i, 2, 3, 4, 5];
605     let ys = [7i, 9, 11];
606     let mut it = xs.iter().chain(ys.iter());
607     assert_eq!(it.idx(0).unwrap(), &1);
608     assert_eq!(it.idx(5).unwrap(), &7);
609     assert_eq!(it.idx(7).unwrap(), &11);
610     assert!(it.idx(8).is_none());
611
612     it.next();
613     it.next();
614     it.next_back();
615
616     assert_eq!(it.idx(0).unwrap(), &3);
617     assert_eq!(it.idx(4).unwrap(), &9);
618     assert!(it.idx(6).is_none());
619
620     check_randacc_iter(it, xs.len() + ys.len() - 3);
621 }
622
623 #[test]
624 fn test_random_access_enumerate() {
625     let xs = [1i, 2, 3, 4, 5];
626     check_randacc_iter(xs.iter().enumerate(), xs.len());
627 }
628
629 #[test]
630 fn test_random_access_rev() {
631     let xs = [1i, 2, 3, 4, 5];
632     check_randacc_iter(xs.iter().rev(), xs.len());
633     let mut it = xs.iter().rev();
634     it.next();
635     it.next_back();
636     it.next();
637     check_randacc_iter(it, xs.len() - 3);
638 }
639
640 #[test]
641 fn test_random_access_zip() {
642     let xs = [1i, 2, 3, 4, 5];
643     let ys = [7i, 9, 11];
644     check_randacc_iter(xs.iter().zip(ys.iter()), cmp::min(xs.len(), ys.len()));
645 }
646
647 #[test]
648 fn test_random_access_take() {
649     let xs = [1i, 2, 3, 4, 5];
650     let empty: &[int] = &[];
651     check_randacc_iter(xs.iter().take(3), 3);
652     check_randacc_iter(xs.iter().take(20), xs.len());
653     check_randacc_iter(xs.iter().take(0), 0);
654     check_randacc_iter(empty.iter().take(2), 0);
655 }
656
657 #[test]
658 fn test_random_access_skip() {
659     let xs = [1i, 2, 3, 4, 5];
660     let empty: &[int] = &[];
661     check_randacc_iter(xs.iter().skip(2), xs.len() - 2);
662     check_randacc_iter(empty.iter().skip(2), 0);
663 }
664
665 #[test]
666 fn test_random_access_inspect() {
667     let xs = [1i, 2, 3, 4, 5];
668
669     // test .map and .inspect that don't implement Clone
670     let mut it = xs.iter().inspect(|_| {});
671     assert_eq!(xs.len(), it.indexable());
672     for (i, elt) in xs.iter().enumerate() {
673         assert_eq!(Some(elt), it.idx(i));
674     }
675
676 }
677
678 #[test]
679 fn test_random_access_map() {
680     let xs = [1i, 2, 3, 4, 5];
681
682     let mut it = xs.iter().map(|x| *x);
683     assert_eq!(xs.len(), it.indexable());
684     for (i, elt) in xs.iter().enumerate() {
685         assert_eq!(Some(*elt), it.idx(i));
686     }
687 }
688
689 #[test]
690 fn test_random_access_cycle() {
691     let xs = [1i, 2, 3, 4, 5];
692     let empty: &[int] = &[];
693     check_randacc_iter(xs.iter().cycle().take(27), 27);
694     check_randacc_iter(empty.iter().cycle(), 0);
695 }
696
697 #[test]
698 fn test_double_ended_range() {
699     assert!(range(11i, 14).rev().collect::<Vec<int>>() == vec![13i, 12, 11]);
700     for _ in range(10i, 0).rev() {
701         panic!("unreachable");
702     }
703
704     assert!(range(11u, 14).rev().collect::<Vec<uint>>() == vec![13u, 12, 11]);
705     for _ in range(10u, 0).rev() {
706         panic!("unreachable");
707     }
708 }
709
710 #[test]
711 fn test_range() {
712     assert!(range(0i, 5).collect::<Vec<int>>() == vec![0i, 1, 2, 3, 4]);
713     assert!(range(-10i, -1).collect::<Vec<int>>() ==
714                vec![-10, -9, -8, -7, -6, -5, -4, -3, -2]);
715     assert!(range(0i, 5).rev().collect::<Vec<int>>() == vec![4, 3, 2, 1, 0]);
716     assert_eq!(range(200i, -5).count(), 0);
717     assert_eq!(range(200i, -5).rev().count(), 0);
718     assert_eq!(range(200i, 200).count(), 0);
719     assert_eq!(range(200i, 200).rev().count(), 0);
720
721     assert_eq!(range(0i, 100).size_hint(), (100, Some(100)));
722     // this test is only meaningful when sizeof uint < sizeof u64
723     assert_eq!(range(uint::MAX - 1, uint::MAX).size_hint(), (1, Some(1)));
724     assert_eq!(range(-10i, -1).size_hint(), (9, Some(9)));
725 }
726
727 #[test]
728 fn test_range_inclusive() {
729     assert!(range_inclusive(0i, 5).collect::<Vec<int>>() ==
730             vec![0i, 1, 2, 3, 4, 5]);
731     assert!(range_inclusive(0i, 5).rev().collect::<Vec<int>>() ==
732             vec![5i, 4, 3, 2, 1, 0]);
733     assert_eq!(range_inclusive(200i, -5).count(), 0);
734     assert_eq!(range_inclusive(200i, -5).rev().count(), 0);
735     assert!(range_inclusive(200i, 200).collect::<Vec<int>>() == vec![200]);
736     assert!(range_inclusive(200i, 200).rev().collect::<Vec<int>>() == vec![200]);
737 }
738
739 #[test]
740 fn test_range_step() {
741     assert!(range_step(0i, 20, 5).collect::<Vec<int>>() ==
742             vec![0, 5, 10, 15]);
743     assert!(range_step(20i, 0, -5).collect::<Vec<int>>() ==
744             vec![20, 15, 10, 5]);
745     assert!(range_step(20i, 0, -6).collect::<Vec<int>>() ==
746             vec![20, 14, 8, 2]);
747     assert!(range_step(200u8, 255, 50).collect::<Vec<u8>>() ==
748             vec![200u8, 250]);
749     assert!(range_step(200i, -5, 1).collect::<Vec<int>>() == vec![]);
750     assert!(range_step(200i, 200, 1).collect::<Vec<int>>() == vec![]);
751 }
752
753 #[test]
754 fn test_range_step_inclusive() {
755     assert!(range_step_inclusive(0i, 20, 5).collect::<Vec<int>>() ==
756             vec![0, 5, 10, 15, 20]);
757     assert!(range_step_inclusive(20i, 0, -5).collect::<Vec<int>>() ==
758             vec![20, 15, 10, 5, 0]);
759     assert!(range_step_inclusive(20i, 0, -6).collect::<Vec<int>>() ==
760             vec![20, 14, 8, 2]);
761     assert!(range_step_inclusive(200u8, 255, 50).collect::<Vec<u8>>() ==
762             vec![200u8, 250]);
763     assert!(range_step_inclusive(200i, -5, 1).collect::<Vec<int>>() ==
764             vec![]);
765     assert!(range_step_inclusive(200i, 200, 1).collect::<Vec<int>>() ==
766             vec![200]);
767 }
768
769 #[test]
770 fn test_reverse() {
771     let mut ys = [1i, 2, 3, 4, 5];
772     ys.iter_mut().reverse_();
773     assert!(ys == [5, 4, 3, 2, 1]);
774 }
775
776 #[test]
777 fn test_peekable_is_empty() {
778     let a = [1i];
779     let mut it = a.iter().peekable();
780     assert!( !it.is_empty() );
781     it.next();
782     assert!( it.is_empty() );
783 }
784
785 #[test]
786 fn test_min_max() {
787     let v: [int; 0] = [];
788     assert_eq!(v.iter().min_max(), NoElements);
789
790     let v = [1i];
791     assert!(v.iter().min_max() == OneElement(&1));
792
793     let v = [1i, 2, 3, 4, 5];
794     assert!(v.iter().min_max() == MinMax(&1, &5));
795
796     let v = [1i, 2, 3, 4, 5, 6];
797     assert!(v.iter().min_max() == MinMax(&1, &6));
798
799     let v = [1i, 1, 1, 1];
800     assert!(v.iter().min_max() == MinMax(&1, &1));
801 }
802
803 #[test]
804 fn test_min_max_result() {
805     let r: MinMaxResult<int> = NoElements;
806     assert_eq!(r.into_option(), None);
807
808     let r = OneElement(1i);
809     assert_eq!(r.into_option(), Some((1,1)));
810
811     let r = MinMax(1i,2);
812     assert_eq!(r.into_option(), Some((1,2)));
813 }
814
815 #[test]
816 fn test_iterate() {
817     let mut it = iterate(1u, |x| x * 2);
818     assert_eq!(it.next(), Some(1u));
819     assert_eq!(it.next(), Some(2u));
820     assert_eq!(it.next(), Some(4u));
821     assert_eq!(it.next(), Some(8u));
822 }
823
824 #[test]
825 fn test_repeat() {
826     let mut it = repeat(42u);
827     assert_eq!(it.next(), Some(42u));
828     assert_eq!(it.next(), Some(42u));
829     assert_eq!(it.next(), Some(42u));
830 }
831
832 #[bench]
833 fn bench_rposition(b: &mut Bencher) {
834     let it: Vec<uint> = range(0u, 300).collect();
835     b.iter(|| {
836         it.iter().rposition(|&x| x <= 150);
837     });
838 }
839
840 #[bench]
841 fn bench_skip_while(b: &mut Bencher) {
842     b.iter(|| {
843         let it = range(0u, 100);
844         let mut sum = 0;
845         it.skip_while(|&x| { sum += x; sum < 4000 }).all(|_| true);
846     });
847 }
848
849 #[bench]
850 fn bench_multiple_take(b: &mut Bencher) {
851     let mut it = range(0u, 42).cycle();
852     b.iter(|| {
853         let n = it.next().unwrap();
854         for _ in range(0u, n) {
855             it.take(it.next().unwrap()).all(|_| true);
856         }
857     });
858 }