pyth-lazer-protocol 0.40.0

Pyth Lazer SDK - protocol types.
Documentation
use {crate::rate::Rate, assert_float_eq::assert_float_absolute_eq};

#[test]
fn rate_constructs() {
    let rate = Rate::parse_str("42.68", -8).unwrap();
    assert_eq!(rate.0, 4_268_000_000);
    assert_float_absolute_eq!(rate.to_f64(-8).unwrap(), 42.68);

    let rate2 = Rate::from_integer(2, -8).unwrap();
    assert_eq!(rate2.0, 200_000_000);
    assert_float_absolute_eq!(rate2.to_f64(-8).unwrap(), 2.);

    let rate3 = Rate::from_mantissa(123_456);
    assert_eq!(rate3.0, 123_456);
    assert_float_absolute_eq!(rate3.to_f64(-8).unwrap(), 0.001_234_56);

    let rate4 = Rate::from_f64(42.68, -8).unwrap();
    assert_eq!(rate4.0, 4_268_000_000);
    assert_float_absolute_eq!(rate4.to_f64(-8).unwrap(), 42.68);
}

#[test]
fn rate_constructs_with_negative_mantissa() {
    let rate = Rate::parse_str("-42.68", -8).unwrap();
    assert_eq!(rate.0, -4_268_000_000);
    assert_float_absolute_eq!(rate.to_f64(-8).unwrap(), -42.68);

    let rate2 = Rate::from_integer(-2, -8).unwrap();
    assert_eq!(rate2.0, -200_000_000);
    assert_float_absolute_eq!(rate2.to_f64(-8).unwrap(), -2.);

    let rate3 = Rate::from_mantissa(-123_456);
    assert_eq!(rate3.0, -123_456);
    assert_float_absolute_eq!(rate3.to_f64(-8).unwrap(), -0.001_234_56);

    let rate4 = Rate::from_f64(-42.68, -8).unwrap();
    assert_eq!(rate4.0, -4_268_000_000);
    assert_float_absolute_eq!(rate4.to_f64(-8).unwrap(), -42.68);
}

#[test]
fn rate_constructs_with_zero_exponent() {
    let rate = Rate::parse_str("42", 0).unwrap();
    assert_eq!(rate.0, 42);
    assert_float_absolute_eq!(rate.to_f64(0).unwrap(), 42.);

    let rate2 = Rate::from_integer(2, 0).unwrap();
    assert_eq!(rate2.0, 2);
    assert_float_absolute_eq!(rate2.to_f64(0).unwrap(), 2.);

    let rate3 = Rate::from_mantissa(123_456);
    assert_eq!(rate3.0, 123_456);
    assert_float_absolute_eq!(rate3.to_f64(0).unwrap(), 123_456.);

    let rate4 = Rate::from_f64(42., 0).unwrap();
    assert_eq!(rate4.0, 42);
    assert_float_absolute_eq!(rate4.to_f64(0).unwrap(), 42.);
}

#[test]
fn rate_constructs_with_zero_mantissa() {
    let rate1 = Rate::parse_str("0.0", -8).unwrap();
    assert_eq!(rate1.0, 0);
    let rate2 = Rate::from_integer(0, -8).unwrap();
    assert_eq!(rate2.0, 0);
    let rate3 = Rate::from_mantissa(0);
    assert_eq!(rate3.0, 0);
    let rate4 = Rate::from_f64(-0.0, -8).unwrap();
    assert_eq!(rate4.0, 0);

    let rate1 = Rate::parse_str("0.0", 8).unwrap();
    assert_eq!(rate1.0, 0);
    let rate2 = Rate::from_integer(0, 8).unwrap();
    assert_eq!(rate2.0, 0);
    let rate4 = Rate::from_f64(-0.0, 8).unwrap();
    assert_eq!(rate4.0, 0);
}

#[test]
fn rate_constructs_with_positive_exponent() {
    let rate = Rate::parse_str("42_680_000", 3).unwrap();
    assert_eq!(rate.0, 42_680);
    assert_float_absolute_eq!(rate.to_f64(3).unwrap(), 42_680_000.);

    let rate2 = Rate::from_integer(200_000, 3).unwrap();
    assert_eq!(rate2.0, 200);
    assert_float_absolute_eq!(rate2.to_f64(3).unwrap(), 200_000.);

    let rate3 = Rate::from_mantissa(123_456);
    assert_eq!(rate3.0, 123_456);
    assert_float_absolute_eq!(rate3.to_f64(3).unwrap(), 123_456_000.);

    let rate4 = Rate::from_f64(42_680_000., 3).unwrap();
    assert_eq!(rate4.0, 42_680);
    assert_float_absolute_eq!(rate4.to_f64(3).unwrap(), 42_680_000.);
}

#[test]
fn rate_rejects_too_precise() {
    Rate::parse_str("42.68", 0).unwrap_err();
    Rate::parse_str("42.68", -1).unwrap_err();
    Rate::parse_str("42.68", -2).unwrap();

    Rate::parse_str("42_680", 3).unwrap_err();
    Rate::parse_str("42_600", 3).unwrap_err();
    Rate::parse_str("42_000", 3).unwrap();
}