quant-primitives 0.7.0

Pure trading primitives — candles, intervals, symbols, currencies, asset taxonomy
Documentation
//! Unit tests for Bps value object.

use super::*;
use rust_decimal_macros::dec;

#[test]
fn valid_bps_accepted() {
    let bps = Bps::new(dec!(50)).unwrap();
    assert_eq!(bps.value(), dec!(50));
}

#[test]
fn zero_bps_accepted() {
    let bps = Bps::new(Decimal::ZERO).unwrap();
    assert_eq!(bps.value(), Decimal::ZERO);
}

#[test]
fn max_bps_accepted() {
    let bps = Bps::new(dec!(10000)).unwrap();
    assert_eq!(bps.value(), dec!(10000));
}

#[test]
fn negative_bps_rejected() {
    let err = Bps::new(dec!(-1)).unwrap_err();
    assert_eq!(err, BpsError::OutOfRange(dec!(-1)));
}

#[test]
fn over_10000_bps_rejected() {
    let err = Bps::new(dec!(10001)).unwrap_err();
    assert_eq!(err, BpsError::OutOfRange(dec!(10001)));
}

#[test]
fn as_fraction_conversion() {
    let bps = Bps::from_trusted(100);
    assert_eq!(bps.as_fraction(), dec!(0.01));
}

#[test]
fn as_fraction_zero() {
    assert_eq!(Bps::zero().as_fraction(), Decimal::ZERO);
}

#[test]
fn as_fraction_full() {
    let bps = Bps::from_trusted(10000);
    assert_eq!(bps.as_fraction(), Decimal::ONE);
}

#[test]
fn to_fraction_returns_validated_type() {
    let bps = Bps::from_trusted(500);
    let frac = bps.to_fraction();
    assert_eq!(frac.value(), dec!(0.05));
}

#[test]
fn fractional_bps_accepted() {
    let bps = Bps::new(dec!(2.5)).unwrap();
    assert_eq!(bps.value(), dec!(2.5));
    assert_eq!(bps.as_fraction(), dec!(0.00025));
}

#[test]
fn ordering_preserves_magnitude() {
    let small = Bps::from_trusted(10);
    let medium = Bps::from_trusted(100);
    let large = Bps::from_trusted(1000);
    assert!(small < medium);
    assert!(medium < large);
}

#[test]
#[should_panic(expected = "from_trusted")]
fn from_trusted_panics_on_invalid() {
    let _ = Bps::from_trusted(10001);
}

#[test]
fn display_format() {
    let bps = Bps::from_trusted(50);
    assert_eq!(format!("{bps}"), "50bps");
}

#[test]
fn serde_roundtrip() {
    let bps = Bps::from_trusted(75);
    let json = serde_json::to_string(&bps).unwrap();
    let deserialized: Bps = serde_json::from_str(&json).unwrap();
    assert_eq!(bps, deserialized);
}

#[test]
fn cross_type_consistency_bps_500_equals_5_percent() {
    use crate::Percentage;
    let bps = Bps::from_trusted(500);
    let pct = Percentage::from_trusted(5);
    assert_eq!(bps.as_fraction(), pct.as_fraction());
}