#[cfg(test)]
mod complex_composition_tests {
use qubit_function::{
ArcTransformer,
BoxTransformer,
RcTransformer,
Transformer,
};
#[test]
fn test_multiple_and_then() {
let add_one = BoxTransformer::new(|x: i32| x + 1);
let double = BoxTransformer::new(|x: i32| x * 2);
let to_string = BoxTransformer::new(|x: i32| x.to_string());
let composed = add_one.and_then(double).and_then(to_string);
assert_eq!(composed.apply(5), "12"); }
#[test]
fn test_multiple_and_then_with_box() {
let add_one = BoxTransformer::new(|x: i32| x + 1);
let double = BoxTransformer::new(|x: i32| x * 2);
let square = BoxTransformer::new(|x: i32| x * x);
let composed = add_one.and_then(double).and_then(square);
assert_eq!(composed.apply(5), 144); }
#[test]
fn test_arc_multiple_and_then() {
let add_one = ArcTransformer::new(|x: i32| x + 1);
let double = ArcTransformer::new(|x: i32| x * 2);
let to_string = ArcTransformer::new(|x: i32| x.to_string());
let composed =
add_one.and_then(double.clone()).and_then(to_string.clone());
assert_eq!(composed.apply(5), "12");
assert_eq!(add_one.apply(5), 6);
assert_eq!(double.apply(5), 10);
}
#[test]
fn test_rc_multiple_and_then() {
let add_one = RcTransformer::new(|x: i32| x + 1);
let double = RcTransformer::new(|x: i32| x * 2);
let square = RcTransformer::new(|x: i32| x * x);
let composed =
add_one.and_then(double.clone()).and_then(square.clone());
assert_eq!(composed.apply(5), 144); assert_eq!(add_one.apply(5), 6);
assert_eq!(double.apply(5), 10);
assert_eq!(square.apply(5), 25);
}
}