1 extern crate arrayvec;
2 #[macro_use] extern crate matches;
3 
4 use arrayvec::ArrayVec;
5 use arrayvec::ArrayString;
6 use std::mem;
7 use arrayvec::CapacityError;
8 
9 use std::collections::HashMap;
10 
11 
12 #[test]
test_simple()13 fn test_simple() {
14     use std::ops::Add;
15 
16     let mut vec: ArrayVec<Vec<i32>,  3> = ArrayVec::new();
17 
18     vec.push(vec![1, 2, 3, 4]);
19     vec.push(vec![10]);
20     vec.push(vec![-1, 13, -2]);
21 
22     for elt in &vec {
23         assert_eq!(elt.iter().fold(0, Add::add), 10);
24     }
25 
26     let sum_len = vec.into_iter().map(|x| x.len()).fold(0, Add::add);
27     assert_eq!(sum_len, 8);
28 }
29 
30 #[test]
test_capacity_left()31 fn test_capacity_left() {
32     let mut vec: ArrayVec<usize,  4> = ArrayVec::new();
33     assert_eq!(vec.remaining_capacity(), 4);
34     vec.push(1);
35     assert_eq!(vec.remaining_capacity(), 3);
36     vec.push(2);
37     assert_eq!(vec.remaining_capacity(), 2);
38     vec.push(3);
39     assert_eq!(vec.remaining_capacity(), 1);
40     vec.push(4);
41     assert_eq!(vec.remaining_capacity(), 0);
42 }
43 
44 #[test]
test_extend_from_slice()45 fn test_extend_from_slice() {
46     let mut vec: ArrayVec<usize,  10> = ArrayVec::new();
47 
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]);
53 }
54 
55 #[test]
test_extend_from_slice_error()56 fn test_extend_from_slice_error() {
57     let mut vec: ArrayVec<usize,  10> = ArrayVec::new();
58 
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(_));
62 
63     let mut vec: ArrayVec<usize,  0> = ArrayVec::new();
64     let res = vec.try_extend_from_slice(&[0; 1]);
65     assert_matches!(res, Err(_));
66 }
67 
68 #[test]
test_try_from_slice_error()69 fn test_try_from_slice_error() {
70     use arrayvec::ArrayVec;
71     use std::convert::TryInto as _;
72 
73     let res: Result<ArrayVec<_,  2>, _> = (&[1, 2, 3] as &[_]).try_into();
74     assert_matches!(res, Err(_));
75 }
76 
77 #[test]
test_u16_index()78 fn test_u16_index() {
79     const N: usize = 4096;
80     let mut vec: ArrayVec<_,  N> = ArrayVec::new();
81     for _ in 0..N {
82         assert!(vec.try_push(1u8).is_ok());
83     }
84     assert!(vec.try_push(0).is_err());
85     assert_eq!(vec.len(), N);
86 }
87 
88 #[test]
test_iter()89 fn test_iter() {
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);
97 }
98 
99 #[test]
test_drop()100 fn test_drop() {
101     use std::cell::Cell;
102 
103     let flag = &Cell::new(0);
104 
105     #[derive(Clone)]
106     struct Bump<'a>(&'a Cell<i32>);
107 
108     impl<'a> Drop for Bump<'a> {
109         fn drop(&mut self) {
110             let n = self.0.get();
111             self.0.set(n + 1);
112         }
113     }
114 
115     {
116         let mut array = ArrayVec::<Bump,  128>::new();
117         array.push(Bump(flag));
118         array.push(Bump(flag));
119     }
120     assert_eq!(flag.get(), 2);
121 
122     // test something with the nullable pointer optimization
123     flag.set(0);
124 
125     {
126         let mut array = ArrayVec::<_,  3>::new();
127         array.push(vec![Bump(flag)]);
128         array.push(vec![Bump(flag), Bump(flag)]);
129         array.push(vec![]);
130         let push4 = array.try_push(vec![Bump(flag)]);
131         assert_eq!(flag.get(), 0);
132         drop(push4);
133         assert_eq!(flag.get(), 1);
134         drop(array.pop());
135         assert_eq!(flag.get(), 1);
136         drop(array.pop());
137         assert_eq!(flag.get(), 3);
138     }
139 
140     assert_eq!(flag.get(), 4);
141 
142     // test into_inner
143     flag.set(0);
144     {
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);
152         drop(inner);
153         assert_eq!(flag.get(), 3);
154     }
155 
156     // test take
157     flag.set(0);
158     {
159         let mut array1 = ArrayVec::<_,  3>::new();
160         array1.push(Bump(flag));
161         array1.push(Bump(flag));
162         array1.push(Bump(flag));
163         let array2 = array1.take();
164         assert_eq!(flag.get(), 0);
165         drop(array1);
166         assert_eq!(flag.get(), 0);
167         drop(array2);
168         assert_eq!(flag.get(), 3);
169     }
170 
171     // test cloning into_iter
172     flag.set(0);
173     {
174         let mut array = ArrayVec::<_,  3>::new();
175         array.push(Bump(flag));
176         array.push(Bump(flag));
177         array.push(Bump(flag));
178         let mut iter = array.into_iter();
179         assert_eq!(flag.get(), 0);
180         iter.next();
181         assert_eq!(flag.get(), 1);
182         let clone = iter.clone();
183         assert_eq!(flag.get(), 1);
184         drop(clone);
185         assert_eq!(flag.get(), 3);
186         drop(iter);
187         assert_eq!(flag.get(), 5);
188     }
189 }
190 
191 #[test]
test_drop_panics()192 fn test_drop_panics() {
193     use std::cell::Cell;
194     use std::panic::catch_unwind;
195     use std::panic::AssertUnwindSafe;
196 
197     let flag = &Cell::new(0);
198 
199     struct Bump<'a>(&'a Cell<i32>);
200 
201     // Panic in the first drop
202     impl<'a> Drop for Bump<'a> {
203         fn drop(&mut self) {
204             let n = self.0.get();
205             self.0.set(n + 1);
206             if n == 0 {
207                 panic!("Panic in Bump's drop");
208             }
209         }
210     }
211     // check if rust is new enough
212     flag.set(0);
213     {
214         let array = vec![Bump(flag), Bump(flag)];
215         let res = catch_unwind(AssertUnwindSafe(|| {
216             drop(array);
217         }));
218         assert!(res.is_err());
219     }
220 
221     if flag.get() != 2 {
222         println!("test_drop_panics: skip, this version of Rust doesn't continue in drop_in_place");
223         return;
224     }
225 
226     flag.set(0);
227     {
228         let mut array = ArrayVec::<Bump,  128>::new();
229         array.push(Bump(flag));
230         array.push(Bump(flag));
231         array.push(Bump(flag));
232 
233         let res = catch_unwind(AssertUnwindSafe(|| {
234             drop(array);
235         }));
236         assert!(res.is_err());
237     }
238     // Check that all the elements drop, even if the first drop panics.
239     assert_eq!(flag.get(), 3);
240 
241 
242     flag.set(0);
243     {
244         let mut array = ArrayVec::<Bump,  16>::new();
245         array.push(Bump(flag));
246         array.push(Bump(flag));
247         array.push(Bump(flag));
248         array.push(Bump(flag));
249         array.push(Bump(flag));
250 
251         let i = 2;
252         let tail_len = array.len() - i;
253 
254         let res = catch_unwind(AssertUnwindSafe(|| {
255             array.truncate(i);
256         }));
257         assert!(res.is_err());
258         // Check that all the tail elements drop, even if the first drop panics.
259         assert_eq!(flag.get(), tail_len as i32);
260     }
261 
262 
263 }
264 
265 #[test]
test_extend()266 fn test_extend() {
267     let mut range = 0..10;
268 
269     let mut array: ArrayVec<_,  5> = range.by_ref().take(5).collect();
270     assert_eq!(&array[..], &[0, 1, 2, 3, 4]);
271     assert_eq!(range.next(), Some(5));
272 
273     array.extend(range.by_ref().take(0));
274     assert_eq!(range.next(), Some(6));
275 
276     let mut array: ArrayVec<_,  10> = (0..3).collect();
277     assert_eq!(&array[..], &[0, 1, 2]);
278     array.extend(3..5);
279     assert_eq!(&array[..], &[0, 1, 2, 3, 4]);
280 }
281 
282 #[should_panic]
283 #[test]
test_extend_capacity_panic_1()284 fn test_extend_capacity_panic_1() {
285     let mut range = 0..10;
286 
287     let _: ArrayVec<_,  5> = range.by_ref().collect();
288 }
289 
290 #[should_panic]
291 #[test]
test_extend_capacity_panic_2()292 fn test_extend_capacity_panic_2() {
293     let mut range = 0..10;
294 
295     let mut array: ArrayVec<_,  5> = range.by_ref().take(5).collect();
296     assert_eq!(&array[..], &[0, 1, 2, 3, 4]);
297     assert_eq!(range.next(), Some(5));
298     array.extend(range.by_ref().take(1));
299 }
300 
301 #[test]
test_is_send_sync()302 fn test_is_send_sync() {
303     let data = ArrayVec::<Vec<i32>,  5>::new();
304     &data as &dyn Send;
305     &data as &dyn Sync;
306 }
307 
308 #[test]
test_compact_size()309 fn test_compact_size() {
310     // 4 bytes + padding + length
311     type ByteArray = ArrayVec<u8,  4>;
312     println!("{}", mem::size_of::<ByteArray>());
313     assert!(mem::size_of::<ByteArray>() <= 2 * mem::size_of::<u32>());
314 
315     // just length
316     type EmptyArray = ArrayVec<u8,  0>;
317     println!("{}", mem::size_of::<EmptyArray>());
318     assert!(mem::size_of::<EmptyArray>() <= mem::size_of::<u32>());
319 
320     // 3 elements + padding + length
321     type QuadArray = ArrayVec<u32,  3>;
322     println!("{}", mem::size_of::<QuadArray>());
323     assert!(mem::size_of::<QuadArray>() <= 4 * 4 + mem::size_of::<u32>());
324 }
325 
326 #[test]
test_still_works_with_option_arrayvec()327 fn test_still_works_with_option_arrayvec() {
328     type RefArray = ArrayVec<&'static i32,  2>;
329     let array = Some(RefArray::new());
330     assert!(array.is_some());
331     println!("{:?}", array);
332 }
333 
334 #[test]
test_drain()335 fn test_drain() {
336     let mut v = ArrayVec::from([0; 8]);
337     v.pop();
338     v.drain(0..7);
339     assert_eq!(&v[..], &[]);
340 
341     v.extend(0..8);
342     v.drain(1..4);
343     assert_eq!(&v[..], &[0, 4, 5, 6, 7]);
344     let u: ArrayVec<_,  3> = v.drain(1..4).rev().collect();
345     assert_eq!(&u[..], &[6, 5, 4]);
346     assert_eq!(&v[..], &[0, 7]);
347     v.drain(..);
348     assert_eq!(&v[..], &[]);
349 }
350 
351 #[test]
test_drain_range_inclusive()352 fn test_drain_range_inclusive() {
353     let mut v = ArrayVec::from([0; 8]);
354     v.drain(0..=7);
355     assert_eq!(&v[..], &[]);
356 
357     v.extend(0..8);
358     v.drain(1..=4);
359     assert_eq!(&v[..], &[0, 5, 6, 7]);
360     let u: ArrayVec<_,  3> = v.drain(1..=2).rev().collect();
361     assert_eq!(&u[..], &[6, 5]);
362     assert_eq!(&v[..], &[0, 7]);
363     v.drain(..);
364     assert_eq!(&v[..], &[]);
365 }
366 
367 #[test]
368 #[should_panic]
test_drain_range_inclusive_oob()369 fn test_drain_range_inclusive_oob() {
370     let mut v = ArrayVec::from([0; 0]);
371     v.drain(0..=0);
372 }
373 
374 #[test]
test_retain()375 fn test_retain() {
376     let mut v = ArrayVec::from([0; 8]);
377     for (i, elt) in v.iter_mut().enumerate() {
378         *elt = i;
379     }
380     v.retain(|_| true);
381     assert_eq!(&v[..], &[0, 1, 2, 3, 4, 5, 6, 7]);
382     v.retain(|elt| {
383         *elt /= 2;
384         *elt % 2 == 0
385     });
386     assert_eq!(&v[..], &[0, 0, 2, 2]);
387     v.retain(|_| false);
388     assert_eq!(&v[..], &[]);
389 }
390 
391 #[test]
392 #[should_panic]
test_drain_oob()393 fn test_drain_oob() {
394     let mut v = ArrayVec::from([0; 8]);
395     v.pop();
396     v.drain(0..8);
397 }
398 
399 #[test]
400 #[should_panic]
test_drop_panic()401 fn test_drop_panic() {
402     struct DropPanic;
403 
404     impl Drop for DropPanic {
405         fn drop(&mut self) {
406             panic!("drop");
407         }
408     }
409 
410     let mut array = ArrayVec::<DropPanic,  1>::new();
411     array.push(DropPanic);
412 }
413 
414 #[test]
415 #[should_panic]
test_drop_panic_into_iter()416 fn test_drop_panic_into_iter() {
417     struct DropPanic;
418 
419     impl Drop for DropPanic {
420         fn drop(&mut self) {
421             panic!("drop");
422         }
423     }
424 
425     let mut array = ArrayVec::<DropPanic,  1>::new();
426     array.push(DropPanic);
427     array.into_iter();
428 }
429 
430 #[test]
test_insert()431 fn test_insert() {
432     let mut v = ArrayVec::from([]);
433     assert_matches!(v.try_push(1), Err(_));
434 
435     let mut v = ArrayVec::<_,  3>::new();
436     v.insert(0, 0);
437     v.insert(1, 1);
438     //let ret1 = v.try_insert(3, 3);
439     //assert_matches!(ret1, Err(InsertError::OutOfBounds(_)));
440     assert_eq!(&v[..], &[0, 1]);
441     v.insert(2, 2);
442     assert_eq!(&v[..], &[0, 1, 2]);
443 
444     let ret2 = v.try_insert(1, 9);
445     assert_eq!(&v[..], &[0, 1, 2]);
446     assert_matches!(ret2, Err(_));
447 
448     let mut v = ArrayVec::from([2]);
449     assert_matches!(v.try_insert(0, 1), Err(CapacityError { .. }));
450     assert_matches!(v.try_insert(1, 1), Err(CapacityError { .. }));
451     //assert_matches!(v.try_insert(2, 1), Err(CapacityError { .. }));
452 }
453 
454 #[test]
test_into_inner_1()455 fn test_into_inner_1() {
456     let mut v = ArrayVec::from([1, 2]);
457     v.pop();
458     let u = v.clone();
459     assert_eq!(v.into_inner(), Err(u));
460 }
461 
462 #[test]
test_into_inner_2()463 fn test_into_inner_2() {
464     let mut v = ArrayVec::<String,  4>::new();
465     v.push("a".into());
466     v.push("b".into());
467     v.push("c".into());
468     v.push("d".into());
469     assert_eq!(v.into_inner().unwrap(), ["a", "b", "c", "d"]);
470 }
471 
472 #[test]
test_into_inner_3()473 fn test_into_inner_3() {
474     let mut v = ArrayVec::<i32,  4>::new();
475     v.extend(1..=4);
476     assert_eq!(v.into_inner().unwrap(), [1, 2, 3, 4]);
477 }
478 
479 #[test]
test_take()480 fn test_take() {
481     let mut v1 = ArrayVec::<i32,  4>::new();
482     v1.extend(1..=4);
483     let v2 = v1.take();
484     assert!(v1.into_inner().is_err());
485     assert_eq!(v2.into_inner().unwrap(), [1, 2, 3, 4]);
486 }
487 
488 #[cfg(feature="std")]
489 #[test]
test_write()490 fn test_write() {
491     use std::io::Write;
492     let mut v = ArrayVec::<_,  8>::new();
493     write!(&mut v, "\x01\x02\x03").unwrap();
494     assert_eq!(&v[..], &[1, 2, 3]);
495     let r = v.write(&[9; 16]).unwrap();
496     assert_eq!(r, 5);
497     assert_eq!(&v[..], &[1, 2, 3, 9, 9, 9, 9, 9]);
498 }
499 
500 #[test]
array_clone_from()501 fn array_clone_from() {
502     let mut v = ArrayVec::<_,  4>::new();
503     v.push(vec![1, 2]);
504     v.push(vec![3, 4, 5]);
505     v.push(vec![6]);
506     let reference = v.to_vec();
507     let mut u = ArrayVec::<_,  4>::new();
508     u.clone_from(&v);
509     assert_eq!(&u, &reference[..]);
510 
511     let mut t = ArrayVec::<_,  4>::new();
512     t.push(vec![97]);
513     t.push(vec![]);
514     t.push(vec![5, 6, 2]);
515     t.push(vec![2]);
516     t.clone_from(&v);
517     assert_eq!(&t, &reference[..]);
518     t.clear();
519     t.clone_from(&v);
520     assert_eq!(&t, &reference[..]);
521 }
522 
523 #[cfg(feature="std")]
524 #[test]
test_string()525 fn test_string() {
526     use std::error::Error;
527 
528     let text = "hello world";
529     let mut s = ArrayString::<16>::new();
530     s.try_push_str(text).unwrap();
531     assert_eq!(&s, text);
532     assert_eq!(text, &s);
533 
534     // Make sure Hash / Eq / Borrow match up so we can use HashMap
535     let mut map = HashMap::new();
536     map.insert(s, 1);
537     assert_eq!(map[text], 1);
538 
539     let mut t = ArrayString::<2>::new();
540     assert!(t.try_push_str(text).is_err());
541     assert_eq!(&t, "");
542 
543     t.push_str("ab");
544     // DerefMut
545     let tmut: &mut str = &mut t;
546     assert_eq!(tmut, "ab");
547 
548     // Test Error trait / try
549     let t = || -> Result<(), Box<dyn Error>> {
550         let mut t = ArrayString::<2>::new();
551         t.try_push_str(text)?;
552         Ok(())
553     }();
554     assert!(t.is_err());
555 }
556 
557 #[test]
test_string_from()558 fn test_string_from() {
559     let text = "hello world";
560 	// Test `from` constructor
561     let u = ArrayString::<11>::from(text).unwrap();
562     assert_eq!(&u, text);
563     assert_eq!(u.len(), text.len());
564 }
565 
566 #[test]
test_string_parse_from_str()567 fn test_string_parse_from_str() {
568     let text = "hello world";
569     let u: ArrayString<11> = text.parse().unwrap();
570     assert_eq!(&u, text);
571     assert_eq!(u.len(), text.len());
572 }
573 
574 #[test]
test_string_from_bytes()575 fn test_string_from_bytes() {
576     let text = "hello world";
577     let u = ArrayString::from_byte_string(b"hello world").unwrap();
578     assert_eq!(&u, text);
579     assert_eq!(u.len(), text.len());
580 }
581 
582 #[test]
test_string_clone()583 fn test_string_clone() {
584     let text = "hi";
585     let mut s = ArrayString::<4>::new();
586     s.push_str("abcd");
587     let t = ArrayString::<4>::from(text).unwrap();
588     s.clone_from(&t);
589     assert_eq!(&t, &s);
590 }
591 
592 #[test]
test_string_push()593 fn test_string_push() {
594     let text = "abcαβγ";
595     let mut s = ArrayString::<8>::new();
596     for c in text.chars() {
597         if let Err(_) = s.try_push(c) {
598             break;
599         }
600     }
601     assert_eq!("abcαβ", &s[..]);
602     s.push('x');
603     assert_eq!("abcαβx", &s[..]);
604     assert!(s.try_push('x').is_err());
605 }
606 
607 
608 #[test]
test_insert_at_length()609 fn test_insert_at_length() {
610     let mut v = ArrayVec::<_,  8>::new();
611     let result1 = v.try_insert(0, "a");
612     let result2 = v.try_insert(1, "b");
613     assert!(result1.is_ok() && result2.is_ok());
614     assert_eq!(&v[..], &["a", "b"]);
615 }
616 
617 #[should_panic]
618 #[test]
test_insert_out_of_bounds()619 fn test_insert_out_of_bounds() {
620     let mut v = ArrayVec::<_,  8>::new();
621     let _ = v.try_insert(1, "test");
622 }
623 
624 /*
625  * insert that pushes out the last
626     let mut u = ArrayVec::from([1, 2, 3, 4]);
627     let ret = u.try_insert(3, 99);
628     assert_eq!(&u[..], &[1, 2, 3, 99]);
629     assert_matches!(ret, Err(_));
630     let ret = u.try_insert(4, 77);
631     assert_eq!(&u[..], &[1, 2, 3, 99]);
632     assert_matches!(ret, Err(_));
633 */
634 
635 #[test]
test_drop_in_insert()636 fn test_drop_in_insert() {
637     use std::cell::Cell;
638 
639     let flag = &Cell::new(0);
640 
641     struct Bump<'a>(&'a Cell<i32>);
642 
643     impl<'a> Drop for Bump<'a> {
644         fn drop(&mut self) {
645             let n = self.0.get();
646             self.0.set(n + 1);
647         }
648     }
649 
650     flag.set(0);
651 
652     {
653         let mut array = ArrayVec::<_,  2>::new();
654         array.push(Bump(flag));
655         array.insert(0, Bump(flag));
656         assert_eq!(flag.get(), 0);
657         let ret = array.try_insert(1, Bump(flag));
658         assert_eq!(flag.get(), 0);
659         assert_matches!(ret, Err(_));
660         drop(ret);
661         assert_eq!(flag.get(), 1);
662     }
663     assert_eq!(flag.get(), 3);
664 }
665 
666 #[test]
test_pop_at()667 fn test_pop_at() {
668     let mut v = ArrayVec::<String,  4>::new();
669     let s = String::from;
670     v.push(s("a"));
671     v.push(s("b"));
672     v.push(s("c"));
673     v.push(s("d"));
674 
675     assert_eq!(v.pop_at(4), None);
676     assert_eq!(v.pop_at(1), Some(s("b")));
677     assert_eq!(v.pop_at(1), Some(s("c")));
678     assert_eq!(v.pop_at(2), None);
679     assert_eq!(&v[..], &["a", "d"]);
680 }
681 
682 #[test]
test_sizes()683 fn test_sizes() {
684     let v = ArrayVec::from([0u8; 1 << 16]);
685     assert_eq!(vec![0u8; v.len()], &v[..]);
686 }
687 
688 #[test]
test_default()689 fn test_default() {
690     use std::net;
691     let s: ArrayString<4> = Default::default();
692     // Something without `Default` implementation.
693     let v: ArrayVec<net::TcpStream,  4> = Default::default();
694     assert_eq!(s.len(), 0);
695     assert_eq!(v.len(), 0);
696 }
697 
698 #[cfg(feature="array-sizes-33-128")]
699 #[test]
test_sizes_33_128()700 fn test_sizes_33_128() {
701     ArrayVec::from([0u8; 52]);
702     ArrayVec::from([0u8; 127]);
703 }
704 
705 #[cfg(feature="array-sizes-129-255")]
706 #[test]
test_sizes_129_255()707 fn test_sizes_129_255() {
708     ArrayVec::from([0u8; 237]);
709     ArrayVec::from([0u8; 255]);
710 }
711 
712 #[test]
test_extend_zst()713 fn test_extend_zst() {
714     let mut range = 0..10;
715     #[derive(Copy, Clone, PartialEq, Debug)]
716     struct Z; // Zero sized type
717 
718     let mut array: ArrayVec<_,  5> = range.by_ref().take(5).map(|_| Z).collect();
719     assert_eq!(&array[..], &[Z; 5]);
720     assert_eq!(range.next(), Some(5));
721 
722     array.extend(range.by_ref().take(0).map(|_| Z));
723     assert_eq!(range.next(), Some(6));
724 
725     let mut array: ArrayVec<_,  10> = (0..3).map(|_| Z).collect();
726     assert_eq!(&array[..], &[Z; 3]);
727     array.extend((3..5).map(|_| Z));
728     assert_eq!(&array[..], &[Z; 5]);
729     assert_eq!(array.len(), 5);
730 }
731 
732 #[test]
test_try_from_argument()733 fn test_try_from_argument() {
734     use core::convert::TryFrom;
735     let v = ArrayString::<16>::try_from(format_args!("Hello {}", 123)).unwrap();
736     assert_eq!(&v, "Hello 123");
737 }
738 
739 #[test]
allow_max_capacity_arrayvec_type()740 fn allow_max_capacity_arrayvec_type() {
741     // this type is allowed to be used (but can't be constructed)
742     let _v: ArrayVec<(), {usize::MAX}>;
743 }
744 
745 #[should_panic(expected="largest supported capacity")]
746 #[test]
deny_max_capacity_arrayvec_value()747 fn deny_max_capacity_arrayvec_value() {
748     if mem::size_of::<usize>() <= mem::size_of::<u32>() {
749         panic!("This test does not work on this platform. 'largest supported capacity'");
750     }
751     // this type is allowed to be used (but can't be constructed)
752     let _v: ArrayVec<(), {usize::MAX}> = ArrayVec::new();
753 }
754 
755 #[should_panic(expected="index out of bounds")]
756 #[test]
deny_max_capacity_arrayvec_value_const()757 fn deny_max_capacity_arrayvec_value_const() {
758     if mem::size_of::<usize>() <= mem::size_of::<u32>() {
759         panic!("This test does not work on this platform. 'index out of bounds'");
760     }
761     // this type is allowed to be used (but can't be constructed)
762     let _v: ArrayVec<(), {usize::MAX}> = ArrayVec::new_const();
763 }
764 
765 #[test]
test_arrayvec_const_constructible()766 fn test_arrayvec_const_constructible() {
767     const OF_U8: ArrayVec<Vec<u8>, 10> = ArrayVec::new_const();
768 
769     let mut var = OF_U8;
770     assert!(var.is_empty());
771     assert_eq!(var, ArrayVec::new());
772     var.push(vec![3, 5, 8]);
773     assert_eq!(var[..], [vec![3, 5, 8]]);
774 }
775 
776 #[test]
test_arraystring_const_constructible()777 fn test_arraystring_const_constructible() {
778     const AS: ArrayString<10> = ArrayString::new_const();
779 
780     let mut var = AS;
781     assert!(var.is_empty());
782     assert_eq!(var, ArrayString::new());
783     var.push_str("hello");
784     assert_eq!(var, *"hello");
785 }
786 
787 
788 #[test]
test_arraystring_zero_filled_has_some_sanity_checks()789 fn test_arraystring_zero_filled_has_some_sanity_checks() {
790     let string = ArrayString::<4>::zero_filled();
791     assert_eq!(string.as_str(), "\0\0\0\0");
792     assert_eq!(string.len(), 4);
793 }