#[macro_export]
macro_rules! assert_f64_ne_as_result {
($a:expr, $b:expr $(,)?) => {
match (&$a, &$b) {
(a, b) => {
if !(a >= b && a - b < f64::EPSILON) && !(a <= b && b - a < f64::EPSILON) {
Ok(())
} else {
Err(format!(
concat!(
"assertion failed: `assert_f64_ne!(a, b)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_f64_ne.html\n",
" a label: `{}`,\n",
" a debug: `{}`,\n",
" b label: `{}`,\n",
" b debug: `{:?}`,\n",
" diff: `{}`,\n",
" ε: `{}`",
),
stringify!($a),
a,
stringify!($b),
b,
a - b,
f64::EPSILON,
))
}
}
}
};
}
#[cfg(test)]
mod test_assert_f64_ne_as_result {
use crate::assert_f64::{EQ, EQ_GT, EQ_LT, GT, LT};
use std::sync::Once;
#[test]
fn lt() {
let a: f64 = EQ;
let b: f64 = GT;
for _ in 0..1 {
let actual = assert_f64_ne_as_result!(a, b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn lt_once() {
static A: Once = Once::new();
fn a() -> f64 {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
EQ
}
static B: Once = Once::new();
fn b() -> f64 {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
GT
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_f64_ne_as_result!(a(), b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn gt() {
let a: f64 = EQ;
let b: f64 = LT;
for _ in 0..1 {
let actual = assert_f64_ne_as_result!(a, b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn gt_once() {
static A: Once = Once::new();
fn a() -> f64 {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
EQ
}
static B: Once = Once::new();
fn b() -> f64 {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
GT
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_f64_ne_as_result!(a(), b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn eq() {
let a: f64 = EQ;
let b: f64 = EQ;
let actual = assert_f64_ne_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_f64_ne!(a, b)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_f64_ne.html\n",
" a label: `a`,\n",
" a debug: `0.3333333333333333`,\n",
" b label: `b`,\n",
" b debug: `0.3333333333333333`,\n",
" diff: `0`,\n",
" ε: `0.0000000000000002220446049250313`",
);
assert_eq!(actual.unwrap_err(), message);
}
#[test]
fn eq_lt() {
let a: f64 = EQ;
let b: f64 = EQ_GT;
let actual = assert_f64_ne_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_f64_ne!(a, b)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_f64_ne.html\n",
" a label: `a`,\n",
" a debug: `0.3333333333333333`,\n",
" b label: `b`,\n",
" b debug: `0.3333333333333335`,\n",
" diff: `-0.00000000000000016653345369377348`,\n",
" ε: `0.0000000000000002220446049250313`",
);
assert_eq!(actual.unwrap_err(), message);
}
#[test]
fn eq_gt() {
let a: f64 = EQ;
let b: f64 = EQ_LT;
let actual = assert_f64_ne_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_f64_ne!(a, b)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_f64_ne.html\n",
" a label: `a`,\n",
" a debug: `0.3333333333333333`,\n",
" b label: `b`,\n",
" b debug: `0.3333333333333332`,\n",
" diff: `0.00000000000000011102230246251565`,\n",
" ε: `0.0000000000000002220446049250313`",
);
assert_eq!(actual.unwrap_err(), message);
}
}
#[macro_export]
macro_rules! assert_f64_ne {
($a:expr, $b:expr $(,)?) => {
match $crate::assert_f64_ne_as_result!($a, $b) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
};
($a:expr, $b:expr, $($message:tt)+) => {
match $crate::assert_f64_ne_as_result!($a, $b) {
Ok(()) => (),
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_f64_ne {
use crate::assert_f64::{EQ, GT};
use std::panic;
#[test]
fn ne() {
let a: f64 = EQ;
let b: f64 = GT;
for _ in 0..1 {
let actual = assert_f64_ne!(a, b);
assert_eq!(actual, ());
}
}
}
#[macro_export]
macro_rules! debug_assert_f64_ne {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_f64_ne!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_f64_ne {
use crate::assert_f64::{EQ, GT};
use std::panic;
#[test]
fn ne() {
let a: f64 = EQ;
let b: f64 = GT;
for _ in 0..1 {
let _actual = debug_assert_f64_ne!(a, b);
}
}
}