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;
15 let mut m = LinkedList::<Box<_>>::new();
16 assert_eq!(m.pop_front(), None);
17 assert_eq!(m.pop_back(), None);
18 assert_eq!(m.pop_front(), None);
20 assert_eq!(m.pop_front(), Some(box 1));
23 assert_eq!(m.len(), 2);
24 assert_eq!(m.pop_front(), Some(box 2));
25 assert_eq!(m.pop_front(), Some(box 3));
26 assert_eq!(m.len(), 0);
27 assert_eq!(m.pop_front(), None);
32 assert_eq!(m.pop_front(), Some(box 1));
34 let mut n = LinkedList::new();
38 assert_eq!(n.front().unwrap(), &3);
39 let x = n.front_mut().unwrap();
44 assert_eq!(n.back().unwrap(), &2);
45 let y = n.back_mut().unwrap();
49 assert_eq!(n.pop_front(), Some(0));
50 assert_eq!(n.pop_front(), Some(1));
54 fn generate_test() -> LinkedList<i32> {
55 list_from(&[0, 1, 2, 3, 4, 5, 6])
59 fn list_from<T: Clone>(v: &[T]) -> LinkedList<T> {
60 v.iter().cloned().collect()
67 let mut m = LinkedList::new();
70 let p = m.split_off(0);
71 assert_eq!(m.len(), 0);
72 assert_eq!(p.len(), 1);
73 assert_eq!(p.back(), Some(&1));
74 assert_eq!(p.front(), Some(&1));
77 // not singleton, forwards
79 let u = vec![1, 2, 3, 4, 5];
80 let mut m = list_from(&u);
81 let mut n = m.split_off(2);
82 assert_eq!(m.len(), 2);
83 assert_eq!(n.len(), 3);
85 assert_eq!(m.pop_front(), Some(elt));
88 assert_eq!(n.pop_front(), Some(elt));
91 // not singleton, backwards
93 let u = vec![1, 2, 3, 4, 5];
94 let mut m = list_from(&u);
95 let mut n = m.split_off(4);
96 assert_eq!(m.len(), 4);
97 assert_eq!(n.len(), 1);
99 assert_eq!(m.pop_front(), Some(elt));
102 assert_eq!(n.pop_front(), Some(elt));
106 // no-op on the last index
108 let mut m = LinkedList::new();
111 let p = m.split_off(1);
112 assert_eq!(m.len(), 1);
113 assert_eq!(p.len(), 0);
114 assert_eq!(m.back(), Some(&1));
115 assert_eq!(m.front(), Some(&1));
122 let m = generate_test();
123 for (i, elt) in m.iter().enumerate() {
124 assert_eq!(i as i32, *elt);
126 let mut n = LinkedList::new();
127 assert_eq!(n.iter().next(), None);
129 let mut it = n.iter();
130 assert_eq!(it.size_hint(), (1, Some(1)));
131 assert_eq!(it.next().unwrap(), &4);
132 assert_eq!(it.size_hint(), (0, Some(0)));
133 assert_eq!(it.next(), None);
137 fn test_iterator_clone() {
138 let mut n = LinkedList::new();
142 let mut it = n.iter();
144 let mut jt = it.clone();
145 assert_eq!(it.next(), jt.next());
146 assert_eq!(it.next_back(), jt.next_back());
147 assert_eq!(it.next(), jt.next());
151 fn test_iterator_double_end() {
152 let mut n = LinkedList::new();
153 assert_eq!(n.iter().next(), None);
157 let mut it = n.iter();
158 assert_eq!(it.size_hint(), (3, Some(3)));
159 assert_eq!(it.next().unwrap(), &6);
160 assert_eq!(it.size_hint(), (2, Some(2)));
161 assert_eq!(it.next_back().unwrap(), &4);
162 assert_eq!(it.size_hint(), (1, Some(1)));
163 assert_eq!(it.next_back().unwrap(), &5);
164 assert_eq!(it.next_back(), None);
165 assert_eq!(it.next(), None);
170 let m = generate_test();
171 for (i, elt) in m.iter().rev().enumerate() {
172 assert_eq!((6 - i) as i32, *elt);
174 let mut n = LinkedList::new();
175 assert_eq!(n.iter().rev().next(), None);
177 let mut it = n.iter().rev();
178 assert_eq!(it.size_hint(), (1, Some(1)));
179 assert_eq!(it.next().unwrap(), &4);
180 assert_eq!(it.size_hint(), (0, Some(0)));
181 assert_eq!(it.next(), None);
186 let mut m = generate_test();
187 let mut len = m.len();
188 for (i, elt) in m.iter_mut().enumerate() {
189 assert_eq!(i as i32, *elt);
193 let mut n = LinkedList::new();
194 assert!(n.iter_mut().next().is_none());
197 let mut it = n.iter_mut();
198 assert_eq!(it.size_hint(), (2, Some(2)));
199 assert!(it.next().is_some());
200 assert!(it.next().is_some());
201 assert_eq!(it.size_hint(), (0, Some(0)));
202 assert!(it.next().is_none());
206 fn test_iterator_mut_double_end() {
207 let mut n = LinkedList::new();
208 assert!(n.iter_mut().next_back().is_none());
212 let mut it = n.iter_mut();
213 assert_eq!(it.size_hint(), (3, Some(3)));
214 assert_eq!(*it.next().unwrap(), 6);
215 assert_eq!(it.size_hint(), (2, Some(2)));
216 assert_eq!(*it.next_back().unwrap(), 4);
217 assert_eq!(it.size_hint(), (1, Some(1)));
218 assert_eq!(*it.next_back().unwrap(), 5);
219 assert!(it.next_back().is_none());
220 assert!(it.next().is_none());
224 fn test_mut_rev_iter() {
225 let mut m = generate_test();
226 for (i, elt) in m.iter_mut().rev().enumerate() {
227 assert_eq!((6 - i) as i32, *elt);
229 let mut n = LinkedList::new();
230 assert!(n.iter_mut().rev().next().is_none());
232 let mut it = n.iter_mut().rev();
233 assert!(it.next().is_some());
234 assert!(it.next().is_none());
239 let mut n = list_from(&[]);
240 let mut m = list_from(&[]);
247 let n = list_from(&[2, 3, 4]);
248 let m = list_from(&[1, 2, 3]);
254 let mut x = LinkedList::new();
255 let mut y = LinkedList::new();
257 assert!(::hash(&x) == ::hash(&y));
267 assert!(::hash(&x) == ::hash(&y));
272 let n = list_from(&[]);
273 let m = list_from(&[1, 2, 3]);
282 let nan = 0.0f64 / 0.0;
283 let n = list_from(&[nan]);
284 let m = list_from(&[nan]);
290 let n = list_from(&[nan]);
291 let one = list_from(&[1.0f64]);
294 assert!(!(n <= one));
295 assert!(!(n >= one));
297 let u = list_from(&[1.0f64, 2.0, nan]);
298 let v = list_from(&[1.0f64, 2.0, 3.0]);
304 let s = list_from(&[1.0f64, 2.0, 4.0, 2.0]);
305 let t = list_from(&[1.0f64, 2.0, 3.0, 2.0]);
308 assert!(!(s <= one));
314 let list: LinkedList<_> = (0..10).collect();
315 assert_eq!(format!("{:?}", list), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
317 let list: LinkedList<_> = vec!["just", "one", "test", "more"].iter().cloned().collect();
318 assert_eq!(format!("{:?}", list),
319 "[\"just\", \"one\", \"test\", \"more\"]");
323 fn test_extend_ref() {
324 let mut a = LinkedList::new();
327 a.extend(&[2, 3, 4]);
329 assert_eq!(a.len(), 4);
330 assert_eq!(a, list_from(&[1, 2, 3, 4]));
332 let mut b = LinkedList::new();
337 assert_eq!(a.len(), 6);
338 assert_eq!(a, list_from(&[1, 2, 3, 4, 5, 6]));
343 let mut a = LinkedList::new();
345 a.extend(vec![2, 3, 4]); // uses iterator
347 assert_eq!(a.len(), 4);
348 assert!(a.iter().eq(&[1, 2, 3, 4]));
350 let b: LinkedList<_> = vec![5, 6, 7].into_iter().collect();
351 a.extend(b); // specializes to `append`
353 assert_eq!(a.len(), 7);
354 assert!(a.iter().eq(&[1, 2, 3, 4, 5, 6, 7]));
359 let mut l = LinkedList::new();
360 l.extend(&[2, 3, 4]);
362 assert!(l.contains(&3));
363 assert!(!l.contains(&1));
367 assert!(!l.contains(&3));