use qubit_function::predicates::ArcPredicate;
use qubit_function::predicates::BoxPredicate;
use qubit_function::predicates::Predicate;
use qubit_function::predicates::RcPredicate;
#[cfg(test)]
mod generic_function_tests {
use super::ArcPredicate;
use super::BoxPredicate;
use super::Predicate;
use super::RcPredicate;
fn filter_by_predicate<T, P>(items: Vec<T>, pred: P) -> Vec<T>
where
P: Predicate<T>,
{
items.into_iter().filter(|item| pred.test(item)).collect()
}
#[test]
fn test_with_box_predicate() {
let pred = BoxPredicate::new(|x: &i32| *x > 0);
let result = filter_by_predicate(vec![-2, -1, 0, 1, 2], pred);
assert_eq!(result, vec![1, 2]);
}
#[test]
fn test_with_rc_predicate() {
let pred = RcPredicate::new(|x: &i32| *x > 0);
let pred_clone = pred.clone();
let result = filter_by_predicate(vec![-2, -1, 0, 1, 2], pred_clone);
assert_eq!(result, vec![1, 2]);
assert!(pred.test(&5));
}
#[test]
fn test_with_arc_predicate() {
let pred = ArcPredicate::new(|x: &i32| *x > 0);
let pred_clone = pred.clone();
let result = filter_by_predicate(vec![-2, -1, 0, 1, 2], pred_clone);
assert_eq!(result, vec![1, 2]);
assert!(pred.test(&5));
}
#[test]
fn test_with_closure() {
let pred = |x: &i32| *x > 0;
let result = filter_by_predicate(vec![-2, -1, 0, 1, 2], pred);
assert_eq!(result, vec![1, 2]);
}
}