use numeral::Cardinal; use std::{fs, mem}; macro_rules! test_call_on_min_max { ($fn_name:ident, $numtype:ty) => { #[test] fn $fn_name() { <$numtype>::MAX.cardinal(); <$numtype>::MIN.cardinal(); } }; } test_call_on_min_max!(call_on_min_max_i8, i8); test_call_on_min_max!(call_on_min_max_u8, u8); test_call_on_min_max!(call_on_min_max_i16, i16); test_call_on_min_max!(call_on_min_max_u16, u16); test_call_on_min_max!(call_on_min_max_i32, i32); test_call_on_min_max!(call_on_min_max_u32, u32); test_call_on_min_max!(call_on_min_max_i64, i64); test_call_on_min_max!(call_on_min_max_u64, u64); test_call_on_min_max!(call_on_min_max_isize, isize); test_call_on_min_max!(call_on_min_max_usize, usize); macro_rules! test_call_on_full_range { ($fn_name:ident, $numtype:ty) => { #[test] fn $fn_name() { for n in (<$numtype>::MIN)..=(<$numtype>::MAX) { n.cardinal(); } } }; } test_call_on_full_range!(call_on_full_range_i8, i8); test_call_on_full_range!(call_on_full_range_u8, u8); test_call_on_full_range!(call_on_full_range_i16, i16); test_call_on_full_range!(call_on_full_range_u16, u16); macro_rules! test_call_on_critical_ranges { ($fn_name:ident, $numtype:ty) => { #[test] fn $fn_name() { for n in (<$numtype>::MIN)..=(<$numtype>::MIN) + 130 { n.cardinal(); } for n in (<$numtype>::MAX) - 130..=(<$numtype>::MAX) { n.cardinal(); } if <$numtype>::MIN != 0 { for n in -130..=130 { n.cardinal(); } } } }; } test_call_on_critical_ranges!(call_on_critical_ranges_i32, i32); test_call_on_critical_ranges!(call_on_critical_ranges_u32, u32); test_call_on_critical_ranges!(call_on_critical_ranges_i64, i64); test_call_on_critical_ranges!(call_on_critical_ranges_u64, u64); test_call_on_critical_ranges!(call_on_critical_ranges_isize, isize); test_call_on_critical_ranges!(call_on_critical_ranges_usize, usize); #[test] fn cardinal_value_m256_256() { let cardinals = fs::read_to_string("tests/cardinal_-256..=256.txt").unwrap(); assert!(cardinals.lines().eq((-256..=256).map(|n: i32| n.cardinal()))); } #[test] fn cardinal_value_min_max_int() { let cardinals = fs::read_to_string("tests/cardinal_min_max.txt").unwrap(); let mut lines = cardinals.lines(); macro_rules! assert_eq_min_max { ($signed:ty, $unsigned:ty) => { assert_eq!(lines.next().unwrap(), <$signed>::MIN.cardinal()); assert_eq!(lines.next().unwrap(), <$signed>::MAX.cardinal()); assert_eq!(lines.next().unwrap(), <$unsigned>::MAX.cardinal()); }; } assert_eq!(lines.next().unwrap(), 0.cardinal()); assert_eq_min_max!(i8, u8); assert_eq_min_max!(i16, u16); assert_eq_min_max!(i32, u32); assert_eq_min_max!(i64, u64); } #[test] fn cardinal_value_min_max_ptr() { macro_rules! assert_eq_min_max_if_ptr_is { ($ptr:ty, $int:ty) => { if mem::size_of::<$ptr>() == mem::size_of::<$int>() { assert_eq!(<$ptr>::MIN.cardinal(), <$int>::MIN.cardinal()); assert_eq!(<$ptr>::MAX.cardinal(), <$int>::MAX.cardinal()); } }; } assert_eq_min_max_if_ptr_is!(isize, i8); assert_eq_min_max_if_ptr_is!(isize, i16); assert_eq_min_max_if_ptr_is!(isize, i32); assert_eq_min_max_if_ptr_is!(isize, i64); assert_eq_min_max_if_ptr_is!(usize, u8); assert_eq_min_max_if_ptr_is!(usize, u16); assert_eq_min_max_if_ptr_is!(usize, u32); assert_eq_min_max_if_ptr_is!(usize, u64); }