pub fn is_finite() -> __internal::IsFiniteMatcher {
__internal::IsFiniteMatcher
}
pub mod __internal {
use crate::{
description::Description,
matcher::{Describable, Matcher, MatcherResult},
};
use core::fmt::Debug;
use num_traits::float::Float;
#[doc(hidden)]
pub struct IsFiniteMatcher;
impl<T: Float + Debug> Matcher<T> for IsFiniteMatcher {
fn matches(&self, actual: &T) -> MatcherResult {
actual.is_finite().into()
}
}
impl Describable for IsFiniteMatcher {
fn describe(&self, matcher_result: MatcherResult) -> Description {
if matcher_result.into() { "is finite" } else { "is infinite or NaN" }.into()
}
}
}
#[cfg(test)]
mod tests {
use super::is_finite;
use crate::prelude::*;
#[test]
fn does_not_match_f32_infinity() -> TestResult<()> {
verify_that!(f32::INFINITY, not(is_finite()))
}
#[test]
fn matches_f32_number() -> TestResult<()> {
verify_that!(0.0f32, is_finite())
}
#[test]
fn does_not_match_f32_nan() -> TestResult<()> {
verify_that!(f32::NAN, not(is_finite()))
}
#[test]
fn does_not_match_f64_infinity() -> TestResult<()> {
verify_that!(f64::INFINITY, not(is_finite()))
}
#[test]
fn matches_f64_number() -> TestResult<()> {
verify_that!(0.0f64, is_finite())
}
#[test]
fn does_not_match_f64_nan() -> TestResult<()> {
verify_that!(f64::NAN, not(is_finite()))
}
}