quant-primitives 0.7.0

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

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

#[test]
fn valid_fraction_accepted() {
    let frac = Fraction::new(dec!(0.5)).unwrap();
    assert_eq!(frac.value(), dec!(0.5));
}

#[test]
fn zero_fraction_accepted() {
    let frac = Fraction::new(Decimal::ZERO).unwrap();
    assert_eq!(frac.value(), Decimal::ZERO);
}

#[test]
fn one_fraction_accepted() {
    let frac = Fraction::new(Decimal::ONE).unwrap();
    assert_eq!(frac.value(), Decimal::ONE);
}

#[test]
fn negative_fraction_rejected() {
    let err = Fraction::new(dec!(-0.01)).unwrap_err();
    assert_eq!(err, FractionError::OutOfRange(dec!(-0.01)));
}

#[test]
fn over_one_fraction_rejected() {
    let err = Fraction::new(dec!(1.01)).unwrap_err();
    assert_eq!(err, FractionError::OutOfRange(dec!(1.01)));
}

#[test]
fn display_format() {
    let frac = Fraction::new(dec!(0.05)).unwrap();
    assert_eq!(format!("{frac}"), "0.05");
}

#[test]
fn serde_roundtrip() {
    let frac = Fraction::new(dec!(0.25)).unwrap();
    let json = serde_json::to_string(&frac).unwrap();
    let deserialized: Fraction = serde_json::from_str(&json).unwrap();
    assert_eq!(frac, deserialized);
}

#[test]
fn ordering_preserves_magnitude() {
    let small = Fraction::new(dec!(0.01)).unwrap();
    let medium = Fraction::new(dec!(0.5)).unwrap();
    let large = Fraction::new(dec!(0.99)).unwrap();
    assert!(small < medium);
    assert!(medium < large);
}