fastnum2 0.3.6

fork of Fast decimal numbers library
Documentation
macro_rules! test_impl {
    (D, $bits: literal) => {
        paste::paste! { test_impl!(T: [< dec $bits >], [< u $bits >], [<D $bits>], [<U $bits>]); }
    };
    (UD, $bits: literal) => {
        paste::paste! { test_impl!(T: [< udec $bits >], [< u $bits >], [<UD $bits>], [<U $bits>]); }
    };
    (T: $dec: ident, $uint: ident, $D: ident, $U: ident) => {
        mod $dec {
            use fastnum::{decimal::*, *};
            use rstest::*;

            #[rstest(::trace)]
            #[case(0, $uint!(1), 0, Signals::empty())]
            #[case(-0, $uint!(1), 0, Signals::empty())]
            #[case(-1, $uint!(1), 1, Signals::empty())]
            #[case(1, $uint!(1), -1, Signals::empty())]
            #[case(-2, $uint!(1), 2, Signals::empty())]
            #[case(2, $uint!(1), -2, Signals::empty())]
            #[case(-3, $uint!(1), 3, Signals::empty())]
            #[case(3, $uint!(1), -3, Signals::empty())]
            // -----------
            #[case(1000, $uint!(1), -1000, Signals::empty())]
            #[case(32767, $uint!(1), -32767, Signals::empty())]
            #[case(32768, $uint!(1), -32768, Signals::empty())]
            #[case(32769, $uint!(10), -32768, signals![!CP, !ROUND])]
            #[case(32770, $uint!(100), -32768, signals![!CP, !ROUND])]
            #[case(32771, $uint!(1000), -32768, signals![!CP, !ROUND])]
            // -----------
            #[case(-1000, $uint!(1), 1000, Signals::empty())]
            #[case(-32765, $uint!(1), 32765, Signals::empty())]
            #[case(-32766, $uint!(1), 32766, Signals::empty())]
            #[case(-32767, $uint!(1), 32767, Signals::empty())]
            fn test_quantum(
                #[case] exp: i32,
                #[case] digits: $U,
                #[case] scale: i16,
                #[case] signals: Signals,
            ) {
                let d = $D::quantum(exp, Context::default());

                assert_eq!(d.digits(), digits);
                assert_eq!(d.fractional_digits_count(), scale);
                assert_eq!(d.op_signals(), signals);
            }

            #[rstest(::trace)]
            #[case(65536)]
            fn test_quantum_overflow(#[case] exp: i32) {
                let d = $D::quantum(
                    exp,
                    Context::default().with_signal_traps(SignalsTraps::empty()),
                );
                assert!(d.is_infinite());
                assert_eq!(d.op_signals(), signals![!OFW, !INEXACT, !ROUND]);
            }

            #[rstest(::trace)]
            #[case(-65536)]
            #[case(-32768)]
            fn test_quantum_underflow(#[case] exp: i32) {
                let d = $D::quantum(
                    exp,
                    Context::default().with_signal_traps(SignalsTraps::empty()),
                );
                assert!(d.is_zero());
                assert_eq!(d.op_signals(), signals![!UFW, !INEXACT, !ROUND, !SN]);
            }
        }
    };
}

pub(crate) use test_impl;