]>
git.proxmox.com Git - rustc.git/blob - vendor/arrayvec-0.5.2/tests/tests.rs
2 #[macro_use] extern crate matches;
4 use arrayvec
::ArrayVec
;
5 use arrayvec
::ArrayString
;
7 use arrayvec
::CapacityError
;
9 use std
::collections
::HashMap
;
16 let mut vec
: ArrayVec
<[Vec
<i32>; 3]> = ArrayVec
::new();
18 vec
.push(vec
![1, 2, 3, 4]);
20 vec
.push(vec
![-1, 13, -2]);
23 assert_eq
!(elt
.iter().fold(0, Add
::add
), 10);
26 let sum_len
= vec
.into_iter().map(|x
| x
.len()).fold(0, Add
::add
);
27 assert_eq
!(sum_len
, 8);
31 fn test_capacity_left() {
32 let mut vec
: ArrayVec
<[usize; 4]> = ArrayVec
::new();
33 assert_eq
!(vec
.remaining_capacity(), 4);
35 assert_eq
!(vec
.remaining_capacity(), 3);
37 assert_eq
!(vec
.remaining_capacity(), 2);
39 assert_eq
!(vec
.remaining_capacity(), 1);
41 assert_eq
!(vec
.remaining_capacity(), 0);
45 fn test_extend_from_slice() {
46 let mut vec
: ArrayVec
<[usize; 10]> = ArrayVec
::new();
48 vec
.try_extend_from_slice(&[1, 2, 3]).unwrap();
49 assert_eq
!(vec
.len(), 3);
50 assert_eq
!(&vec
[..], &[1, 2, 3]);
51 assert_eq
!(vec
.pop(), Some(3));
52 assert_eq
!(&vec
[..], &[1, 2]);
56 fn test_extend_from_slice_error() {
57 let mut vec
: ArrayVec
<[usize; 10]> = ArrayVec
::new();
59 vec
.try_extend_from_slice(&[1, 2, 3]).unwrap();
60 let res
= vec
.try_extend_from_slice(&[0; 8]);
61 assert_matches
!(res
, Err(_
));
63 let mut vec
: ArrayVec
<[usize; 0]> = ArrayVec
::new();
64 let res
= vec
.try_extend_from_slice(&[0; 1]);
65 assert_matches
!(res
, Err(_
));
69 fn test_try_from_slice_error() {
70 use arrayvec
::ArrayVec
;
71 use std
::convert
::TryInto
as _
;
73 let res
: Result
<ArrayVec
<[_
; 2]>, _
> = (&[1, 2, 3] as &[_
]).try_into();
74 assert_matches
!(res
, Err(_
));
79 const N
: usize = 4096;
80 let mut vec
: ArrayVec
<[_
; N
]> = ArrayVec
::new();
82 assert
!(vec
.try_push(1u8).is_ok());
84 assert
!(vec
.try_push(0).is_err());
85 assert_eq
!(vec
.len(), N
);
90 let mut iter
= ArrayVec
::from([1, 2, 3]).into_iter();
91 assert_eq
!(iter
.size_hint(), (3, Some(3)));
92 assert_eq
!(iter
.next_back(), Some(3));
93 assert_eq
!(iter
.next(), Some(1));
94 assert_eq
!(iter
.next_back(), Some(2));
95 assert_eq
!(iter
.size_hint(), (0, Some(0)));
96 assert_eq
!(iter
.next_back(), None
);
103 let flag
= &Cell
::new(0);
106 struct Bump
<'a
>(&'a Cell
<i32>);
108 impl<'a
> Drop
for Bump
<'a
> {
110 let n
= self.0.get();
116 let mut array
= ArrayVec
::<[Bump
; 128]>::new();
117 array
.push(Bump(flag
));
118 array
.push(Bump(flag
));
120 assert_eq
!(flag
.get(), 2);
122 // test something with the nullable pointer optimization
126 let mut array
= ArrayVec
::<[_
; 3]>::new();
127 array
.push(vec
![Bump(flag
)]);
128 array
.push(vec
![Bump(flag
), Bump(flag
)]);
130 let push4
= array
.try_push(vec
![Bump(flag
)]);
131 assert_eq
!(flag
.get(), 0);
133 assert_eq
!(flag
.get(), 1);
135 assert_eq
!(flag
.get(), 1);
137 assert_eq
!(flag
.get(), 3);
140 assert_eq
!(flag
.get(), 4);
145 let mut array
= ArrayVec
::<[_
; 3]>::new();
146 array
.push(Bump(flag
));
147 array
.push(Bump(flag
));
148 array
.push(Bump(flag
));
149 let inner
= array
.into_inner();
150 assert
!(inner
.is_ok());
151 assert_eq
!(flag
.get(), 0);
153 assert_eq
!(flag
.get(), 3);
156 // test cloning into_iter
159 let mut array
= ArrayVec
::<[_
; 3]>::new();
160 array
.push(Bump(flag
));
161 array
.push(Bump(flag
));
162 array
.push(Bump(flag
));
163 let mut iter
= array
.into_iter();
164 assert_eq
!(flag
.get(), 0);
166 assert_eq
!(flag
.get(), 1);
167 let clone
= iter
.clone();
168 assert_eq
!(flag
.get(), 1);
170 assert_eq
!(flag
.get(), 3);
172 assert_eq
!(flag
.get(), 5);
177 fn test_drop_panics() {
179 use std
::panic
::catch_unwind
;
180 use std
::panic
::AssertUnwindSafe
;
182 let flag
= &Cell
::new(0);
184 struct Bump
<'a
>(&'a Cell
<i32>);
186 // Panic in the first drop
187 impl<'a
> Drop
for Bump
<'a
> {
189 let n
= self.0.get();
192 panic
!("Panic in Bump's drop");
196 // check if rust is new enough
199 let array
= vec
![Bump(flag
), Bump(flag
)];
200 let res
= catch_unwind(AssertUnwindSafe(|| {
203 assert
!(res
.is_err());
207 println
!("test_drop_panics: skip, this version of Rust doesn't continue in drop_in_place");
213 let mut array
= ArrayVec
::<[Bump
; 128]>::new();
214 array
.push(Bump(flag
));
215 array
.push(Bump(flag
));
216 array
.push(Bump(flag
));
218 let res
= catch_unwind(AssertUnwindSafe(|| {
221 assert
!(res
.is_err());
223 // Check that all the elements drop, even if the first drop panics.
224 assert_eq
!(flag
.get(), 3);
229 let mut array
= ArrayVec
::<[Bump
; 16]>::new();
230 array
.push(Bump(flag
));
231 array
.push(Bump(flag
));
232 array
.push(Bump(flag
));
233 array
.push(Bump(flag
));
234 array
.push(Bump(flag
));
237 let tail_len
= array
.len() - i
;
239 let res
= catch_unwind(AssertUnwindSafe(|| {
242 assert
!(res
.is_err());
243 // Check that all the tail elements drop, even if the first drop panics.
244 assert_eq
!(flag
.get(), tail_len
as i32);
252 let mut range
= 0..10;
254 let mut array
: ArrayVec
<[_
; 5]> = range
.by_ref().collect();
255 assert_eq
!(&array
[..], &[0, 1, 2, 3, 4]);
256 assert_eq
!(range
.next(), Some(5));
258 array
.extend(range
.by_ref());
259 assert_eq
!(range
.next(), Some(6));
261 let mut array
: ArrayVec
<[_
; 10]> = (0..3).collect();
262 assert_eq
!(&array
[..], &[0, 1, 2]);
264 assert_eq
!(&array
[..], &[0, 1, 2, 3, 4]);
268 fn test_is_send_sync() {
269 let data
= ArrayVec
::<[Vec
<i32>; 5]>::new();
275 fn test_compact_size() {
276 // Future rust will kill these drop flags!
277 // 4 elements size + 1 len + 1 enum tag + [1 drop flag]
278 type ByteArray
= ArrayVec
<[u8; 4]>;
279 println
!("{}", mem
::size_of
::<ByteArray
>());
280 assert
!(mem
::size_of
::<ByteArray
>() <= 8);
282 // 1 enum tag + 1 drop flag
283 type EmptyArray
= ArrayVec
<[u8; 0]>;
284 println
!("{}", mem
::size_of
::<EmptyArray
>());
285 assert
!(mem
::size_of
::<EmptyArray
>() <= 2);
287 // 12 element size + 1 enum tag + 3 padding + 1 len + 1 drop flag + 2 padding
288 type QuadArray
= ArrayVec
<[u32; 3]>;
289 println
!("{}", mem
::size_of
::<QuadArray
>());
290 assert
!(mem
::size_of
::<QuadArray
>() <= 24);
294 fn test_still_works_with_option_arrayvec() {
295 type RefArray
= ArrayVec
<[&'
static i32; 2]>;
296 let array
= Some(RefArray
::new());
297 assert
!(array
.is_some());
298 println
!("{:?}", array
);
303 let mut v
= ArrayVec
::from([0; 8]);
306 assert_eq
!(&v
[..], &[]);
310 assert_eq
!(&v
[..], &[0, 4, 5, 6, 7]);
311 let u
: ArrayVec
<[_
; 3]> = v
.drain(1..4).rev().collect();
312 assert_eq
!(&u
[..], &[6, 5, 4]);
313 assert_eq
!(&v
[..], &[0, 7]);
315 assert_eq
!(&v
[..], &[]);
319 fn test_drain_range_inclusive() {
320 let mut v
= ArrayVec
::from([0; 8]);
322 assert_eq
!(&v
[..], &[]);
326 assert_eq
!(&v
[..], &[0, 5, 6, 7]);
327 let u
: ArrayVec
<[_
; 3]> = v
.drain(1..=2).rev().collect();
328 assert_eq
!(&u
[..], &[6, 5]);
329 assert_eq
!(&v
[..], &[0, 7]);
331 assert_eq
!(&v
[..], &[]);
336 fn test_drain_range_inclusive_oob() {
337 let mut v
= ArrayVec
::from([0; 0]);
343 let mut v
= ArrayVec
::from([0; 8]);
344 for (i
, elt
) in v
.iter_mut().enumerate() {
348 assert_eq
!(&v
[..], &[0, 1, 2, 3, 4, 5, 6, 7]);
353 assert_eq
!(&v
[..], &[0, 0, 2, 2]);
355 assert_eq
!(&v
[..], &[]);
360 fn test_drain_oob() {
361 let mut v
= ArrayVec
::from([0; 8]);
368 fn test_drop_panic() {
371 impl Drop
for DropPanic
{
377 let mut array
= ArrayVec
::<[DropPanic
; 1]>::new();
378 array
.push(DropPanic
);
383 fn test_drop_panic_into_iter() {
386 impl Drop
for DropPanic
{
392 let mut array
= ArrayVec
::<[DropPanic
; 1]>::new();
393 array
.push(DropPanic
);
399 let mut v
= ArrayVec
::from([]);
400 assert_matches
!(v
.try_push(1), Err(_
));
402 let mut v
= ArrayVec
::<[_
; 3]>::new();
405 //let ret1 = v.try_insert(3, 3);
406 //assert_matches!(ret1, Err(InsertError::OutOfBounds(_)));
407 assert_eq
!(&v
[..], &[0, 1]);
409 assert_eq
!(&v
[..], &[0, 1, 2]);
411 let ret2
= v
.try_insert(1, 9);
412 assert_eq
!(&v
[..], &[0, 1, 2]);
413 assert_matches
!(ret2
, Err(_
));
415 let mut v
= ArrayVec
::from([2]);
416 assert_matches
!(v
.try_insert(0, 1), Err(CapacityError { .. }
));
417 assert_matches
!(v
.try_insert(1, 1), Err(CapacityError { .. }
));
418 //assert_matches!(v.try_insert(2, 1), Err(CapacityError { .. }));
422 fn test_into_inner_1() {
423 let mut v
= ArrayVec
::from([1, 2]);
426 assert_eq
!(v
.into_inner(), Err(u
));
430 fn test_into_inner_2() {
431 let mut v
= ArrayVec
::<[String
; 4]>::new();
436 assert_eq
!(v
.into_inner().unwrap(), ["a", "b", "c", "d"]);
440 fn test_into_inner_3_() {
441 let mut v
= ArrayVec
::<[i32; 4]>::new();
443 assert_eq
!(v
.into_inner().unwrap(), [1, 2, 3, 4]);
446 #[cfg(feature="std")]
450 let mut v
= ArrayVec
::<[_
; 8]>::new();
451 write
!(&mut v
, "\x01\x02\x03").unwrap();
452 assert_eq
!(&v
[..], &[1, 2, 3]);
453 let r
= v
.write(&[9; 16]).unwrap();
455 assert_eq
!(&v
[..], &[1, 2, 3, 9, 9, 9, 9, 9]);
459 fn array_clone_from() {
460 let mut v
= ArrayVec
::<[_
; 4]>::new();
462 v
.push(vec
![3, 4, 5]);
464 let reference
= v
.to_vec();
465 let mut u
= ArrayVec
::<[_
; 4]>::new();
467 assert_eq
!(&u
, &reference
[..]);
469 let mut t
= ArrayVec
::<[_
; 4]>::new();
472 t
.push(vec
![5, 6, 2]);
475 assert_eq
!(&t
, &reference
[..]);
478 assert_eq
!(&t
, &reference
[..]);
481 #[cfg(feature="std")]
484 use std
::error
::Error
;
486 let text
= "hello world";
487 let mut s
= ArrayString
::<[_
; 16]>::new();
488 s
.try_push_str(text
).unwrap();
489 assert_eq
!(&s
, text
);
490 assert_eq
!(text
, &s
);
492 // Make sure Hash / Eq / Borrow match up so we can use HashMap
493 let mut map
= HashMap
::new();
495 assert_eq
!(map
[text
], 1);
497 let mut t
= ArrayString
::<[_
; 2]>::new();
498 assert
!(t
.try_push_str(text
).is_err());
503 let tmut
: &mut str = &mut t
;
504 assert_eq
!(tmut
, "ab");
506 // Test Error trait / try
507 let t
= || -> Result
<(), Box
<dyn Error
>> {
508 let mut t
= ArrayString
::<[_
; 2]>::new();
509 t
.try_push_str(text
)?
;
516 fn test_string_from() {
517 let text
= "hello world";
518 // Test `from` constructor
519 let u
= ArrayString
::<[_
; 11]>::from(text
).unwrap();
520 assert_eq
!(&u
, text
);
521 assert_eq
!(u
.len(), text
.len());
525 fn test_string_parse_from_str() {
526 let text
= "hello world";
527 let u
: ArrayString
<[_
; 11]> = text
.parse().unwrap();
528 assert_eq
!(&u
, text
);
529 assert_eq
!(u
.len(), text
.len());
533 fn test_string_from_bytes() {
534 let text
= "hello world";
535 let u
= ArrayString
::from_byte_string(b
"hello world").unwrap();
536 assert_eq
!(&u
, text
);
537 assert_eq
!(u
.len(), text
.len());
541 fn test_string_clone() {
543 let mut s
= ArrayString
::<[_
; 4]>::new();
545 let t
= ArrayString
::<[_
; 4]>::from(text
).unwrap();
551 fn test_string_push() {
553 let mut s
= ArrayString
::<[_
; 8]>::new();
554 for c
in text
.chars() {
555 if let Err(_
) = s
.try_push(c
) {
559 assert_eq
!("abcαβ", &s
[..]);
561 assert_eq
!("abcαβx", &s
[..]);
562 assert
!(s
.try_push('x'
).is_err());
567 fn test_insert_at_length() {
568 let mut v
= ArrayVec
::<[_
; 8]>::new();
569 let result1
= v
.try_insert(0, "a");
570 let result2
= v
.try_insert(1, "b");
571 assert
!(result1
.is_ok() && result2
.is_ok());
572 assert_eq
!(&v
[..], &["a", "b"]);
577 fn test_insert_out_of_bounds() {
578 let mut v
= ArrayVec
::<[_
; 8]>::new();
579 let _
= v
.try_insert(1, "test");
583 * insert that pushes out the last
584 let mut u = ArrayVec::from([1, 2, 3, 4]);
585 let ret = u.try_insert(3, 99);
586 assert_eq!(&u[..], &[1, 2, 3, 99]);
587 assert_matches!(ret, Err(_));
588 let ret = u.try_insert(4, 77);
589 assert_eq!(&u[..], &[1, 2, 3, 99]);
590 assert_matches!(ret, Err(_));
594 fn test_drop_in_insert() {
597 let flag
= &Cell
::new(0);
599 struct Bump
<'a
>(&'a Cell
<i32>);
601 impl<'a
> Drop
for Bump
<'a
> {
603 let n
= self.0.get();
611 let mut array
= ArrayVec
::<[_
; 2]>::new();
612 array
.push(Bump(flag
));
613 array
.insert(0, Bump(flag
));
614 assert_eq
!(flag
.get(), 0);
615 let ret
= array
.try_insert(1, Bump(flag
));
616 assert_eq
!(flag
.get(), 0);
617 assert_matches
!(ret
, Err(_
));
619 assert_eq
!(flag
.get(), 1);
621 assert_eq
!(flag
.get(), 3);
626 let mut v
= ArrayVec
::<[String
; 4]>::new();
627 let s
= String
::from
;
633 assert_eq
!(v
.pop_at(4), None
);
634 assert_eq
!(v
.pop_at(1), Some(s("b")));
635 assert_eq
!(v
.pop_at(1), Some(s("c")));
636 assert_eq
!(v
.pop_at(2), None
);
637 assert_eq
!(&v
[..], &["a", "d"]);
642 let v
= ArrayVec
::from([0u8; 1 << 16]);
643 assert_eq
!(vec
![0u8; v
.len()], &v
[..]);
649 let s
: ArrayString
<[u8; 4]> = Default
::default();
650 // Something without `Default` implementation.
651 let v
: ArrayVec
<[net
::TcpStream
; 4]> = Default
::default();
652 assert_eq
!(s
.len(), 0);
653 assert_eq
!(v
.len(), 0);
656 #[cfg(feature="array-sizes-33-128")]
658 fn test_sizes_33_128() {
659 ArrayVec
::from([0u8; 52]);
660 ArrayVec
::from([0u8; 127]);
663 #[cfg(feature="array-sizes-129-255")]
665 fn test_sizes_129_255() {
666 ArrayVec
::from([0u8; 237]);
667 ArrayVec
::from([0u8; 255]);
671 fn test_extend_zst() {
672 let mut range
= 0..10;
673 #[derive(Copy, Clone, PartialEq, Debug)]
674 struct Z
; // Zero sized type
676 let mut array
: ArrayVec
<[_
; 5]> = range
.by_ref().map(|_
| Z
).collect();
677 assert_eq
!(&array
[..], &[Z
; 5]);
678 assert_eq
!(range
.next(), Some(5));
680 array
.extend(range
.by_ref().map(|_
| Z
));
681 assert_eq
!(range
.next(), Some(6));
683 let mut array
: ArrayVec
<[_
; 10]> = (0..3).map(|_
| Z
).collect();
684 assert_eq
!(&array
[..], &[Z
; 3]);
685 array
.extend((3..5).map(|_
| Z
));
686 assert_eq
!(&array
[..], &[Z
; 5]);
687 assert_eq
!(array
.len(), 5);