diff options
Diffstat (limited to 'src/test.rs')
-rw-r--r-- | src/test.rs | 119 |
1 files changed, 53 insertions, 66 deletions
diff --git a/src/test.rs b/src/test.rs index 6b619ab..161a022 100644 --- a/src/test.rs +++ b/src/test.rs @@ -6,7 +6,7 @@ macro_rules! promote_and_back { $( mod $src { mod from { - use From; + use crate::From; $( quickcheck! { @@ -24,50 +24,32 @@ macro_rules! promote_and_back { #[cfg(target_pointer_width = "32")] promote_and_back! { - i8 => f32, f64, i16, i32, isize, i64 ; - i16 => f32, f64, i32, isize, i64 ; - i32 => f32, f64, i64 ; - isize => f32, f64, i64 ; - i64 => f32, f64 ; - u8 => f32, f64, i16, i32, isize, i64, u16, u32, usize, u64; - u16 => f32, f64, i32, isize, i64, u32, usize, u64; - u32 => f32, f64, i64, u64; - usize => f32, f64, i64, u64; - u64 => f32, f64 ; + i8 => f32, f64, i16, i32, isize, i64, i128 ; + i16 => f32, f64, i32, isize, i64, i128 ; + i32 => f64, i64, i128 ; + isize => f64, i64, i128 ; + i64 => i128 ; + u8 => f32, f64, i16, i32, isize, i64, i128, u16, u32, usize, u64, u128; + u16 => f32, f64, i32, isize, i64, i128, u32, usize, u64, u128; + u32 => f64, i64, i128, u64, u128; + usize => f64, i64, i128, u64, u128; + u64 => i128, u128; } #[cfg(target_pointer_width = "64")] promote_and_back! { - i8 => f32, f64, i16, i32, i64, isize ; - i16 => f32, f64, i32, i64, isize ; - i32 => f32, f64, i64, isize ; - i64 => f32, f64 ; - isize => f32, f64 ; - u8 => f32, f64, i16, i32, i64, isize, u16, u32, u64, usize; - u16 => f32, f64, i32, i64, isize, u32, u64, usize; - u32 => f32, f64, i64, isize, u64, usize; - u64 => f32, f64 ; - usize => f32, f64 ; + i8 => f32, f64, i16, i32, i64, isize, i128 ; + i16 => f32, f64, i32, i64, isize, i128 ; + i32 => f64, i64, isize, i128 ; + i64 => i128 ; + isize => i128 ; + u8 => f32, f64, i16, i32, i64, isize, i128, u16, u32, u64, usize, u128; + u16 => f32, f64, i32, i64, isize, i128, u32, u64, usize, u128; + u32 => f64, i64, isize, i128, u64, usize, u128; + u64 => i128, u128; + usize => i128, u128; } -// TODO uncomment this once quickcheck supports Arbitrary for i128/u128 -// https://github.com/BurntSushi/quickcheck/issues/162 -/*#[cfg(feature = "x128")] -promote_and_back! { - i8 => i128 ; - i16 => i128 ; - i32 => i128 ; - isize => i128 ; - i64 => i128 ; - i128 => f32, f64 ; - u8 => i128, u128; - u16 => i128, u128; - u32 => i128, u128; - usize => i128, u128; - u64 => i128, u128; - u128 => f32, f64 ; -}*/ - // If it's Ok to cast `src` to `$dst`, it must also be Ok to cast `dst` back to // `$src` macro_rules! symmetric_cast_between { @@ -78,7 +60,7 @@ macro_rules! symmetric_cast_between { mod and { use quickcheck::TestResult; - use From; + use crate::From; $( quickcheck! { @@ -110,27 +92,21 @@ symmetric_cast_between! { #[cfg(target_pointer_width = "64")] symmetric_cast_between! { - u8 => i8 ; - u16 => i8, i16 ; - u32 => i8, i16, i32 ; - u64 => i8, i16, i32, i64, isize; - usize => i8, i16, i32, i64, isize; + u8 => i8 ; + u16 => i8, i16 ; + u32 => i8, i16, i32 ; + u64 => i8, i16, i32, i64, isize ; + usize => i8, i16, i32, i64, isize ; + u128 => i8, i16, i32, i64, isize, i128; } -// TODO uncomment this once quickcheck supports Arbitrary for i128/u128 -// https://github.com/BurntSushi/quickcheck/issues/162 -/*#[cfg(feature = "x128")] -symmetric_cast_between! { - u128 => i8, i16, i32, isize, i64, i128; -}*/ - macro_rules! from_float { ($($src:ident => $($dst:ident),+);+;) => { $( mod $src { mod inf { mod to { - use {Error, From}; + use crate::{Error, From}; $( #[test] @@ -151,7 +127,7 @@ macro_rules! from_float { mod nan { mod to { - use {Error, From}; + use crate::{Error, From}; $( #[test] @@ -171,22 +147,13 @@ macro_rules! from_float { } from_float! { - f32 => i8, i16, i32, i64, isize, u8, u16, u32, u64, usize; - f64 => i8, i16, i32, i64, isize, u8, u16, u32, u64, usize; + f32 => i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize; + f64 => i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize; } -// TODO uncomment this once quickcheck supports Arbitrary for i128/u128 -// https://github.com/BurntSushi/quickcheck/issues/162 -/*#[cfg(feature = "x128")] -from_float! { - f32 => i128, u128; - f64 => i128, u128; -}*/ - #[test] -#[cfg(feature = "x128")] fn test_fl_conversion() { - use u128; + use crate::u128; assert_eq!(u128(42.0f32), Ok(42)); } @@ -219,3 +186,23 @@ fn gh15() { assert_eq!(super::u16(16_f32.exp2()), Err(super::Error::Overflow)); assert_eq!(super::u16(16_f64.exp2()), Err(super::Error::Overflow)); } + +#[test] +fn gh23_lossless_integer_max_min_to_float() { + // f32::MANTISSA_DIGITS = 24 + assert_eq!(Ok(u8::MAX), super::u8(255f32)); + assert_eq!(Ok(u16::MAX), super::u16(65_535f32)); + + // f64::MANTISSA_DIGITS = 53 + assert_eq!(Ok(u8::MAX), super::u8(255f64)); + assert_eq!(Ok(u16::MAX), super::u16(65_535f64)); + assert_eq!(Ok(u32::MAX), super::u32(4_294_967_295f64)); + + // also check negative values (not part of the original bug) + assert_eq!(Ok(i8::MIN), super::i8(-128f32)); + assert_eq!(Ok(i16::MIN), super::i16(-32_768f32)); + + assert_eq!(Ok(i8::MIN), super::i8(-128f64)); + assert_eq!(Ok(i16::MIN), super::i16(-32_768f64)); + assert_eq!(Ok(i32::MIN), super::i32(-2_147_483_648f64)); +} |