| //! Test for `boxed` mod. |
| |
| use core::any::Any; |
| use core::ops::Deref; |
| use std::boxed::Box; |
| |
| #[test] |
| fn test_owned_clone() { |
| let a = Box::new(5); |
| let b: Box<i32> = a.clone(); |
| assert!(a == b); |
| } |
| |
| #[derive(Debug, PartialEq, Eq)] |
| struct Test; |
| |
| #[test] |
| fn any_move() { |
| let a = Box::new(8) as Box<dyn Any>; |
| let b = Box::new(Test) as Box<dyn Any>; |
| |
| let a: Box<i32> = a.downcast::<i32>().unwrap(); |
| assert_eq!(*a, 8); |
| |
| let b: Box<Test> = b.downcast::<Test>().unwrap(); |
| assert_eq!(*b, Test); |
| |
| let a = Box::new(8) as Box<dyn Any>; |
| let b = Box::new(Test) as Box<dyn Any>; |
| |
| assert!(a.downcast::<Box<i32>>().is_err()); |
| assert!(b.downcast::<Box<Test>>().is_err()); |
| } |
| |
| #[test] |
| fn test_show() { |
| let a = Box::new(8) as Box<dyn Any>; |
| let b = Box::new(Test) as Box<dyn Any>; |
| let a_str = format!("{a:?}"); |
| let b_str = format!("{b:?}"); |
| assert_eq!(a_str, "Any { .. }"); |
| assert_eq!(b_str, "Any { .. }"); |
| |
| static EIGHT: usize = 8; |
| static TEST: Test = Test; |
| let a = &EIGHT as &dyn Any; |
| let b = &TEST as &dyn Any; |
| let s = format!("{a:?}"); |
| assert_eq!(s, "Any { .. }"); |
| let s = format!("{b:?}"); |
| assert_eq!(s, "Any { .. }"); |
| } |
| |
| #[test] |
| fn deref() { |
| fn homura<T: Deref<Target = i32>>(_: T) {} |
| homura(Box::new(765)); |
| } |
| |
| #[test] |
| fn raw_sized() { |
| let x = Box::new(17); |
| let p = Box::into_raw(x); |
| unsafe { |
| assert_eq!(17, *p); |
| *p = 19; |
| let y = Box::from_raw(p); |
| assert_eq!(19, *y); |
| } |
| } |
| |
| #[test] |
| fn raw_trait() { |
| trait Foo { |
| fn get(&self) -> u32; |
| fn set(&mut self, value: u32); |
| } |
| |
| struct Bar(u32); |
| |
| impl Foo for Bar { |
| fn get(&self) -> u32 { |
| self.0 |
| } |
| |
| fn set(&mut self, value: u32) { |
| self.0 = value; |
| } |
| } |
| |
| let x: Box<dyn Foo> = Box::new(Bar(17)); |
| let p = Box::into_raw(x); |
| unsafe { |
| assert_eq!(17, (*p).get()); |
| (*p).set(19); |
| let y: Box<dyn Foo> = Box::from_raw(p); |
| assert_eq!(19, y.get()); |
| } |
| } |
| |
| #[test] |
| fn f64_slice() { |
| let slice: &[f64] = &[-1.0, 0.0, 1.0, f64::INFINITY]; |
| let boxed: Box<[f64]> = Box::from(slice); |
| assert_eq!(&*boxed, slice) |
| } |
| |
| #[test] |
| fn i64_slice() { |
| let slice: &[i64] = &[i64::MIN, -2, -1, 0, 1, 2, i64::MAX]; |
| let boxed: Box<[i64]> = Box::from(slice); |
| assert_eq!(&*boxed, slice) |
| } |
| |
| #[test] |
| fn str_slice() { |
| let s = "Hello, world!"; |
| let boxed: Box<str> = Box::from(s); |
| assert_eq!(&*boxed, s) |
| } |
| |
| #[test] |
| fn boxed_slice_from_iter() { |
| let iter = 0..100; |
| let boxed: Box<[u32]> = iter.collect(); |
| assert_eq!(boxed.len(), 100); |
| assert_eq!(boxed[7], 7); |
| } |
| |
| #[test] |
| fn test_array_from_slice() { |
| let v = vec![1, 2, 3]; |
| let r: Box<[u32]> = v.into_boxed_slice(); |
| |
| let a: Result<Box<[u32; 3]>, _> = r.clone().try_into(); |
| assert!(a.is_ok()); |
| |
| let a: Result<Box<[u32; 2]>, _> = r.clone().try_into(); |
| assert!(a.is_err()); |
| } |