quant-primitives 0.7.0

Pure trading primitives — candles, intervals, symbols, currencies, asset taxonomy
Documentation
use rust_decimal::Decimal;
use rust_decimal_macros::dec;

use super::{Percentage, PercentageError};

#[test]
fn new_valid() {
    let pct = Percentage::new(dec!(50)).expect("should be valid");
    assert_eq!(pct.value(), dec!(50));
}

#[test]
fn new_zero_boundary() {
    let pct = Percentage::new(Decimal::ZERO).expect("zero should be valid");
    assert_eq!(pct.value(), Decimal::ZERO);
}

#[test]
fn new_hundred_boundary() {
    let pct = Percentage::new(dec!(100)).expect("100 should be valid");
    assert_eq!(pct.value(), dec!(100));
}

#[test]
fn new_negative_rejected() {
    let err = Percentage::new(dec!(-1)).expect_err("should reject -1");
    assert_eq!(err, PercentageError::OutOfRange(dec!(-1)));
}

#[test]
fn new_over_hundred_rejected() {
    let err = Percentage::new(dec!(101)).expect_err("should reject 101");
    assert_eq!(err, PercentageError::OutOfRange(dec!(101)));
}

#[test]
fn as_fraction_fifty() {
    let pct = Percentage::from_trusted(50);
    assert_eq!(pct.as_fraction(), dec!(0.5));
}

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

#[test]
fn as_fraction_hundred() {
    assert_eq!(Percentage::hundred().as_fraction(), Decimal::ONE);
}

#[test]
fn display_fifty() {
    assert_eq!(format!("{}", Percentage::from_trusted(50)), "50%");
}

#[test]
fn display_zero() {
    assert_eq!(format!("{}", Percentage::zero()), "0%");
}

#[test]
fn from_trusted_valid() {
    let pct = Percentage::from_trusted(42);
    assert_eq!(pct.value(), dec!(42));
}

#[test]
#[should_panic(expected = "from_trusted: 101 > 100")]
fn from_trusted_panics_over_hundred() {
    let _ = Percentage::from_trusted(101);
}

#[test]
fn serde_roundtrip() {
    let pct = Percentage::from_trusted(42);
    let json = serde_json::to_string(&pct).expect("serialize");
    let back: Percentage = serde_json::from_str(&json).expect("deserialize");
    assert_eq!(pct, back);
}

#[test]
fn ordering() {
    let low = Percentage::from_trusted(10);
    let high = Percentage::from_trusted(90);
    assert!(low < high);
}

#[test]
fn fractional_percentage() {
    let pct = Percentage::new(dec!(33.33)).expect("should be valid");
    assert_eq!(pct.value(), dec!(33.33));
    assert_eq!(pct.as_fraction(), dec!(0.3333));
}