#![cfg(all(
feature = "std-sync",
not(feature = "tokio-sync"),
not(feature = "wasm-sync")
))]
use shared_container::SharedContainer;
#[derive(Debug, Clone, PartialEq)]
struct TestStruct {
value: i32,
}
#[test]
fn test_read_access() {
let container = SharedContainer::new(TestStruct { value: 42 });
let guard = container.read().unwrap();
assert_eq!(guard.value, 42);
}
#[test]
fn test_write_access() {
let container = SharedContainer::new(TestStruct { value: 42 });
{
let mut guard = container.write().unwrap();
guard.value = 100;
}
let guard = container.read().unwrap();
assert_eq!(guard.value, 100);
}
#[test]
fn test_clone_container() {
let container1 = SharedContainer::new(TestStruct { value: 42 });
let container2 = container1.clone();
{
let mut guard = container2.write().unwrap();
guard.value = 100;
}
let guard = container1.read().unwrap();
assert_eq!(guard.value, 100);
}
#[test]
fn test_get_cloned() {
let container = SharedContainer::new(TestStruct { value: 42 });
let cloned = container.get_cloned().unwrap();
assert_eq!(cloned, TestStruct { value: 42 });
{
let mut guard = container.write().unwrap();
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_weak_ref() {
let container = SharedContainer::new(TestStruct { value: 42 });
let weak = container.downgrade();
let container2 = weak.upgrade().unwrap();
{
let mut guard = container2.write().unwrap();
guard.value = 100;
}
{
let guard = container.read().unwrap();
assert_eq!(guard.value, 100);
}
drop(container);
drop(container2);
assert!(weak.upgrade().is_none());
}
#[test]
fn test_weak_clone() {
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().unwrap();
guard.value = 100;
}
{
let guard = container1.read().unwrap();
assert_eq!(guard.value, 100);
}
drop(container);
drop(container1);
drop(container2);
assert!(weak1.upgrade().is_none());
assert!(weak2.upgrade().is_none());
}
#[test]
fn test_partial_eq() {
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_multiple_reads() {
let container = SharedContainer::new(TestStruct { value: 42 });
let guard1 = container.read().unwrap();
let guard2 = container.read().unwrap();
assert_eq!(guard1.value, 42);
assert_eq!(guard2.value, 42);
}
#[test]
fn test_lock_behavior() {
let container = SharedContainer::new(TestStruct { value: 42 });
assert!(container.read().is_some());
assert!(container.write().is_some());
let guard1 = container.read();
let guard2 = container.read();
assert!(guard1.is_some());
assert!(guard2.is_some());
drop(guard1);
drop(guard2);
}