]>
Commit | Line | Data |
---|---|---|
0731742a | 1 | use core::cell::Cell; |
532ac7d7 | 2 | use core::convert::TryFrom; |
1a4d82fc | 3 | use core::iter::*; |
d9579d0f | 4 | use core::{i8, i16, isize}; |
c34b1796 | 5 | use core::usize; |
1a4d82fc | 6 | |
1a4d82fc JJ |
7 | #[test] |
8 | fn test_lt() { | |
c34b1796 | 9 | let empty: [isize; 0] = []; |
85aaf69f SL |
10 | let xs = [1,2,3]; |
11 | let ys = [1,2,0]; | |
1a4d82fc | 12 | |
e9174d1e SL |
13 | assert!(!xs.iter().lt(ys.iter())); |
14 | assert!(!xs.iter().le(ys.iter())); | |
15 | assert!( xs.iter().gt(ys.iter())); | |
16 | assert!( xs.iter().ge(ys.iter())); | |
1a4d82fc | 17 | |
e9174d1e SL |
18 | assert!( ys.iter().lt(xs.iter())); |
19 | assert!( ys.iter().le(xs.iter())); | |
20 | assert!(!ys.iter().gt(xs.iter())); | |
21 | assert!(!ys.iter().ge(xs.iter())); | |
1a4d82fc | 22 | |
e9174d1e SL |
23 | assert!( empty.iter().lt(xs.iter())); |
24 | assert!( empty.iter().le(xs.iter())); | |
25 | assert!(!empty.iter().gt(xs.iter())); | |
26 | assert!(!empty.iter().ge(xs.iter())); | |
1a4d82fc JJ |
27 | |
28 | // Sequence with NaN | |
29 | let u = [1.0f64, 2.0]; | |
30 | let v = [0.0f64/0.0, 3.0]; | |
31 | ||
e9174d1e SL |
32 | assert!(!u.iter().lt(v.iter())); |
33 | assert!(!u.iter().le(v.iter())); | |
34 | assert!(!u.iter().gt(v.iter())); | |
35 | assert!(!u.iter().ge(v.iter())); | |
1a4d82fc JJ |
36 | |
37 | let a = [0.0f64/0.0]; | |
38 | let b = [1.0f64]; | |
39 | let c = [2.0f64]; | |
40 | ||
e9174d1e SL |
41 | assert!(a.iter().lt(b.iter()) == (a[0] < b[0])); |
42 | assert!(a.iter().le(b.iter()) == (a[0] <= b[0])); | |
43 | assert!(a.iter().gt(b.iter()) == (a[0] > b[0])); | |
44 | assert!(a.iter().ge(b.iter()) == (a[0] >= b[0])); | |
1a4d82fc | 45 | |
e9174d1e SL |
46 | assert!(c.iter().lt(b.iter()) == (c[0] < b[0])); |
47 | assert!(c.iter().le(b.iter()) == (c[0] <= b[0])); | |
48 | assert!(c.iter().gt(b.iter()) == (c[0] > b[0])); | |
49 | assert!(c.iter().ge(b.iter()) == (c[0] >= b[0])); | |
1a4d82fc JJ |
50 | } |
51 | ||
52 | #[test] | |
53 | fn test_multi_iter() { | |
85aaf69f SL |
54 | let xs = [1,2,3,4]; |
55 | let ys = [4,3,2,1]; | |
e9174d1e SL |
56 | assert!(xs.iter().eq(ys.iter().rev())); |
57 | assert!(xs.iter().lt(xs.iter().skip(2))); | |
1a4d82fc JJ |
58 | } |
59 | ||
60 | #[test] | |
61 | fn test_counter_from_iter() { | |
041b39d2 | 62 | let it = (0..).step_by(5).take(10); |
c34b1796 AL |
63 | let xs: Vec<isize> = FromIterator::from_iter(it); |
64 | assert_eq!(xs, [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]); | |
1a4d82fc JJ |
65 | } |
66 | ||
67 | #[test] | |
68 | fn test_iterator_chain() { | |
85aaf69f SL |
69 | let xs = [0, 1, 2, 3, 4, 5]; |
70 | let ys = [30, 40, 50, 60]; | |
1a4d82fc | 71 | let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60]; |
62682a34 | 72 | let it = xs.iter().chain(&ys); |
1a4d82fc JJ |
73 | let mut i = 0; |
74 | for &x in it { | |
75 | assert_eq!(x, expected[i]); | |
76 | i += 1; | |
77 | } | |
78 | assert_eq!(i, expected.len()); | |
79 | ||
041b39d2 | 80 | let ys = (30..).step_by(10).take(4); |
c34b1796 | 81 | let it = xs.iter().cloned().chain(ys); |
1a4d82fc JJ |
82 | let mut i = 0; |
83 | for x in it { | |
84 | assert_eq!(x, expected[i]); | |
85 | i += 1; | |
86 | } | |
87 | assert_eq!(i, expected.len()); | |
88 | } | |
89 | ||
d9579d0f AL |
90 | #[test] |
91 | fn test_iterator_chain_nth() { | |
92 | let xs = [0, 1, 2, 3, 4, 5]; | |
93 | let ys = [30, 40, 50, 60]; | |
94 | let zs = []; | |
95 | let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60]; | |
96 | for (i, x) in expected.iter().enumerate() { | |
62682a34 | 97 | assert_eq!(Some(x), xs.iter().chain(&ys).nth(i)); |
d9579d0f | 98 | } |
62682a34 | 99 | assert_eq!(zs.iter().chain(&xs).nth(0), Some(&0)); |
d9579d0f | 100 | |
62682a34 | 101 | let mut it = xs.iter().chain(&zs); |
d9579d0f AL |
102 | assert_eq!(it.nth(5), Some(&5)); |
103 | assert_eq!(it.next(), None); | |
104 | } | |
105 | ||
106 | #[test] | |
107 | fn test_iterator_chain_last() { | |
108 | let xs = [0, 1, 2, 3, 4, 5]; | |
109 | let ys = [30, 40, 50, 60]; | |
110 | let zs = []; | |
62682a34 SL |
111 | assert_eq!(xs.iter().chain(&ys).last(), Some(&60)); |
112 | assert_eq!(zs.iter().chain(&ys).last(), Some(&60)); | |
113 | assert_eq!(ys.iter().chain(&zs).last(), Some(&60)); | |
114 | assert_eq!(zs.iter().chain(&zs).last(), None); | |
d9579d0f AL |
115 | } |
116 | ||
117 | #[test] | |
118 | fn test_iterator_chain_count() { | |
119 | let xs = [0, 1, 2, 3, 4, 5]; | |
120 | let ys = [30, 40, 50, 60]; | |
121 | let zs = []; | |
62682a34 SL |
122 | assert_eq!(xs.iter().chain(&ys).count(), 10); |
123 | assert_eq!(zs.iter().chain(&ys).count(), 4); | |
d9579d0f AL |
124 | } |
125 | ||
a7813a04 XL |
126 | #[test] |
127 | fn test_iterator_chain_find() { | |
128 | let xs = [0, 1, 2, 3, 4, 5]; | |
129 | let ys = [30, 40, 50, 60]; | |
130 | let mut iter = xs.iter().chain(&ys); | |
131 | assert_eq!(iter.find(|&&i| i == 4), Some(&4)); | |
132 | assert_eq!(iter.next(), Some(&5)); | |
133 | assert_eq!(iter.find(|&&i| i == 40), Some(&40)); | |
134 | assert_eq!(iter.next(), Some(&50)); | |
135 | assert_eq!(iter.find(|&&i| i == 100), None); | |
136 | assert_eq!(iter.next(), None); | |
137 | } | |
138 | ||
0531ce1d XL |
139 | #[test] |
140 | fn test_zip_nth() { | |
141 | let xs = [0, 1, 2, 4, 5]; | |
142 | let ys = [10, 11, 12]; | |
143 | ||
144 | let mut it = xs.iter().zip(&ys); | |
145 | assert_eq!(it.nth(0), Some((&0, &10))); | |
146 | assert_eq!(it.nth(1), Some((&2, &12))); | |
147 | assert_eq!(it.nth(0), None); | |
148 | ||
149 | let mut it = xs.iter().zip(&ys); | |
150 | assert_eq!(it.nth(3), None); | |
151 | ||
152 | let mut it = ys.iter().zip(&xs); | |
153 | assert_eq!(it.nth(3), None); | |
154 | } | |
155 | ||
156 | #[test] | |
157 | fn test_zip_nth_side_effects() { | |
158 | let mut a = Vec::new(); | |
159 | let mut b = Vec::new(); | |
160 | let value = [1, 2, 3, 4, 5, 6].iter().cloned() | |
161 | .map(|n| { | |
162 | a.push(n); | |
163 | n * 10 | |
164 | }) | |
165 | .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| { | |
166 | b.push(n * 100); | |
167 | n * 1000 | |
168 | })) | |
169 | .skip(1) | |
170 | .nth(3); | |
171 | assert_eq!(value, Some((50, 6000))); | |
172 | assert_eq!(a, vec![1, 2, 3, 4, 5]); | |
173 | assert_eq!(b, vec![200, 300, 400, 500, 600]); | |
174 | } | |
175 | ||
7cac9316 XL |
176 | #[test] |
177 | fn test_iterator_step_by() { | |
178 | // Identity | |
041b39d2 | 179 | let mut it = (0..).step_by(1).take(3); |
7cac9316 XL |
180 | assert_eq!(it.next(), Some(0)); |
181 | assert_eq!(it.next(), Some(1)); | |
182 | assert_eq!(it.next(), Some(2)); | |
183 | assert_eq!(it.next(), None); | |
184 | ||
041b39d2 | 185 | let mut it = (0..).step_by(3).take(4); |
7cac9316 XL |
186 | assert_eq!(it.next(), Some(0)); |
187 | assert_eq!(it.next(), Some(3)); | |
188 | assert_eq!(it.next(), Some(6)); | |
189 | assert_eq!(it.next(), Some(9)); | |
190 | assert_eq!(it.next(), None); | |
416331ca XL |
191 | |
192 | let mut it = (0..3).step_by(1); | |
193 | assert_eq!(it.next_back(), Some(2)); | |
194 | assert_eq!(it.next_back(), Some(1)); | |
195 | assert_eq!(it.next_back(), Some(0)); | |
196 | assert_eq!(it.next_back(), None); | |
197 | ||
198 | let mut it = (0..11).step_by(3); | |
199 | assert_eq!(it.next_back(), Some(9)); | |
200 | assert_eq!(it.next_back(), Some(6)); | |
201 | assert_eq!(it.next_back(), Some(3)); | |
202 | assert_eq!(it.next_back(), Some(0)); | |
203 | assert_eq!(it.next_back(), None); | |
7cac9316 XL |
204 | } |
205 | ||
2c00a5a8 XL |
206 | #[test] |
207 | fn test_iterator_step_by_nth() { | |
208 | let mut it = (0..16).step_by(5); | |
209 | assert_eq!(it.nth(0), Some(0)); | |
210 | assert_eq!(it.nth(0), Some(5)); | |
211 | assert_eq!(it.nth(0), Some(10)); | |
212 | assert_eq!(it.nth(0), Some(15)); | |
213 | assert_eq!(it.nth(0), None); | |
214 | ||
215 | let it = (0..18).step_by(5); | |
216 | assert_eq!(it.clone().nth(0), Some(0)); | |
217 | assert_eq!(it.clone().nth(1), Some(5)); | |
218 | assert_eq!(it.clone().nth(2), Some(10)); | |
219 | assert_eq!(it.clone().nth(3), Some(15)); | |
220 | assert_eq!(it.clone().nth(4), None); | |
221 | assert_eq!(it.clone().nth(42), None); | |
222 | } | |
223 | ||
224 | #[test] | |
225 | fn test_iterator_step_by_nth_overflow() { | |
226 | #[cfg(target_pointer_width = "8")] | |
227 | type Bigger = u16; | |
228 | #[cfg(target_pointer_width = "16")] | |
229 | type Bigger = u32; | |
230 | #[cfg(target_pointer_width = "32")] | |
231 | type Bigger = u64; | |
232 | #[cfg(target_pointer_width = "64")] | |
233 | type Bigger = u128; | |
234 | ||
235 | #[derive(Clone)] | |
236 | struct Test(Bigger); | |
0bf4aa26 | 237 | impl Iterator for &mut Test { |
2c00a5a8 XL |
238 | type Item = i32; |
239 | fn next(&mut self) -> Option<Self::Item> { Some(21) } | |
240 | fn nth(&mut self, n: usize) -> Option<Self::Item> { | |
241 | self.0 += n as Bigger + 1; | |
242 | Some(42) | |
243 | } | |
244 | } | |
245 | ||
246 | let mut it = Test(0); | |
247 | let root = usize::MAX >> (::std::mem::size_of::<usize>() * 8 / 2); | |
248 | let n = root + 20; | |
249 | (&mut it).step_by(n).nth(n); | |
250 | assert_eq!(it.0, n as Bigger * n as Bigger); | |
251 | ||
252 | // large step | |
253 | let mut it = Test(0); | |
254 | (&mut it).step_by(usize::MAX).nth(5); | |
255 | assert_eq!(it.0, (usize::MAX as Bigger) * 5); | |
256 | ||
257 | // n + 1 overflows | |
258 | let mut it = Test(0); | |
259 | (&mut it).step_by(2).nth(usize::MAX); | |
260 | assert_eq!(it.0, (usize::MAX as Bigger) * 2); | |
261 | ||
262 | // n + 1 overflows | |
263 | let mut it = Test(0); | |
264 | (&mut it).step_by(1).nth(usize::MAX); | |
265 | assert_eq!(it.0, (usize::MAX as Bigger) * 1); | |
266 | } | |
267 | ||
416331ca XL |
268 | #[test] |
269 | fn test_iterator_step_by_nth_back() { | |
270 | let mut it = (0..16).step_by(5); | |
271 | assert_eq!(it.nth_back(0), Some(15)); | |
272 | assert_eq!(it.nth_back(0), Some(10)); | |
273 | assert_eq!(it.nth_back(0), Some(5)); | |
274 | assert_eq!(it.nth_back(0), Some(0)); | |
275 | assert_eq!(it.nth_back(0), None); | |
276 | ||
277 | let mut it = (0..16).step_by(5); | |
278 | assert_eq!(it.next(), Some(0)); // to set `first_take` to `false` | |
279 | assert_eq!(it.nth_back(0), Some(15)); | |
280 | assert_eq!(it.nth_back(0), Some(10)); | |
281 | assert_eq!(it.nth_back(0), Some(5)); | |
282 | assert_eq!(it.nth_back(0), None); | |
283 | ||
284 | let it = || (0..18).step_by(5); | |
285 | assert_eq!(it().nth_back(0), Some(15)); | |
286 | assert_eq!(it().nth_back(1), Some(10)); | |
287 | assert_eq!(it().nth_back(2), Some(5)); | |
288 | assert_eq!(it().nth_back(3), Some(0)); | |
289 | assert_eq!(it().nth_back(4), None); | |
290 | assert_eq!(it().nth_back(42), None); | |
291 | } | |
292 | ||
7cac9316 XL |
293 | #[test] |
294 | #[should_panic] | |
295 | fn test_iterator_step_by_zero() { | |
041b39d2 | 296 | let mut it = (0..).step_by(0); |
7cac9316 XL |
297 | it.next(); |
298 | } | |
299 | ||
300 | #[test] | |
301 | fn test_iterator_step_by_size_hint() { | |
302 | struct StubSizeHint(usize, Option<usize>); | |
303 | impl Iterator for StubSizeHint { | |
304 | type Item = (); | |
305 | fn next(&mut self) -> Option<()> { | |
306 | self.0 -= 1; | |
307 | if let Some(ref mut upper) = self.1 { | |
308 | *upper -= 1; | |
309 | } | |
310 | Some(()) | |
311 | } | |
312 | fn size_hint(&self) -> (usize, Option<usize>) { | |
313 | (self.0, self.1) | |
314 | } | |
315 | } | |
316 | ||
317 | // The two checks in each case are needed because the logic | |
318 | // is different before the first call to `next()`. | |
319 | ||
320 | let mut it = StubSizeHint(10, Some(10)).step_by(1); | |
321 | assert_eq!(it.size_hint(), (10, Some(10))); | |
322 | it.next(); | |
323 | assert_eq!(it.size_hint(), (9, Some(9))); | |
324 | ||
325 | // exact multiple | |
326 | let mut it = StubSizeHint(10, Some(10)).step_by(3); | |
327 | assert_eq!(it.size_hint(), (4, Some(4))); | |
328 | it.next(); | |
329 | assert_eq!(it.size_hint(), (3, Some(3))); | |
330 | ||
331 | // larger base range, but not enough to get another element | |
332 | let mut it = StubSizeHint(12, Some(12)).step_by(3); | |
333 | assert_eq!(it.size_hint(), (4, Some(4))); | |
334 | it.next(); | |
335 | assert_eq!(it.size_hint(), (3, Some(3))); | |
336 | ||
337 | // smaller base range, so fewer resulting elements | |
338 | let mut it = StubSizeHint(9, Some(9)).step_by(3); | |
339 | assert_eq!(it.size_hint(), (3, Some(3))); | |
340 | it.next(); | |
341 | assert_eq!(it.size_hint(), (2, Some(2))); | |
342 | ||
343 | // infinite upper bound | |
344 | let mut it = StubSizeHint(usize::MAX, None).step_by(1); | |
345 | assert_eq!(it.size_hint(), (usize::MAX, None)); | |
346 | it.next(); | |
347 | assert_eq!(it.size_hint(), (usize::MAX-1, None)); | |
348 | ||
349 | // still infinite with larger step | |
350 | let mut it = StubSizeHint(7, None).step_by(3); | |
351 | assert_eq!(it.size_hint(), (3, None)); | |
352 | it.next(); | |
353 | assert_eq!(it.size_hint(), (2, None)); | |
354 | ||
355 | // propagates ExactSizeIterator | |
356 | let a = [1,2,3,4,5]; | |
357 | let it = a.iter().step_by(2); | |
358 | assert_eq!(it.len(), 3); | |
359 | ||
360 | // Cannot be TrustedLen as a step greater than one makes an iterator | |
361 | // with (usize::MAX, None) no longer meet the safety requirements | |
362 | trait TrustedLenCheck { fn test(self) -> bool; } | |
363 | impl<T:Iterator> TrustedLenCheck for T { | |
364 | default fn test(self) -> bool { false } | |
365 | } | |
366 | impl<T:TrustedLen> TrustedLenCheck for T { | |
367 | fn test(self) -> bool { true } | |
368 | } | |
369 | assert!(TrustedLenCheck::test(a.iter())); | |
370 | assert!(!TrustedLenCheck::test(a.iter().step_by(1))); | |
371 | } | |
372 | ||
1a4d82fc JJ |
373 | #[test] |
374 | fn test_filter_map() { | |
041b39d2 | 375 | let it = (0..).step_by(1).take(10) |
1a4d82fc | 376 | .filter_map(|x| if x % 2 == 0 { Some(x*x) } else { None }); |
c34b1796 | 377 | assert_eq!(it.collect::<Vec<usize>>(), [0*0, 2*2, 4*4, 6*6, 8*8]); |
1a4d82fc JJ |
378 | } |
379 | ||
ea8adc8c XL |
380 | #[test] |
381 | fn test_filter_map_fold() { | |
382 | let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | |
383 | let ys = [0*0, 2*2, 4*4, 6*6, 8*8]; | |
384 | let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x*x) } else { None }); | |
385 | let i = it.fold(0, |i, x| { | |
386 | assert_eq!(x, ys[i]); | |
387 | i + 1 | |
388 | }); | |
389 | assert_eq!(i, ys.len()); | |
390 | ||
391 | let it = xs.iter().filter_map(|&x| if x % 2 == 0 { Some(x*x) } else { None }); | |
392 | let i = it.rfold(ys.len(), |i, x| { | |
393 | assert_eq!(x, ys[i - 1]); | |
394 | i - 1 | |
395 | }); | |
396 | assert_eq!(i, 0); | |
397 | } | |
398 | ||
1a4d82fc JJ |
399 | #[test] |
400 | fn test_iterator_enumerate() { | |
85aaf69f | 401 | let xs = [0, 1, 2, 3, 4, 5]; |
c34b1796 | 402 | let it = xs.iter().enumerate(); |
1a4d82fc JJ |
403 | for (i, &x) in it { |
404 | assert_eq!(i, x); | |
405 | } | |
406 | } | |
407 | ||
d9579d0f AL |
408 | #[test] |
409 | fn test_iterator_enumerate_nth() { | |
410 | let xs = [0, 1, 2, 3, 4, 5]; | |
411 | for (i, &x) in xs.iter().enumerate() { | |
412 | assert_eq!(i, x); | |
413 | } | |
414 | ||
415 | let mut it = xs.iter().enumerate(); | |
416 | while let Some((i, &x)) = it.nth(0) { | |
417 | assert_eq!(i, x); | |
418 | } | |
419 | ||
420 | let mut it = xs.iter().enumerate(); | |
421 | while let Some((i, &x)) = it.nth(1) { | |
422 | assert_eq!(i, x); | |
423 | } | |
424 | ||
425 | let (i, &x) = xs.iter().enumerate().nth(3).unwrap(); | |
426 | assert_eq!(i, x); | |
427 | assert_eq!(i, 3); | |
428 | } | |
429 | ||
48663c56 XL |
430 | #[test] |
431 | fn test_iterator_enumerate_nth_back() { | |
432 | let xs = [0, 1, 2, 3, 4, 5]; | |
433 | let mut it = xs.iter().enumerate(); | |
434 | while let Some((i, &x)) = it.nth_back(0) { | |
435 | assert_eq!(i, x); | |
436 | } | |
437 | ||
438 | let mut it = xs.iter().enumerate(); | |
439 | while let Some((i, &x)) = it.nth_back(1) { | |
440 | assert_eq!(i, x); | |
441 | } | |
442 | ||
443 | let (i, &x) = xs.iter().enumerate().nth_back(3).unwrap(); | |
444 | assert_eq!(i, x); | |
445 | assert_eq!(i, 2); | |
446 | } | |
447 | ||
d9579d0f AL |
448 | #[test] |
449 | fn test_iterator_enumerate_count() { | |
450 | let xs = [0, 1, 2, 3, 4, 5]; | |
ea8adc8c XL |
451 | assert_eq!(xs.iter().enumerate().count(), 6); |
452 | } | |
453 | ||
454 | #[test] | |
455 | fn test_iterator_enumerate_fold() { | |
456 | let xs = [0, 1, 2, 3, 4, 5]; | |
457 | let mut it = xs.iter().enumerate(); | |
458 | // steal a couple to get an interesting offset | |
459 | assert_eq!(it.next(), Some((0, &0))); | |
460 | assert_eq!(it.next(), Some((1, &1))); | |
461 | let i = it.fold(2, |i, (j, &x)| { | |
462 | assert_eq!(i, j); | |
463 | assert_eq!(x, xs[j]); | |
464 | i + 1 | |
465 | }); | |
466 | assert_eq!(i, xs.len()); | |
467 | ||
468 | let mut it = xs.iter().enumerate(); | |
469 | assert_eq!(it.next(), Some((0, &0))); | |
470 | let i = it.rfold(xs.len() - 1, |i, (j, &x)| { | |
471 | assert_eq!(i, j); | |
472 | assert_eq!(x, xs[j]); | |
473 | i - 1 | |
474 | }); | |
475 | assert_eq!(i, 0); | |
d9579d0f AL |
476 | } |
477 | ||
8bb4bdeb XL |
478 | #[test] |
479 | fn test_iterator_filter_count() { | |
480 | let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | |
481 | assert_eq!(xs.iter().filter(|&&x| x % 2 == 0).count(), 5); | |
482 | } | |
483 | ||
ea8adc8c XL |
484 | #[test] |
485 | fn test_iterator_filter_fold() { | |
486 | let xs = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | |
487 | let ys = [0, 2, 4, 6, 8]; | |
488 | let it = xs.iter().filter(|&&x| x % 2 == 0); | |
489 | let i = it.fold(0, |i, &x| { | |
490 | assert_eq!(x, ys[i]); | |
491 | i + 1 | |
492 | }); | |
493 | assert_eq!(i, ys.len()); | |
494 | ||
495 | let it = xs.iter().filter(|&&x| x % 2 == 0); | |
496 | let i = it.rfold(ys.len(), |i, &x| { | |
497 | assert_eq!(x, ys[i - 1]); | |
498 | i - 1 | |
499 | }); | |
500 | assert_eq!(i, 0); | |
501 | } | |
502 | ||
1a4d82fc JJ |
503 | #[test] |
504 | fn test_iterator_peekable() { | |
85aaf69f | 505 | let xs = vec![0, 1, 2, 3, 4, 5]; |
85aaf69f | 506 | |
416331ca | 507 | let mut it = xs.iter().cloned().peekable(); |
85aaf69f | 508 | assert_eq!(it.len(), 6); |
1a4d82fc | 509 | assert_eq!(it.peek().unwrap(), &0); |
85aaf69f | 510 | assert_eq!(it.len(), 6); |
1a4d82fc | 511 | assert_eq!(it.next().unwrap(), 0); |
85aaf69f | 512 | assert_eq!(it.len(), 5); |
1a4d82fc | 513 | assert_eq!(it.next().unwrap(), 1); |
85aaf69f | 514 | assert_eq!(it.len(), 4); |
1a4d82fc | 515 | assert_eq!(it.next().unwrap(), 2); |
85aaf69f | 516 | assert_eq!(it.len(), 3); |
1a4d82fc | 517 | assert_eq!(it.peek().unwrap(), &3); |
85aaf69f | 518 | assert_eq!(it.len(), 3); |
1a4d82fc | 519 | assert_eq!(it.peek().unwrap(), &3); |
85aaf69f | 520 | assert_eq!(it.len(), 3); |
1a4d82fc | 521 | assert_eq!(it.next().unwrap(), 3); |
85aaf69f | 522 | assert_eq!(it.len(), 2); |
1a4d82fc | 523 | assert_eq!(it.next().unwrap(), 4); |
85aaf69f | 524 | assert_eq!(it.len(), 1); |
1a4d82fc | 525 | assert_eq!(it.peek().unwrap(), &5); |
85aaf69f | 526 | assert_eq!(it.len(), 1); |
1a4d82fc | 527 | assert_eq!(it.next().unwrap(), 5); |
85aaf69f | 528 | assert_eq!(it.len(), 0); |
1a4d82fc | 529 | assert!(it.peek().is_none()); |
85aaf69f | 530 | assert_eq!(it.len(), 0); |
1a4d82fc | 531 | assert!(it.next().is_none()); |
85aaf69f | 532 | assert_eq!(it.len(), 0); |
416331ca XL |
533 | |
534 | let mut it = xs.iter().cloned().peekable(); | |
535 | assert_eq!(it.len(), 6); | |
536 | assert_eq!(it.peek().unwrap(), &0); | |
537 | assert_eq!(it.len(), 6); | |
538 | assert_eq!(it.next_back().unwrap(), 5); | |
539 | assert_eq!(it.len(), 5); | |
540 | assert_eq!(it.next_back().unwrap(), 4); | |
541 | assert_eq!(it.len(), 4); | |
542 | assert_eq!(it.next_back().unwrap(), 3); | |
543 | assert_eq!(it.len(), 3); | |
544 | assert_eq!(it.peek().unwrap(), &0); | |
545 | assert_eq!(it.len(), 3); | |
546 | assert_eq!(it.peek().unwrap(), &0); | |
547 | assert_eq!(it.len(), 3); | |
548 | assert_eq!(it.next_back().unwrap(), 2); | |
549 | assert_eq!(it.len(), 2); | |
550 | assert_eq!(it.next_back().unwrap(), 1); | |
551 | assert_eq!(it.len(), 1); | |
552 | assert_eq!(it.peek().unwrap(), &0); | |
553 | assert_eq!(it.len(), 1); | |
554 | assert_eq!(it.next_back().unwrap(), 0); | |
555 | assert_eq!(it.len(), 0); | |
556 | assert!(it.peek().is_none()); | |
557 | assert_eq!(it.len(), 0); | |
558 | assert!(it.next_back().is_none()); | |
559 | assert_eq!(it.len(), 0); | |
1a4d82fc JJ |
560 | } |
561 | ||
d9579d0f AL |
562 | #[test] |
563 | fn test_iterator_peekable_count() { | |
564 | let xs = [0, 1, 2, 3, 4, 5]; | |
565 | let ys = [10]; | |
566 | let zs: [i32; 0] = []; | |
567 | ||
568 | assert_eq!(xs.iter().peekable().count(), 6); | |
569 | ||
570 | let mut it = xs.iter().peekable(); | |
571 | assert_eq!(it.peek(), Some(&&0)); | |
572 | assert_eq!(it.count(), 6); | |
573 | ||
574 | assert_eq!(ys.iter().peekable().count(), 1); | |
575 | ||
576 | let mut it = ys.iter().peekable(); | |
577 | assert_eq!(it.peek(), Some(&&10)); | |
578 | assert_eq!(it.count(), 1); | |
579 | ||
580 | assert_eq!(zs.iter().peekable().count(), 0); | |
581 | ||
582 | let mut it = zs.iter().peekable(); | |
583 | assert_eq!(it.peek(), None); | |
584 | ||
585 | } | |
586 | ||
587 | #[test] | |
588 | fn test_iterator_peekable_nth() { | |
589 | let xs = [0, 1, 2, 3, 4, 5]; | |
590 | let mut it = xs.iter().peekable(); | |
591 | ||
592 | assert_eq!(it.peek(), Some(&&0)); | |
593 | assert_eq!(it.nth(0), Some(&0)); | |
594 | assert_eq!(it.peek(), Some(&&1)); | |
595 | assert_eq!(it.nth(1), Some(&2)); | |
596 | assert_eq!(it.peek(), Some(&&3)); | |
597 | assert_eq!(it.nth(2), Some(&5)); | |
598 | assert_eq!(it.next(), None); | |
599 | } | |
600 | ||
601 | #[test] | |
602 | fn test_iterator_peekable_last() { | |
603 | let xs = [0, 1, 2, 3, 4, 5]; | |
604 | let ys = [0]; | |
605 | ||
606 | let mut it = xs.iter().peekable(); | |
607 | assert_eq!(it.peek(), Some(&&0)); | |
608 | assert_eq!(it.last(), Some(&5)); | |
609 | ||
610 | let mut it = ys.iter().peekable(); | |
611 | assert_eq!(it.peek(), Some(&&0)); | |
612 | assert_eq!(it.last(), Some(&0)); | |
476ff2be SL |
613 | |
614 | let mut it = ys.iter().peekable(); | |
615 | assert_eq!(it.next(), Some(&0)); | |
616 | assert_eq!(it.peek(), None); | |
617 | assert_eq!(it.last(), None); | |
618 | } | |
619 | ||
ea8adc8c XL |
620 | #[test] |
621 | fn test_iterator_peekable_fold() { | |
622 | let xs = [0, 1, 2, 3, 4, 5]; | |
623 | let mut it = xs.iter().peekable(); | |
624 | assert_eq!(it.peek(), Some(&&0)); | |
625 | let i = it.fold(0, |i, &x| { | |
626 | assert_eq!(x, xs[i]); | |
627 | i + 1 | |
628 | }); | |
629 | assert_eq!(i, xs.len()); | |
630 | } | |
631 | ||
416331ca XL |
632 | #[test] |
633 | fn test_iterator_peekable_rfold() { | |
634 | let xs = [0, 1, 2, 3, 4, 5]; | |
635 | let mut it = xs.iter().peekable(); | |
636 | assert_eq!(it.peek(), Some(&&0)); | |
637 | let i = it.rfold(0, |i, &x| { | |
638 | assert_eq!(x, xs[xs.len() - 1 - i]); | |
639 | i + 1 | |
640 | }); | |
641 | assert_eq!(i, xs.len()); | |
642 | } | |
643 | ||
476ff2be SL |
644 | /// This is an iterator that follows the Iterator contract, |
645 | /// but it is not fused. After having returned None once, it will start | |
646 | /// producing elements if .next() is called again. | |
48663c56 | 647 | pub struct CycleIter<'a, T> { |
476ff2be SL |
648 | index: usize, |
649 | data: &'a [T], | |
650 | } | |
651 | ||
48663c56 | 652 | pub fn cycle<T>(data: &[T]) -> CycleIter<'_, T> { |
476ff2be SL |
653 | CycleIter { |
654 | index: 0, | |
3b2f2976 | 655 | data, |
476ff2be SL |
656 | } |
657 | } | |
658 | ||
659 | impl<'a, T> Iterator for CycleIter<'a, T> { | |
660 | type Item = &'a T; | |
661 | fn next(&mut self) -> Option<Self::Item> { | |
662 | let elt = self.data.get(self.index); | |
663 | self.index += 1; | |
664 | self.index %= 1 + self.data.len(); | |
665 | elt | |
666 | } | |
667 | } | |
668 | ||
669 | #[test] | |
670 | fn test_iterator_peekable_remember_peek_none_1() { | |
671 | // Check that the loop using .peek() terminates | |
672 | let data = [1, 2, 3]; | |
673 | let mut iter = cycle(&data).peekable(); | |
674 | ||
675 | let mut n = 0; | |
676 | while let Some(_) = iter.next() { | |
677 | let is_the_last = iter.peek().is_none(); | |
678 | assert_eq!(is_the_last, n == data.len() - 1); | |
679 | n += 1; | |
680 | if n > data.len() { break; } | |
681 | } | |
682 | assert_eq!(n, data.len()); | |
683 | } | |
684 | ||
685 | #[test] | |
686 | fn test_iterator_peekable_remember_peek_none_2() { | |
687 | let data = [0]; | |
688 | let mut iter = cycle(&data).peekable(); | |
689 | iter.next(); | |
690 | assert_eq!(iter.peek(), None); | |
691 | assert_eq!(iter.last(), None); | |
692 | } | |
693 | ||
694 | #[test] | |
695 | fn test_iterator_peekable_remember_peek_none_3() { | |
696 | let data = [0]; | |
697 | let mut iter = cycle(&data).peekable(); | |
698 | iter.peek(); | |
699 | assert_eq!(iter.nth(0), Some(&0)); | |
700 | ||
701 | let mut iter = cycle(&data).peekable(); | |
702 | iter.next(); | |
703 | assert_eq!(iter.peek(), None); | |
704 | assert_eq!(iter.nth(0), None); | |
d9579d0f AL |
705 | } |
706 | ||
1a4d82fc JJ |
707 | #[test] |
708 | fn test_iterator_take_while() { | |
85aaf69f SL |
709 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19]; |
710 | let ys = [0, 1, 2, 3, 5, 13]; | |
c34b1796 | 711 | let it = xs.iter().take_while(|&x| *x < 15); |
1a4d82fc JJ |
712 | let mut i = 0; |
713 | for x in it { | |
714 | assert_eq!(*x, ys[i]); | |
715 | i += 1; | |
716 | } | |
717 | assert_eq!(i, ys.len()); | |
718 | } | |
719 | ||
720 | #[test] | |
721 | fn test_iterator_skip_while() { | |
85aaf69f | 722 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19]; |
1a4d82fc | 723 | let ys = [15, 16, 17, 19]; |
c34b1796 | 724 | let it = xs.iter().skip_while(|&x| *x < 15); |
1a4d82fc JJ |
725 | let mut i = 0; |
726 | for x in it { | |
727 | assert_eq!(*x, ys[i]); | |
728 | i += 1; | |
729 | } | |
730 | assert_eq!(i, ys.len()); | |
731 | } | |
732 | ||
ea8adc8c XL |
733 | #[test] |
734 | fn test_iterator_skip_while_fold() { | |
735 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19]; | |
736 | let ys = [15, 16, 17, 19]; | |
737 | let it = xs.iter().skip_while(|&x| *x < 15); | |
738 | let i = it.fold(0, |i, &x| { | |
739 | assert_eq!(x, ys[i]); | |
740 | i + 1 | |
741 | }); | |
742 | assert_eq!(i, ys.len()); | |
743 | ||
744 | let mut it = xs.iter().skip_while(|&x| *x < 15); | |
745 | assert_eq!(it.next(), Some(&ys[0])); // process skips before folding | |
746 | let i = it.fold(1, |i, &x| { | |
747 | assert_eq!(x, ys[i]); | |
748 | i + 1 | |
749 | }); | |
750 | assert_eq!(i, ys.len()); | |
751 | } | |
752 | ||
1a4d82fc JJ |
753 | #[test] |
754 | fn test_iterator_skip() { | |
85aaf69f | 755 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; |
1a4d82fc JJ |
756 | let ys = [13, 15, 16, 17, 19, 20, 30]; |
757 | let mut it = xs.iter().skip(5); | |
758 | let mut i = 0; | |
85aaf69f | 759 | while let Some(&x) = it.next() { |
1a4d82fc JJ |
760 | assert_eq!(x, ys[i]); |
761 | i += 1; | |
85aaf69f | 762 | assert_eq!(it.len(), xs.len()-5-i); |
1a4d82fc JJ |
763 | } |
764 | assert_eq!(i, ys.len()); | |
85aaf69f | 765 | assert_eq!(it.len(), 0); |
1a4d82fc JJ |
766 | } |
767 | ||
54a0048b SL |
768 | #[test] |
769 | fn test_iterator_skip_doubleended() { | |
770 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; | |
771 | let mut it = xs.iter().rev().skip(5); | |
772 | assert_eq!(it.next(), Some(&15)); | |
773 | assert_eq!(it.by_ref().rev().next(), Some(&0)); | |
774 | assert_eq!(it.next(), Some(&13)); | |
775 | assert_eq!(it.by_ref().rev().next(), Some(&1)); | |
776 | assert_eq!(it.next(), Some(&5)); | |
777 | assert_eq!(it.by_ref().rev().next(), Some(&2)); | |
778 | assert_eq!(it.next(), Some(&3)); | |
779 | assert_eq!(it.next(), None); | |
780 | let mut it = xs.iter().rev().skip(5).rev(); | |
781 | assert_eq!(it.next(), Some(&0)); | |
782 | assert_eq!(it.rev().next(), Some(&15)); | |
783 | let mut it_base = xs.iter(); | |
784 | { | |
785 | let mut it = it_base.by_ref().skip(5).rev(); | |
786 | assert_eq!(it.next(), Some(&30)); | |
787 | assert_eq!(it.next(), Some(&20)); | |
788 | assert_eq!(it.next(), Some(&19)); | |
789 | assert_eq!(it.next(), Some(&17)); | |
790 | assert_eq!(it.next(), Some(&16)); | |
791 | assert_eq!(it.next(), Some(&15)); | |
792 | assert_eq!(it.next(), Some(&13)); | |
793 | assert_eq!(it.next(), None); | |
794 | } | |
795 | // make sure the skipped parts have not been consumed | |
796 | assert_eq!(it_base.next(), Some(&0)); | |
797 | assert_eq!(it_base.next(), Some(&1)); | |
798 | assert_eq!(it_base.next(), Some(&2)); | |
799 | assert_eq!(it_base.next(), Some(&3)); | |
800 | assert_eq!(it_base.next(), Some(&5)); | |
801 | assert_eq!(it_base.next(), None); | |
802 | let it = xs.iter().skip(5).rev(); | |
803 | assert_eq!(it.last(), Some(&13)); | |
804 | } | |
805 | ||
d9579d0f AL |
806 | #[test] |
807 | fn test_iterator_skip_nth() { | |
808 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; | |
809 | ||
810 | let mut it = xs.iter().skip(0); | |
811 | assert_eq!(it.nth(0), Some(&0)); | |
812 | assert_eq!(it.nth(1), Some(&2)); | |
813 | ||
814 | let mut it = xs.iter().skip(5); | |
815 | assert_eq!(it.nth(0), Some(&13)); | |
816 | assert_eq!(it.nth(1), Some(&16)); | |
817 | ||
818 | let mut it = xs.iter().skip(12); | |
819 | assert_eq!(it.nth(0), None); | |
820 | ||
821 | } | |
822 | ||
823 | #[test] | |
824 | fn test_iterator_skip_count() { | |
825 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; | |
826 | ||
827 | assert_eq!(xs.iter().skip(0).count(), 12); | |
828 | assert_eq!(xs.iter().skip(1).count(), 11); | |
829 | assert_eq!(xs.iter().skip(11).count(), 1); | |
830 | assert_eq!(xs.iter().skip(12).count(), 0); | |
831 | assert_eq!(xs.iter().skip(13).count(), 0); | |
832 | } | |
833 | ||
834 | #[test] | |
835 | fn test_iterator_skip_last() { | |
836 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; | |
837 | ||
838 | assert_eq!(xs.iter().skip(0).last(), Some(&30)); | |
839 | assert_eq!(xs.iter().skip(1).last(), Some(&30)); | |
840 | assert_eq!(xs.iter().skip(11).last(), Some(&30)); | |
841 | assert_eq!(xs.iter().skip(12).last(), None); | |
842 | assert_eq!(xs.iter().skip(13).last(), None); | |
843 | ||
844 | let mut it = xs.iter().skip(5); | |
845 | assert_eq!(it.next(), Some(&13)); | |
846 | assert_eq!(it.last(), Some(&30)); | |
847 | } | |
848 | ||
ea8adc8c XL |
849 | #[test] |
850 | fn test_iterator_skip_fold() { | |
851 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; | |
852 | let ys = [13, 15, 16, 17, 19, 20, 30]; | |
abe05a73 | 853 | |
ea8adc8c XL |
854 | let it = xs.iter().skip(5); |
855 | let i = it.fold(0, |i, &x| { | |
856 | assert_eq!(x, ys[i]); | |
857 | i + 1 | |
858 | }); | |
859 | assert_eq!(i, ys.len()); | |
860 | ||
861 | let mut it = xs.iter().skip(5); | |
862 | assert_eq!(it.next(), Some(&ys[0])); // process skips before folding | |
863 | let i = it.fold(1, |i, &x| { | |
864 | assert_eq!(x, ys[i]); | |
865 | i + 1 | |
866 | }); | |
867 | assert_eq!(i, ys.len()); | |
abe05a73 XL |
868 | |
869 | let it = xs.iter().skip(5); | |
870 | let i = it.rfold(ys.len(), |i, &x| { | |
871 | let i = i - 1; | |
872 | assert_eq!(x, ys[i]); | |
873 | i | |
874 | }); | |
875 | assert_eq!(i, 0); | |
876 | ||
877 | let mut it = xs.iter().skip(5); | |
878 | assert_eq!(it.next(), Some(&ys[0])); // process skips before folding | |
879 | let i = it.rfold(ys.len(), |i, &x| { | |
880 | let i = i - 1; | |
881 | assert_eq!(x, ys[i]); | |
882 | i | |
883 | }); | |
884 | assert_eq!(i, 1); | |
885 | ||
ea8adc8c XL |
886 | } |
887 | ||
1a4d82fc JJ |
888 | #[test] |
889 | fn test_iterator_take() { | |
85aaf69f SL |
890 | let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19]; |
891 | let ys = [0, 1, 2, 3, 5]; | |
416331ca XL |
892 | |
893 | let mut it = xs.iter().take(ys.len()); | |
1a4d82fc | 894 | let mut i = 0; |
416331ca | 895 | assert_eq!(it.len(), ys.len()); |
85aaf69f SL |
896 | while let Some(&x) = it.next() { |
897 | assert_eq!(x, ys[i]); | |
898 | i += 1; | |
416331ca XL |
899 | assert_eq!(it.len(), ys.len() - i); |
900 | } | |
901 | assert_eq!(i, ys.len()); | |
902 | assert_eq!(it.len(), 0); | |
903 | ||
904 | let mut it = xs.iter().take(ys.len()); | |
905 | let mut i = 0; | |
906 | assert_eq!(it.len(), ys.len()); | |
907 | while let Some(&x) = it.next_back() { | |
908 | i += 1; | |
909 | assert_eq!(x, ys[ys.len() - i]); | |
910 | assert_eq!(it.len(), ys.len() - i); | |
85aaf69f SL |
911 | } |
912 | assert_eq!(i, ys.len()); | |
913 | assert_eq!(it.len(), 0); | |
914 | } | |
915 | ||
d9579d0f AL |
916 | #[test] |
917 | fn test_iterator_take_nth() { | |
918 | let xs = [0, 1, 2, 4, 5]; | |
919 | let mut it = xs.iter(); | |
920 | { | |
921 | let mut take = it.by_ref().take(3); | |
922 | let mut i = 0; | |
923 | while let Some(&x) = take.nth(0) { | |
924 | assert_eq!(x, i); | |
925 | i += 1; | |
926 | } | |
927 | } | |
928 | assert_eq!(it.nth(1), Some(&5)); | |
929 | assert_eq!(it.nth(0), None); | |
930 | ||
931 | let xs = [0, 1, 2, 3, 4]; | |
932 | let mut it = xs.iter().take(7); | |
933 | let mut i = 1; | |
934 | while let Some(&x) = it.nth(1) { | |
935 | assert_eq!(x, i); | |
936 | i += 2; | |
937 | } | |
938 | } | |
939 | ||
416331ca XL |
940 | #[test] |
941 | fn test_iterator_take_nth_back() { | |
942 | let xs = [0, 1, 2, 4, 5]; | |
943 | let mut it = xs.iter(); | |
944 | { | |
945 | let mut take = it.by_ref().take(3); | |
946 | let mut i = 0; | |
947 | while let Some(&x) = take.nth_back(0) { | |
948 | i += 1; | |
949 | assert_eq!(x, 3 - i); | |
950 | } | |
951 | } | |
952 | assert_eq!(it.nth_back(0), None); | |
953 | ||
954 | let xs = [0, 1, 2, 3, 4]; | |
955 | let mut it = xs.iter().take(7); | |
956 | assert_eq!(it.nth_back(1), Some(&3)); | |
957 | assert_eq!(it.nth_back(1), Some(&1)); | |
958 | assert_eq!(it.nth_back(1), None); | |
959 | } | |
960 | ||
85aaf69f SL |
961 | #[test] |
962 | fn test_iterator_take_short() { | |
963 | let xs = [0, 1, 2, 3]; | |
416331ca | 964 | |
85aaf69f SL |
965 | let mut it = xs.iter().take(5); |
966 | let mut i = 0; | |
416331ca | 967 | assert_eq!(it.len(), xs.len()); |
85aaf69f | 968 | while let Some(&x) = it.next() { |
416331ca | 969 | assert_eq!(x, xs[i]); |
1a4d82fc | 970 | i += 1; |
416331ca | 971 | assert_eq!(it.len(), xs.len() - i); |
1a4d82fc | 972 | } |
416331ca XL |
973 | assert_eq!(i, xs.len()); |
974 | assert_eq!(it.len(), 0); | |
975 | ||
976 | let mut it = xs.iter().take(5); | |
977 | let mut i = 0; | |
978 | assert_eq!(it.len(), xs.len()); | |
979 | while let Some(&x) = it.next_back() { | |
980 | i += 1; | |
981 | assert_eq!(x, xs[xs.len() - i]); | |
982 | assert_eq!(it.len(), xs.len() - i); | |
983 | } | |
984 | assert_eq!(i, xs.len()); | |
85aaf69f | 985 | assert_eq!(it.len(), 0); |
1a4d82fc JJ |
986 | } |
987 | ||
988 | #[test] | |
989 | fn test_iterator_scan() { | |
990 | // test the type inference | |
c34b1796 AL |
991 | fn add(old: &mut isize, new: &usize) -> Option<f64> { |
992 | *old += *new as isize; | |
1a4d82fc JJ |
993 | Some(*old as f64) |
994 | } | |
85aaf69f | 995 | let xs = [0, 1, 2, 3, 4]; |
1a4d82fc JJ |
996 | let ys = [0f64, 1.0, 3.0, 6.0, 10.0]; |
997 | ||
c34b1796 | 998 | let it = xs.iter().scan(0, add); |
1a4d82fc JJ |
999 | let mut i = 0; |
1000 | for x in it { | |
1001 | assert_eq!(x, ys[i]); | |
1002 | i += 1; | |
1003 | } | |
1004 | assert_eq!(i, ys.len()); | |
1005 | } | |
1006 | ||
1007 | #[test] | |
1008 | fn test_iterator_flat_map() { | |
85aaf69f SL |
1009 | let xs = [0, 3, 6]; |
1010 | let ys = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | |
041b39d2 | 1011 | let it = xs.iter().flat_map(|&x| (x..).step_by(1).take(3)); |
1a4d82fc JJ |
1012 | let mut i = 0; |
1013 | for x in it { | |
1014 | assert_eq!(x, ys[i]); | |
1015 | i += 1; | |
1016 | } | |
1017 | assert_eq!(i, ys.len()); | |
1018 | } | |
1019 | ||
9fa01778 | 1020 | /// Tests `FlatMap::fold` with items already picked off the front and back, |
ea8adc8c XL |
1021 | /// to make sure all parts of the `FlatMap` are folded correctly. |
1022 | #[test] | |
1023 | fn test_iterator_flat_map_fold() { | |
1024 | let xs = [0, 3, 6]; | |
1025 | let ys = [1, 2, 3, 4, 5, 6, 7]; | |
1026 | let mut it = xs.iter().flat_map(|&x| x..x+3); | |
1027 | assert_eq!(it.next(), Some(0)); | |
1028 | assert_eq!(it.next_back(), Some(8)); | |
1029 | let i = it.fold(0, |i, x| { | |
1030 | assert_eq!(x, ys[i]); | |
1031 | i + 1 | |
1032 | }); | |
1033 | assert_eq!(i, ys.len()); | |
1034 | ||
1035 | let mut it = xs.iter().flat_map(|&x| x..x+3); | |
1036 | assert_eq!(it.next(), Some(0)); | |
1037 | assert_eq!(it.next_back(), Some(8)); | |
1038 | let i = it.rfold(ys.len(), |i, x| { | |
1039 | assert_eq!(x, ys[i - 1]); | |
1040 | i - 1 | |
1041 | }); | |
1042 | assert_eq!(i, 0); | |
1043 | } | |
1044 | ||
0531ce1d XL |
1045 | #[test] |
1046 | fn test_iterator_flatten() { | |
1047 | let xs = [0, 3, 6]; | |
1048 | let ys = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | |
1049 | let it = xs.iter().map(|&x| (x..).step_by(1).take(3)).flatten(); | |
1050 | let mut i = 0; | |
1051 | for x in it { | |
1052 | assert_eq!(x, ys[i]); | |
1053 | i += 1; | |
1054 | } | |
1055 | assert_eq!(i, ys.len()); | |
1056 | } | |
1057 | ||
9fa01778 | 1058 | /// Tests `Flatten::fold` with items already picked off the front and back, |
0531ce1d XL |
1059 | /// to make sure all parts of the `Flatten` are folded correctly. |
1060 | #[test] | |
1061 | fn test_iterator_flatten_fold() { | |
1062 | let xs = [0, 3, 6]; | |
1063 | let ys = [1, 2, 3, 4, 5, 6, 7]; | |
1064 | let mut it = xs.iter().map(|&x| x..x+3).flatten(); | |
1065 | assert_eq!(it.next(), Some(0)); | |
1066 | assert_eq!(it.next_back(), Some(8)); | |
1067 | let i = it.fold(0, |i, x| { | |
1068 | assert_eq!(x, ys[i]); | |
1069 | i + 1 | |
1070 | }); | |
1071 | assert_eq!(i, ys.len()); | |
1072 | ||
1073 | let mut it = xs.iter().map(|&x| x..x+3).flatten(); | |
1074 | assert_eq!(it.next(), Some(0)); | |
1075 | assert_eq!(it.next_back(), Some(8)); | |
1076 | let i = it.rfold(ys.len(), |i, x| { | |
1077 | assert_eq!(x, ys[i - 1]); | |
1078 | i - 1 | |
1079 | }); | |
1080 | assert_eq!(i, 0); | |
1081 | } | |
1082 | ||
1a4d82fc JJ |
1083 | #[test] |
1084 | fn test_inspect() { | |
85aaf69f SL |
1085 | let xs = [1, 2, 3, 4]; |
1086 | let mut n = 0; | |
1a4d82fc JJ |
1087 | |
1088 | let ys = xs.iter() | |
85aaf69f | 1089 | .cloned() |
1a4d82fc | 1090 | .inspect(|_| n += 1) |
c34b1796 | 1091 | .collect::<Vec<usize>>(); |
1a4d82fc JJ |
1092 | |
1093 | assert_eq!(n, xs.len()); | |
85aaf69f | 1094 | assert_eq!(&xs[..], &ys[..]); |
1a4d82fc JJ |
1095 | } |
1096 | ||
ea8adc8c XL |
1097 | #[test] |
1098 | fn test_inspect_fold() { | |
1099 | let xs = [1, 2, 3, 4]; | |
1100 | let mut n = 0; | |
1101 | { | |
1102 | let it = xs.iter().inspect(|_| n += 1); | |
1103 | let i = it.fold(0, |i, &x| { | |
1104 | assert_eq!(x, xs[i]); | |
1105 | i + 1 | |
1106 | }); | |
1107 | assert_eq!(i, xs.len()); | |
1108 | } | |
1109 | assert_eq!(n, xs.len()); | |
1110 | ||
1111 | let mut n = 0; | |
1112 | { | |
1113 | let it = xs.iter().inspect(|_| n += 1); | |
1114 | let i = it.rfold(xs.len(), |i, &x| { | |
1115 | assert_eq!(x, xs[i - 1]); | |
1116 | i - 1 | |
1117 | }); | |
1118 | assert_eq!(i, 0); | |
1119 | } | |
1120 | assert_eq!(n, xs.len()); | |
1121 | } | |
1122 | ||
1a4d82fc JJ |
1123 | #[test] |
1124 | fn test_cycle() { | |
1125 | let cycle_len = 3; | |
041b39d2 | 1126 | let it = (0..).step_by(1).take(cycle_len).cycle(); |
c34b1796 | 1127 | assert_eq!(it.size_hint(), (usize::MAX, None)); |
1a4d82fc JJ |
1128 | for (i, x) in it.take(100).enumerate() { |
1129 | assert_eq!(i % cycle_len, x); | |
1130 | } | |
1131 | ||
041b39d2 | 1132 | let mut it = (0..).step_by(1).take(0).cycle(); |
1a4d82fc JJ |
1133 | assert_eq!(it.size_hint(), (0, Some(0))); |
1134 | assert_eq!(it.next(), None); | |
0731742a XL |
1135 | |
1136 | assert_eq!(empty::<i32>().cycle().fold(0, |acc, x| acc + x), 0); | |
1137 | ||
1138 | assert_eq!(once(1).cycle().skip(1).take(4).fold(0, |acc, x| acc + x), 4); | |
1a4d82fc JJ |
1139 | } |
1140 | ||
1141 | #[test] | |
1142 | fn test_iterator_nth() { | |
85aaf69f SL |
1143 | let v: &[_] = &[0, 1, 2, 3, 4]; |
1144 | for i in 0..v.len() { | |
1a4d82fc JJ |
1145 | assert_eq!(v.iter().nth(i).unwrap(), &v[i]); |
1146 | } | |
1147 | assert_eq!(v.iter().nth(v.len()), None); | |
1148 | } | |
1149 | ||
0731742a XL |
1150 | #[test] |
1151 | fn test_iterator_nth_back() { | |
1152 | let v: &[_] = &[0, 1, 2, 3, 4]; | |
1153 | for i in 0..v.len() { | |
1154 | assert_eq!(v.iter().nth_back(i).unwrap(), &v[v.len() - 1 - i]); | |
1155 | } | |
1156 | assert_eq!(v.iter().nth_back(v.len()), None); | |
1157 | } | |
1158 | ||
1159 | #[test] | |
1160 | fn test_iterator_rev_nth_back() { | |
1161 | let v: &[_] = &[0, 1, 2, 3, 4]; | |
1162 | for i in 0..v.len() { | |
1163 | assert_eq!(v.iter().rev().nth_back(i).unwrap(), &v[i]); | |
1164 | } | |
1165 | assert_eq!(v.iter().rev().nth_back(v.len()), None); | |
1166 | } | |
1167 | ||
1168 | #[test] | |
1169 | fn test_iterator_rev_nth() { | |
1170 | let v: &[_] = &[0, 1, 2, 3, 4]; | |
1171 | for i in 0..v.len() { | |
1172 | assert_eq!(v.iter().rev().nth(i).unwrap(), &v[v.len() - 1 - i]); | |
1173 | } | |
1174 | assert_eq!(v.iter().rev().nth(v.len()), None); | |
1175 | } | |
1176 | ||
1a4d82fc JJ |
1177 | #[test] |
1178 | fn test_iterator_last() { | |
85aaf69f | 1179 | let v: &[_] = &[0, 1, 2, 3, 4]; |
1a4d82fc JJ |
1180 | assert_eq!(v.iter().last().unwrap(), &4); |
1181 | assert_eq!(v[..1].iter().last().unwrap(), &0); | |
1182 | } | |
1183 | ||
1184 | #[test] | |
1185 | fn test_iterator_len() { | |
85aaf69f | 1186 | let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
1a4d82fc JJ |
1187 | assert_eq!(v[..4].iter().count(), 4); |
1188 | assert_eq!(v[..10].iter().count(), 10); | |
85aaf69f | 1189 | assert_eq!(v[..0].iter().count(), 0); |
1a4d82fc JJ |
1190 | } |
1191 | ||
1192 | #[test] | |
1193 | fn test_iterator_sum() { | |
85aaf69f | 1194 | let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
9346a6ac AL |
1195 | assert_eq!(v[..4].iter().cloned().sum::<i32>(), 6); |
1196 | assert_eq!(v.iter().cloned().sum::<i32>(), 55); | |
1197 | assert_eq!(v[..0].iter().cloned().sum::<i32>(), 0); | |
1a4d82fc JJ |
1198 | } |
1199 | ||
32a655c1 SL |
1200 | #[test] |
1201 | fn test_iterator_sum_result() { | |
1202 | let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; | |
1203 | assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Ok(10)); | |
1204 | let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)]; | |
1205 | assert_eq!(v.iter().cloned().sum::<Result<i32, _>>(), Err(())); | |
416331ca XL |
1206 | |
1207 | #[derive(PartialEq, Debug)] | |
1208 | struct S(Result<i32, ()>); | |
1209 | ||
1210 | impl Sum<Result<i32, ()>> for S { | |
1211 | fn sum<I: Iterator<Item = Result<i32, ()>>>(mut iter: I) -> Self { | |
1212 | // takes the sum by repeatedly calling `next` on `iter`, | |
1213 | // thus testing that repeated calls to `ResultShunt::try_fold` | |
1214 | // produce the expected results | |
1215 | Self(iter.by_ref().sum()) | |
1216 | } | |
1217 | } | |
1218 | ||
1219 | let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; | |
1220 | assert_eq!(v.iter().cloned().sum::<S>(), S(Ok(10))); | |
1221 | let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)]; | |
1222 | assert_eq!(v.iter().cloned().sum::<S>(), S(Err(()))); | |
32a655c1 SL |
1223 | } |
1224 | ||
dc9dc135 XL |
1225 | #[test] |
1226 | fn test_iterator_sum_option() { | |
1227 | let v: &[Option<i32>] = &[Some(1), Some(2), Some(3), Some(4)]; | |
1228 | assert_eq!(v.iter().cloned().sum::<Option<i32>>(), Some(10)); | |
1229 | let v: &[Option<i32>] = &[Some(1), None, Some(3), Some(4)]; | |
1230 | assert_eq!(v.iter().cloned().sum::<Option<i32>>(), None); | |
1231 | } | |
1232 | ||
1a4d82fc JJ |
1233 | #[test] |
1234 | fn test_iterator_product() { | |
85aaf69f | 1235 | let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
9346a6ac AL |
1236 | assert_eq!(v[..4].iter().cloned().product::<i32>(), 0); |
1237 | assert_eq!(v[1..5].iter().cloned().product::<i32>(), 24); | |
1238 | assert_eq!(v[..0].iter().cloned().product::<i32>(), 1); | |
1a4d82fc JJ |
1239 | } |
1240 | ||
32a655c1 SL |
1241 | #[test] |
1242 | fn test_iterator_product_result() { | |
1243 | let v: &[Result<i32, ()>] = &[Ok(1), Ok(2), Ok(3), Ok(4)]; | |
1244 | assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Ok(24)); | |
1245 | let v: &[Result<i32, ()>] = &[Ok(1), Err(()), Ok(3), Ok(4)]; | |
1246 | assert_eq!(v.iter().cloned().product::<Result<i32, _>>(), Err(())); | |
1247 | } | |
1248 | ||
532ac7d7 XL |
1249 | /// A wrapper struct that implements `Eq` and `Ord` based on the wrapped |
1250 | /// integer modulo 3. Used to test that `Iterator::max` and `Iterator::min` | |
1251 | /// return the correct element if some of them are equal. | |
1252 | #[derive(Debug)] | |
1253 | struct Mod3(i32); | |
1254 | ||
1255 | impl PartialEq for Mod3 { | |
1256 | fn eq(&self, other: &Self) -> bool { | |
1257 | self.0 % 3 == other.0 % 3 | |
1258 | } | |
1259 | } | |
1260 | ||
1261 | impl Eq for Mod3 {} | |
1262 | ||
1263 | impl PartialOrd for Mod3 { | |
1264 | fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> { | |
1265 | Some(self.cmp(other)) | |
1266 | } | |
1267 | } | |
1268 | ||
1269 | impl Ord for Mod3 { | |
1270 | fn cmp(&self, other: &Self) -> core::cmp::Ordering { | |
1271 | (self.0 % 3).cmp(&(other.0 % 3)) | |
1272 | } | |
1273 | } | |
1274 | ||
dc9dc135 XL |
1275 | #[test] |
1276 | fn test_iterator_product_option() { | |
1277 | let v: &[Option<i32>] = &[Some(1), Some(2), Some(3), Some(4)]; | |
1278 | assert_eq!(v.iter().cloned().product::<Option<i32>>(), Some(24)); | |
1279 | let v: &[Option<i32>] = &[Some(1), None, Some(3), Some(4)]; | |
1280 | assert_eq!(v.iter().cloned().product::<Option<i32>>(), None); | |
1281 | } | |
1282 | ||
1a4d82fc JJ |
1283 | #[test] |
1284 | fn test_iterator_max() { | |
85aaf69f SL |
1285 | let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
1286 | assert_eq!(v[..4].iter().cloned().max(), Some(3)); | |
1287 | assert_eq!(v.iter().cloned().max(), Some(10)); | |
1288 | assert_eq!(v[..0].iter().cloned().max(), None); | |
532ac7d7 | 1289 | assert_eq!(v.iter().cloned().map(Mod3).max().map(|x| x.0), Some(8)); |
1a4d82fc JJ |
1290 | } |
1291 | ||
1292 | #[test] | |
1293 | fn test_iterator_min() { | |
85aaf69f SL |
1294 | let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
1295 | assert_eq!(v[..4].iter().cloned().min(), Some(0)); | |
1296 | assert_eq!(v.iter().cloned().min(), Some(0)); | |
1297 | assert_eq!(v[..0].iter().cloned().min(), None); | |
532ac7d7 | 1298 | assert_eq!(v.iter().cloned().map(Mod3).min().map(|x| x.0), Some(0)); |
1a4d82fc JJ |
1299 | } |
1300 | ||
1301 | #[test] | |
1302 | fn test_iterator_size_hint() { | |
041b39d2 | 1303 | let c = (0..).step_by(1); |
85aaf69f SL |
1304 | let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; |
1305 | let v2 = &[10, 11, 12]; | |
1a4d82fc JJ |
1306 | let vi = v.iter(); |
1307 | ||
7cac9316 | 1308 | assert_eq!((0..).size_hint(), (usize::MAX, None)); |
c34b1796 | 1309 | assert_eq!(c.size_hint(), (usize::MAX, None)); |
85aaf69f SL |
1310 | assert_eq!(vi.clone().size_hint(), (10, Some(10))); |
1311 | ||
1312 | assert_eq!(c.clone().take(5).size_hint(), (5, Some(5))); | |
1313 | assert_eq!(c.clone().skip(5).size_hint().1, None); | |
1314 | assert_eq!(c.clone().take_while(|_| false).size_hint(), (0, None)); | |
1315 | assert_eq!(c.clone().skip_while(|_| false).size_hint(), (0, None)); | |
c34b1796 AL |
1316 | assert_eq!(c.clone().enumerate().size_hint(), (usize::MAX, None)); |
1317 | assert_eq!(c.clone().chain(vi.clone().cloned()).size_hint(), (usize::MAX, None)); | |
85aaf69f SL |
1318 | assert_eq!(c.clone().zip(vi.clone()).size_hint(), (10, Some(10))); |
1319 | assert_eq!(c.clone().scan(0, |_,_| Some(0)).size_hint(), (0, None)); | |
1320 | assert_eq!(c.clone().filter(|_| false).size_hint(), (0, None)); | |
c34b1796 | 1321 | assert_eq!(c.clone().map(|_| 0).size_hint(), (usize::MAX, None)); |
85aaf69f SL |
1322 | assert_eq!(c.filter_map(|_| Some(0)).size_hint(), (0, None)); |
1323 | ||
1324 | assert_eq!(vi.clone().take(5).size_hint(), (5, Some(5))); | |
1325 | assert_eq!(vi.clone().take(12).size_hint(), (10, Some(10))); | |
1326 | assert_eq!(vi.clone().skip(3).size_hint(), (7, Some(7))); | |
1327 | assert_eq!(vi.clone().skip(12).size_hint(), (0, Some(0))); | |
1328 | assert_eq!(vi.clone().take_while(|_| false).size_hint(), (0, Some(10))); | |
1329 | assert_eq!(vi.clone().skip_while(|_| false).size_hint(), (0, Some(10))); | |
1330 | assert_eq!(vi.clone().enumerate().size_hint(), (10, Some(10))); | |
62682a34 SL |
1331 | assert_eq!(vi.clone().chain(v2).size_hint(), (13, Some(13))); |
1332 | assert_eq!(vi.clone().zip(v2).size_hint(), (3, Some(3))); | |
85aaf69f SL |
1333 | assert_eq!(vi.clone().scan(0, |_,_| Some(0)).size_hint(), (0, Some(10))); |
1334 | assert_eq!(vi.clone().filter(|_| false).size_hint(), (0, Some(10))); | |
1335 | assert_eq!(vi.clone().map(|&i| i+1).size_hint(), (10, Some(10))); | |
1336 | assert_eq!(vi.filter_map(|_| Some(0)).size_hint(), (0, Some(10))); | |
1a4d82fc JJ |
1337 | } |
1338 | ||
1339 | #[test] | |
1340 | fn test_collect() { | |
85aaf69f | 1341 | let a = vec![1, 2, 3, 4, 5]; |
c34b1796 | 1342 | let b: Vec<isize> = a.iter().cloned().collect(); |
1a4d82fc JJ |
1343 | assert!(a == b); |
1344 | } | |
1345 | ||
1346 | #[test] | |
1347 | fn test_all() { | |
c34b1796 | 1348 | let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]); |
1a4d82fc JJ |
1349 | assert!(v.iter().all(|&x| x < 10)); |
1350 | assert!(!v.iter().all(|&x| x % 2 == 0)); | |
1351 | assert!(!v.iter().all(|&x| x > 100)); | |
85aaf69f | 1352 | assert!(v[..0].iter().all(|_| panic!())); |
1a4d82fc JJ |
1353 | } |
1354 | ||
1355 | #[test] | |
1356 | fn test_any() { | |
c34b1796 | 1357 | let v: Box<[isize]> = Box::new([1, 2, 3, 4, 5]); |
1a4d82fc JJ |
1358 | assert!(v.iter().any(|&x| x < 10)); |
1359 | assert!(v.iter().any(|&x| x % 2 == 0)); | |
1360 | assert!(!v.iter().any(|&x| x > 100)); | |
85aaf69f | 1361 | assert!(!v[..0].iter().any(|_| panic!())); |
1a4d82fc JJ |
1362 | } |
1363 | ||
1364 | #[test] | |
1365 | fn test_find() { | |
c34b1796 | 1366 | let v: &[isize] = &[1, 3, 9, 27, 103, 14, 11]; |
1a4d82fc JJ |
1367 | assert_eq!(*v.iter().find(|&&x| x & 1 == 0).unwrap(), 14); |
1368 | assert_eq!(*v.iter().find(|&&x| x % 3 == 0).unwrap(), 3); | |
1369 | assert!(v.iter().find(|&&x| x % 12 == 0).is_none()); | |
1370 | } | |
1371 | ||
83c7162d XL |
1372 | #[test] |
1373 | fn test_find_map() { | |
1374 | let xs: &[isize] = &[]; | |
1375 | assert_eq!(xs.iter().find_map(half_if_even), None); | |
1376 | let xs: &[isize] = &[3, 5]; | |
1377 | assert_eq!(xs.iter().find_map(half_if_even), None); | |
1378 | let xs: &[isize] = &[4, 5]; | |
1379 | assert_eq!(xs.iter().find_map(half_if_even), Some(2)); | |
1380 | let xs: &[isize] = &[3, 6]; | |
1381 | assert_eq!(xs.iter().find_map(half_if_even), Some(3)); | |
1382 | ||
1383 | let xs: &[isize] = &[1, 2, 3, 4, 5, 6, 7]; | |
1384 | let mut iter = xs.iter(); | |
1385 | assert_eq!(iter.find_map(half_if_even), Some(1)); | |
1386 | assert_eq!(iter.find_map(half_if_even), Some(2)); | |
1387 | assert_eq!(iter.find_map(half_if_even), Some(3)); | |
1388 | assert_eq!(iter.next(), Some(&7)); | |
1389 | ||
1390 | fn half_if_even(x: &isize) -> Option<isize> { | |
1391 | if x % 2 == 0 { | |
1392 | Some(x / 2) | |
1393 | } else { | |
1394 | None | |
1395 | } | |
1396 | } | |
1397 | } | |
1398 | ||
1a4d82fc JJ |
1399 | #[test] |
1400 | fn test_position() { | |
85aaf69f | 1401 | let v = &[1, 3, 9, 27, 103, 14, 11]; |
1a4d82fc JJ |
1402 | assert_eq!(v.iter().position(|x| *x & 1 == 0).unwrap(), 5); |
1403 | assert_eq!(v.iter().position(|x| *x % 3 == 0).unwrap(), 1); | |
1404 | assert!(v.iter().position(|x| *x % 12 == 0).is_none()); | |
1405 | } | |
1406 | ||
1407 | #[test] | |
1408 | fn test_count() { | |
85aaf69f | 1409 | let xs = &[1, 2, 2, 1, 5, 9, 0, 2]; |
1a4d82fc JJ |
1410 | assert_eq!(xs.iter().filter(|x| **x == 2).count(), 3); |
1411 | assert_eq!(xs.iter().filter(|x| **x == 5).count(), 1); | |
1412 | assert_eq!(xs.iter().filter(|x| **x == 95).count(), 0); | |
1413 | } | |
1414 | ||
1415 | #[test] | |
7453a54e | 1416 | fn test_max_by_key() { |
c34b1796 | 1417 | let xs: &[isize] = &[-3, 0, 1, 5, -10]; |
7453a54e | 1418 | assert_eq!(*xs.iter().max_by_key(|x| x.abs()).unwrap(), -10); |
1a4d82fc JJ |
1419 | } |
1420 | ||
9e0c209e SL |
1421 | #[test] |
1422 | fn test_max_by() { | |
1423 | let xs: &[isize] = &[-3, 0, 1, 5, -10]; | |
1424 | assert_eq!(*xs.iter().max_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), -10); | |
1425 | } | |
1426 | ||
1a4d82fc | 1427 | #[test] |
7453a54e | 1428 | fn test_min_by_key() { |
c34b1796 | 1429 | let xs: &[isize] = &[-3, 0, 1, 5, -10]; |
7453a54e | 1430 | assert_eq!(*xs.iter().min_by_key(|x| x.abs()).unwrap(), 0); |
1a4d82fc JJ |
1431 | } |
1432 | ||
9e0c209e SL |
1433 | #[test] |
1434 | fn test_min_by() { | |
1435 | let xs: &[isize] = &[-3, 0, 1, 5, -10]; | |
1436 | assert_eq!(*xs.iter().min_by(|x, y| x.abs().cmp(&y.abs())).unwrap(), 0); | |
1437 | } | |
1438 | ||
1a4d82fc JJ |
1439 | #[test] |
1440 | fn test_by_ref() { | |
85aaf69f | 1441 | let mut xs = 0..10; |
1a4d82fc JJ |
1442 | // sum the first five values |
1443 | let partial_sum = xs.by_ref().take(5).fold(0, |a, b| a + b); | |
1444 | assert_eq!(partial_sum, 10); | |
1445 | assert_eq!(xs.next(), Some(5)); | |
1446 | } | |
1447 | ||
1448 | #[test] | |
1449 | fn test_rev() { | |
85aaf69f | 1450 | let xs = [2, 4, 6, 8, 10, 12, 14, 16]; |
1a4d82fc JJ |
1451 | let mut it = xs.iter(); |
1452 | it.next(); | |
1453 | it.next(); | |
c34b1796 | 1454 | assert!(it.rev().cloned().collect::<Vec<isize>>() == |
1a4d82fc JJ |
1455 | vec![16, 14, 12, 10, 8, 6]); |
1456 | } | |
1457 | ||
0731742a XL |
1458 | #[test] |
1459 | fn test_copied() { | |
1460 | let xs = [2, 4, 6, 8]; | |
1461 | ||
1462 | let mut it = xs.iter().copied(); | |
1463 | assert_eq!(it.len(), 4); | |
1464 | assert_eq!(it.next(), Some(2)); | |
1465 | assert_eq!(it.len(), 3); | |
1466 | assert_eq!(it.next(), Some(4)); | |
1467 | assert_eq!(it.len(), 2); | |
1468 | assert_eq!(it.next_back(), Some(8)); | |
1469 | assert_eq!(it.len(), 1); | |
1470 | assert_eq!(it.next_back(), Some(6)); | |
1471 | assert_eq!(it.len(), 0); | |
1472 | assert_eq!(it.next_back(), None); | |
1473 | } | |
1474 | ||
1a4d82fc JJ |
1475 | #[test] |
1476 | fn test_cloned() { | |
54a0048b | 1477 | let xs = [2, 4, 6, 8]; |
1a4d82fc JJ |
1478 | |
1479 | let mut it = xs.iter().cloned(); | |
1480 | assert_eq!(it.len(), 4); | |
1481 | assert_eq!(it.next(), Some(2)); | |
1482 | assert_eq!(it.len(), 3); | |
1483 | assert_eq!(it.next(), Some(4)); | |
1484 | assert_eq!(it.len(), 2); | |
1485 | assert_eq!(it.next_back(), Some(8)); | |
1486 | assert_eq!(it.len(), 1); | |
1487 | assert_eq!(it.next_back(), Some(6)); | |
1488 | assert_eq!(it.len(), 0); | |
1489 | assert_eq!(it.next_back(), None); | |
1490 | } | |
1491 | ||
0731742a XL |
1492 | #[test] |
1493 | fn test_cloned_side_effects() { | |
1494 | let mut count = 0; | |
1495 | { | |
1496 | let iter = [1, 2, 3] | |
1497 | .iter() | |
1498 | .map(|x| { | |
1499 | count += 1; | |
1500 | x | |
1501 | }) | |
1502 | .cloned() | |
1503 | .zip(&[1]); | |
1504 | for _ in iter {} | |
1505 | } | |
1506 | assert_eq!(count, 2); | |
1507 | } | |
1508 | ||
1a4d82fc JJ |
1509 | #[test] |
1510 | fn test_double_ended_map() { | |
85aaf69f | 1511 | let xs = [1, 2, 3, 4, 5, 6]; |
1a4d82fc JJ |
1512 | let mut it = xs.iter().map(|&x| x * -1); |
1513 | assert_eq!(it.next(), Some(-1)); | |
1514 | assert_eq!(it.next(), Some(-2)); | |
1515 | assert_eq!(it.next_back(), Some(-6)); | |
1516 | assert_eq!(it.next_back(), Some(-5)); | |
1517 | assert_eq!(it.next(), Some(-3)); | |
1518 | assert_eq!(it.next_back(), Some(-4)); | |
1519 | assert_eq!(it.next(), None); | |
1520 | } | |
1521 | ||
1522 | #[test] | |
1523 | fn test_double_ended_enumerate() { | |
85aaf69f SL |
1524 | let xs = [1, 2, 3, 4, 5, 6]; |
1525 | let mut it = xs.iter().cloned().enumerate(); | |
1a4d82fc JJ |
1526 | assert_eq!(it.next(), Some((0, 1))); |
1527 | assert_eq!(it.next(), Some((1, 2))); | |
1528 | assert_eq!(it.next_back(), Some((5, 6))); | |
1529 | assert_eq!(it.next_back(), Some((4, 5))); | |
1530 | assert_eq!(it.next_back(), Some((3, 4))); | |
1531 | assert_eq!(it.next_back(), Some((2, 3))); | |
1532 | assert_eq!(it.next(), None); | |
1533 | } | |
1534 | ||
1535 | #[test] | |
1536 | fn test_double_ended_zip() { | |
85aaf69f SL |
1537 | let xs = [1, 2, 3, 4, 5, 6]; |
1538 | let ys = [1, 2, 3, 7]; | |
1539 | let a = xs.iter().cloned(); | |
1540 | let b = ys.iter().cloned(); | |
1a4d82fc JJ |
1541 | let mut it = a.zip(b); |
1542 | assert_eq!(it.next(), Some((1, 1))); | |
1543 | assert_eq!(it.next(), Some((2, 2))); | |
1544 | assert_eq!(it.next_back(), Some((4, 7))); | |
1545 | assert_eq!(it.next_back(), Some((3, 3))); | |
1546 | assert_eq!(it.next(), None); | |
1547 | } | |
1548 | ||
1549 | #[test] | |
1550 | fn test_double_ended_filter() { | |
85aaf69f | 1551 | let xs = [1, 2, 3, 4, 5, 6]; |
1a4d82fc JJ |
1552 | let mut it = xs.iter().filter(|&x| *x & 1 == 0); |
1553 | assert_eq!(it.next_back().unwrap(), &6); | |
1554 | assert_eq!(it.next_back().unwrap(), &4); | |
1555 | assert_eq!(it.next().unwrap(), &2); | |
1556 | assert_eq!(it.next_back(), None); | |
1557 | } | |
1558 | ||
1559 | #[test] | |
1560 | fn test_double_ended_filter_map() { | |
85aaf69f | 1561 | let xs = [1, 2, 3, 4, 5, 6]; |
1a4d82fc JJ |
1562 | let mut it = xs.iter().filter_map(|&x| if x & 1 == 0 { Some(x * 2) } else { None }); |
1563 | assert_eq!(it.next_back().unwrap(), 12); | |
1564 | assert_eq!(it.next_back().unwrap(), 8); | |
1565 | assert_eq!(it.next().unwrap(), 4); | |
1566 | assert_eq!(it.next_back(), None); | |
1567 | } | |
1568 | ||
1569 | #[test] | |
1570 | fn test_double_ended_chain() { | |
85aaf69f SL |
1571 | let xs = [1, 2, 3, 4, 5]; |
1572 | let ys = [7, 9, 11]; | |
62682a34 | 1573 | let mut it = xs.iter().chain(&ys).rev(); |
1a4d82fc JJ |
1574 | assert_eq!(it.next().unwrap(), &11); |
1575 | assert_eq!(it.next().unwrap(), &9); | |
1576 | assert_eq!(it.next_back().unwrap(), &1); | |
1577 | assert_eq!(it.next_back().unwrap(), &2); | |
1578 | assert_eq!(it.next_back().unwrap(), &3); | |
1579 | assert_eq!(it.next_back().unwrap(), &4); | |
1580 | assert_eq!(it.next_back().unwrap(), &5); | |
1581 | assert_eq!(it.next_back().unwrap(), &7); | |
1582 | assert_eq!(it.next_back(), None); | |
e9174d1e SL |
1583 | |
1584 | ||
1585 | // test that .chain() is well behaved with an unfused iterator | |
1586 | struct CrazyIterator(bool); | |
1587 | impl CrazyIterator { fn new() -> CrazyIterator { CrazyIterator(false) } } | |
1588 | impl Iterator for CrazyIterator { | |
1589 | type Item = i32; | |
1590 | fn next(&mut self) -> Option<i32> { | |
1591 | if self.0 { Some(99) } else { self.0 = true; None } | |
1592 | } | |
1593 | } | |
1594 | ||
1595 | impl DoubleEndedIterator for CrazyIterator { | |
1596 | fn next_back(&mut self) -> Option<i32> { | |
1597 | self.next() | |
1598 | } | |
1599 | } | |
1600 | ||
1601 | assert_eq!(CrazyIterator::new().chain(0..10).rev().last(), Some(0)); | |
1602 | assert!((0..10).chain(CrazyIterator::new()).rev().any(|i| i == 0)); | |
1a4d82fc JJ |
1603 | } |
1604 | ||
1605 | #[test] | |
1606 | fn test_rposition() { | |
c34b1796 AL |
1607 | fn f(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'b' } |
1608 | fn g(xy: &(isize, char)) -> bool { let (_x, y) = *xy; y == 'd' } | |
85aaf69f | 1609 | let v = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'b')]; |
1a4d82fc | 1610 | |
85aaf69f | 1611 | assert_eq!(v.iter().rposition(f), Some(3)); |
1a4d82fc JJ |
1612 | assert!(v.iter().rposition(g).is_none()); |
1613 | } | |
1614 | ||
1615 | #[test] | |
c34b1796 | 1616 | #[should_panic] |
1a4d82fc | 1617 | fn test_rposition_panic() { |
c34b1796 AL |
1618 | let v: [(Box<_>, Box<_>); 4] = |
1619 | [(box 0, box 0), (box 0, box 0), | |
1620 | (box 0, box 0), (box 0, box 0)]; | |
85aaf69f | 1621 | let mut i = 0; |
1a4d82fc JJ |
1622 | v.iter().rposition(|_elt| { |
1623 | if i == 2 { | |
1624 | panic!() | |
1625 | } | |
1626 | i += 1; | |
1627 | false | |
1628 | }); | |
1629 | } | |
1630 | ||
1631 | ||
1a4d82fc JJ |
1632 | #[test] |
1633 | fn test_double_ended_flat_map() { | |
85aaf69f SL |
1634 | let u = [0,1]; |
1635 | let v = [5,6,7,8]; | |
62682a34 | 1636 | let mut it = u.iter().flat_map(|x| &v[*x..v.len()]); |
1a4d82fc JJ |
1637 | assert_eq!(it.next_back().unwrap(), &8); |
1638 | assert_eq!(it.next().unwrap(), &5); | |
1639 | assert_eq!(it.next_back().unwrap(), &7); | |
1640 | assert_eq!(it.next_back().unwrap(), &6); | |
1641 | assert_eq!(it.next_back().unwrap(), &8); | |
1642 | assert_eq!(it.next().unwrap(), &6); | |
1643 | assert_eq!(it.next_back().unwrap(), &7); | |
1644 | assert_eq!(it.next_back(), None); | |
1645 | assert_eq!(it.next(), None); | |
1646 | assert_eq!(it.next_back(), None); | |
1647 | } | |
1648 | ||
0531ce1d XL |
1649 | #[test] |
1650 | fn test_double_ended_flatten() { | |
1651 | let u = [0,1]; | |
1652 | let v = [5,6,7,8]; | |
1653 | let mut it = u.iter().map(|x| &v[*x..v.len()]).flatten(); | |
1654 | assert_eq!(it.next_back().unwrap(), &8); | |
1655 | assert_eq!(it.next().unwrap(), &5); | |
1656 | assert_eq!(it.next_back().unwrap(), &7); | |
1657 | assert_eq!(it.next_back().unwrap(), &6); | |
1658 | assert_eq!(it.next_back().unwrap(), &8); | |
1659 | assert_eq!(it.next().unwrap(), &6); | |
1660 | assert_eq!(it.next_back().unwrap(), &7); | |
1661 | assert_eq!(it.next_back(), None); | |
1662 | assert_eq!(it.next(), None); | |
1663 | assert_eq!(it.next_back(), None); | |
1664 | } | |
1665 | ||
1a4d82fc JJ |
1666 | #[test] |
1667 | fn test_double_ended_range() { | |
c34b1796 | 1668 | assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]); |
85aaf69f | 1669 | for _ in (10..0).rev() { |
1a4d82fc JJ |
1670 | panic!("unreachable"); |
1671 | } | |
1672 | ||
c34b1796 | 1673 | assert_eq!((11..14).rev().collect::<Vec<_>>(), [13, 12, 11]); |
85aaf69f | 1674 | for _ in (10..0).rev() { |
1a4d82fc JJ |
1675 | panic!("unreachable"); |
1676 | } | |
1677 | } | |
1678 | ||
1679 | #[test] | |
1680 | fn test_range() { | |
c34b1796 AL |
1681 | assert_eq!((0..5).collect::<Vec<_>>(), [0, 1, 2, 3, 4]); |
1682 | assert_eq!((-10..-1).collect::<Vec<_>>(), [-10, -9, -8, -7, -6, -5, -4, -3, -2]); | |
1683 | assert_eq!((0..5).rev().collect::<Vec<_>>(), [4, 3, 2, 1, 0]); | |
85aaf69f SL |
1684 | assert_eq!((200..-5).count(), 0); |
1685 | assert_eq!((200..-5).rev().count(), 0); | |
1686 | assert_eq!((200..200).count(), 0); | |
1687 | assert_eq!((200..200).rev().count(), 0); | |
1a4d82fc | 1688 | |
85aaf69f | 1689 | assert_eq!((0..100).size_hint(), (100, Some(100))); |
c34b1796 AL |
1690 | // this test is only meaningful when sizeof usize < sizeof u64 |
1691 | assert_eq!((usize::MAX - 1..usize::MAX).size_hint(), (1, Some(1))); | |
85aaf69f SL |
1692 | assert_eq!((-10..-1).size_hint(), (9, Some(9))); |
1693 | assert_eq!((-1..-10).size_hint(), (0, Some(0))); | |
d9579d0f | 1694 | |
54a0048b SL |
1695 | assert_eq!((-70..58).size_hint(), (128, Some(128))); |
1696 | assert_eq!((-128..127).size_hint(), (255, Some(255))); | |
d9579d0f AL |
1697 | assert_eq!((-2..isize::MAX).size_hint(), |
1698 | (isize::MAX as usize + 2, Some(isize::MAX as usize + 2))); | |
1a4d82fc JJ |
1699 | } |
1700 | ||
0531ce1d XL |
1701 | #[test] |
1702 | fn test_range_exhaustion() { | |
1703 | let mut r = 10..10; | |
1704 | assert!(r.is_empty()); | |
1705 | assert_eq!(r.next(), None); | |
1706 | assert_eq!(r.next_back(), None); | |
1707 | assert_eq!(r, 10..10); | |
1708 | ||
1709 | let mut r = 10..12; | |
1710 | assert_eq!(r.next(), Some(10)); | |
1711 | assert_eq!(r.next(), Some(11)); | |
1712 | assert!(r.is_empty()); | |
1713 | assert_eq!(r, 12..12); | |
1714 | assert_eq!(r.next(), None); | |
1715 | ||
1716 | let mut r = 10..12; | |
1717 | assert_eq!(r.next_back(), Some(11)); | |
1718 | assert_eq!(r.next_back(), Some(10)); | |
1719 | assert!(r.is_empty()); | |
1720 | assert_eq!(r, 10..10); | |
1721 | assert_eq!(r.next_back(), None); | |
1722 | ||
1723 | let mut r = 100..10; | |
1724 | assert!(r.is_empty()); | |
1725 | assert_eq!(r.next(), None); | |
1726 | assert_eq!(r.next_back(), None); | |
1727 | assert_eq!(r, 100..10); | |
1728 | } | |
1729 | ||
041b39d2 XL |
1730 | #[test] |
1731 | fn test_range_inclusive_exhaustion() { | |
ea8adc8c | 1732 | let mut r = 10..=10; |
041b39d2 | 1733 | assert_eq!(r.next(), Some(10)); |
0531ce1d XL |
1734 | assert!(r.is_empty()); |
1735 | assert_eq!(r.next(), None); | |
1736 | assert_eq!(r.next(), None); | |
041b39d2 | 1737 | |
ea8adc8c | 1738 | let mut r = 10..=10; |
041b39d2 | 1739 | assert_eq!(r.next_back(), Some(10)); |
0531ce1d XL |
1740 | assert!(r.is_empty()); |
1741 | assert_eq!(r.next_back(), None); | |
041b39d2 | 1742 | |
2c00a5a8 XL |
1743 | let mut r = 10..=12; |
1744 | assert_eq!(r.next(), Some(10)); | |
1745 | assert_eq!(r.next(), Some(11)); | |
1746 | assert_eq!(r.next(), Some(12)); | |
0531ce1d XL |
1747 | assert!(r.is_empty()); |
1748 | assert_eq!(r.next(), None); | |
2c00a5a8 XL |
1749 | |
1750 | let mut r = 10..=12; | |
1751 | assert_eq!(r.next_back(), Some(12)); | |
1752 | assert_eq!(r.next_back(), Some(11)); | |
1753 | assert_eq!(r.next_back(), Some(10)); | |
0531ce1d XL |
1754 | assert!(r.is_empty()); |
1755 | assert_eq!(r.next_back(), None); | |
2c00a5a8 | 1756 | |
ea8adc8c | 1757 | let mut r = 10..=12; |
041b39d2 | 1758 | assert_eq!(r.nth(2), Some(12)); |
0531ce1d XL |
1759 | assert!(r.is_empty()); |
1760 | assert_eq!(r.next(), None); | |
041b39d2 | 1761 | |
ea8adc8c | 1762 | let mut r = 10..=12; |
041b39d2 | 1763 | assert_eq!(r.nth(5), None); |
0531ce1d XL |
1764 | assert!(r.is_empty()); |
1765 | assert_eq!(r.next(), None); | |
041b39d2 | 1766 | |
2c00a5a8 XL |
1767 | let mut r = 100..=10; |
1768 | assert_eq!(r.next(), None); | |
0531ce1d XL |
1769 | assert!(r.is_empty()); |
1770 | assert_eq!(r.next(), None); | |
1771 | assert_eq!(r.next(), None); | |
2c00a5a8 XL |
1772 | assert_eq!(r, 100..=10); |
1773 | ||
1774 | let mut r = 100..=10; | |
1775 | assert_eq!(r.next_back(), None); | |
0531ce1d XL |
1776 | assert!(r.is_empty()); |
1777 | assert_eq!(r.next_back(), None); | |
1778 | assert_eq!(r.next_back(), None); | |
2c00a5a8 | 1779 | assert_eq!(r, 100..=10); |
041b39d2 XL |
1780 | } |
1781 | ||
1782 | #[test] | |
1783 | fn test_range_nth() { | |
1784 | assert_eq!((10..15).nth(0), Some(10)); | |
1785 | assert_eq!((10..15).nth(1), Some(11)); | |
1786 | assert_eq!((10..15).nth(4), Some(14)); | |
1787 | assert_eq!((10..15).nth(5), None); | |
1788 | ||
1789 | let mut r = 10..20; | |
1790 | assert_eq!(r.nth(2), Some(12)); | |
1791 | assert_eq!(r, 13..20); | |
1792 | assert_eq!(r.nth(2), Some(15)); | |
1793 | assert_eq!(r, 16..20); | |
1794 | assert_eq!(r.nth(10), None); | |
1795 | assert_eq!(r, 20..20); | |
1796 | } | |
1797 | ||
dc9dc135 XL |
1798 | #[test] |
1799 | fn test_range_nth_back() { | |
1800 | assert_eq!((10..15).nth_back(0), Some(14)); | |
1801 | assert_eq!((10..15).nth_back(1), Some(13)); | |
1802 | assert_eq!((10..15).nth_back(4), Some(10)); | |
1803 | assert_eq!((10..15).nth_back(5), None); | |
1804 | assert_eq!((-120..80_i8).nth_back(199), Some(-120)); | |
1805 | ||
1806 | let mut r = 10..20; | |
1807 | assert_eq!(r.nth_back(2), Some(17)); | |
1808 | assert_eq!(r, 10..17); | |
1809 | assert_eq!(r.nth_back(2), Some(14)); | |
1810 | assert_eq!(r, 10..14); | |
1811 | assert_eq!(r.nth_back(10), None); | |
1812 | assert_eq!(r, 10..10); | |
1813 | } | |
1814 | ||
041b39d2 XL |
1815 | #[test] |
1816 | fn test_range_from_nth() { | |
1817 | assert_eq!((10..).nth(0), Some(10)); | |
1818 | assert_eq!((10..).nth(1), Some(11)); | |
1819 | assert_eq!((10..).nth(4), Some(14)); | |
1820 | ||
1821 | let mut r = 10..; | |
1822 | assert_eq!(r.nth(2), Some(12)); | |
1823 | assert_eq!(r, 13..); | |
1824 | assert_eq!(r.nth(2), Some(15)); | |
1825 | assert_eq!(r, 16..); | |
1826 | assert_eq!(r.nth(10), Some(26)); | |
1827 | assert_eq!(r, 27..); | |
2c00a5a8 XL |
1828 | |
1829 | assert_eq!((0..).size_hint(), (usize::MAX, None)); | |
1830 | } | |
1831 | ||
1832 | fn is_trusted_len<I: TrustedLen>(_: I) {} | |
1833 | ||
1834 | #[test] | |
1835 | fn test_range_from_take() { | |
1836 | let mut it = (0..).take(3); | |
1837 | assert_eq!(it.next(), Some(0)); | |
1838 | assert_eq!(it.next(), Some(1)); | |
1839 | assert_eq!(it.next(), Some(2)); | |
1840 | assert_eq!(it.next(), None); | |
1841 | is_trusted_len((0..).take(3)); | |
1842 | assert_eq!((0..).take(3).size_hint(), (3, Some(3))); | |
1843 | assert_eq!((0..).take(0).size_hint(), (0, Some(0))); | |
1844 | assert_eq!((0..).take(usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX))); | |
1845 | } | |
1846 | ||
1847 | #[test] | |
1848 | fn test_range_from_take_collect() { | |
1849 | let v: Vec<_> = (0..).take(3).collect(); | |
1850 | assert_eq!(v, vec![0, 1, 2]); | |
041b39d2 XL |
1851 | } |
1852 | ||
1853 | #[test] | |
1854 | fn test_range_inclusive_nth() { | |
ea8adc8c XL |
1855 | assert_eq!((10..=15).nth(0), Some(10)); |
1856 | assert_eq!((10..=15).nth(1), Some(11)); | |
1857 | assert_eq!((10..=15).nth(5), Some(15)); | |
1858 | assert_eq!((10..=15).nth(6), None); | |
041b39d2 | 1859 | |
ea8adc8c | 1860 | let mut r = 10_u8..=20; |
041b39d2 | 1861 | assert_eq!(r.nth(2), Some(12)); |
ea8adc8c | 1862 | assert_eq!(r, 13..=20); |
041b39d2 | 1863 | assert_eq!(r.nth(2), Some(15)); |
ea8adc8c | 1864 | assert_eq!(r, 16..=20); |
041b39d2 | 1865 | assert_eq!(r.is_empty(), false); |
0531ce1d | 1866 | assert_eq!(ExactSizeIterator::is_empty(&r), false); |
041b39d2 XL |
1867 | assert_eq!(r.nth(10), None); |
1868 | assert_eq!(r.is_empty(), true); | |
0531ce1d | 1869 | assert_eq!(ExactSizeIterator::is_empty(&r), true); |
041b39d2 XL |
1870 | } |
1871 | ||
dc9dc135 XL |
1872 | #[test] |
1873 | fn test_range_inclusive_nth_back() { | |
1874 | assert_eq!((10..=15).nth_back(0), Some(15)); | |
1875 | assert_eq!((10..=15).nth_back(1), Some(14)); | |
1876 | assert_eq!((10..=15).nth_back(5), Some(10)); | |
1877 | assert_eq!((10..=15).nth_back(6), None); | |
1878 | assert_eq!((-120..=80_i8).nth_back(200), Some(-120)); | |
1879 | ||
1880 | let mut r = 10_u8..=20; | |
1881 | assert_eq!(r.nth_back(2), Some(18)); | |
1882 | assert_eq!(r, 10..=17); | |
1883 | assert_eq!(r.nth_back(2), Some(15)); | |
1884 | assert_eq!(r, 10..=14); | |
1885 | assert_eq!(r.is_empty(), false); | |
1886 | assert_eq!(ExactSizeIterator::is_empty(&r), false); | |
1887 | assert_eq!(r.nth_back(10), None); | |
1888 | assert_eq!(r.is_empty(), true); | |
1889 | assert_eq!(ExactSizeIterator::is_empty(&r), true); | |
1890 | } | |
1891 | ||
1a4d82fc | 1892 | #[test] |
1a4d82fc | 1893 | fn test_range_step() { |
7cac9316 XL |
1894 | #![allow(deprecated)] |
1895 | ||
c34b1796 | 1896 | assert_eq!((0..20).step_by(5).collect::<Vec<isize>>(), [0, 5, 10, 15]); |
041b39d2 XL |
1897 | assert_eq!((1..21).rev().step_by(5).collect::<Vec<isize>>(), [20, 15, 10, 5]); |
1898 | assert_eq!((1..21).rev().step_by(6).collect::<Vec<isize>>(), [20, 14, 8, 2]); | |
c34b1796 AL |
1899 | assert_eq!((200..255).step_by(50).collect::<Vec<u8>>(), [200, 250]); |
1900 | assert_eq!((200..-5).step_by(1).collect::<Vec<isize>>(), []); | |
1901 | assert_eq!((200..200).step_by(1).collect::<Vec<isize>>(), []); | |
d9579d0f AL |
1902 | |
1903 | assert_eq!((0..20).step_by(1).size_hint(), (20, Some(20))); | |
1904 | assert_eq!((0..20).step_by(21).size_hint(), (1, Some(1))); | |
1905 | assert_eq!((0..20).step_by(5).size_hint(), (4, Some(4))); | |
041b39d2 XL |
1906 | assert_eq!((1..21).rev().step_by(5).size_hint(), (4, Some(4))); |
1907 | assert_eq!((1..21).rev().step_by(6).size_hint(), (4, Some(4))); | |
d9579d0f AL |
1908 | assert_eq!((20..-5).step_by(1).size_hint(), (0, Some(0))); |
1909 | assert_eq!((20..20).step_by(1).size_hint(), (0, Some(0))); | |
041b39d2 XL |
1910 | assert_eq!((i8::MIN..i8::MAX).step_by(-(i8::MIN as i32) as usize).size_hint(), (2, Some(2))); |
1911 | assert_eq!((i16::MIN..i16::MAX).step_by(i16::MAX as usize).size_hint(), (3, Some(3))); | |
d9579d0f | 1912 | assert_eq!((isize::MIN..isize::MAX).step_by(1).size_hint(), (usize::MAX, Some(usize::MAX))); |
1a4d82fc JJ |
1913 | } |
1914 | ||
13cf67c4 XL |
1915 | #[test] |
1916 | fn test_step_by_skip() { | |
1917 | assert_eq!((0..640).step_by(128).skip(1).collect::<Vec<_>>(), [128, 256, 384, 512]); | |
1918 | assert_eq!((0..=50).step_by(10).nth(3), Some(30)); | |
1919 | assert_eq!((200..=255u8).step_by(10).nth(3), Some(230)); | |
1920 | } | |
1921 | ||
8faf50e0 XL |
1922 | #[test] |
1923 | fn test_range_inclusive_step() { | |
1924 | assert_eq!((0..=50).step_by(10).collect::<Vec<_>>(), [0, 10, 20, 30, 40, 50]); | |
1925 | assert_eq!((0..=5).step_by(1).collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5]); | |
1926 | assert_eq!((200..=255u8).step_by(10).collect::<Vec<_>>(), [200, 210, 220, 230, 240, 250]); | |
1927 | assert_eq!((250..=255u8).step_by(1).collect::<Vec<_>>(), [250, 251, 252, 253, 254, 255]); | |
1928 | } | |
1929 | ||
2c00a5a8 XL |
1930 | #[test] |
1931 | fn test_range_last_max() { | |
1932 | assert_eq!((0..20).last(), Some(19)); | |
1933 | assert_eq!((-20..0).last(), Some(-1)); | |
1934 | assert_eq!((5..5).last(), None); | |
1935 | ||
1936 | assert_eq!((0..20).max(), Some(19)); | |
1937 | assert_eq!((-20..0).max(), Some(-1)); | |
1938 | assert_eq!((5..5).max(), None); | |
1939 | } | |
1940 | ||
1941 | #[test] | |
1942 | fn test_range_inclusive_last_max() { | |
1943 | assert_eq!((0..=20).last(), Some(20)); | |
1944 | assert_eq!((-20..=0).last(), Some(0)); | |
1945 | assert_eq!((5..=5).last(), Some(5)); | |
1946 | let mut r = 10..=10; | |
1947 | r.next(); | |
1948 | assert_eq!(r.last(), None); | |
1949 | ||
1950 | assert_eq!((0..=20).max(), Some(20)); | |
1951 | assert_eq!((-20..=0).max(), Some(0)); | |
1952 | assert_eq!((5..=5).max(), Some(5)); | |
1953 | let mut r = 10..=10; | |
1954 | r.next(); | |
1955 | assert_eq!(r.max(), None); | |
1956 | } | |
1957 | ||
1958 | #[test] | |
1959 | fn test_range_min() { | |
1960 | assert_eq!((0..20).min(), Some(0)); | |
1961 | assert_eq!((-20..0).min(), Some(-20)); | |
1962 | assert_eq!((5..5).min(), None); | |
1963 | } | |
1964 | ||
1965 | #[test] | |
1966 | fn test_range_inclusive_min() { | |
1967 | assert_eq!((0..=20).min(), Some(0)); | |
1968 | assert_eq!((-20..=0).min(), Some(-20)); | |
1969 | assert_eq!((5..=5).min(), Some(5)); | |
1970 | let mut r = 10..=10; | |
1971 | r.next(); | |
1972 | assert_eq!(r.min(), None); | |
1973 | } | |
1974 | ||
1975 | #[test] | |
1976 | fn test_range_inclusive_folds() { | |
1977 | assert_eq!((1..=10).sum::<i32>(), 55); | |
1978 | assert_eq!((1..=10).rev().sum::<i32>(), 55); | |
1979 | ||
9fa01778 | 1980 | let mut it = 44..=50; |
2c00a5a8 | 1981 | assert_eq!(it.try_fold(0, i8::checked_add), None); |
9fa01778 XL |
1982 | assert_eq!(it, 47..=50); |
1983 | assert_eq!(it.try_fold(0, i8::checked_add), None); | |
1984 | assert_eq!(it, 50..=50); | |
1985 | assert_eq!(it.try_fold(0, i8::checked_add), Some(50)); | |
1986 | assert!(it.is_empty()); | |
1987 | assert_eq!(it.try_fold(0, i8::checked_add), Some(0)); | |
1988 | assert!(it.is_empty()); | |
1989 | ||
1990 | let mut it = 40..=47; | |
1991 | assert_eq!(it.try_rfold(0, i8::checked_add), None); | |
1992 | assert_eq!(it, 40..=44); | |
2c00a5a8 | 1993 | assert_eq!(it.try_rfold(0, i8::checked_add), None); |
9fa01778 XL |
1994 | assert_eq!(it, 40..=41); |
1995 | assert_eq!(it.try_rfold(0, i8::checked_add), Some(81)); | |
1996 | assert!(it.is_empty()); | |
1997 | assert_eq!(it.try_rfold(0, i8::checked_add), Some(0)); | |
1998 | assert!(it.is_empty()); | |
2c00a5a8 XL |
1999 | |
2000 | let mut it = 10..=20; | |
2001 | assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(165)); | |
0531ce1d | 2002 | assert!(it.is_empty()); |
9fa01778 XL |
2003 | assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(0)); |
2004 | assert!(it.is_empty()); | |
2c00a5a8 XL |
2005 | |
2006 | let mut it = 10..=20; | |
2007 | assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(165)); | |
0531ce1d | 2008 | assert!(it.is_empty()); |
9fa01778 XL |
2009 | assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(0)); |
2010 | assert!(it.is_empty()); | |
2c00a5a8 XL |
2011 | } |
2012 | ||
532ac7d7 XL |
2013 | #[test] |
2014 | fn test_range_size_hint() { | |
2015 | use core::usize::MAX as UMAX; | |
2016 | assert_eq!((0..0usize).size_hint(), (0, Some(0))); | |
2017 | assert_eq!((0..100usize).size_hint(), (100, Some(100))); | |
2018 | assert_eq!((0..UMAX).size_hint(), (UMAX, Some(UMAX))); | |
2019 | ||
2020 | let umax = u128::try_from(UMAX).unwrap(); | |
2021 | assert_eq!((0..0u128).size_hint(), (0, Some(0))); | |
2022 | assert_eq!((0..100u128).size_hint(), (100, Some(100))); | |
2023 | assert_eq!((0..umax).size_hint(), (UMAX, Some(UMAX))); | |
2024 | assert_eq!((0..umax + 1).size_hint(), (UMAX, None)); | |
2025 | ||
2026 | use core::isize::{MAX as IMAX, MIN as IMIN}; | |
2027 | assert_eq!((0..0isize).size_hint(), (0, Some(0))); | |
2028 | assert_eq!((-100..100isize).size_hint(), (200, Some(200))); | |
2029 | assert_eq!((IMIN..IMAX).size_hint(), (UMAX, Some(UMAX))); | |
2030 | ||
2031 | let imin = i128::try_from(IMIN).unwrap(); | |
2032 | let imax = i128::try_from(IMAX).unwrap(); | |
2033 | assert_eq!((0..0i128).size_hint(), (0, Some(0))); | |
2034 | assert_eq!((-100..100i128).size_hint(), (200, Some(200))); | |
2035 | assert_eq!((imin..imax).size_hint(), (UMAX, Some(UMAX))); | |
2036 | assert_eq!((imin..imax + 1).size_hint(), (UMAX, None)); | |
2037 | } | |
2038 | ||
2039 | #[test] | |
2040 | fn test_range_inclusive_size_hint() { | |
2041 | use core::usize::MAX as UMAX; | |
2042 | assert_eq!((1..=0usize).size_hint(), (0, Some(0))); | |
2043 | assert_eq!((0..=0usize).size_hint(), (1, Some(1))); | |
2044 | assert_eq!((0..=100usize).size_hint(), (101, Some(101))); | |
2045 | assert_eq!((0..=UMAX - 1).size_hint(), (UMAX, Some(UMAX))); | |
2046 | assert_eq!((0..=UMAX).size_hint(), (UMAX, None)); | |
2047 | ||
2048 | let umax = u128::try_from(UMAX).unwrap(); | |
2049 | assert_eq!((1..=0u128).size_hint(), (0, Some(0))); | |
2050 | assert_eq!((0..=0u128).size_hint(), (1, Some(1))); | |
2051 | assert_eq!((0..=100u128).size_hint(), (101, Some(101))); | |
2052 | assert_eq!((0..=umax - 1).size_hint(), (UMAX, Some(UMAX))); | |
2053 | assert_eq!((0..=umax).size_hint(), (UMAX, None)); | |
2054 | assert_eq!((0..=umax + 1).size_hint(), (UMAX, None)); | |
2055 | ||
2056 | use core::isize::{MAX as IMAX, MIN as IMIN}; | |
2057 | assert_eq!((0..=-1isize).size_hint(), (0, Some(0))); | |
2058 | assert_eq!((0..=0isize).size_hint(), (1, Some(1))); | |
2059 | assert_eq!((-100..=100isize).size_hint(), (201, Some(201))); | |
2060 | assert_eq!((IMIN..=IMAX - 1).size_hint(), (UMAX, Some(UMAX))); | |
2061 | assert_eq!((IMIN..=IMAX).size_hint(), (UMAX, None)); | |
2062 | ||
2063 | let imin = i128::try_from(IMIN).unwrap(); | |
2064 | let imax = i128::try_from(IMAX).unwrap(); | |
2065 | assert_eq!((0..=-1i128).size_hint(), (0, Some(0))); | |
2066 | assert_eq!((0..=0i128).size_hint(), (1, Some(1))); | |
2067 | assert_eq!((-100..=100i128).size_hint(), (201, Some(201))); | |
2068 | assert_eq!((imin..=imax - 1).size_hint(), (UMAX, Some(UMAX))); | |
2069 | assert_eq!((imin..=imax).size_hint(), (UMAX, None)); | |
2070 | assert_eq!((imin..=imax + 1).size_hint(), (UMAX, None)); | |
2071 | } | |
2072 | ||
1a4d82fc JJ |
2073 | #[test] |
2074 | fn test_repeat() { | |
85aaf69f SL |
2075 | let mut it = repeat(42); |
2076 | assert_eq!(it.next(), Some(42)); | |
2077 | assert_eq!(it.next(), Some(42)); | |
2078 | assert_eq!(it.next(), Some(42)); | |
2c00a5a8 XL |
2079 | assert_eq!(repeat(42).size_hint(), (usize::MAX, None)); |
2080 | } | |
2081 | ||
2082 | #[test] | |
2083 | fn test_repeat_take() { | |
2084 | let mut it = repeat(42).take(3); | |
2085 | assert_eq!(it.next(), Some(42)); | |
2086 | assert_eq!(it.next(), Some(42)); | |
2087 | assert_eq!(it.next(), Some(42)); | |
2088 | assert_eq!(it.next(), None); | |
2089 | is_trusted_len(repeat(42).take(3)); | |
2090 | assert_eq!(repeat(42).take(3).size_hint(), (3, Some(3))); | |
2091 | assert_eq!(repeat(42).take(0).size_hint(), (0, Some(0))); | |
2092 | assert_eq!(repeat(42).take(usize::MAX).size_hint(), (usize::MAX, Some(usize::MAX))); | |
2093 | } | |
2094 | ||
2095 | #[test] | |
2096 | fn test_repeat_take_collect() { | |
2097 | let v: Vec<_> = repeat(42).take(3).collect(); | |
2098 | assert_eq!(v, vec![42, 42, 42]); | |
85aaf69f SL |
2099 | } |
2100 | ||
0531ce1d XL |
2101 | #[test] |
2102 | fn test_repeat_with() { | |
2103 | #[derive(PartialEq, Debug)] | |
2104 | struct NotClone(usize); | |
2105 | let mut it = repeat_with(|| NotClone(42)); | |
2106 | assert_eq!(it.next(), Some(NotClone(42))); | |
2107 | assert_eq!(it.next(), Some(NotClone(42))); | |
2108 | assert_eq!(it.next(), Some(NotClone(42))); | |
2109 | assert_eq!(repeat_with(|| NotClone(42)).size_hint(), (usize::MAX, None)); | |
2110 | } | |
2111 | ||
0531ce1d XL |
2112 | #[test] |
2113 | fn test_repeat_with_take() { | |
2114 | let mut it = repeat_with(|| 42).take(3); | |
2115 | assert_eq!(it.next(), Some(42)); | |
2116 | assert_eq!(it.next(), Some(42)); | |
2117 | assert_eq!(it.next(), Some(42)); | |
2118 | assert_eq!(it.next(), None); | |
2119 | is_trusted_len(repeat_with(|| 42).take(3)); | |
2120 | assert_eq!(repeat_with(|| 42).take(3).size_hint(), (3, Some(3))); | |
2121 | assert_eq!(repeat_with(|| 42).take(0).size_hint(), (0, Some(0))); | |
2122 | assert_eq!(repeat_with(|| 42).take(usize::MAX).size_hint(), | |
2123 | (usize::MAX, Some(usize::MAX))); | |
2124 | } | |
2125 | ||
2126 | #[test] | |
2127 | fn test_repeat_with_take_collect() { | |
2128 | let mut curr = 1; | |
2129 | let v: Vec<_> = repeat_with(|| { let tmp = curr; curr *= 2; tmp }) | |
2130 | .take(5).collect(); | |
2131 | assert_eq!(v, vec![1, 2, 4, 8, 16]); | |
2132 | } | |
2133 | ||
a1dfa0c6 XL |
2134 | #[test] |
2135 | fn test_successors() { | |
2136 | let mut powers_of_10 = successors(Some(1_u16), |n| n.checked_mul(10)); | |
2137 | assert_eq!(powers_of_10.by_ref().collect::<Vec<_>>(), &[1, 10, 100, 1_000, 10_000]); | |
2138 | assert_eq!(powers_of_10.next(), None); | |
2139 | ||
2140 | let mut empty = successors(None::<u32>, |_| unimplemented!()); | |
2141 | assert_eq!(empty.next(), None); | |
2142 | assert_eq!(empty.next(), None); | |
2143 | } | |
2144 | ||
85aaf69f SL |
2145 | #[test] |
2146 | fn test_fuse() { | |
2147 | let mut it = 0..3; | |
2148 | assert_eq!(it.len(), 3); | |
2149 | assert_eq!(it.next(), Some(0)); | |
2150 | assert_eq!(it.len(), 2); | |
2151 | assert_eq!(it.next(), Some(1)); | |
2152 | assert_eq!(it.len(), 1); | |
2153 | assert_eq!(it.next(), Some(2)); | |
2154 | assert_eq!(it.len(), 0); | |
2155 | assert_eq!(it.next(), None); | |
2156 | assert_eq!(it.len(), 0); | |
2157 | assert_eq!(it.next(), None); | |
2158 | assert_eq!(it.len(), 0); | |
2159 | assert_eq!(it.next(), None); | |
2160 | assert_eq!(it.len(), 0); | |
1a4d82fc JJ |
2161 | } |
2162 | ||
d9579d0f AL |
2163 | #[test] |
2164 | fn test_fuse_nth() { | |
2165 | let xs = [0, 1, 2]; | |
2166 | let mut it = xs.iter(); | |
2167 | ||
2168 | assert_eq!(it.len(), 3); | |
2169 | assert_eq!(it.nth(2), Some(&2)); | |
2170 | assert_eq!(it.len(), 0); | |
2171 | assert_eq!(it.nth(2), None); | |
2172 | assert_eq!(it.len(), 0); | |
2173 | } | |
2174 | ||
2175 | #[test] | |
2176 | fn test_fuse_last() { | |
2177 | let xs = [0, 1, 2]; | |
2178 | let it = xs.iter(); | |
2179 | ||
2180 | assert_eq!(it.len(), 3); | |
2181 | assert_eq!(it.last(), Some(&2)); | |
2182 | } | |
2183 | ||
2184 | #[test] | |
2185 | fn test_fuse_count() { | |
2186 | let xs = [0, 1, 2]; | |
2187 | let it = xs.iter(); | |
2188 | ||
2189 | assert_eq!(it.len(), 3); | |
2190 | assert_eq!(it.count(), 3); | |
2191 | // Can't check len now because count consumes. | |
2192 | } | |
2193 | ||
ea8adc8c XL |
2194 | #[test] |
2195 | fn test_fuse_fold() { | |
2196 | let xs = [0, 1, 2]; | |
2197 | let it = xs.iter(); // `FusedIterator` | |
2198 | let i = it.fuse().fold(0, |i, &x| { | |
2199 | assert_eq!(x, xs[i]); | |
2200 | i + 1 | |
2201 | }); | |
2202 | assert_eq!(i, xs.len()); | |
2203 | ||
2204 | let it = xs.iter(); // `FusedIterator` | |
2205 | let i = it.fuse().rfold(xs.len(), |i, &x| { | |
2206 | assert_eq!(x, xs[i - 1]); | |
2207 | i - 1 | |
2208 | }); | |
2209 | assert_eq!(i, 0); | |
2210 | ||
2211 | let it = xs.iter().scan((), |_, &x| Some(x)); // `!FusedIterator` | |
2212 | let i = it.fuse().fold(0, |i, x| { | |
2213 | assert_eq!(x, xs[i]); | |
2214 | i + 1 | |
2215 | }); | |
2216 | assert_eq!(i, xs.len()); | |
2217 | } | |
2218 | ||
62682a34 SL |
2219 | #[test] |
2220 | fn test_once() { | |
2221 | let mut it = once(42); | |
2222 | assert_eq!(it.next(), Some(42)); | |
2223 | assert_eq!(it.next(), None); | |
2224 | } | |
2225 | ||
0731742a XL |
2226 | #[test] |
2227 | fn test_once_with() { | |
2228 | let count = Cell::new(0); | |
2229 | let mut it = once_with(|| { | |
2230 | count.set(count.get() + 1); | |
2231 | 42 | |
2232 | }); | |
2233 | ||
2234 | assert_eq!(count.get(), 0); | |
2235 | assert_eq!(it.next(), Some(42)); | |
2236 | assert_eq!(count.get(), 1); | |
2237 | assert_eq!(it.next(), None); | |
2238 | assert_eq!(count.get(), 1); | |
2239 | assert_eq!(it.next(), None); | |
2240 | assert_eq!(count.get(), 1); | |
2241 | } | |
2242 | ||
62682a34 SL |
2243 | #[test] |
2244 | fn test_empty() { | |
2245 | let mut it = empty::<i32>(); | |
2246 | assert_eq!(it.next(), None); | |
2247 | } | |
2248 | ||
c30ab7b3 SL |
2249 | #[test] |
2250 | fn test_chain_fold() { | |
2251 | let xs = [1, 2, 3]; | |
2252 | let ys = [1, 2, 0]; | |
2253 | ||
2254 | let mut iter = xs.iter().chain(&ys); | |
2255 | iter.next(); | |
2256 | let mut result = Vec::new(); | |
2257 | iter.fold((), |(), &elt| result.push(elt)); | |
2258 | assert_eq!(&[2, 3, 1, 2, 0], &result[..]); | |
2259 | } | |
2260 | ||
7cac9316 XL |
2261 | #[test] |
2262 | fn test_step_replace_unsigned() { | |
2263 | let mut x = 4u32; | |
2264 | let y = x.replace_zero(); | |
2265 | assert_eq!(x, 0); | |
2266 | assert_eq!(y, 4); | |
2267 | ||
2268 | x = 5; | |
2269 | let y = x.replace_one(); | |
2270 | assert_eq!(x, 1); | |
2271 | assert_eq!(y, 5); | |
2272 | } | |
2273 | ||
2274 | #[test] | |
2275 | fn test_step_replace_signed() { | |
2276 | let mut x = 4i32; | |
2277 | let y = x.replace_zero(); | |
2278 | assert_eq!(x, 0); | |
2279 | assert_eq!(y, 4); | |
2280 | ||
2281 | x = 5; | |
2282 | let y = x.replace_one(); | |
2283 | assert_eq!(x, 1); | |
2284 | assert_eq!(y, 5); | |
2285 | } | |
2286 | ||
2287 | #[test] | |
2288 | fn test_step_replace_no_between() { | |
2289 | let mut x = 4u128; | |
2290 | let y = x.replace_zero(); | |
2291 | assert_eq!(x, 0); | |
2292 | assert_eq!(y, 4); | |
2293 | ||
2294 | x = 5; | |
2295 | let y = x.replace_one(); | |
2296 | assert_eq!(x, 1); | |
2297 | assert_eq!(y, 5); | |
2298 | } | |
abe05a73 XL |
2299 | |
2300 | #[test] | |
2301 | fn test_rev_try_folds() { | |
2302 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2303 | assert_eq!((1..10).rev().try_fold(7, f), (1..10).try_rfold(7, f)); | |
2304 | assert_eq!((1..10).rev().try_rfold(7, f), (1..10).try_fold(7, f)); | |
2305 | ||
2306 | let a = [10, 20, 30, 40, 100, 60, 70, 80, 90]; | |
2307 | let mut iter = a.iter().rev(); | |
2308 | assert_eq!(iter.try_fold(0_i8, |acc, &x| acc.checked_add(x)), None); | |
2309 | assert_eq!(iter.next(), Some(&70)); | |
2310 | let mut iter = a.iter().rev(); | |
2311 | assert_eq!(iter.try_rfold(0_i8, |acc, &x| acc.checked_add(x)), None); | |
2312 | assert_eq!(iter.next_back(), Some(&60)); | |
2313 | } | |
2314 | ||
2315 | #[test] | |
2316 | fn test_cloned_try_folds() { | |
2317 | let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]; | |
2318 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2319 | let f_ref = &|acc, &x| i32::checked_add(2*acc, x); | |
2320 | assert_eq!(a.iter().cloned().try_fold(7, f), a.iter().try_fold(7, f_ref)); | |
2321 | assert_eq!(a.iter().cloned().try_rfold(7, f), a.iter().try_rfold(7, f_ref)); | |
2322 | ||
2323 | let a = [10, 20, 30, 40, 100, 60, 70, 80, 90]; | |
2324 | let mut iter = a.iter().cloned(); | |
2325 | assert_eq!(iter.try_fold(0_i8, |acc, x| acc.checked_add(x)), None); | |
2326 | assert_eq!(iter.next(), Some(60)); | |
2327 | let mut iter = a.iter().cloned(); | |
2328 | assert_eq!(iter.try_rfold(0_i8, |acc, x| acc.checked_add(x)), None); | |
2329 | assert_eq!(iter.next_back(), Some(70)); | |
2330 | } | |
2331 | ||
2332 | #[test] | |
2333 | fn test_chain_try_folds() { | |
2334 | let c = || (0..10).chain(10..20); | |
2335 | ||
2336 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2337 | assert_eq!(c().try_fold(7, f), (0..20).try_fold(7, f)); | |
2338 | assert_eq!(c().try_rfold(7, f), (0..20).rev().try_fold(7, f)); | |
2339 | ||
2340 | let mut iter = c(); | |
2341 | assert_eq!(iter.position(|x| x == 5), Some(5)); | |
2342 | assert_eq!(iter.next(), Some(6), "stopped in front, state Both"); | |
2343 | assert_eq!(iter.position(|x| x == 13), Some(6)); | |
2344 | assert_eq!(iter.next(), Some(14), "stopped in back, state Back"); | |
2345 | assert_eq!(iter.try_fold(0, |acc, x| Some(acc+x)), Some((15..20).sum())); | |
2346 | ||
2347 | let mut iter = c().rev(); // use rev to access try_rfold | |
2348 | assert_eq!(iter.position(|x| x == 15), Some(4)); | |
2349 | assert_eq!(iter.next(), Some(14), "stopped in back, state Both"); | |
2350 | assert_eq!(iter.position(|x| x == 5), Some(8)); | |
2351 | assert_eq!(iter.next(), Some(4), "stopped in front, state Front"); | |
2352 | assert_eq!(iter.try_fold(0, |acc, x| Some(acc+x)), Some((0..4).sum())); | |
2353 | ||
2354 | let mut iter = c(); | |
2355 | iter.by_ref().rev().nth(14); // skip the last 15, ending in state Front | |
2356 | assert_eq!(iter.try_fold(7, f), (0..5).try_fold(7, f)); | |
2357 | ||
2358 | let mut iter = c(); | |
2359 | iter.nth(14); // skip the first 15, ending in state Back | |
2360 | assert_eq!(iter.try_rfold(7, f), (15..20).try_rfold(7, f)); | |
2361 | } | |
2362 | ||
2363 | #[test] | |
2364 | fn test_map_try_folds() { | |
2365 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2366 | assert_eq!((0..10).map(|x| x+3).try_fold(7, f), (3..13).try_fold(7, f)); | |
2367 | assert_eq!((0..10).map(|x| x+3).try_rfold(7, f), (3..13).try_rfold(7, f)); | |
2368 | ||
2369 | let mut iter = (0..40).map(|x| x+10); | |
2370 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2371 | assert_eq!(iter.next(), Some(20)); | |
2372 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2373 | assert_eq!(iter.next_back(), Some(46)); | |
2374 | } | |
2375 | ||
2376 | #[test] | |
2377 | fn test_filter_try_folds() { | |
2378 | fn p(&x: &i32) -> bool { 0 <= x && x < 10 } | |
2379 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2380 | assert_eq!((-10..20).filter(p).try_fold(7, f), (0..10).try_fold(7, f)); | |
2381 | assert_eq!((-10..20).filter(p).try_rfold(7, f), (0..10).try_rfold(7, f)); | |
2382 | ||
2383 | let mut iter = (0..40).filter(|&x| x % 2 == 1); | |
2384 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2385 | assert_eq!(iter.next(), Some(25)); | |
2386 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2387 | assert_eq!(iter.next_back(), Some(31)); | |
2388 | } | |
2389 | ||
2390 | #[test] | |
2391 | fn test_filter_map_try_folds() { | |
2392 | let mp = &|x| if 0 <= x && x < 10 { Some(x*2) } else { None }; | |
2393 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2394 | assert_eq!((-9..20).filter_map(mp).try_fold(7, f), (0..10).map(|x| 2*x).try_fold(7, f)); | |
2395 | assert_eq!((-9..20).filter_map(mp).try_rfold(7, f), (0..10).map(|x| 2*x).try_rfold(7, f)); | |
2396 | ||
2397 | let mut iter = (0..40).filter_map(|x| if x%2 == 1 { None } else { Some(x*2 + 10) }); | |
2398 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2399 | assert_eq!(iter.next(), Some(38)); | |
2400 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2401 | assert_eq!(iter.next_back(), Some(78)); | |
2402 | } | |
2403 | ||
2404 | #[test] | |
2405 | fn test_enumerate_try_folds() { | |
2406 | let f = &|acc, (i, x)| usize::checked_add(2*acc, x/(i+1) + i); | |
2407 | assert_eq!((9..18).enumerate().try_fold(7, f), (0..9).map(|i| (i, i+9)).try_fold(7, f)); | |
2408 | assert_eq!((9..18).enumerate().try_rfold(7, f), (0..9).map(|i| (i, i+9)).try_rfold(7, f)); | |
2409 | ||
2410 | let mut iter = (100..200).enumerate(); | |
2411 | let f = &|acc, (i, x)| u8::checked_add(acc, u8::checked_div(x, i as u8 + 1)?); | |
2412 | assert_eq!(iter.try_fold(0, f), None); | |
2413 | assert_eq!(iter.next(), Some((7, 107))); | |
2414 | assert_eq!(iter.try_rfold(0, f), None); | |
2415 | assert_eq!(iter.next_back(), Some((11, 111))); | |
2416 | } | |
2417 | ||
2418 | #[test] | |
416331ca | 2419 | fn test_peek_try_folds() { |
abe05a73 | 2420 | let f = &|acc, x| i32::checked_add(2*acc, x); |
416331ca | 2421 | |
abe05a73 | 2422 | assert_eq!((1..20).peekable().try_fold(7, f), (1..20).try_fold(7, f)); |
416331ca XL |
2423 | assert_eq!((1..20).peekable().try_rfold(7, f), (1..20).try_rfold(7, f)); |
2424 | ||
abe05a73 XL |
2425 | let mut iter = (1..20).peekable(); |
2426 | assert_eq!(iter.peek(), Some(&1)); | |
2427 | assert_eq!(iter.try_fold(7, f), (1..20).try_fold(7, f)); | |
2428 | ||
416331ca XL |
2429 | let mut iter = (1..20).peekable(); |
2430 | assert_eq!(iter.peek(), Some(&1)); | |
2431 | assert_eq!(iter.try_rfold(7, f), (1..20).try_rfold(7, f)); | |
2432 | ||
abe05a73 XL |
2433 | let mut iter = [100, 20, 30, 40, 50, 60, 70].iter().cloned().peekable(); |
2434 | assert_eq!(iter.peek(), Some(&100)); | |
2435 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2436 | assert_eq!(iter.peek(), Some(&40)); | |
416331ca XL |
2437 | |
2438 | let mut iter = [100, 20, 30, 40, 50, 60, 70].iter().cloned().peekable(); | |
2439 | assert_eq!(iter.peek(), Some(&100)); | |
2440 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2441 | assert_eq!(iter.peek(), Some(&100)); | |
2442 | assert_eq!(iter.next_back(), Some(50)); | |
2443 | ||
2444 | let mut iter = (2..5).peekable(); | |
2445 | assert_eq!(iter.peek(), Some(&2)); | |
2446 | assert_eq!(iter.try_for_each(Err), Err(2)); | |
2447 | assert_eq!(iter.peek(), Some(&3)); | |
2448 | assert_eq!(iter.try_for_each(Err), Err(3)); | |
2449 | assert_eq!(iter.peek(), Some(&4)); | |
2450 | assert_eq!(iter.try_for_each(Err), Err(4)); | |
2451 | assert_eq!(iter.peek(), None); | |
2452 | assert_eq!(iter.try_for_each(Err), Ok(())); | |
2453 | ||
2454 | let mut iter = (2..5).peekable(); | |
2455 | assert_eq!(iter.peek(), Some(&2)); | |
2456 | assert_eq!(iter.try_rfold((), |(), x| Err(x)), Err(4)); | |
2457 | assert_eq!(iter.peek(), Some(&2)); | |
2458 | assert_eq!(iter.try_rfold((), |(), x| Err(x)), Err(3)); | |
2459 | assert_eq!(iter.peek(), Some(&2)); | |
2460 | assert_eq!(iter.try_rfold((), |(), x| Err(x)), Err(2)); | |
2461 | assert_eq!(iter.peek(), None); | |
2462 | assert_eq!(iter.try_rfold((), |(), x| Err(x)), Ok(())); | |
abe05a73 XL |
2463 | } |
2464 | ||
2465 | #[test] | |
2466 | fn test_skip_while_try_fold() { | |
2467 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2468 | fn p(&x: &i32) -> bool { (x % 10) <= 5 } | |
2469 | assert_eq!((1..20).skip_while(p).try_fold(7, f), (6..20).try_fold(7, f)); | |
2470 | let mut iter = (1..20).skip_while(p); | |
2471 | assert_eq!(iter.nth(5), Some(11)); | |
2472 | assert_eq!(iter.try_fold(7, f), (12..20).try_fold(7, f)); | |
2473 | ||
2474 | let mut iter = (0..50).skip_while(|&x| (x % 20) < 15); | |
2475 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2476 | assert_eq!(iter.next(), Some(23)); | |
2477 | } | |
2478 | ||
2479 | #[test] | |
2480 | fn test_take_while_folds() { | |
2481 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2482 | assert_eq!((1..20).take_while(|&x| x != 10).try_fold(7, f), (1..10).try_fold(7, f)); | |
2483 | let mut iter = (1..20).take_while(|&x| x != 10); | |
2484 | assert_eq!(iter.try_fold(0, |x, y| Some(x+y)), Some((1..10).sum())); | |
2485 | assert_eq!(iter.next(), None, "flag should be set"); | |
2486 | let iter = (1..20).take_while(|&x| x != 10); | |
2487 | assert_eq!(iter.fold(0, |x, y| x+y), (1..10).sum()); | |
2488 | ||
2489 | let mut iter = (10..50).take_while(|&x| x != 40); | |
2490 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2491 | assert_eq!(iter.next(), Some(20)); | |
2492 | } | |
2493 | ||
2494 | #[test] | |
2495 | fn test_skip_try_folds() { | |
2496 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2497 | assert_eq!((1..20).skip(9).try_fold(7, f), (10..20).try_fold(7, f)); | |
2498 | assert_eq!((1..20).skip(9).try_rfold(7, f), (10..20).try_rfold(7, f)); | |
2499 | ||
2500 | let mut iter = (0..30).skip(10); | |
2501 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2502 | assert_eq!(iter.next(), Some(20)); | |
2503 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2504 | assert_eq!(iter.next_back(), Some(24)); | |
2505 | } | |
2506 | ||
dc9dc135 XL |
2507 | #[test] |
2508 | fn test_skip_nth_back() { | |
2509 | let xs = [0, 1, 2, 3, 4, 5]; | |
2510 | let mut it = xs.iter().skip(2); | |
2511 | assert_eq!(it.nth_back(0), Some(&5)); | |
2512 | assert_eq!(it.nth_back(1), Some(&3)); | |
2513 | assert_eq!(it.nth_back(0), Some(&2)); | |
2514 | assert_eq!(it.nth_back(0), None); | |
2515 | ||
2516 | let ys = [2, 3, 4, 5]; | |
2517 | let mut ity = ys.iter(); | |
2518 | let mut it = xs.iter().skip(2); | |
2519 | assert_eq!(it.nth_back(1), ity.nth_back(1)); | |
2520 | assert_eq!(it.clone().nth(0), ity.clone().nth(0)); | |
2521 | assert_eq!(it.nth_back(0), ity.nth_back(0)); | |
2522 | assert_eq!(it.clone().nth(0), ity.clone().nth(0)); | |
2523 | assert_eq!(it.nth_back(0), ity.nth_back(0)); | |
2524 | assert_eq!(it.clone().nth(0), ity.clone().nth(0)); | |
2525 | assert_eq!(it.nth_back(0), ity.nth_back(0)); | |
2526 | assert_eq!(it.clone().nth(0), ity.clone().nth(0)); | |
2527 | ||
2528 | let mut it = xs.iter().skip(2); | |
2529 | assert_eq!(it.nth_back(4), None); | |
2530 | assert_eq!(it.nth_back(0), None); | |
2531 | ||
2532 | let mut it = xs.iter(); | |
2533 | it.by_ref().skip(2).nth_back(3); | |
2534 | assert_eq!(it.next_back(), Some(&1)); | |
2535 | ||
2536 | let mut it = xs.iter(); | |
2537 | it.by_ref().skip(2).nth_back(10); | |
2538 | assert_eq!(it.next_back(), Some(&1)); | |
2539 | } | |
2540 | ||
abe05a73 XL |
2541 | #[test] |
2542 | fn test_take_try_folds() { | |
2543 | let f = &|acc, x| i32::checked_add(2*acc, x); | |
2544 | assert_eq!((10..30).take(10).try_fold(7, f), (10..20).try_fold(7, f)); | |
416331ca | 2545 | assert_eq!((10..30).take(10).try_rfold(7, f), (10..20).try_rfold(7, f)); |
abe05a73 XL |
2546 | |
2547 | let mut iter = (10..30).take(20); | |
2548 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2549 | assert_eq!(iter.next(), Some(20)); | |
416331ca XL |
2550 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); |
2551 | assert_eq!(iter.next_back(), Some(24)); | |
2552 | ||
2553 | let mut iter = (2..20).take(3); | |
2554 | assert_eq!(iter.try_for_each(Err), Err(2)); | |
2555 | assert_eq!(iter.try_for_each(Err), Err(3)); | |
2556 | assert_eq!(iter.try_for_each(Err), Err(4)); | |
2557 | assert_eq!(iter.try_for_each(Err), Ok(())); | |
2558 | ||
2559 | let mut iter = (2..20).take(3).rev(); | |
2560 | assert_eq!(iter.try_for_each(Err), Err(4)); | |
2561 | assert_eq!(iter.try_for_each(Err), Err(3)); | |
2562 | assert_eq!(iter.try_for_each(Err), Err(2)); | |
2563 | assert_eq!(iter.try_for_each(Err), Ok(())); | |
abe05a73 XL |
2564 | } |
2565 | ||
2566 | #[test] | |
2567 | fn test_flat_map_try_folds() { | |
2568 | let f = &|acc, x| i32::checked_add(acc*2/3, x); | |
2569 | let mr = &|x| (5*x)..(5*x + 5); | |
2570 | assert_eq!((0..10).flat_map(mr).try_fold(7, f), (0..50).try_fold(7, f)); | |
2571 | assert_eq!((0..10).flat_map(mr).try_rfold(7, f), (0..50).try_rfold(7, f)); | |
2572 | let mut iter = (0..10).flat_map(mr); | |
2573 | iter.next(); iter.next_back(); // have front and back iters in progress | |
2574 | assert_eq!(iter.try_rfold(7, f), (1..49).try_rfold(7, f)); | |
2575 | ||
2576 | let mut iter = (0..10).flat_map(|x| (4*x)..(4*x + 4)); | |
2577 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2578 | assert_eq!(iter.next(), Some(17)); | |
2579 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2580 | assert_eq!(iter.next_back(), Some(35)); | |
2581 | } | |
0531ce1d XL |
2582 | |
2583 | #[test] | |
2584 | fn test_flatten_try_folds() { | |
2585 | let f = &|acc, x| i32::checked_add(acc*2/3, x); | |
2586 | let mr = &|x| (5*x)..(5*x + 5); | |
2587 | assert_eq!((0..10).map(mr).flatten().try_fold(7, f), (0..50).try_fold(7, f)); | |
2588 | assert_eq!((0..10).map(mr).flatten().try_rfold(7, f), (0..50).try_rfold(7, f)); | |
2589 | let mut iter = (0..10).map(mr).flatten(); | |
2590 | iter.next(); iter.next_back(); // have front and back iters in progress | |
2591 | assert_eq!(iter.try_rfold(7, f), (1..49).try_rfold(7, f)); | |
2592 | ||
2593 | let mut iter = (0..10).map(|x| (4*x)..(4*x + 4)).flatten(); | |
2594 | assert_eq!(iter.try_fold(0, i8::checked_add), None); | |
2595 | assert_eq!(iter.next(), Some(17)); | |
2596 | assert_eq!(iter.try_rfold(0, i8::checked_add), None); | |
2597 | assert_eq!(iter.next_back(), Some(35)); | |
2598 | } | |
2599 | ||
2600 | #[test] | |
2601 | fn test_functor_laws() { | |
2602 | // identity: | |
2603 | fn identity<T>(x: T) -> T { x } | |
2604 | assert_eq!((0..10).map(identity).sum::<usize>(), (0..10).sum()); | |
2605 | ||
2606 | // composition: | |
2607 | fn f(x: usize) -> usize { x + 3 } | |
2608 | fn g(x: usize) -> usize { x * 2 } | |
2609 | fn h(x: usize) -> usize { g(f(x)) } | |
2610 | assert_eq!((0..10).map(f).map(g).sum::<usize>(), (0..10).map(h).sum()); | |
2611 | } | |
2612 | ||
2613 | #[test] | |
2614 | fn test_monad_laws_left_identity() { | |
2615 | fn f(x: usize) -> impl Iterator<Item = usize> { | |
2616 | (0..10).map(move |y| x * y) | |
2617 | } | |
2618 | assert_eq!(once(42).flat_map(f.clone()).sum::<usize>(), f(42).sum()); | |
2619 | } | |
2620 | ||
2621 | #[test] | |
2622 | fn test_monad_laws_right_identity() { | |
2623 | assert_eq!((0..10).flat_map(|x| once(x)).sum::<usize>(), (0..10).sum()); | |
2624 | } | |
2625 | ||
2626 | #[test] | |
2627 | fn test_monad_laws_associativity() { | |
2628 | fn f(x: usize) -> impl Iterator<Item = usize> { 0..x } | |
2629 | fn g(x: usize) -> impl Iterator<Item = usize> { (0..x).rev() } | |
2630 | assert_eq!((0..10).flat_map(f).flat_map(g).sum::<usize>(), | |
2631 | (0..10).flat_map(|x| f(x).flat_map(g)).sum::<usize>()); | |
2632 | } | |
9fa01778 XL |
2633 | |
2634 | #[test] | |
2635 | fn test_is_sorted() { | |
2636 | assert!([1, 2, 2, 9].iter().is_sorted()); | |
2637 | assert!(![1, 3, 2].iter().is_sorted()); | |
2638 | assert!([0].iter().is_sorted()); | |
2639 | assert!(std::iter::empty::<i32>().is_sorted()); | |
2640 | assert!(![0.0, 1.0, std::f32::NAN].iter().is_sorted()); | |
2641 | assert!([-2, -1, 0, 3].iter().is_sorted()); | |
2642 | assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs())); | |
2643 | assert!(!["c", "bb", "aaa"].iter().is_sorted()); | |
2644 | assert!(["c", "bb", "aaa"].iter().is_sorted_by_key(|s| s.len())); | |
2645 | } | |
416331ca XL |
2646 | |
2647 | #[test] | |
2648 | fn test_partition() { | |
2649 | fn check(xs: &mut [i32], ref p: impl Fn(&i32) -> bool, expected: usize) { | |
2650 | let i = xs.iter_mut().partition_in_place(p); | |
2651 | assert_eq!(expected, i); | |
2652 | assert!(xs[..i].iter().all(p)); | |
2653 | assert!(!xs[i..].iter().any(p)); | |
2654 | assert!(xs.iter().is_partitioned(p)); | |
2655 | if i == 0 || i == xs.len() { | |
2656 | assert!(xs.iter().rev().is_partitioned(p)); | |
2657 | } else { | |
2658 | assert!(!xs.iter().rev().is_partitioned(p)); | |
2659 | } | |
2660 | } | |
2661 | ||
2662 | check(&mut [], |_| true, 0); | |
2663 | check(&mut [], |_| false, 0); | |
2664 | ||
2665 | check(&mut [0], |_| true, 1); | |
2666 | check(&mut [0], |_| false, 0); | |
2667 | ||
2668 | check(&mut [-1, 1], |&x| x > 0, 1); | |
2669 | check(&mut [-1, 1], |&x| x < 0, 1); | |
2670 | ||
2671 | let ref mut xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; | |
2672 | check(xs, |_| true, 10); | |
2673 | check(xs, |_| false, 0); | |
2674 | check(xs, |&x| x % 2 == 0, 5); // evens | |
2675 | check(xs, |&x| x % 2 == 1, 5); // odds | |
2676 | check(xs, |&x| x % 3 == 0, 4); // multiple of 3 | |
2677 | check(xs, |&x| x % 4 == 0, 3); // multiple of 4 | |
2678 | check(xs, |&x| x % 5 == 0, 2); // multiple of 5 | |
2679 | check(xs, |&x| x < 3, 3); // small | |
2680 | check(xs, |&x| x > 6, 3); // large | |
2681 | } |