1 use crate::{smallvec, SmallVec};
2
3 use std::iter::FromIterator;
4
5 use alloc::borrow::ToOwned;
6 use alloc::boxed::Box;
7 use alloc::rc::Rc;
8 use alloc::{vec, vec::Vec};
9
10 #[test]
test_zero()11 pub fn test_zero() {
12 let mut v = SmallVec::<[_; 0]>::new();
13 assert!(!v.spilled());
14 v.push(0usize);
15 assert!(v.spilled());
16 assert_eq!(&*v, &[0]);
17 }
18
19 // We heap allocate all these strings so that double frees will show up under valgrind.
20
21 #[test]
test_inline()22 pub fn test_inline() {
23 let mut v = SmallVec::<[_; 16]>::new();
24 v.push("hello".to_owned());
25 v.push("there".to_owned());
26 assert_eq!(&*v, &["hello".to_owned(), "there".to_owned(),][..]);
27 }
28
29 #[test]
test_spill()30 pub fn test_spill() {
31 let mut v = SmallVec::<[_; 2]>::new();
32 v.push("hello".to_owned());
33 assert_eq!(v[0], "hello");
34 v.push("there".to_owned());
35 v.push("burma".to_owned());
36 assert_eq!(v[0], "hello");
37 v.push("shave".to_owned());
38 assert_eq!(
39 &*v,
40 &[
41 "hello".to_owned(),
42 "there".to_owned(),
43 "burma".to_owned(),
44 "shave".to_owned(),
45 ][..]
46 );
47 }
48
49 #[test]
test_double_spill()50 pub fn test_double_spill() {
51 let mut v = SmallVec::<[_; 2]>::new();
52 v.push("hello".to_owned());
53 v.push("there".to_owned());
54 v.push("burma".to_owned());
55 v.push("shave".to_owned());
56 v.push("hello".to_owned());
57 v.push("there".to_owned());
58 v.push("burma".to_owned());
59 v.push("shave".to_owned());
60 assert_eq!(
61 &*v,
62 &[
63 "hello".to_owned(),
64 "there".to_owned(),
65 "burma".to_owned(),
66 "shave".to_owned(),
67 "hello".to_owned(),
68 "there".to_owned(),
69 "burma".to_owned(),
70 "shave".to_owned(),
71 ][..]
72 );
73 }
74
75 /// https://github.com/servo/rust-smallvec/issues/4
76 #[test]
issue_4()77 fn issue_4() {
78 SmallVec::<[Box<u32>; 2]>::new();
79 }
80
81 /// https://github.com/servo/rust-smallvec/issues/5
82 #[test]
issue_5()83 fn issue_5() {
84 assert!(Some(SmallVec::<[&u32; 2]>::new()).is_some());
85 }
86
87 #[test]
test_with_capacity()88 fn test_with_capacity() {
89 let v: SmallVec<[u8; 3]> = SmallVec::with_capacity(1);
90 assert!(v.is_empty());
91 assert!(!v.spilled());
92 assert_eq!(v.capacity(), 3);
93
94 let v: SmallVec<[u8; 3]> = SmallVec::with_capacity(10);
95 assert!(v.is_empty());
96 assert!(v.spilled());
97 assert_eq!(v.capacity(), 10);
98 }
99
100 #[test]
drain()101 fn drain() {
102 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
103 v.push(3);
104 assert_eq!(v.drain(..).collect::<Vec<_>>(), &[3]);
105
106 // spilling the vec
107 v.push(3);
108 v.push(4);
109 v.push(5);
110 let old_capacity = v.capacity();
111 assert_eq!(v.drain(1..).collect::<Vec<_>>(), &[4, 5]);
112 // drain should not change the capacity
113 assert_eq!(v.capacity(), old_capacity);
114 }
115
116 #[test]
drain_rev()117 fn drain_rev() {
118 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
119 v.push(3);
120 assert_eq!(v.drain(..).rev().collect::<Vec<_>>(), &[3]);
121
122 // spilling the vec
123 v.push(3);
124 v.push(4);
125 v.push(5);
126 assert_eq!(v.drain(..).rev().collect::<Vec<_>>(), &[5, 4, 3]);
127 }
128
129 #[test]
drain_forget()130 fn drain_forget() {
131 let mut v: SmallVec<[u8; 1]> = smallvec![0, 1, 2, 3, 4, 5, 6, 7];
132 std::mem::forget(v.drain(2..5));
133 assert_eq!(v.len(), 2);
134 }
135
136 #[test]
into_iter()137 fn into_iter() {
138 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
139 v.push(3);
140 assert_eq!(v.into_iter().collect::<Vec<_>>(), &[3]);
141
142 // spilling the vec
143 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
144 v.push(3);
145 v.push(4);
146 v.push(5);
147 assert_eq!(v.into_iter().collect::<Vec<_>>(), &[3, 4, 5]);
148 }
149
150 #[test]
into_iter_rev()151 fn into_iter_rev() {
152 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
153 v.push(3);
154 assert_eq!(v.into_iter().rev().collect::<Vec<_>>(), &[3]);
155
156 // spilling the vec
157 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
158 v.push(3);
159 v.push(4);
160 v.push(5);
161 assert_eq!(v.into_iter().rev().collect::<Vec<_>>(), &[5, 4, 3]);
162 }
163
164 #[test]
into_iter_drop()165 fn into_iter_drop() {
166 use std::cell::Cell;
167
168 struct DropCounter<'a>(&'a Cell<i32>);
169
170 impl<'a> Drop for DropCounter<'a> {
171 fn drop(&mut self) {
172 self.0.set(self.0.get() + 1);
173 }
174 }
175
176 {
177 let cell = Cell::new(0);
178 let mut v: SmallVec<[DropCounter<'_>; 2]> = SmallVec::new();
179 v.push(DropCounter(&cell));
180 v.into_iter();
181 assert_eq!(cell.get(), 1);
182 }
183
184 {
185 let cell = Cell::new(0);
186 let mut v: SmallVec<[DropCounter<'_>; 2]> = SmallVec::new();
187 v.push(DropCounter(&cell));
188 v.push(DropCounter(&cell));
189 assert!(v.into_iter().next().is_some());
190 assert_eq!(cell.get(), 2);
191 }
192
193 {
194 let cell = Cell::new(0);
195 let mut v: SmallVec<[DropCounter<'_>; 2]> = SmallVec::new();
196 v.push(DropCounter(&cell));
197 v.push(DropCounter(&cell));
198 v.push(DropCounter(&cell));
199 assert!(v.into_iter().next().is_some());
200 assert_eq!(cell.get(), 3);
201 }
202 {
203 let cell = Cell::new(0);
204 let mut v: SmallVec<[DropCounter<'_>; 2]> = SmallVec::new();
205 v.push(DropCounter(&cell));
206 v.push(DropCounter(&cell));
207 v.push(DropCounter(&cell));
208 {
209 let mut it = v.into_iter();
210 assert!(it.next().is_some());
211 assert!(it.next_back().is_some());
212 }
213 assert_eq!(cell.get(), 3);
214 }
215 }
216
217 #[test]
test_capacity()218 fn test_capacity() {
219 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
220 v.reserve(1);
221 assert_eq!(v.capacity(), 2);
222 assert!(!v.spilled());
223
224 v.reserve_exact(0x100);
225 assert!(v.capacity() >= 0x100);
226
227 v.push(0);
228 v.push(1);
229 v.push(2);
230 v.push(3);
231
232 v.shrink_to_fit();
233 assert!(v.capacity() < 0x100);
234 }
235
236 #[test]
test_truncate()237 fn test_truncate() {
238 let mut v: SmallVec<[Box<u8>; 8]> = SmallVec::new();
239
240 for x in 0..8 {
241 v.push(Box::new(x));
242 }
243 v.truncate(4);
244
245 assert_eq!(v.len(), 4);
246 assert!(!v.spilled());
247
248 assert_eq!(*v.swap_remove(1), 1);
249 assert_eq!(*v.remove(1), 3);
250 v.insert(1, Box::new(3));
251
252 assert_eq!(&v.iter().map(|v| **v).collect::<Vec<_>>(), &[0, 3, 2]);
253 }
254
255 #[test]
test_insert_many()256 fn test_insert_many() {
257 let mut v: SmallVec<[u8; 8]> = SmallVec::new();
258 for x in 0..4 {
259 v.push(x);
260 }
261 assert_eq!(v.len(), 4);
262 v.insert_many(1, [5, 6].iter().cloned());
263 assert_eq!(
264 &v.iter().map(|v| *v).collect::<Vec<_>>(),
265 &[0, 5, 6, 1, 2, 3]
266 );
267 }
268
269 struct MockHintIter<T: Iterator> {
270 x: T,
271 hint: usize,
272 }
273 impl<T: Iterator> Iterator for MockHintIter<T> {
274 type Item = T::Item;
next(&mut self) -> Option<Self::Item>275 fn next(&mut self) -> Option<Self::Item> {
276 self.x.next()
277 }
size_hint(&self) -> (usize, Option<usize>)278 fn size_hint(&self) -> (usize, Option<usize>) {
279 (self.hint, None)
280 }
281 }
282
283 #[test]
test_insert_many_short_hint()284 fn test_insert_many_short_hint() {
285 let mut v: SmallVec<[u8; 8]> = SmallVec::new();
286 for x in 0..4 {
287 v.push(x);
288 }
289 assert_eq!(v.len(), 4);
290 v.insert_many(
291 1,
292 MockHintIter {
293 x: [5, 6].iter().cloned(),
294 hint: 5,
295 },
296 );
297 assert_eq!(
298 &v.iter().map(|v| *v).collect::<Vec<_>>(),
299 &[0, 5, 6, 1, 2, 3]
300 );
301 }
302
303 #[test]
test_insert_many_long_hint()304 fn test_insert_many_long_hint() {
305 let mut v: SmallVec<[u8; 8]> = SmallVec::new();
306 for x in 0..4 {
307 v.push(x);
308 }
309 assert_eq!(v.len(), 4);
310 v.insert_many(
311 1,
312 MockHintIter {
313 x: [5, 6].iter().cloned(),
314 hint: 1,
315 },
316 );
317 assert_eq!(
318 &v.iter().map(|v| *v).collect::<Vec<_>>(),
319 &[0, 5, 6, 1, 2, 3]
320 );
321 }
322
323 // https://github.com/servo/rust-smallvec/issues/96
324 mod insert_many_panic {
325 use crate::{smallvec, SmallVec};
326 use alloc::boxed::Box;
327
328 struct PanicOnDoubleDrop {
329 dropped: Box<bool>,
330 }
331
332 impl PanicOnDoubleDrop {
new() -> Self333 fn new() -> Self {
334 Self {
335 dropped: Box::new(false),
336 }
337 }
338 }
339
340 impl Drop for PanicOnDoubleDrop {
drop(&mut self)341 fn drop(&mut self) {
342 assert!(!*self.dropped, "already dropped");
343 *self.dropped = true;
344 }
345 }
346
347 /// Claims to yield `hint` items, but actually yields `count`, then panics.
348 struct BadIter {
349 hint: usize,
350 count: usize,
351 }
352
353 impl Iterator for BadIter {
354 type Item = PanicOnDoubleDrop;
size_hint(&self) -> (usize, Option<usize>)355 fn size_hint(&self) -> (usize, Option<usize>) {
356 (self.hint, None)
357 }
next(&mut self) -> Option<Self::Item>358 fn next(&mut self) -> Option<Self::Item> {
359 if self.count == 0 {
360 panic!()
361 }
362 self.count -= 1;
363 Some(PanicOnDoubleDrop::new())
364 }
365 }
366
367 #[test]
panic_early_at_start()368 fn panic_early_at_start() {
369 let mut vec: SmallVec<[PanicOnDoubleDrop; 0]> =
370 smallvec![PanicOnDoubleDrop::new(), PanicOnDoubleDrop::new(),];
371 let result = ::std::panic::catch_unwind(move || {
372 vec.insert_many(0, BadIter { hint: 1, count: 0 });
373 });
374 assert!(result.is_err());
375 }
376
377 #[test]
panic_early_in_middle()378 fn panic_early_in_middle() {
379 let mut vec: SmallVec<[PanicOnDoubleDrop; 0]> =
380 smallvec![PanicOnDoubleDrop::new(), PanicOnDoubleDrop::new(),];
381 let result = ::std::panic::catch_unwind(move || {
382 vec.insert_many(1, BadIter { hint: 4, count: 2 });
383 });
384 assert!(result.is_err());
385 }
386
387 #[test]
panic_early_at_end()388 fn panic_early_at_end() {
389 let mut vec: SmallVec<[PanicOnDoubleDrop; 0]> =
390 smallvec![PanicOnDoubleDrop::new(), PanicOnDoubleDrop::new(),];
391 let result = ::std::panic::catch_unwind(move || {
392 vec.insert_many(2, BadIter { hint: 3, count: 1 });
393 });
394 assert!(result.is_err());
395 }
396
397 #[test]
panic_late_at_start()398 fn panic_late_at_start() {
399 let mut vec: SmallVec<[PanicOnDoubleDrop; 0]> =
400 smallvec![PanicOnDoubleDrop::new(), PanicOnDoubleDrop::new(),];
401 let result = ::std::panic::catch_unwind(move || {
402 vec.insert_many(0, BadIter { hint: 3, count: 5 });
403 });
404 assert!(result.is_err());
405 }
406
407 #[test]
panic_late_at_end()408 fn panic_late_at_end() {
409 let mut vec: SmallVec<[PanicOnDoubleDrop; 0]> =
410 smallvec![PanicOnDoubleDrop::new(), PanicOnDoubleDrop::new(),];
411 let result = ::std::panic::catch_unwind(move || {
412 vec.insert_many(2, BadIter { hint: 3, count: 5 });
413 });
414 assert!(result.is_err());
415 }
416 }
417
418 #[test]
419 #[should_panic]
test_invalid_grow()420 fn test_invalid_grow() {
421 let mut v: SmallVec<[u8; 8]> = SmallVec::new();
422 v.extend(0..8);
423 v.grow(5);
424 }
425
426 #[test]
test_insert_from_slice()427 fn test_insert_from_slice() {
428 let mut v: SmallVec<[u8; 8]> = SmallVec::new();
429 for x in 0..4 {
430 v.push(x);
431 }
432 assert_eq!(v.len(), 4);
433 v.insert_from_slice(1, &[5, 6]);
434 assert_eq!(
435 &v.iter().map(|v| *v).collect::<Vec<_>>(),
436 &[0, 5, 6, 1, 2, 3]
437 );
438 }
439
440 #[test]
test_extend_from_slice()441 fn test_extend_from_slice() {
442 let mut v: SmallVec<[u8; 8]> = SmallVec::new();
443 for x in 0..4 {
444 v.push(x);
445 }
446 assert_eq!(v.len(), 4);
447 v.extend_from_slice(&[5, 6]);
448 assert_eq!(
449 &v.iter().map(|v| *v).collect::<Vec<_>>(),
450 &[0, 1, 2, 3, 5, 6]
451 );
452 }
453
454 #[test]
455 #[should_panic]
test_drop_panic_smallvec()456 fn test_drop_panic_smallvec() {
457 // This test should only panic once, and not double panic,
458 // which would mean a double drop
459 struct DropPanic;
460
461 impl Drop for DropPanic {
462 fn drop(&mut self) {
463 panic!("drop");
464 }
465 }
466
467 let mut v = SmallVec::<[_; 1]>::new();
468 v.push(DropPanic);
469 }
470
471 #[test]
test_eq()472 fn test_eq() {
473 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
474 let mut b: SmallVec<[u32; 2]> = SmallVec::new();
475 let mut c: SmallVec<[u32; 2]> = SmallVec::new();
476 // a = [1, 2]
477 a.push(1);
478 a.push(2);
479 // b = [1, 2]
480 b.push(1);
481 b.push(2);
482 // c = [3, 4]
483 c.push(3);
484 c.push(4);
485
486 assert!(a == b);
487 assert!(a != c);
488 }
489
490 #[test]
test_ord()491 fn test_ord() {
492 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
493 let mut b: SmallVec<[u32; 2]> = SmallVec::new();
494 let mut c: SmallVec<[u32; 2]> = SmallVec::new();
495 // a = [1]
496 a.push(1);
497 // b = [1, 1]
498 b.push(1);
499 b.push(1);
500 // c = [1, 2]
501 c.push(1);
502 c.push(2);
503
504 assert!(a < b);
505 assert!(b > a);
506 assert!(b < c);
507 assert!(c > b);
508 }
509
510 #[test]
test_hash()511 fn test_hash() {
512 use std::collections::hash_map::DefaultHasher;
513 use std::hash::Hash;
514
515 {
516 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
517 let b = [1, 2];
518 a.extend(b.iter().cloned());
519 let mut hasher = DefaultHasher::new();
520 assert_eq!(a.hash(&mut hasher), b.hash(&mut hasher));
521 }
522 {
523 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
524 let b = [1, 2, 11, 12];
525 a.extend(b.iter().cloned());
526 let mut hasher = DefaultHasher::new();
527 assert_eq!(a.hash(&mut hasher), b.hash(&mut hasher));
528 }
529 }
530
531 #[test]
test_as_ref()532 fn test_as_ref() {
533 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
534 a.push(1);
535 assert_eq!(a.as_ref(), [1]);
536 a.push(2);
537 assert_eq!(a.as_ref(), [1, 2]);
538 a.push(3);
539 assert_eq!(a.as_ref(), [1, 2, 3]);
540 }
541
542 #[test]
test_as_mut()543 fn test_as_mut() {
544 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
545 a.push(1);
546 assert_eq!(a.as_mut(), [1]);
547 a.push(2);
548 assert_eq!(a.as_mut(), [1, 2]);
549 a.push(3);
550 assert_eq!(a.as_mut(), [1, 2, 3]);
551 a.as_mut()[1] = 4;
552 assert_eq!(a.as_mut(), [1, 4, 3]);
553 }
554
555 #[test]
test_borrow()556 fn test_borrow() {
557 use std::borrow::Borrow;
558
559 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
560 a.push(1);
561 assert_eq!(a.borrow(), [1]);
562 a.push(2);
563 assert_eq!(a.borrow(), [1, 2]);
564 a.push(3);
565 assert_eq!(a.borrow(), [1, 2, 3]);
566 }
567
568 #[test]
test_borrow_mut()569 fn test_borrow_mut() {
570 use std::borrow::BorrowMut;
571
572 let mut a: SmallVec<[u32; 2]> = SmallVec::new();
573 a.push(1);
574 assert_eq!(a.borrow_mut(), [1]);
575 a.push(2);
576 assert_eq!(a.borrow_mut(), [1, 2]);
577 a.push(3);
578 assert_eq!(a.borrow_mut(), [1, 2, 3]);
579 BorrowMut::<[u32]>::borrow_mut(&mut a)[1] = 4;
580 assert_eq!(a.borrow_mut(), [1, 4, 3]);
581 }
582
583 #[test]
test_from()584 fn test_from() {
585 assert_eq!(&SmallVec::<[u32; 2]>::from(&[1][..])[..], [1]);
586 assert_eq!(&SmallVec::<[u32; 2]>::from(&[1, 2, 3][..])[..], [1, 2, 3]);
587
588 let vec = vec![];
589 let small_vec: SmallVec<[u8; 3]> = SmallVec::from(vec);
590 assert_eq!(&*small_vec, &[]);
591 drop(small_vec);
592
593 let vec = vec![1, 2, 3, 4, 5];
594 let small_vec: SmallVec<[u8; 3]> = SmallVec::from(vec);
595 assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
596 drop(small_vec);
597
598 let vec = vec![1, 2, 3, 4, 5];
599 let small_vec: SmallVec<[u8; 1]> = SmallVec::from(vec);
600 assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
601 drop(small_vec);
602
603 let array = [1];
604 let small_vec: SmallVec<[u8; 1]> = SmallVec::from(array);
605 assert_eq!(&*small_vec, &[1]);
606 drop(small_vec);
607
608 let array = [99; 128];
609 let small_vec: SmallVec<[u8; 128]> = SmallVec::from(array);
610 assert_eq!(&*small_vec, vec![99u8; 128].as_slice());
611 drop(small_vec);
612 }
613
614 #[test]
test_from_slice()615 fn test_from_slice() {
616 assert_eq!(&SmallVec::<[u32; 2]>::from_slice(&[1][..])[..], [1]);
617 assert_eq!(
618 &SmallVec::<[u32; 2]>::from_slice(&[1, 2, 3][..])[..],
619 [1, 2, 3]
620 );
621 }
622
623 #[test]
test_exact_size_iterator()624 fn test_exact_size_iterator() {
625 let mut vec = SmallVec::<[u32; 2]>::from(&[1, 2, 3][..]);
626 assert_eq!(vec.clone().into_iter().len(), 3);
627 assert_eq!(vec.drain(..2).len(), 2);
628 assert_eq!(vec.into_iter().len(), 1);
629 }
630
631 #[test]
test_into_iter_as_slice()632 fn test_into_iter_as_slice() {
633 let vec = SmallVec::<[u32; 2]>::from(&[1, 2, 3][..]);
634 let mut iter = vec.clone().into_iter();
635 assert_eq!(iter.as_slice(), &[1, 2, 3]);
636 assert_eq!(iter.as_mut_slice(), &[1, 2, 3]);
637 iter.next();
638 assert_eq!(iter.as_slice(), &[2, 3]);
639 assert_eq!(iter.as_mut_slice(), &[2, 3]);
640 iter.next_back();
641 assert_eq!(iter.as_slice(), &[2]);
642 assert_eq!(iter.as_mut_slice(), &[2]);
643 }
644
645 #[test]
test_into_iter_clone()646 fn test_into_iter_clone() {
647 // Test that the cloned iterator yields identical elements and that it owns its own copy
648 // (i.e. no use after move errors).
649 let mut iter = SmallVec::<[u8; 2]>::from_iter(0..3).into_iter();
650 let mut clone_iter = iter.clone();
651 while let Some(x) = iter.next() {
652 assert_eq!(x, clone_iter.next().unwrap());
653 }
654 assert_eq!(clone_iter.next(), None);
655 }
656
657 #[test]
test_into_iter_clone_partially_consumed_iterator()658 fn test_into_iter_clone_partially_consumed_iterator() {
659 // Test that the cloned iterator only contains the remaining elements of the original iterator.
660 let mut iter = SmallVec::<[u8; 2]>::from_iter(0..3).into_iter().skip(1);
661 let mut clone_iter = iter.clone();
662 while let Some(x) = iter.next() {
663 assert_eq!(x, clone_iter.next().unwrap());
664 }
665 assert_eq!(clone_iter.next(), None);
666 }
667
668 #[test]
test_into_iter_clone_empty_smallvec()669 fn test_into_iter_clone_empty_smallvec() {
670 let mut iter = SmallVec::<[u8; 2]>::new().into_iter();
671 let mut clone_iter = iter.clone();
672 assert_eq!(iter.next(), None);
673 assert_eq!(clone_iter.next(), None);
674 }
675
676 #[test]
shrink_to_fit_unspill()677 fn shrink_to_fit_unspill() {
678 let mut vec = SmallVec::<[u8; 2]>::from_iter(0..3);
679 vec.pop();
680 assert!(vec.spilled());
681 vec.shrink_to_fit();
682 assert!(!vec.spilled(), "shrink_to_fit will un-spill if possible");
683 }
684
685 #[test]
test_into_vec()686 fn test_into_vec() {
687 let vec = SmallVec::<[u8; 2]>::from_iter(0..2);
688 assert_eq!(vec.into_vec(), vec![0, 1]);
689
690 let vec = SmallVec::<[u8; 2]>::from_iter(0..3);
691 assert_eq!(vec.into_vec(), vec![0, 1, 2]);
692 }
693
694 #[test]
test_into_inner()695 fn test_into_inner() {
696 let vec = SmallVec::<[u8; 2]>::from_iter(0..2);
697 assert_eq!(vec.into_inner(), Ok([0, 1]));
698
699 let vec = SmallVec::<[u8; 2]>::from_iter(0..1);
700 assert_eq!(vec.clone().into_inner(), Err(vec));
701
702 let vec = SmallVec::<[u8; 2]>::from_iter(0..3);
703 assert_eq!(vec.clone().into_inner(), Err(vec));
704 }
705
706 #[test]
test_from_vec()707 fn test_from_vec() {
708 let vec = vec![];
709 let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
710 assert_eq!(&*small_vec, &[]);
711 drop(small_vec);
712
713 let vec = vec![];
714 let small_vec: SmallVec<[u8; 1]> = SmallVec::from_vec(vec);
715 assert_eq!(&*small_vec, &[]);
716 drop(small_vec);
717
718 let vec = vec![1];
719 let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
720 assert_eq!(&*small_vec, &[1]);
721 drop(small_vec);
722
723 let vec = vec![1, 2, 3];
724 let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
725 assert_eq!(&*small_vec, &[1, 2, 3]);
726 drop(small_vec);
727
728 let vec = vec![1, 2, 3, 4, 5];
729 let small_vec: SmallVec<[u8; 3]> = SmallVec::from_vec(vec);
730 assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
731 drop(small_vec);
732
733 let vec = vec![1, 2, 3, 4, 5];
734 let small_vec: SmallVec<[u8; 1]> = SmallVec::from_vec(vec);
735 assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
736 drop(small_vec);
737 }
738
739 #[test]
test_retain()740 fn test_retain() {
741 // Test inline data storate
742 let mut sv: SmallVec<[i32; 5]> = SmallVec::from_slice(&[1, 2, 3, 3, 4]);
743 sv.retain(|&mut i| i != 3);
744 assert_eq!(sv.pop(), Some(4));
745 assert_eq!(sv.pop(), Some(2));
746 assert_eq!(sv.pop(), Some(1));
747 assert_eq!(sv.pop(), None);
748
749 // Test spilled data storage
750 let mut sv: SmallVec<[i32; 3]> = SmallVec::from_slice(&[1, 2, 3, 3, 4]);
751 sv.retain(|&mut i| i != 3);
752 assert_eq!(sv.pop(), Some(4));
753 assert_eq!(sv.pop(), Some(2));
754 assert_eq!(sv.pop(), Some(1));
755 assert_eq!(sv.pop(), None);
756
757 // Test that drop implementations are called for inline.
758 let one = Rc::new(1);
759 let mut sv: SmallVec<[Rc<i32>; 3]> = SmallVec::new();
760 sv.push(Rc::clone(&one));
761 assert_eq!(Rc::strong_count(&one), 2);
762 sv.retain(|_| false);
763 assert_eq!(Rc::strong_count(&one), 1);
764
765 // Test that drop implementations are called for spilled data.
766 let mut sv: SmallVec<[Rc<i32>; 1]> = SmallVec::new();
767 sv.push(Rc::clone(&one));
768 sv.push(Rc::new(2));
769 assert_eq!(Rc::strong_count(&one), 2);
770 sv.retain(|_| false);
771 assert_eq!(Rc::strong_count(&one), 1);
772 }
773
774 #[test]
test_dedup()775 fn test_dedup() {
776 let mut dupes: SmallVec<[i32; 5]> = SmallVec::from_slice(&[1, 1, 2, 3, 3]);
777 dupes.dedup();
778 assert_eq!(&*dupes, &[1, 2, 3]);
779
780 let mut empty: SmallVec<[i32; 5]> = SmallVec::new();
781 empty.dedup();
782 assert!(empty.is_empty());
783
784 let mut all_ones: SmallVec<[i32; 5]> = SmallVec::from_slice(&[1, 1, 1, 1, 1]);
785 all_ones.dedup();
786 assert_eq!(all_ones.len(), 1);
787
788 let mut no_dupes: SmallVec<[i32; 5]> = SmallVec::from_slice(&[1, 2, 3, 4, 5]);
789 no_dupes.dedup();
790 assert_eq!(no_dupes.len(), 5);
791 }
792
793 #[test]
test_resize()794 fn test_resize() {
795 let mut v: SmallVec<[i32; 8]> = SmallVec::new();
796 v.push(1);
797 v.resize(5, 0);
798 assert_eq!(v[..], [1, 0, 0, 0, 0][..]);
799
800 v.resize(2, -1);
801 assert_eq!(v[..], [1, 0][..]);
802 }
803
804 #[cfg(feature = "write")]
805 #[test]
test_write()806 fn test_write() {
807 use std::io::Write;
808
809 let data = [1, 2, 3, 4, 5];
810
811 let mut small_vec: SmallVec<[u8; 2]> = SmallVec::new();
812 let len = small_vec.write(&data[..]).unwrap();
813 assert_eq!(len, 5);
814 assert_eq!(small_vec.as_ref(), data.as_ref());
815
816 let mut small_vec: SmallVec<[u8; 2]> = SmallVec::new();
817 small_vec.write_all(&data[..]).unwrap();
818 assert_eq!(small_vec.as_ref(), data.as_ref());
819 }
820
821 #[cfg(feature = "serde")]
822 extern crate bincode;
823
824 #[cfg(feature = "serde")]
825 #[test]
test_serde()826 fn test_serde() {
827 use self::bincode::{config, deserialize};
828 let mut small_vec: SmallVec<[i32; 2]> = SmallVec::new();
829 small_vec.push(1);
830 let encoded = config().limit(100).serialize(&small_vec).unwrap();
831 let decoded: SmallVec<[i32; 2]> = deserialize(&encoded).unwrap();
832 assert_eq!(small_vec, decoded);
833 small_vec.push(2);
834 // Spill the vec
835 small_vec.push(3);
836 small_vec.push(4);
837 // Check again after spilling.
838 let encoded = config().limit(100).serialize(&small_vec).unwrap();
839 let decoded: SmallVec<[i32; 2]> = deserialize(&encoded).unwrap();
840 assert_eq!(small_vec, decoded);
841 }
842
843 #[test]
grow_to_shrink()844 fn grow_to_shrink() {
845 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
846 v.push(1);
847 v.push(2);
848 v.push(3);
849 assert!(v.spilled());
850 v.clear();
851 // Shrink to inline.
852 v.grow(2);
853 assert!(!v.spilled());
854 assert_eq!(v.capacity(), 2);
855 assert_eq!(v.len(), 0);
856 v.push(4);
857 assert_eq!(v[..], [4]);
858 }
859
860 #[test]
resumable_extend()861 fn resumable_extend() {
862 let s = "a b c";
863 // This iterator yields: (Some('a'), None, Some('b'), None, Some('c')), None
864 let it = s
865 .chars()
866 .scan(0, |_, ch| if ch.is_whitespace() { None } else { Some(ch) });
867 let mut v: SmallVec<[char; 4]> = SmallVec::new();
868 v.extend(it);
869 assert_eq!(v[..], ['a']);
870 }
871
872 // #139
873 #[test]
uninhabited()874 fn uninhabited() {
875 enum Void {}
876 let _sv = SmallVec::<[Void; 8]>::new();
877 }
878
879 #[test]
grow_spilled_same_size()880 fn grow_spilled_same_size() {
881 let mut v: SmallVec<[u8; 2]> = SmallVec::new();
882 v.push(0);
883 v.push(1);
884 v.push(2);
885 assert!(v.spilled());
886 assert_eq!(v.capacity(), 4);
887 // grow with the same capacity
888 v.grow(4);
889 assert_eq!(v.capacity(), 4);
890 assert_eq!(v[..], [0, 1, 2]);
891 }
892
893 #[cfg(feature = "const_generics")]
894 #[test]
const_generics()895 fn const_generics() {
896 let _v = SmallVec::<[i32; 987]>::default();
897 }
898
899 #[test]
empty_macro()900 fn empty_macro() {
901 let _v: SmallVec<[u8; 1]> = smallvec![];
902 }
903
904 #[test]
zero_size_items()905 fn zero_size_items() {
906 SmallVec::<[(); 0]>::new().push(());
907 }
908
909 #[test]
test_insert_many_overflow()910 fn test_insert_many_overflow() {
911 let mut v: SmallVec<[u8; 1]> = SmallVec::new();
912 v.push(123);
913
914 // Prepare an iterator with small lower bound
915 let iter = (0u8..5).filter(|n| n % 2 == 0);
916 assert_eq!(iter.size_hint().0, 0);
917
918 v.insert_many(0, iter);
919 assert_eq!(&*v, &[0, 2, 4, 123]);
920 }
921