use qubit_function::ArcMutatingFunction;
use qubit_function::MutatingFunction;
#[cfg(test)]
mod test_arc_mutating_function {
use std::thread;
use super::ArcMutatingFunction;
use super::MutatingFunction;
#[test]
fn test_new() {
let func = ArcMutatingFunction::new(|x: &mut i32| {
*x += 1;
*x
});
let mut value = 5;
assert_eq!(func.apply(&mut value), 6);
assert_eq!(value, 6);
}
#[test]
fn test_clone() {
let func = ArcMutatingFunction::new(|x: &mut i32| {
*x *= 2;
*x
});
let clone = func.clone();
let mut value1 = 5;
assert_eq!(func.apply(&mut value1), 10);
let mut value2 = 3;
assert_eq!(clone.apply(&mut value2), 6);
}
#[test]
fn test_thread_safe() {
let func = ArcMutatingFunction::new(|x: &mut i32| {
*x *= 2;
*x
});
let func_clone = func.clone();
let handle = thread::spawn(move || {
let mut value = 5;
func_clone.apply(&mut value)
});
let result = handle.join().expect("thread should not panic");
assert_eq!(result, 10);
}
#[test]
fn test_identity() {
let identity = ArcMutatingFunction::<i32, i32>::identity();
let mut value = 42;
assert_eq!(identity.apply(&mut value), 42);
assert_eq!(value, 42);
}
#[test]
fn test_map() {
let func = ArcMutatingFunction::new(|x: &mut i32| {
*x *= 2;
*x
});
let mapped = func.and_then(|result: &i32| result.to_string());
let mut value = 5;
assert_eq!(mapped.apply(&mut value), "10");
assert_eq!(value, 10);
}
}