]>
git.proxmox.com Git - rustc.git/blob - src/liballoc/tests/linked_list.rs
1 use std
::collections
::LinkedList
;
5 let mut m
= LinkedList
::<Box
<_
>>::new();
6 assert_eq
!(m
.pop_front(), None
);
7 assert_eq
!(m
.pop_back(), None
);
8 assert_eq
!(m
.pop_front(), None
);
10 assert_eq
!(m
.pop_front(), Some(box 1));
13 assert_eq
!(m
.len(), 2);
14 assert_eq
!(m
.pop_front(), Some(box 2));
15 assert_eq
!(m
.pop_front(), Some(box 3));
16 assert_eq
!(m
.len(), 0);
17 assert_eq
!(m
.pop_front(), None
);
22 assert_eq
!(m
.pop_front(), Some(box 1));
24 let mut n
= LinkedList
::new();
28 assert_eq
!(n
.front().unwrap(), &3);
29 let x
= n
.front_mut().unwrap();
34 assert_eq
!(n
.back().unwrap(), &2);
35 let y
= n
.back_mut().unwrap();
39 assert_eq
!(n
.pop_front(), Some(0));
40 assert_eq
!(n
.pop_front(), Some(1));
44 fn generate_test() -> LinkedList
<i32> {
45 list_from(&[0, 1, 2, 3, 4, 5, 6])
49 fn list_from
<T
: Clone
>(v
: &[T
]) -> LinkedList
<T
> {
50 v
.iter().cloned().collect()
57 let mut m
= LinkedList
::new();
60 let p
= m
.split_off(0);
61 assert_eq
!(m
.len(), 0);
62 assert_eq
!(p
.len(), 1);
63 assert_eq
!(p
.back(), Some(&1));
64 assert_eq
!(p
.front(), Some(&1));
67 // not singleton, forwards
69 let u
= vec
![1, 2, 3, 4, 5];
70 let mut m
= list_from(&u
);
71 let mut n
= m
.split_off(2);
72 assert_eq
!(m
.len(), 2);
73 assert_eq
!(n
.len(), 3);
75 assert_eq
!(m
.pop_front(), Some(elt
));
78 assert_eq
!(n
.pop_front(), Some(elt
));
81 // not singleton, backwards
83 let u
= vec
![1, 2, 3, 4, 5];
84 let mut m
= list_from(&u
);
85 let mut n
= m
.split_off(4);
86 assert_eq
!(m
.len(), 4);
87 assert_eq
!(n
.len(), 1);
89 assert_eq
!(m
.pop_front(), Some(elt
));
92 assert_eq
!(n
.pop_front(), Some(elt
));
96 // no-op on the last index
98 let mut m
= LinkedList
::new();
101 let p
= m
.split_off(1);
102 assert_eq
!(m
.len(), 1);
103 assert_eq
!(p
.len(), 0);
104 assert_eq
!(m
.back(), Some(&1));
105 assert_eq
!(m
.front(), Some(&1));
112 let m
= generate_test();
113 for (i
, elt
) in m
.iter().enumerate() {
114 assert_eq
!(i
as i32, *elt
);
116 let mut n
= LinkedList
::new();
117 assert_eq
!(n
.iter().next(), None
);
119 let mut it
= n
.iter();
120 assert_eq
!(it
.size_hint(), (1, Some(1)));
121 assert_eq
!(it
.next().unwrap(), &4);
122 assert_eq
!(it
.size_hint(), (0, Some(0)));
123 assert_eq
!(it
.next(), None
);
127 fn test_iterator_clone() {
128 let mut n
= LinkedList
::new();
132 let mut it
= n
.iter();
134 let mut jt
= it
.clone();
135 assert_eq
!(it
.next(), jt
.next());
136 assert_eq
!(it
.next_back(), jt
.next_back());
137 assert_eq
!(it
.next(), jt
.next());
141 fn test_iterator_double_end() {
142 let mut n
= LinkedList
::new();
143 assert_eq
!(n
.iter().next(), None
);
147 let mut it
= n
.iter();
148 assert_eq
!(it
.size_hint(), (3, Some(3)));
149 assert_eq
!(it
.next().unwrap(), &6);
150 assert_eq
!(it
.size_hint(), (2, Some(2)));
151 assert_eq
!(it
.next_back().unwrap(), &4);
152 assert_eq
!(it
.size_hint(), (1, Some(1)));
153 assert_eq
!(it
.next_back().unwrap(), &5);
154 assert_eq
!(it
.next_back(), None
);
155 assert_eq
!(it
.next(), None
);
160 let m
= generate_test();
161 for (i
, elt
) in m
.iter().rev().enumerate() {
162 assert_eq
!((6 - i
) as i32, *elt
);
164 let mut n
= LinkedList
::new();
165 assert_eq
!(n
.iter().rev().next(), None
);
167 let mut it
= n
.iter().rev();
168 assert_eq
!(it
.size_hint(), (1, Some(1)));
169 assert_eq
!(it
.next().unwrap(), &4);
170 assert_eq
!(it
.size_hint(), (0, Some(0)));
171 assert_eq
!(it
.next(), None
);
176 let mut m
= generate_test();
177 let mut len
= m
.len();
178 for (i
, elt
) in m
.iter_mut().enumerate() {
179 assert_eq
!(i
as i32, *elt
);
183 let mut n
= LinkedList
::new();
184 assert
!(n
.iter_mut().next().is_none());
187 let mut it
= n
.iter_mut();
188 assert_eq
!(it
.size_hint(), (2, Some(2)));
189 assert
!(it
.next().is_some());
190 assert
!(it
.next().is_some());
191 assert_eq
!(it
.size_hint(), (0, Some(0)));
192 assert
!(it
.next().is_none());
196 fn test_iterator_mut_double_end() {
197 let mut n
= LinkedList
::new();
198 assert
!(n
.iter_mut().next_back().is_none());
202 let mut it
= n
.iter_mut();
203 assert_eq
!(it
.size_hint(), (3, Some(3)));
204 assert_eq
!(*it
.next().unwrap(), 6);
205 assert_eq
!(it
.size_hint(), (2, Some(2)));
206 assert_eq
!(*it
.next_back().unwrap(), 4);
207 assert_eq
!(it
.size_hint(), (1, Some(1)));
208 assert_eq
!(*it
.next_back().unwrap(), 5);
209 assert
!(it
.next_back().is_none());
210 assert
!(it
.next().is_none());
214 fn test_mut_rev_iter() {
215 let mut m
= generate_test();
216 for (i
, elt
) in m
.iter_mut().rev().enumerate() {
217 assert_eq
!((6 - i
) as i32, *elt
);
219 let mut n
= LinkedList
::new();
220 assert
!(n
.iter_mut().rev().next().is_none());
222 let mut it
= n
.iter_mut().rev();
223 assert
!(it
.next().is_some());
224 assert
!(it
.next().is_none());
229 let mut n
= list_from(&[]);
230 let mut m
= list_from(&[]);
237 let n
= list_from(&[2, 3, 4]);
238 let m
= list_from(&[1, 2, 3]);
244 let mut x
= LinkedList
::new();
245 let mut y
= LinkedList
::new();
247 assert
!(::hash(&x
) == ::hash(&y
));
257 assert
!(::hash(&x
) == ::hash(&y
));
262 let n
= list_from(&[]);
263 let m
= list_from(&[1, 2, 3]);
272 let nan
= 0.0f64 / 0.0;
273 let n
= list_from(&[nan
]);
274 let m
= list_from(&[nan
]);
280 let n
= list_from(&[nan
]);
281 let one
= list_from(&[1.0f64]);
284 assert
!(!(n
<= one
));
285 assert
!(!(n
>= one
));
287 let u
= list_from(&[1.0f64, 2.0, nan
]);
288 let v
= list_from(&[1.0f64, 2.0, 3.0]);
294 let s
= list_from(&[1.0f64, 2.0, 4.0, 2.0]);
295 let t
= list_from(&[1.0f64, 2.0, 3.0, 2.0]);
298 assert
!(!(s
<= one
));
304 let list
: LinkedList
<_
> = (0..10).collect();
305 assert_eq
!(format
!("{:?}", list
), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
307 let list
: LinkedList
<_
> = vec
!["just", "one", "test", "more"].iter().cloned().collect();
308 assert_eq
!(format
!("{:?}", list
),
309 "[\"just\", \"one\", \"test\", \"more\"]");
313 fn test_extend_ref() {
314 let mut a
= LinkedList
::new();
317 a
.extend(&[2, 3, 4]);
319 assert_eq
!(a
.len(), 4);
320 assert_eq
!(a
, list_from(&[1, 2, 3, 4]));
322 let mut b
= LinkedList
::new();
327 assert_eq
!(a
.len(), 6);
328 assert_eq
!(a
, list_from(&[1, 2, 3, 4, 5, 6]));
333 let mut a
= LinkedList
::new();
335 a
.extend(vec
![2, 3, 4]); // uses iterator
337 assert_eq
!(a
.len(), 4);
338 assert
!(a
.iter().eq(&[1, 2, 3, 4]));
340 let b
: LinkedList
<_
> = vec
![5, 6, 7].into_iter().collect();
341 a
.extend(b
); // specializes to `append`
343 assert_eq
!(a
.len(), 7);
344 assert
!(a
.iter().eq(&[1, 2, 3, 4, 5, 6, 7]));
349 let mut l
= LinkedList
::new();
350 l
.extend(&[2, 3, 4]);
352 assert
!(l
.contains(&3));
353 assert
!(!l
.contains(&1));
357 assert
!(!l
.contains(&3));
361 fn drain_filter_empty() {
362 let mut list
: LinkedList
<i32> = LinkedList
::new();
365 let mut iter
= list
.drain_filter(|_
| true);
366 assert_eq
!(iter
.size_hint(), (0, Some(0)));
367 assert_eq
!(iter
.next(), None
);
368 assert_eq
!(iter
.size_hint(), (0, Some(0)));
369 assert_eq
!(iter
.next(), None
);
370 assert_eq
!(iter
.size_hint(), (0, Some(0)));
373 assert_eq
!(list
.len(), 0);
374 assert_eq
!(list
.into_iter().collect
::<Vec
<_
>>(), vec
![]);
378 fn drain_filter_zst() {
379 let mut list
: LinkedList
<_
> = vec
![(), (), (), (), ()].into_iter().collect();
380 let initial_len
= list
.len();
384 let mut iter
= list
.drain_filter(|_
| true);
385 assert_eq
!(iter
.size_hint(), (0, Some(initial_len
)));
386 while let Some(_
) = iter
.next() {
388 assert_eq
!(iter
.size_hint(), (0, Some(initial_len
- count
)));
390 assert_eq
!(iter
.size_hint(), (0, Some(0)));
391 assert_eq
!(iter
.next(), None
);
392 assert_eq
!(iter
.size_hint(), (0, Some(0)));
395 assert_eq
!(count
, initial_len
);
396 assert_eq
!(list
.len(), 0);
397 assert_eq
!(list
.into_iter().collect
::<Vec
<_
>>(), vec
![]);
401 fn drain_filter_false() {
402 let mut list
: LinkedList
<_
> = vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
404 let initial_len
= list
.len();
408 let mut iter
= list
.drain_filter(|_
| false);
409 assert_eq
!(iter
.size_hint(), (0, Some(initial_len
)));
410 for _
in iter
.by_ref() {
413 assert_eq
!(iter
.size_hint(), (0, Some(0)));
414 assert_eq
!(iter
.next(), None
);
415 assert_eq
!(iter
.size_hint(), (0, Some(0)));
418 assert_eq
!(count
, 0);
419 assert_eq
!(list
.len(), initial_len
);
420 assert_eq
!(list
.into_iter().collect
::<Vec
<_
>>(), vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
424 fn drain_filter_true() {
425 let mut list
: LinkedList
<_
> = vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
427 let initial_len
= list
.len();
431 let mut iter
= list
.drain_filter(|_
| true);
432 assert_eq
!(iter
.size_hint(), (0, Some(initial_len
)));
433 while let Some(_
) = iter
.next() {
435 assert_eq
!(iter
.size_hint(), (0, Some(initial_len
- count
)));
437 assert_eq
!(iter
.size_hint(), (0, Some(0)));
438 assert_eq
!(iter
.next(), None
);
439 assert_eq
!(iter
.size_hint(), (0, Some(0)));
442 assert_eq
!(count
, initial_len
);
443 assert_eq
!(list
.len(), 0);
444 assert_eq
!(list
.into_iter().collect
::<Vec
<_
>>(), vec
![]);
448 fn drain_filter_complex() {
450 { // [+xxx++++++xxxxx++++x+x++]
454 7, 9, 11, 13, 15, 17,
461 ].into_iter().collect
::<LinkedList
<_
>>();
463 let removed
= list
.drain_filter(|x
| *x
% 2 == 0).collect
::<Vec
<_
>>();
464 assert_eq
!(removed
.len(), 10);
465 assert_eq
!(removed
, vec
![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
467 assert_eq
!(list
.len(), 14);
469 list
.into_iter().collect
::<Vec
<_
>>(),
470 vec
![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
474 { // [xxx++++++xxxxx++++x+x++]
477 7, 9, 11, 13, 15, 17,
484 ].into_iter().collect
::<LinkedList
<_
>>();
486 let removed
= list
.drain_filter(|x
| *x
% 2 == 0).collect
::<Vec
<_
>>();
487 assert_eq
!(removed
.len(), 10);
488 assert_eq
!(removed
, vec
![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
490 assert_eq
!(list
.len(), 13);
492 list
.into_iter().collect
::<Vec
<_
>>(),
493 vec
![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
497 { // [xxx++++++xxxxx++++x+x]
500 7, 9, 11, 13, 15, 17,
506 ].into_iter().collect
::<LinkedList
<_
>>();
508 let removed
= list
.drain_filter(|x
| *x
% 2 == 0).collect
::<Vec
<_
>>();
509 assert_eq
!(removed
.len(), 10);
510 assert_eq
!(removed
, vec
![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
512 assert_eq
!(list
.len(), 11);
514 list
.into_iter().collect
::<Vec
<_
>>(),
515 vec
![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]
519 { // [xxxxxxxxxx+++++++++++]
521 2, 4, 6, 8, 10, 12, 14, 16, 18, 20,
522 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
523 ].into_iter().collect
::<LinkedList
<_
>>();
525 let removed
= list
.drain_filter(|x
| *x
% 2 == 0).collect
::<Vec
<_
>>();
526 assert_eq
!(removed
.len(), 10);
527 assert_eq
!(removed
, vec
![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
529 assert_eq
!(list
.len(), 10);
530 assert_eq
!(list
.into_iter().collect
::<Vec
<_
>>(), vec
![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
533 { // [+++++++++++xxxxxxxxxx]
535 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
536 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
537 ].into_iter().collect
::<LinkedList
<_
>>();
539 let removed
= list
.drain_filter(|x
| *x
% 2 == 0).collect
::<Vec
<_
>>();
540 assert_eq
!(removed
.len(), 10);
541 assert_eq
!(removed
, vec
![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
543 assert_eq
!(list
.len(), 10);
544 assert_eq
!(list
.into_iter().collect
::<Vec
<_
>>(), vec
![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);