use qubit_function::{
ArcConsumer,
BoxConsumer,
Consumer,
RcConsumer,
};
use std::rc::Rc;
use std::sync::Arc;
#[cfg(test)]
mod box_conditional_consumer_tests {
use super::{
Arc,
BoxConsumer,
Consumer,
};
use std::sync::Mutex;
#[test]
fn test_box_conditional_and_then() {
let log = Arc::new(Mutex::new(Vec::new()));
let l1 = log.clone();
let l2 = log.clone();
let consumer = qubit_function::BoxConsumer::new(move |x: &i32| {
l1.lock().expect("mutex should not be poisoned").push(*x);
});
let conditional = consumer.when(|x: &i32| *x > 0);
let chained = conditional.and_then(move |x: &i32| {
l2.lock()
.expect("mutex should not be poisoned")
.push(*x * 2);
});
chained.accept(&5);
assert_eq!(
*log.lock().expect("mutex should not be poisoned"),
vec![5, 10]
);
chained.accept(&-5);
assert_eq!(
*log.lock().expect("mutex should not be poisoned"),
vec![5, 10, -10]
);
}
#[test]
fn test_box_conditional_or_else() {
let log = Arc::new(Mutex::new(Vec::new()));
let l1 = log.clone();
let l2 = log.clone();
let consumer = qubit_function::BoxConsumer::new(move |x: &i32| {
l1.lock().expect("mutex should not be poisoned").push(*x);
});
let conditional =
consumer.when(|x: &i32| *x > 0).or_else(move |x: &i32| {
l2.lock()
.expect("mutex should not be poisoned")
.push(*x * 10);
});
conditional.accept(&5);
assert_eq!(*log.lock().expect("mutex should not be poisoned"), vec![5]);
conditional.accept(&-5);
assert_eq!(
*log.lock().expect("mutex should not be poisoned"),
vec![5, -50]
);
}
#[test]
fn test_box_conditional_accept() {
let log = Arc::new(Mutex::new(Vec::new()));
let l = log.clone();
let consumer = qubit_function::BoxConsumer::new(move |x: &i32| {
l.lock().expect("mutex should not be poisoned").push(*x);
});
let conditional = consumer.when(|x: &i32| *x > 0);
conditional.accept(&5);
assert_eq!(*log.lock().expect("mutex should not be poisoned"), vec![5]);
conditional.accept(&-5);
assert_eq!(*log.lock().expect("mutex should not be poisoned"), vec![5]);
}
}