use lfrlock::LfrLock;
#[derive(Debug, Clone, PartialEq)]
struct Data {
value: i32,
}
#[test]
fn test_lfrlock_read_write() {
let lock = LfrLock::new(Data { value: 0 });
for i in 1..=10 {
lock.update(|old_data| Data {
value: old_data.value + 1,
});
let data = lock.read();
assert_eq!(data.value, i);
}
let data = lock.read();
assert_eq!(data.value, 10);
}
#[test]
fn test_store() {
let lock = LfrLock::new(Data { value: 0 });
lock.store(Data { value: 42 });
assert_eq!(lock.read().value, 42);
lock.store(Data { value: 100 });
assert_eq!(lock.read().value, 100);
}
#[test]
fn test_swap() {
let lock = LfrLock::new(Data { value: 10 });
let old = lock.swap(Data { value: 20 });
assert_eq!(old.value, 10);
assert_eq!(lock.read().value, 20);
let old = lock.swap(Data { value: 30 });
assert_eq!(old.value, 20);
assert_eq!(lock.read().value, 30);
}
#[test]
fn test_get() {
let lock = LfrLock::new(Data { value: 42 });
let value = lock.get();
assert_eq!(value.value, 42);
lock.store(Data { value: 100 });
let value = lock.get();
assert_eq!(value.value, 100);
}
#[test]
fn test_map() {
let lock = LfrLock::new(Data { value: 42 });
let doubled = lock.map(|data| data.value * 2);
assert_eq!(doubled, 84);
let as_string = lock.map(|data| format!("value: {}", data.value));
assert_eq!(as_string, "value: 42");
}
#[test]
fn test_filter() {
let lock = LfrLock::new(Data { value: 42 });
let result = lock.filter(|data| data.value > 40);
assert!(result.is_some());
assert_eq!(result.unwrap().value, 42);
let result = lock.filter(|data| data.value > 50);
assert!(result.is_none());
}
#[test]
fn test_lock_clone() {
let lock = LfrLock::new(Data { value: 0 });
let lock2 = lock.clone();
lock.update(|old_data| Data {
value: old_data.value + 10,
});
lock2.update(|old_data| Data {
value: old_data.value + 5,
});
let data = lock.read();
assert_eq!(data.value, 15);
}
#[test]
fn test_multiple_lock_instances() {
let lock = LfrLock::new(Data { value: 42 });
let lock2 = lock.clone();
let data1 = lock.read();
let data2 = lock2.read();
assert_eq!(data1.value, 42);
assert_eq!(data2.value, 42);
lock.store(Data { value: 100 });
let data1 = lock.read();
let data2 = lock2.read();
assert_eq!(data1.value, 100);
assert_eq!(data2.value, 100);
}
#[test]
fn test_from_trait() {
let lock: LfrLock<Data> = Data { value: 42 }.into();
assert_eq!(lock.read().value, 42);
let lock = LfrLock::from(Data { value: 100 });
assert_eq!(lock.read().value, 100);
}
#[test]
fn test_default_trait() {
let lock: LfrLock<i32> = LfrLock::default();
assert_eq!(*lock.read(), 0);
let lock: LfrLock<String> = LfrLock::default();
assert_eq!(*lock.read(), "");
}