]> git.lizzy.rs Git - rust.git/blob - src/liballoc/tests/arc.rs
7c5a8926126e36dd3f63904aa6f9fabdc06a6170
[rust.git] / src / liballoc / tests / arc.rs
1 #![cfg(not(miri))]
2
3 use std::any::Any;
4 use std::sync::{Arc, Weak};
5 use std::cell::RefCell;
6 use std::cmp::PartialEq;
7
8 #[test]
9 fn uninhabited() {
10     enum Void {}
11     let mut a = Weak::<Void>::new();
12     a = a.clone();
13     assert!(a.upgrade().is_none());
14
15     let mut a: Weak<dyn Any> = a;  // Unsizing
16     a = a.clone();
17     assert!(a.upgrade().is_none());
18 }
19
20 #[test]
21 fn slice() {
22     let a: Arc<[u32; 3]> = Arc::new([3, 2, 1]);
23     let a: Arc<[u32]> = a;  // Unsizing
24     let b: Arc<[u32]> = Arc::from(&[3, 2, 1][..]);  // Conversion
25     assert_eq!(a, b);
26
27     // Exercise is_dangling() with a DST
28     let mut a = Arc::downgrade(&a);
29     a = a.clone();
30     assert!(a.upgrade().is_some());
31 }
32
33 #[test]
34 fn trait_object() {
35     let a: Arc<u32> = Arc::new(4);
36     let a: Arc<dyn Any> = a;  // Unsizing
37
38     // Exercise is_dangling() with a DST
39     let mut a = Arc::downgrade(&a);
40     a = a.clone();
41     assert!(a.upgrade().is_some());
42
43     let mut b = Weak::<u32>::new();
44     b = b.clone();
45     assert!(b.upgrade().is_none());
46     let mut b: Weak<dyn Any> = b;  // Unsizing
47     b = b.clone();
48     assert!(b.upgrade().is_none());
49 }
50
51 #[test]
52 fn float_nan_ne() {
53     let x = Arc::new(std::f32::NAN);
54     assert!(x != x);
55     assert!(!(x == x));
56 }
57
58 #[test]
59 fn partial_eq() {
60     struct TestPEq (RefCell<usize>);
61     impl PartialEq for TestPEq {
62         fn eq(&self, other: &TestPEq) -> bool {
63             *self.0.borrow_mut() += 1;
64             *other.0.borrow_mut() += 1;
65             true
66         }
67     }
68     let x = Arc::new(TestPEq(RefCell::new(0)));
69     assert!(x == x);
70     assert!(!(x != x));
71     assert_eq!(*x.0.borrow(), 4);
72 }
73
74 #[test]
75 fn eq() {
76     #[derive(Eq)]
77     struct TestEq (RefCell<usize>);
78     impl PartialEq for TestEq {
79         fn eq(&self, other: &TestEq) -> bool {
80             *self.0.borrow_mut() += 1;
81             *other.0.borrow_mut() += 1;
82             true
83         }
84     }
85     let x = Arc::new(TestEq(RefCell::new(0)));
86     assert!(x == x);
87     assert!(!(x != x));
88     assert_eq!(*x.0.borrow(), 0);
89 }