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 }