use qubit_function::BoxMutatingFunction;
use qubit_function::MutatingFunction;
#[cfg(test)]
mod test_box_mutating_function {
use super::BoxMutatingFunction;
use super::MutatingFunction;
#[test]
fn test_new() {
let func = BoxMutatingFunction::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_with_different_types() {
let string_func = BoxMutatingFunction::new(|s: &mut String| {
let old_len = s.len();
s.push('!');
old_len
});
let mut text = String::from("hello");
assert_eq!(string_func.apply(&mut text), 5);
assert_eq!(text, "hello!");
let vec_func = BoxMutatingFunction::new(|v: &mut Vec<i32>| {
let old_len = v.len();
v.push(42);
old_len
});
let mut numbers = vec![1, 2, 3];
assert_eq!(vec_func.apply(&mut numbers), 3);
assert_eq!(numbers, vec![1, 2, 3, 42]);
let bool_func = BoxMutatingFunction::new(|b: &mut bool| {
let old = *b;
*b = !*b;
old
});
let mut flag = true;
assert!(bool_func.apply(&mut flag));
assert!(!flag);
}
#[test]
fn test_and_then() {
let func = BoxMutatingFunction::new(|x: &mut i32| {
*x *= 2;
*x
})
.and_then(|x: &i32| *x + 10);
let mut value = 5;
let result = func.apply(&mut value);
assert_eq!(result, 20); assert_eq!(value, 10); }
#[test]
fn test_and_then_multiple_chains() {
let func = BoxMutatingFunction::new(|x: &mut i32| {
*x += 1;
*x
})
.and_then(|x: &i32| *x * 2)
.and_then(|x: &i32| *x - 5);
let mut value = 10;
assert_eq!(func.apply(&mut value), 17); assert_eq!(value, 11); }
#[test]
fn test_identity() {
let identity = BoxMutatingFunction::<i32, i32>::identity();
let mut value = 42;
assert_eq!(identity.apply(&mut value), 42);
assert_eq!(value, 42);
}
#[test]
fn test_map() {
let func = BoxMutatingFunction::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);
}
}