#![cfg(feature = "tokio-sync")]
use shared_container::SharedContainer;
use tokio::runtime::Runtime;
#[derive(Debug, Clone, PartialEq)]
struct TestStruct {
value: i32,
}
#[test]
fn test_tokio_read_access() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
assert!(container.read().is_none());
let guard = container.read_async().await;
assert_eq!(guard.value, 42);
});
}
#[test]
fn test_tokio_write_access() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
assert!(container.write().is_none());
{
let mut guard = container.write_async().await;
guard.value = 100;
}
let guard = container.read_async().await;
assert_eq!(guard.value, 100);
});
}
#[test]
fn test_tokio_clone_container() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container1 = SharedContainer::new(TestStruct { value: 42 });
let container2 = container1.clone();
{
let mut guard = container2.write_async().await;
guard.value = 100;
}
let guard = container1.read_async().await;
assert_eq!(guard.value, 100);
});
}
#[test]
fn test_tokio_weak_ref() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
let weak = container.downgrade();
let container2 = weak.upgrade().unwrap();
{
let mut guard = container2.write_async().await;
guard.value = 100;
}
{
let guard = container.read_async().await;
assert_eq!(guard.value, 100);
}
drop(container);
drop(container2);
assert!(weak.upgrade().is_none());
});
}
#[test]
fn test_tokio_weak_clone() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
let weak1 = container.downgrade();
let weak2 = weak1.clone();
let container1 = weak1.upgrade().unwrap();
let container2 = weak2.upgrade().unwrap();
{
let mut guard = container2.write_async().await;
guard.value = 100;
}
{
let guard = container1.read_async().await;
assert_eq!(guard.value, 100);
}
drop(container);
drop(container1);
drop(container2);
assert!(weak1.upgrade().is_none());
assert!(weak2.upgrade().is_none());
});
}
#[test]
fn test_tokio_get_cloned() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
let cloned = container.get_cloned().unwrap();
assert_eq!(cloned, TestStruct { value: 42 });
{
let mut guard = container.write_async().await;
guard.value = 100;
}
assert_eq!(cloned, TestStruct { value: 42 });
let new_clone = container.get_cloned().unwrap();
assert_eq!(new_clone, TestStruct { value: 100 });
});
}
#[test]
fn test_tokio_partial_eq() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container1 = SharedContainer::new(TestStruct { value: 42 });
let container2 = container1.clone();
let container3 = SharedContainer::new(TestStruct { value: 100 });
assert_eq!(container1, container2);
assert_ne!(container1, container3);
});
}
#[test]
fn test_tokio_multiple_reads() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
let guard1 = container.read_async().await;
let guard2 = container.read_async().await;
assert_eq!(guard1.value, 42);
assert_eq!(guard2.value, 42);
});
}
#[test]
fn test_tokio_read_write_conflict() {
let rt = Runtime::new().unwrap();
rt.block_on(async {
let container = SharedContainer::new(TestStruct { value: 42 });
let guard = container.read_async().await;
assert_eq!(guard.value, 42);
});
}