use qubit_function::ArcStatefulMutatingFunction;
use qubit_function::StatefulMutatingFunction;
#[cfg(test)]
mod test_arc_stateful_mutating_function {
use std::thread;
use super::ArcStatefulMutatingFunction;
use super::StatefulMutatingFunction;
#[test]
fn test_new() {
let mut counter = {
let mut count = 0;
ArcStatefulMutatingFunction::new(move |x: &mut i32| {
count += 1;
*x += 1;
count
})
};
let mut value = 5;
assert_eq!(counter.apply(&mut value), 1);
assert_eq!(value, 6);
assert_eq!(counter.apply(&mut value), 2);
assert_eq!(value, 7);
}
#[test]
fn test_clone() {
let counter = {
let mut count = 0;
ArcStatefulMutatingFunction::new(move |x: &mut i32| {
count += 1;
*x *= 2;
count
})
};
let mut clone = counter.clone();
let mut value1 = 5;
assert_eq!(clone.apply(&mut value1), 1);
assert_eq!(value1, 10);
let mut value2 = 3;
assert_eq!(clone.apply(&mut value2), 2);
assert_eq!(value2, 6);
}
#[test]
fn test_thread_safe() {
let counter = {
let mut count = 0;
ArcStatefulMutatingFunction::new(move |x: &mut i32| {
count += 1;
*x *= 2;
count
})
};
let mut counter_clone = counter.clone();
let handle = thread::spawn(move || {
let mut value = 5;
counter_clone.apply(&mut value)
});
let result = handle.join().expect("thread should not panic");
assert_eq!(result, 1);
}
#[test]
fn test_identity() {
let mut identity = ArcStatefulMutatingFunction::<i32, i32>::identity();
let mut value = 42;
assert_eq!(identity.apply(&mut value), 42);
assert_eq!(value, 42);
}
#[test]
fn test_map() {
let func = {
let mut count = 0;
ArcStatefulMutatingFunction::new(move |x: &mut i32| {
count += 1;
*x *= 2;
count
})
};
let mut mapped = func.and_then::<String, _>(|count: &i32| format!("Call #{}", *count));
let mut value = 5;
assert_eq!(mapped.apply(&mut value), "Call #1");
assert_eq!(value, 10);
}
}