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