use core::hint::black_box; use equator::assert; use std::collections::HashMap; #[test] #[should_panic] pub fn test() { black_box(test_asm_1_med as fn(_, _)); black_box(test_asm_2_smol as fn(_, _, _, _)); black_box(test_asm_2_med as fn(_, _, _, _)); black_box(test_asm_2_big as fn(_, _, _, _)); black_box(test_std_asm_1_med as fn(_, _)); black_box(test_std_asm_2_smol as fn(_, _, _, _)); black_box(test_std_asm_2_med as fn(_, _, _, _)); black_box(test_std_asm_2_big as fn(_, _, _, _)); black_box(test_assert2_asm_1_med as fn(_, _)); black_box(test_assert2_asm_2_smol as fn(_, _, _, _)); black_box(test_assert2_asm_2_med as fn(_, _, _, _)); black_box(test_assert2_asm_2_big as fn(_, _, _, _)); let x = 3; let y = 2; let z = true; assert!(true == false); assert!(all(true == false, x < y, any(!z, z))); assert!(all(true == false, x + 1 < y, any(!z, z))); } #[test] #[should_panic] pub fn test_different_types() { assert!(*[0, 1, 2usize].as_slice() == [0, 1usize]); } #[derive(Copy, Clone, Debug)] struct ApproxEq { symbol: &'static str, tol: f64, } #[derive(Copy, Clone, Debug)] enum ApproxEqError { Absolute { distance: f64 }, } impl equator::CmpError for ApproxEq { type Error = ApproxEqError; } impl equator::Cmp for ApproxEq { fn test(&self, lhs: &f64, rhs: &f64) -> Result<(), Self::Error> { let distance = (lhs - rhs).abs(); let result = if distance <= self.tol { Ok(()) } else { Err(ApproxEqError::Absolute { distance }) }; result } } impl equator::CmpDisplay for ApproxEqError { fn fmt( &self, cmp: &ApproxEq, lhs: &f64, lhs_source: &str, _: &dyn core::fmt::Debug, rhs: &f64, rhs_source: &str, _: &dyn core::fmt::Debug, f: &mut core::fmt::Formatter, ) -> core::fmt::Result { let ApproxEq { symbol, tol } = *cmp; let ApproxEqError::Absolute { distance } = self; writeln!( f, "Assertion failed: {lhs_source} {symbol} {rhs_source}, with absolute tolerance {tol:.1e}" )?; writeln!(f, "- {lhs_source} = {lhs:#?}")?; writeln!(f, "- {rhs_source} = {rhs:#?}")?; write!(f, "- distance = {distance:#?}") } } #[test] pub fn test_move() { let ref mut m = HashMap::>::new(); let x = vec![]; assert!(*x == []); assert!(*x == [], "oops {x:?}"); assert!(m.insert(0, x).is_none()); } #[inline(never)] pub fn test_asm_1_med(a: usize, b: usize) { assert!(a == b); } #[inline(never)] pub fn test_asm_2_smol(a: u8, b: u8, c: u8, d: u8) { assert!([a, c] == [b, d]); } #[inline(never)] pub fn test_asm_2_med(a: usize, b: usize, c: usize, d: usize) { assert!(all(a == b, c == d)); } #[inline(never)] pub fn test_asm_2_big(a: usize, b: usize, c: usize, d: usize) { assert!([a, c] == [b, d]); } #[inline(never)] pub fn test_std_asm_2_smol(a: u8, b: u8, c: u8, d: u8) { std::assert_eq!([a, c], [b, d]); } #[inline(never)] pub fn test_std_asm_2_med(a: usize, b: usize, c: usize, d: usize) { std::assert_eq!(a, b); std::assert_eq!(c, d); } #[inline(never)] pub fn test_std_asm_2_big(a: usize, b: usize, c: usize, d: usize) { std::assert_eq!([a, c], [b, d]); } #[inline(never)] pub fn test_assert2_asm_2_smol(a: u8, b: u8, c: u8, d: u8) { assert2::assert!([a, c] == [b, d]); } #[inline(never)] pub fn test_assert2_asm_2_med(a: usize, b: usize, c: usize, d: usize) { assert2::assert!(a == b); assert2::assert!(c == d); } #[inline(never)] pub fn test_assert2_asm_2_big(a: usize, b: usize, c: usize, d: usize) { assert2::assert!([a, c] == [b, d]); } #[inline(never)] pub fn test_std_asm_1_med(a: usize, b: usize) { std::assert_eq!(a, b); } #[inline(never)] pub fn test_assert2_asm_1_med(a: usize, b: usize) { assert2::assert!(a == b); } #[test] #[should_panic] pub fn test_big_fail() { let x = [core::ptr::null::<()>(); 2]; assert!(x != x); } #[test] pub fn test_big() { let x = [core::ptr::null::<()>(); 2]; assert!(x == x); } #[test] #[should_panic] pub fn test_custom_fail() { let approx_eq = ApproxEq { tol: 0.01, symbol: "~", }; let x = 0.1; assert!(all(x ~ 0.2, x ~ 0.1, x ~ 0.3)); } #[test] pub fn test_custom() { let approx_eq = ApproxEq { tol: 0.01, symbol: "~", }; assert!(0.1 :approx_eq: 0.10001); assert!(0.1 ~ 0.10001); }