use qubit_function::{
ArcStatefulMutator,
BoxStatefulMutator,
MutatorOnce,
RcStatefulMutator,
StatefulMutator,
};
#[cfg(test)]
mod test_conditional_execution {
use super::{
ArcStatefulMutator,
BoxStatefulMutator,
RcStatefulMutator,
StatefulMutator,
};
use qubit_function::predicates::{
ArcPredicate,
BoxPredicate,
RcPredicate,
};
fn is_positive(x: &i32) -> bool {
*x > 0
}
fn negate(x: &mut i32) {
*x = -*x;
}
#[test]
fn test_box_when_with_closure() {
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_box_when_with_function_pointer() {
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(is_positive as fn(&i32) -> bool);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_box_when_with_box_predicate() {
let pred = BoxPredicate::new(|x: &i32| *x > 0);
let mut mutator =
BoxStatefulMutator::new(|x: &mut i32| *x *= 2).when(pred);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_box_when_with_rc_predicate() {
let pred = RcPredicate::new(|x: &i32| *x > 0);
let mut mutator =
BoxStatefulMutator::new(|x: &mut i32| *x *= 2).when(pred);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_box_when_with_arc_predicate() {
let pred = ArcPredicate::new(|x: &i32| *x > 0);
let mut mutator =
BoxStatefulMutator::new(|x: &mut i32| *x *= 2).when(pred);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_box_or_else_with_closure() {
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(|x: &mut i32| *x -= 1);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -6);
}
#[test]
fn test_box_or_else_with_function_pointer() {
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(negate as fn(&mut i32));
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 5);
}
#[test]
fn test_box_or_else_with_box_mutator() {
let else_mutator = BoxStatefulMutator::new(|x: &mut i32| *x = 0);
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(else_mutator);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 0);
}
#[test]
fn test_box_or_else_with_rc_mutator() {
let else_mutator = RcStatefulMutator::new(|x: &mut i32| *x = 100);
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(else_mutator);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 100);
}
#[test]
fn test_box_or_else_with_arc_mutator() {
let else_mutator = ArcStatefulMutator::new(|x: &mut i32| *x = 200);
let mut mutator = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(else_mutator);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 200);
}
#[test]
fn test_box_conditional_and_then_with_closure() {
let cond1 = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let mut chained = cond1.and_then(|x: &mut i32| *x += 10);
let mut positive = 5;
chained.apply(&mut positive);
assert_eq!(positive, 20);
let mut negative = -5;
chained.apply(&mut negative);
assert_eq!(negative, 5); }
#[test]
fn test_box_conditional_and_then_with_box_mutator() {
let cond1 = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let next = BoxStatefulMutator::new(|x: &mut i32| *x += 100);
let mut chained = cond1.and_then(next);
let mut positive = 10;
chained.apply(&mut positive);
assert_eq!(positive, 120);
let mut negative = -10;
chained.apply(&mut negative);
assert_eq!(negative, 90); }
#[test]
fn test_box_conditional_and_then_conditional() {
let cond1 = BoxStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let cond2 = BoxStatefulMutator::new(|x: &mut i32| *x = 100)
.when(|x: &i32| *x > 100);
let mut chained = cond1.and_then(cond2);
let mut small = 5;
chained.apply(&mut small);
assert_eq!(small, 10);
let mut large = 60;
chained.apply(&mut large);
assert_eq!(large, 100); }
#[test]
fn test_rc_conditional_and_then_with_closure() {
let conditional = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let mut chained = conditional.and_then(|x: &mut i32| *x += 10);
let mut positive = 5;
chained.apply(&mut positive);
assert_eq!(positive, 20);
let mut negative = -5;
chained.apply(&mut negative);
assert_eq!(negative, 5); }
#[test]
fn test_rc_conditional_and_then_with_rc_mutator() {
let conditional = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let next = RcStatefulMutator::new(|x: &mut i32| *x += 100);
let mut chained = conditional.and_then(next);
let mut positive = 10;
chained.apply(&mut positive);
assert_eq!(positive, 120);
let mut negative = -10;
chained.apply(&mut negative);
assert_eq!(negative, 90); }
#[test]
fn test_arc_conditional_and_then_with_closure() {
let conditional = ArcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let mut chained = conditional.and_then(|x: &mut i32| *x += 10);
let mut positive = 5;
chained.apply(&mut positive);
assert_eq!(positive, 20);
let mut negative = -5;
chained.apply(&mut negative);
assert_eq!(negative, 5); }
#[test]
fn test_arc_conditional_and_then_with_arc_mutator() {
let conditional = ArcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let next = ArcStatefulMutator::new(|x: &mut i32| *x += 100);
let mut chained = conditional.and_then(next);
let mut positive = 10;
chained.apply(&mut positive);
assert_eq!(positive, 120);
let mut negative = -10;
chained.apply(&mut negative);
assert_eq!(negative, 90); }
#[test]
fn test_rc_when_with_closure() {
let conditional = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0);
let mut m = conditional.clone();
let mut positive = 5;
m.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
m.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_rc_when_with_function_pointer() {
let conditional = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(is_positive as fn(&i32) -> bool);
let mut m = conditional.clone();
let mut positive = 5;
m.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
m.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_rc_when_with_rc_predicate() {
let pred = RcPredicate::new(|x: &i32| *x > 0);
let conditional =
RcStatefulMutator::new(|x: &mut i32| *x *= 2).when(pred);
let mut m = conditional.clone();
let mut positive = 5;
m.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
m.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_rc_when_with_box_predicate() {
let pred = BoxPredicate::new(|x: &i32| *x > 0);
let conditional =
RcStatefulMutator::new(|x: &mut i32| *x *= 2).when(pred);
let mut m = conditional.clone();
let mut positive = 5;
m.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
m.apply(&mut negative);
assert_eq!(negative, -5);
}
#[test]
fn test_rc_or_else_with_closure() {
let mut mutator = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(|x: &mut i32| *x -= 1);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, -6);
}
#[test]
fn test_rc_or_else_with_function_pointer() {
let mut mutator = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(negate as fn(&mut i32));
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 5);
}
#[test]
fn test_rc_or_else_with_rc_mutator() {
let else_mutator = RcStatefulMutator::new(|x: &mut i32| *x = 100);
let mut mutator = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(else_mutator);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 100);
}
#[test]
fn test_rc_or_else_with_box_mutator() {
let else_mutator = BoxStatefulMutator::new(|x: &mut i32| *x = 200);
let mut mutator = RcStatefulMutator::new(|x: &mut i32| *x *= 2)
.when(|x: &i32| *x > 0)
.or_else(else_mutator);
let mut positive = 5;
mutator.apply(&mut positive);
assert_eq!(positive, 10);
let mut negative = -5;
mutator.apply(&mut negative);
assert_eq!(negative, 200);
}
}