about summary refs log tree commit diff
path: root/library/alloc/src/sync
diff options
context:
space:
mode:
authorCAD97 <cad97@cad97.com>2020-07-14 15:35:14 -0400
committerCAD97 <cad97@cad97.com>2020-09-12 10:38:33 -0500
commit3d07108d3600dff50e564f57dd390337dbe14d55 (patch)
treea5c7f69e1ec657577aeafc39d411ec4a5df56b37 /library/alloc/src/sync
parent9d9903c5a50bb1f5b5fc3045b86172279eff7d30 (diff)
downloadrust-3d07108d3600dff50e564f57dd390337dbe14d55.tar.gz
rust-3d07108d3600dff50e564f57dd390337dbe14d55.zip
Add tests for weak into/from raw
Diffstat (limited to 'library/alloc/src/sync')
-rw-r--r--library/alloc/src/sync/tests.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/library/alloc/src/sync/tests.rs b/library/alloc/src/sync/tests.rs
index d2517171606..77f328d48f9 100644
--- a/library/alloc/src/sync/tests.rs
+++ b/library/alloc/src/sync/tests.rs
@@ -141,6 +141,48 @@ fn test_into_from_raw_unsized() {
 }
 
 #[test]
+fn into_from_weak_raw() {
+    let x = Arc::new(box "hello");
+    let y = Arc::downgrade(&x);
+
+    let y_ptr = Weak::into_raw(y);
+    unsafe {
+        assert_eq!(**y_ptr, "hello");
+
+        let y = Weak::from_raw(y_ptr);
+        let y_up = Weak::upgrade(&y).unwrap();
+        assert_eq!(**y_up, "hello");
+        drop(y_up);
+
+        assert_eq!(Arc::try_unwrap(x).map(|x| *x), Ok("hello"));
+    }
+}
+
+#[test]
+fn test_into_from_weak_raw_unsized() {
+    use std::fmt::Display;
+    use std::string::ToString;
+
+    let arc: Arc<str> = Arc::from("foo");
+    let weak: Weak<str> = Arc::downgrade(&arc);
+
+    let ptr = Weak::into_raw(weak.clone());
+    let weak2 = unsafe { Weak::from_raw(ptr) };
+
+    assert_eq!(unsafe { &*ptr }, "foo");
+    assert!(weak.ptr_eq(&weak2));
+
+    let arc: Arc<dyn Display> = Arc::new(123);
+    let weak: Weak<dyn Display> = Arc::downgrade(&arc);
+
+    let ptr = Weak::into_raw(weak.clone());
+    let weak2 = unsafe { Weak::from_raw(ptr) };
+
+    assert_eq!(unsafe { &*ptr }.to_string(), "123");
+    assert!(weak.ptr_eq(&weak2));
+}
+
+#[test]
 fn test_cowarc_clone_make_mut() {
     let mut cow0 = Arc::new(75);
     let mut cow1 = cow0.clone();