use std::any::type_name;
use std::cmp::Ordering;
use qubit_function::BoxComparator;
use qubit_function::Comparator;
struct BoxNaturalComparator;
impl Comparator<i32> for BoxNaturalComparator {
fn compare(&self, left: &i32, right: &i32) -> Ordering {
left.cmp(right)
}
}
#[test]
fn test_box_comparator_observable_behavior() {
let comparator_type_name = type_name::<BoxComparator<i32>>();
assert!(comparator_type_name.contains("BoxComparator"), "{comparator_type_name}");
}
#[test]
fn test_box_comparator_name_and_diagnostics() {
let mut comparator =
BoxComparator::new_with_optional_name(|left: &i32, right: &i32| left.cmp(right), Some("ascending".to_owned()));
assert_eq!(comparator.name(), Some("ascending"));
assert_eq!(comparator.compare(&1, &2), Ordering::Less);
assert_eq!(format!("{comparator:?}"), "BoxComparator { name: Some(\"ascending\") }");
assert_eq!(format!("{comparator}"), "BoxComparator(ascending)");
comparator.set_name("natural");
assert_eq!(comparator.name(), Some("natural"));
comparator.clear_name();
assert_eq!(comparator.name(), None);
assert_eq!(format!("{comparator}"), "BoxComparator");
}
#[test]
fn test_box_comparator_with_name() {
let comparator =
BoxComparator::new_with_name("original", |left: &i32, right: &i32| left.cmp(right)).with_name("ascending");
assert_eq!(comparator.name(), Some("ascending"));
assert_eq!(comparator.compare(&2, &1), Ordering::Greater);
}
#[test]
fn test_box_comparator_then_comparing_semantic_trait() {
let comparator = BoxComparator::new(|_: &i32, _: &i32| Ordering::Equal).then_comparing(BoxNaturalComparator);
assert_eq!(comparator.compare(&1, &2), Ordering::Less);
}