aboutsummaryrefslogtreecommitdiff
path: root/src/test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test.rs')
-rw-r--r--src/test.rs119
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));
+}