| use std::any::Any; |
| use std::rc::{Rc, Weak}; |
| use std::cell::RefCell; |
| use std::cmp::PartialEq; |
| |
| #[test] |
| fn uninhabited() { |
| enum Void {} |
| let mut a = Weak::<Void>::new(); |
| a = a.clone(); |
| assert!(a.upgrade().is_none()); |
| |
| let mut a: Weak<dyn Any> = a; // Unsizing |
| a = a.clone(); |
| assert!(a.upgrade().is_none()); |
| } |
| |
| #[test] |
| fn slice() { |
| let a: Rc<[u32; 3]> = Rc::new([3, 2, 1]); |
| let a: Rc<[u32]> = a; // Unsizing |
| let b: Rc<[u32]> = Rc::from(&[3, 2, 1][..]); // Conversion |
| assert_eq!(a, b); |
| |
| // Exercise is_dangling() with a DST |
| let mut a = Rc::downgrade(&a); |
| a = a.clone(); |
| assert!(a.upgrade().is_some()); |
| } |
| |
| #[test] |
| fn trait_object() { |
| let a: Rc<u32> = Rc::new(4); |
| let a: Rc<dyn Any> = a; // Unsizing |
| |
| // Exercise is_dangling() with a DST |
| let mut a = Rc::downgrade(&a); |
| a = a.clone(); |
| assert!(a.upgrade().is_some()); |
| |
| let mut b = Weak::<u32>::new(); |
| b = b.clone(); |
| assert!(b.upgrade().is_none()); |
| let mut b: Weak<dyn Any> = b; // Unsizing |
| b = b.clone(); |
| assert!(b.upgrade().is_none()); |
| } |
| |
| #[test] |
| fn float_nan_ne() { |
| let x = Rc::new(std::f32::NAN); |
| assert!(x != x); |
| assert!(!(x == x)); |
| } |
| |
| #[test] |
| fn partial_eq() { |
| struct TestPEq (RefCell<usize>); |
| impl PartialEq for TestPEq { |
| fn eq(&self, other: &TestPEq) -> bool { |
| *self.0.borrow_mut() += 1; |
| *other.0.borrow_mut() += 1; |
| true |
| } |
| } |
| let x = Rc::new(TestPEq(RefCell::new(0))); |
| assert!(x == x); |
| assert!(!(x != x)); |
| assert_eq!(*x.0.borrow(), 4); |
| } |
| |
| #[test] |
| fn eq() { |
| #[derive(Eq)] |
| struct TestEq (RefCell<usize>); |
| impl PartialEq for TestEq { |
| fn eq(&self, other: &TestEq) -> bool { |
| *self.0.borrow_mut() += 1; |
| *other.0.borrow_mut() += 1; |
| true |
| } |
| } |
| let x = Rc::new(TestEq(RefCell::new(0))); |
| assert!(x == x); |
| assert!(!(x != x)); |
| assert_eq!(*x.0.borrow(), 0); |
| } |