#![cfg(all(feature = "derive", feature = "ordered-float-5"))]
use std::any::Any;
use std::ops::ControlFlow;
use ordered_float_5::OrderedFloat;
use traversable::Traversable as _;
use traversable::TraversableMut as _;
use traversable::Visitor;
use traversable::VisitorMut;
use traversable_derive::Traversable;
use traversable_derive::TraversableMut;
#[test]
fn test_ordered_float() {
#[derive(Debug, Clone, PartialEq, Eq, Traversable, TraversableMut)]
pub enum Literal {
Null,
Float(OrderedFloat<f64>),
}
struct FloatExpr(bool);
impl Visitor for FloatExpr {
type Break = ();
fn enter(&mut self, this: &dyn Any) -> ControlFlow<Self::Break> {
if let Some(Literal::Float(_)) = this.downcast_ref::<Literal>() {
self.0 = true;
}
ControlFlow::Continue(())
}
}
impl VisitorMut for FloatExpr {
type Break = ();
fn enter_mut(&mut self, this: &mut dyn Any) -> ControlFlow<Self::Break> {
if let Some(Literal::Float(_)) = this.downcast_ref::<Literal>() {
self.0 = true;
}
ControlFlow::Continue(())
}
}
assert!({
let mut visitor = FloatExpr(false);
let _ = Literal::Null.traverse(&mut visitor);
!visitor.0
});
assert!({
let mut visitor = FloatExpr(false);
let _ = Literal::Null.traverse_mut(&mut visitor);
!visitor.0
});
assert!({
let mut visitor = FloatExpr(false);
let _ = Literal::Float(OrderedFloat(0.0)).traverse(&mut visitor);
visitor.0
});
assert!({
let mut visitor = FloatExpr(false);
let _ = Literal::Float(OrderedFloat(0.0)).traverse_mut(&mut visitor);
visitor.0
});
}