bigdecimal 0.4.10

Arbitrary precision decimal numbers
Documentation

mod is_one {
    use super::*;

    #[test]
    fn all_from_1_1000() {
        let mut i = BigUint::from(1u8);

        for s in 1..1000 {
            i *= 10u8;
            let d = BigDecimalRef::from(WithScale { value: &i, scale: s });
            assert!(d.is_one(), "{}", s);

            i += 1u8;
            let d = BigDecimalRef::from(WithScale { value: &i, scale: s });
            assert!(!d.is_one(), "{}", s);

            i -= 1u8;
        }
    }

    macro_rules! impl_case {
        ($name:ident: $input:literal => $expected:literal) => {
            #[test]
            fn $name() {
                let d: BigDecimal = $input.parse().unwrap();
                assert_eq!(d.is_one(), $expected);
            }
        };
    }

    impl_case!(case_0: "0" => false);
    impl_case!(case_1: "1" => true);
    impl_case!(case_n1: "-1" => false);
    impl_case!(case_10en1: "10e-1" => true);
    impl_case!(case_100en2: "100e-2" => true);
    impl_case!(case_10000en4: "10000e-4" => true);
    impl_case!(case_1d00000000000000000:   "1.00000000000000000" => true);
    impl_case!(case_1d000000000000000000:  "1.000000000000000000" => true);
    impl_case!(case_1d0000000000000000000: "1.0000000000000000000" => true);
    impl_case!(case_1d00000000000000001:   "1.00000000000000001" => false);
    impl_case!(case_1d000000000000000001:  "1.000000000000000001" => false);
    impl_case!(case_1d0000000000000000001: "1.0000000000000000001" => false);
    impl_case!(case_1d00000000000000000000000000000000: "1.00000000000000000000000000000000" => true);
    impl_case!(case_1d00000000000000000000000000000001: "1.00000000000000000000000000000001" => false);
    impl_case!(case_10d0000000000000000000000000000000000: "10.00000000000000000000000000000000000" => false);
}

mod is_one_quickcheck {
    use super::*;

    #[test]
    fn all_from_1_1e39() {
        let mut i = BigUint::from(1u8);

        for s in 1..39 {
            i *= 10u8;
            let d = BigDecimalRef::from(WithScale { value: &i, scale: s });
            assert_eq!(d.is_one_quickcheck(), Some(true), "{}", s);

            i += 1u8;
            let d = BigDecimalRef::from(WithScale { value: &i, scale: s });
            assert_eq!(d.is_one_quickcheck(), Some(false), "{}", s);

            i -= 1u8;
        }
    }

    macro_rules! impl_case {
        ($name:ident: $input:literal => $expected:expr) => {
            #[test]
            fn $name() {
                let d: BigDecimal = $input.parse().unwrap();
                assert_eq!(d.is_one_quickcheck(), $expected);
            }
        };
    }

    impl_case!(case_0: "0" => Some(false));
    impl_case!(case_1: "1" => Some(true));
    impl_case!(case_n1: "-1" => Some(false));
    impl_case!(case_10000000000000000000en19:   "10000000000000000000e-19" => Some(true));
    impl_case!(case_1d00000000000000000000:   "1.00000000000000000000" => Some(true));
    impl_case!(case_1d00000000000000000000000000000001: "1.00000000000000000000000000000001" => Some(false));

    impl_case!(case_pi15: "3.141592653589793" => Some(false));
    impl_case!(case_pi20: "3.14159265358979323846" => Some(false));
    impl_case!(case_pi50: "3.1415926535897932384626433832795028841971693993751" => None);

    impl_case!(case_10d00000000000000000000:   "10.00000000000000000000" => Some(false));
    impl_case!(case_1000000000d00000000000000000000:   "1000000000.00000000000000000000" => Some(false));
    impl_case!(case_10000000000000000000000000d0000000000000000000000000000000000000000000:   "10000000000000000000000000.0000000000000000000000000000000000000000000" => Some(false));
    impl_case!(case_10000000000000000000000000d0x:   "10000000000000000000000000.0" => Some(false));
}


mod decimal_digit_count {
    use super::*;

    macro_rules! impl_case {
        ($name:ident: $input:literal => $expected:literal) => {
            #[test]
            fn $name() {
                let d: BigDecimal = $input.parse().unwrap();
                assert_eq!(d.decimal_digit_count(), $expected);
            }
        };
    }

    impl_case!(case_0: "0" => 1);
    impl_case!(case_1: "1" => 1);
    impl_case!(case_10: "10" => 2);
    impl_case!(case_10d01: "10.01" => 4);
    impl_case!(case_d00099999999999: ".00099999999999" => 11);
}

mod order_of_magnitude {
    use super::*;

    macro_rules! impl_case {
        ($name:ident: $input:literal => $expected:literal) => {
            #[test]
            fn $name() {
                let d: BigDecimal = $input.parse().unwrap();
                assert_eq!(d.order_of_magnitude(), $expected);
            }
        };
    }

    impl_case!(case_0: "0" => 0);
    impl_case!(case_1: "1" => 0);
    impl_case!(case_10: "10" => 1);
    impl_case!(case_1e1: "1e1" => 1);
    impl_case!(case_0e3: "0e3" => 0);
    impl_case!(case_30e2: "30e2" => 3);
    impl_case!(case_99en2: "99e-2" => -1);
    impl_case!(case_n100d0012e1: "-100.0012e1" => 3);
    impl_case!(case_16651567373773d553089: "16651567373773.553089" => 13);
}