|  | //! 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()); | 
|  | } |