// Copyright © 2024 Mikhail Hogrefe
//
// This file is part of Malachite.
//
// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
// 3 of the License, or (at your option) any later version. See .
use malachite_base::named::Named;
use malachite_base::num::basic::floats::PrimitiveFloat;
use malachite_base::num::basic::integers::PrimitiveInt;
use malachite_base::num::basic::traits::{
Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, OneHalf, Two, Zero,
};
use malachite_base::num::float::NiceFloat;
macro_rules! test_unsigned_constants {
($t: ident) => {
assert_eq!($t::ZERO, 0);
assert_eq!($t::ONE, 1);
assert_eq!($t::TWO, 2);
};
}
macro_rules! test_signed_constants {
($t: ident) => {
test_unsigned_constants!($t);
assert_eq!($t::NEGATIVE_ONE, -1);
};
}
macro_rules! test_float_constants {
($t: ident) => {
assert_eq!($t::ZERO, 0.0);
assert_eq!($t::ONE, 1.0);
assert_eq!($t::TWO, 2.0);
assert_eq!($t::NEGATIVE_ONE, -1.0);
assert_eq!($t::NEGATIVE_ZERO, -0.0);
assert_eq!($t::ONE_HALF, 0.5);
};
}
#[test]
fn test_constants() {
apply_to_unsigneds!(test_unsigned_constants);
apply_to_signeds!(test_signed_constants);
apply_to_primitive_floats!(test_float_constants);
}
#[test]
fn test_width_constants() {
assert_eq!(u8::WIDTH, 8);
assert_eq!(u8::LOG_WIDTH, 3);
assert_eq!(u8::WIDTH_MASK, 0x7);
assert_eq!(u16::WIDTH, 16);
assert_eq!(u16::LOG_WIDTH, 4);
assert_eq!(u16::WIDTH_MASK, 0xf);
assert_eq!(u32::WIDTH, 32);
assert_eq!(u32::LOG_WIDTH, 5);
assert_eq!(u32::WIDTH_MASK, 0x1f);
assert_eq!(u64::WIDTH, 64);
assert_eq!(u64::LOG_WIDTH, 6);
assert_eq!(u64::WIDTH_MASK, 0x3f);
assert_eq!(u128::WIDTH, 128);
assert_eq!(u128::LOG_WIDTH, 7);
assert_eq!(u128::WIDTH_MASK, 0x7f);
assert_eq!(i8::WIDTH, 8);
assert_eq!(i8::LOG_WIDTH, 3);
assert_eq!(i8::WIDTH_MASK, 0x7);
assert_eq!(i16::WIDTH, 16);
assert_eq!(i16::LOG_WIDTH, 4);
assert_eq!(i16::WIDTH_MASK, 0xf);
assert_eq!(i32::WIDTH, 32);
assert_eq!(i32::LOG_WIDTH, 5);
assert_eq!(i32::WIDTH_MASK, 0x1f);
assert_eq!(i64::WIDTH, 64);
assert_eq!(i64::LOG_WIDTH, 6);
assert_eq!(i64::WIDTH_MASK, 0x3f);
assert_eq!(i128::WIDTH, 128);
assert_eq!(i128::LOG_WIDTH, 7);
assert_eq!(i128::WIDTH_MASK, 0x7f);
}
#[test]
fn test_other_float_constants() {
assert_eq!(f32::WIDTH, 32);
assert_eq!(f32::EXPONENT_WIDTH, 8);
assert_eq!(f32::MANTISSA_WIDTH, 23);
assert_eq!(f32::MIN_NORMAL_EXPONENT, -126);
assert_eq!(f32::MIN_EXPONENT, -149);
assert_eq!(f32::MAX_EXPONENT, 127);
assert_eq!(NiceFloat(f32::MIN_POSITIVE_SUBNORMAL), NiceFloat(1.0e-45));
assert_eq!(NiceFloat(f32::MAX_SUBNORMAL), NiceFloat(1.1754942e-38));
assert_eq!(
NiceFloat(f32::MIN_POSITIVE_NORMAL),
NiceFloat(1.1754944e-38)
);
assert_eq!(NiceFloat(f32::MAX_FINITE), NiceFloat(3.4028235e38));
assert_eq!(NiceFloat(Infinity::INFINITY), NiceFloat(f32::INFINITY));
assert_eq!(
NiceFloat(f32::NEGATIVE_INFINITY),
NiceFloat(f32::NEG_INFINITY)
);
assert_eq!(NiceFloat(NaN::NAN), NiceFloat(f32::NAN));
assert_eq!(f32::SMALLEST_UNREPRESENTABLE_UINT, 0x1000001);
assert_eq!(f32::LARGEST_ORDERED_REPRESENTATION, 0xff000001);
assert_eq!(f64::WIDTH, 64);
assert_eq!(f64::EXPONENT_WIDTH, 11);
assert_eq!(f64::MANTISSA_WIDTH, 52);
assert_eq!(f64::MIN_NORMAL_EXPONENT, -1022);
assert_eq!(f64::MIN_EXPONENT, -1074);
assert_eq!(f64::MAX_EXPONENT, 1023);
assert_eq!(NiceFloat(f64::MIN_POSITIVE_SUBNORMAL), NiceFloat(5.0e-324));
assert_eq!(
NiceFloat(f64::MAX_SUBNORMAL),
NiceFloat(2.225073858507201e-308)
);
assert_eq!(
NiceFloat(f64::MIN_POSITIVE_NORMAL),
NiceFloat(2.2250738585072014e-308)
);
assert_eq!(
NiceFloat(f64::MAX_FINITE),
NiceFloat(1.7976931348623157e308)
);
assert_eq!(NiceFloat(Infinity::INFINITY), NiceFloat(f64::INFINITY));
assert_eq!(
NiceFloat(f64::NEGATIVE_INFINITY),
NiceFloat(f64::NEG_INFINITY)
);
assert_eq!(NiceFloat(NaN::NAN), NiceFloat(f64::NAN));
assert_eq!(f32::SMALLEST_UNREPRESENTABLE_UINT, 0x1000001);
assert_eq!(f64::LARGEST_ORDERED_REPRESENTATION, 0xffe0000000000001);
}
#[test]
pub fn test_named() {
fn test(out: &str) {
assert_eq!(T::NAME, out);
}
test::("u8");
test::("u16");
test::("u32");
test::("u64");
test::("u128");
test::("usize");
test::("i8");
test::("i16");
test::("i32");
test::("i64");
test::("i128");
test::("isize");
test::("f32");
test::("f64");
}