Skip to main content

assert_approx_eq

Macro assert_approx_eq 

Source
macro_rules! assert_approx_eq {
    ($lhs:expr, $rhs:expr) => { ... };
    ($lhs:expr, $rhs:expr, rtol <= $rtol:expr) => { ... };
    ($lhs:expr, $rhs:expr, atol <= $atol:expr) => { ... };
    ($lhs:expr, $rhs:expr, rtol <= $rtol:expr, atol <= $atol:expr) => { ... };
    ($lhs:expr, $rhs:expr, atol <= $atol:expr, rtol <= $rtol:expr) => { ... };
}
Expand description

Asserts that two values are approximately equal.

This macro is intended for use in tests. If the values are not approximately equal, it panics with a detailed error message showing:

  • The left and right values
  • The tolerances used
  • Which specific fields failed (for composite types)
  • The actual difference and effective tolerance for failed comparisons

§Syntax

assert_approx_eq!(left, right)                          // Default tolerances
assert_approx_eq!(left, right, atol <= tolerance)       // Custom absolute tolerance
assert_approx_eq!(left, right, rtol <= tolerance)       // Custom relative tolerance
assert_approx_eq!(left, right, atol <= a, rtol <= r)    // Both tolerances
assert_approx_eq!(left, right, rtol <= r, atol <= a)    // Order doesn't matter

§Examples

use lox_test_utils::assert_approx_eq;

// This passes - values are within default tolerance
assert_approx_eq!(1.0, 1.0 + f64::EPSILON);

// Custom tolerance
assert_approx_eq!(1.0, 1.005, atol <= 0.01);

// Works with vectors
use glam::DVec3;
let v1 = DVec3::new(1.0, 2.0, 3.0);
let v2 = DVec3::new(1.0, 2.0, 3.0 + f64::EPSILON);
assert_approx_eq!(v1, v2);

§Panics

Panics with a detailed error message if the values are not approximately equal:

use lox_test_utils::assert_approx_eq;

// This will panic with a detailed error message
assert_approx_eq!(1.0, 2.0);

§See Also