1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use std::collections::LinkedList;
17 let mut m = LinkedList::<Box<_>>::new();
18 assert_eq!(m.pop_front(), None);
19 assert_eq!(m.pop_back(), None);
20 assert_eq!(m.pop_front(), None);
22 assert_eq!(m.pop_front(), Some(box 1));
25 assert_eq!(m.len(), 2);
26 assert_eq!(m.pop_front(), Some(box 2));
27 assert_eq!(m.pop_front(), Some(box 3));
28 assert_eq!(m.len(), 0);
29 assert_eq!(m.pop_front(), None);
34 assert_eq!(m.pop_front(), Some(box 1));
36 let mut n = LinkedList::new();
40 assert_eq!(n.front().unwrap(), &3);
41 let x = n.front_mut().unwrap();
46 assert_eq!(n.back().unwrap(), &2);
47 let y = n.back_mut().unwrap();
51 assert_eq!(n.pop_front(), Some(0));
52 assert_eq!(n.pop_front(), Some(1));
56 fn generate_test() -> LinkedList<i32> {
57 list_from(&[0, 1, 2, 3, 4, 5, 6])
61 fn list_from<T: Clone>(v: &[T]) -> LinkedList<T> {
62 v.iter().cloned().collect()
69 let mut m = LinkedList::new();
72 let p = m.split_off(0);
73 assert_eq!(m.len(), 0);
74 assert_eq!(p.len(), 1);
75 assert_eq!(p.back(), Some(&1));
76 assert_eq!(p.front(), Some(&1));
79 // not singleton, forwards
81 let u = vec![1, 2, 3, 4, 5];
82 let mut m = list_from(&u);
83 let mut n = m.split_off(2);
84 assert_eq!(m.len(), 2);
85 assert_eq!(n.len(), 3);
87 assert_eq!(m.pop_front(), Some(elt));
90 assert_eq!(n.pop_front(), Some(elt));
93 // not singleton, backwards
95 let u = vec![1, 2, 3, 4, 5];
96 let mut m = list_from(&u);
97 let mut n = m.split_off(4);
98 assert_eq!(m.len(), 4);
99 assert_eq!(n.len(), 1);
101 assert_eq!(m.pop_front(), Some(elt));
104 assert_eq!(n.pop_front(), Some(elt));
108 // no-op on the last index
110 let mut m = LinkedList::new();
113 let p = m.split_off(1);
114 assert_eq!(m.len(), 1);
115 assert_eq!(p.len(), 0);
116 assert_eq!(m.back(), Some(&1));
117 assert_eq!(m.front(), Some(&1));
124 let m = generate_test();
125 for (i, elt) in m.iter().enumerate() {
126 assert_eq!(i as i32, *elt);
128 let mut n = LinkedList::new();
129 assert_eq!(n.iter().next(), None);
131 let mut it = n.iter();
132 assert_eq!(it.size_hint(), (1, Some(1)));
133 assert_eq!(it.next().unwrap(), &4);
134 assert_eq!(it.size_hint(), (0, Some(0)));
135 assert_eq!(it.next(), None);
139 fn test_iterator_clone() {
140 let mut n = LinkedList::new();
144 let mut it = n.iter();
146 let mut jt = it.clone();
147 assert_eq!(it.next(), jt.next());
148 assert_eq!(it.next_back(), jt.next_back());
149 assert_eq!(it.next(), jt.next());
153 fn test_iterator_double_end() {
154 let mut n = LinkedList::new();
155 assert_eq!(n.iter().next(), None);
159 let mut it = n.iter();
160 assert_eq!(it.size_hint(), (3, Some(3)));
161 assert_eq!(it.next().unwrap(), &6);
162 assert_eq!(it.size_hint(), (2, Some(2)));
163 assert_eq!(it.next_back().unwrap(), &4);
164 assert_eq!(it.size_hint(), (1, Some(1)));
165 assert_eq!(it.next_back().unwrap(), &5);
166 assert_eq!(it.next_back(), None);
167 assert_eq!(it.next(), None);
172 let m = generate_test();
173 for (i, elt) in m.iter().rev().enumerate() {
174 assert_eq!((6 - i) as i32, *elt);
176 let mut n = LinkedList::new();
177 assert_eq!(n.iter().rev().next(), None);
179 let mut it = n.iter().rev();
180 assert_eq!(it.size_hint(), (1, Some(1)));
181 assert_eq!(it.next().unwrap(), &4);
182 assert_eq!(it.size_hint(), (0, Some(0)));
183 assert_eq!(it.next(), None);
188 let mut m = generate_test();
189 let mut len = m.len();
190 for (i, elt) in m.iter_mut().enumerate() {
191 assert_eq!(i as i32, *elt);
195 let mut n = LinkedList::new();
196 assert!(n.iter_mut().next().is_none());
199 let mut it = n.iter_mut();
200 assert_eq!(it.size_hint(), (2, Some(2)));
201 assert!(it.next().is_some());
202 assert!(it.next().is_some());
203 assert_eq!(it.size_hint(), (0, Some(0)));
204 assert!(it.next().is_none());
208 fn test_iterator_mut_double_end() {
209 let mut n = LinkedList::new();
210 assert!(n.iter_mut().next_back().is_none());
214 let mut it = n.iter_mut();
215 assert_eq!(it.size_hint(), (3, Some(3)));
216 assert_eq!(*it.next().unwrap(), 6);
217 assert_eq!(it.size_hint(), (2, Some(2)));
218 assert_eq!(*it.next_back().unwrap(), 4);
219 assert_eq!(it.size_hint(), (1, Some(1)));
220 assert_eq!(*it.next_back().unwrap(), 5);
221 assert!(it.next_back().is_none());
222 assert!(it.next().is_none());
226 fn test_mut_rev_iter() {
227 let mut m = generate_test();
228 for (i, elt) in m.iter_mut().rev().enumerate() {
229 assert_eq!((6 - i) as i32, *elt);
231 let mut n = LinkedList::new();
232 assert!(n.iter_mut().rev().next().is_none());
234 let mut it = n.iter_mut().rev();
235 assert!(it.next().is_some());
236 assert!(it.next().is_none());
241 let mut n = list_from(&[]);
242 let mut m = list_from(&[]);
249 let n = list_from(&[2, 3, 4]);
250 let m = list_from(&[1, 2, 3]);
256 let mut x = LinkedList::new();
257 let mut y = LinkedList::new();
259 assert!(::hash(&x) == ::hash(&y));
269 assert!(::hash(&x) == ::hash(&y));
274 let n = list_from(&[]);
275 let m = list_from(&[1, 2, 3]);
284 let nan = 0.0f64 / 0.0;
285 let n = list_from(&[nan]);
286 let m = list_from(&[nan]);
292 let n = list_from(&[nan]);
293 let one = list_from(&[1.0f64]);
296 assert!(!(n <= one));
297 assert!(!(n >= one));
299 let u = list_from(&[1.0f64, 2.0, nan]);
300 let v = list_from(&[1.0f64, 2.0, 3.0]);
306 let s = list_from(&[1.0f64, 2.0, 4.0, 2.0]);
307 let t = list_from(&[1.0f64, 2.0, 3.0, 2.0]);
310 assert!(!(s <= one));
316 let list: LinkedList<_> = (0..10).collect();
317 assert_eq!(format!("{:?}", list), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
319 let list: LinkedList<_> = vec!["just", "one", "test", "more"].iter().cloned().collect();
320 assert_eq!(format!("{:?}", list),
321 "[\"just\", \"one\", \"test\", \"more\"]");
325 fn test_extend_ref() {
326 let mut a = LinkedList::new();
329 a.extend(&[2, 3, 4]);
331 assert_eq!(a.len(), 4);
332 assert_eq!(a, list_from(&[1, 2, 3, 4]));
334 let mut b = LinkedList::new();
339 assert_eq!(a.len(), 6);
340 assert_eq!(a, list_from(&[1, 2, 3, 4, 5, 6]));
345 let mut a = LinkedList::new();
347 a.extend(vec![2, 3, 4]); // uses iterator
349 assert_eq!(a.len(), 4);
350 assert!(a.iter().eq(&[1, 2, 3, 4]));
352 let b: LinkedList<_> = vec![5, 6, 7].into_iter().collect();
353 a.extend(b); // specializes to `append`
355 assert_eq!(a.len(), 7);
356 assert!(a.iter().eq(&[1, 2, 3, 4, 5, 6, 7]));
360 fn bench_collect_into(b: &mut test::Bencher) {
363 let _: LinkedList<_> = v.iter().cloned().collect();
368 fn bench_push_front(b: &mut test::Bencher) {
369 let mut m: LinkedList<_> = LinkedList::new();
376 fn bench_push_back(b: &mut test::Bencher) {
377 let mut m: LinkedList<_> = LinkedList::new();
384 fn bench_push_back_pop_back(b: &mut test::Bencher) {
385 let mut m: LinkedList<_> = LinkedList::new();
393 fn bench_push_front_pop_front(b: &mut test::Bencher) {
394 let mut m: LinkedList<_> = LinkedList::new();
402 fn bench_iter(b: &mut test::Bencher) {
404 let m: LinkedList<_> = v.iter().cloned().collect();
406 assert!(m.iter().count() == 128);
410 fn bench_iter_mut(b: &mut test::Bencher) {
412 let mut m: LinkedList<_> = v.iter().cloned().collect();
414 assert!(m.iter_mut().count() == 128);
418 fn bench_iter_rev(b: &mut test::Bencher) {
420 let m: LinkedList<_> = v.iter().cloned().collect();
422 assert!(m.iter().rev().count() == 128);
426 fn bench_iter_mut_rev(b: &mut test::Bencher) {
428 let mut m: LinkedList<_> = v.iter().cloned().collect();
430 assert!(m.iter_mut().rev().count() == 128);
436 let mut l = LinkedList::new();
437 l.extend(&[2, 3, 4]);
439 assert!(l.contains(&3));
440 assert!(!l.contains(&1));
444 assert!(!l.contains(&3));