#![warn(clippy::all, clippy::pedantic)]
use crate::numeric;
use log::debug;
const TEST_SAFE_INT_MAX: f32 = numeric::F32_MAX_SAFE_INT;
const TEST_SAFE_INT_MIN: f32 = numeric::F32_MIN_SAFE_INT;
#[test]
fn test_f32_to_i32() {
assert_eq!(numeric::f32_to_i32(0.0), 0);
assert_eq!(numeric::f32_to_i32(1.0), 1);
assert_eq!(numeric::f32_to_i32(-1.0), -1);
assert_eq!(numeric::f32_to_i32(1.4), 1);
assert_eq!(numeric::f32_to_i32(1.6), 2);
assert_eq!(numeric::f32_to_i32(-1.4), -1);
assert_eq!(numeric::f32_to_i32(-1.6), -2);
assert_eq!(numeric::f32_to_i32(f32::NAN), 0);
assert_eq!(numeric::f32_to_i32(f32::INFINITY), i32::MAX);
assert_eq!(numeric::f32_to_i32(f32::NEG_INFINITY), i32::MIN);
assert_eq!(numeric::f32_to_i32(TEST_SAFE_INT_MAX), i32::MAX);
assert_eq!(numeric::f32_to_i32(TEST_SAFE_INT_MIN), i32::MIN);
#[allow(clippy::cast_possible_truncation)]
{
assert_eq!(
numeric::f32_to_i32(TEST_SAFE_INT_MAX - 1.0),
(TEST_SAFE_INT_MAX - 1.0) as i32
);
assert_eq!(
numeric::f32_to_i32(TEST_SAFE_INT_MIN + 1.0),
(TEST_SAFE_INT_MIN + 1.0) as i32
);
}
}
#[test]
fn test_i32_to_u32() {
assert_eq!(numeric::i32_to_u32(0), 0);
assert_eq!(numeric::i32_to_u32(1), 1);
assert_eq!(numeric::i32_to_u32(i32::MAX), i32::MAX as u32);
assert_eq!(numeric::i32_to_u32(-1), 0);
assert_eq!(numeric::i32_to_u32(i32::MIN), 0);
assert_eq!(numeric::i32_to_u32(-42), 0);
}
#[test]
fn test_u32_to_i32() {
assert_eq!(numeric::u32_to_i32(0), 0);
assert_eq!(numeric::u32_to_i32(1), 1);
assert_eq!(numeric::u32_to_i32(i32::MAX as u32), i32::MAX);
assert_eq!(numeric::u32_to_i32(i32::MAX as u32 + 1), i32::MAX);
assert_eq!(numeric::u32_to_i32(u32::MAX), i32::MAX);
assert_eq!(numeric::u32_to_i32(i32::MAX as u32 - 1), i32::MAX - 1);
}
#[test]
fn test_f32_to_u8() {
assert_eq!(numeric::f32_to_u8(0.0), 0);
assert_eq!(numeric::f32_to_u8(1.0), 1);
assert_eq!(numeric::f32_to_u8(254.0), 254);
assert_eq!(numeric::f32_to_u8(255.0), 255);
assert_eq!(numeric::f32_to_u8(127.4), 127);
assert_eq!(numeric::f32_to_u8(127.6), 128);
assert_eq!(numeric::f32_to_u8(f32::NAN), 0);
assert_eq!(numeric::f32_to_u8(f32::INFINITY), 255);
assert_eq!(numeric::f32_to_u8(f32::NEG_INFINITY), 0);
assert_eq!(numeric::f32_to_u8(-1.0), 0);
assert_eq!(numeric::f32_to_u8(256.0), 255);
assert_eq!(numeric::f32_to_u8(254.4), 254);
assert_eq!(numeric::f32_to_u8(254.6), 255);
assert_eq!(numeric::f32_to_u8(0.4), 0);
assert_eq!(numeric::f32_to_u8(0.6), 1);
}
#[test]
#[allow(
clippy::float_cmp,
clippy::cast_precision_loss,
clippy::cast_possible_truncation
)]
fn test_i32_to_f32_for_pos() {
assert_eq!(numeric::i32_to_f32_for_pos(0), 0.0);
assert_eq!(numeric::i32_to_f32_for_pos(100), 100.0);
assert_eq!(numeric::i32_to_f32_for_pos(-100), -100.0);
let large_value = 16_777_216; assert_eq!(numeric::i32_to_f32_for_pos(large_value), large_value as f32);
assert_eq!(
numeric::i32_to_f32_for_pos(i32::MAX).round() as i32,
i32::MAX
);
assert_eq!(
numeric::i32_to_f32_for_pos(i32::MIN).round() as i32,
i32::MIN
);
}
#[test]
fn test_f32_to_u32() {
assert_eq!(numeric::f32_to_u32(0.0), 0);
assert_eq!(numeric::f32_to_u32(1.0), 1);
assert_eq!(numeric::f32_to_u32(1.4), 1);
assert_eq!(numeric::f32_to_u32(1.6), 2);
assert_eq!(numeric::f32_to_u32(f32::NAN), 0);
assert_eq!(numeric::f32_to_u32(f32::INFINITY), u32::MAX);
assert_eq!(numeric::f32_to_u32(f32::NEG_INFINITY), 0);
assert_eq!(numeric::f32_to_u32(-1.0), 0);
assert_eq!(numeric::f32_to_u32(-0.0), 0);
assert_eq!(numeric::f32_to_u32(0.4), 0);
assert_eq!(numeric::f32_to_u32(0.6), 1);
}
#[test]
fn test_f32_to_u32_max_precision_limitation() {
let max_as_f32 = u32::MAX as f32;
assert_eq!(numeric::f32_to_u32(max_as_f32), u32::MAX);
debug!("Note: u32::MAX as f32 = {max_as_f32}");
debug!("This is slightly less than u32::MAX due to f32's precision limitations");
let max_minus_one_f32 = (u32::MAX - 1) as f32;
let result = numeric::f32_to_u32(max_minus_one_f32);
debug!("Note: (u32::MAX - 1) as f32 = {max_minus_one_f32}");
debug!("Converting back to u32 gives: {result}");
}