quant-primitives 0.7.0

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

#[test]
fn default_is_conservative() {
    let config = PositionConfig::default();
    assert_eq!(config.max_position_pct(), dec!(0.1));
    assert!(!config.volatility_scaling());
    assert_eq!(config.risk_per_trade_pct(), None);
}

#[test]
fn valid_config() {
    let config = PositionConfig::new(dec!(0.25), true, Some(dec!(0.02))).expect("valid config");
    assert_eq!(config.max_position_pct(), dec!(0.25));
    assert!(config.volatility_scaling());
    assert_eq!(config.risk_per_trade_pct(), Some(dec!(0.02)));
}

#[test]
fn max_pct_above_one_rejected() {
    let result = PositionConfig::new(dec!(1.5), false, None);
    assert_eq!(
        result.unwrap_err(),
        PositionConfigError::MaxPositionOutOfRange(dec!(1.5))
    );
}

#[test]
fn max_pct_below_zero_rejected() {
    let result = PositionConfig::new(dec!(-0.1), false, None);
    assert_eq!(
        result.unwrap_err(),
        PositionConfigError::MaxPositionOutOfRange(dec!(-0.1))
    );
}

#[test]
fn max_pct_boundary_zero() {
    let config = PositionConfig::new(dec!(0.0), false, None);
    assert!(config.is_ok());
    assert_eq!(
        config.expect("valid config").max_position_pct(),
        Decimal::ZERO
    );
}

#[test]
fn max_pct_boundary_one() {
    let config = PositionConfig::new(dec!(1.0), false, None);
    assert!(config.is_ok());
    assert_eq!(
        config.expect("valid config").max_position_pct(),
        Decimal::ONE
    );
}

#[test]
fn risk_pct_above_one_rejected() {
    let result = PositionConfig::new(dec!(0.1), false, Some(dec!(1.5)));
    assert_eq!(
        result.unwrap_err(),
        PositionConfigError::RiskPerTradeOutOfRange(dec!(1.5))
    );
}

#[test]
fn risk_pct_below_zero_rejected() {
    let result = PositionConfig::new(dec!(0.1), false, Some(dec!(-0.5)));
    assert_eq!(
        result.unwrap_err(),
        PositionConfigError::RiskPerTradeOutOfRange(dec!(-0.5))
    );
}

#[test]
fn risk_pct_none_valid() {
    let config = PositionConfig::new(dec!(0.1), false, None);
    assert!(config.is_ok());
    assert_eq!(config.expect("valid config").risk_per_trade_pct(), None);
}

#[test]
fn getters_match_construction() {
    let config = PositionConfig::new(dec!(0.5), true, Some(dec!(0.03))).expect("valid config");
    assert_eq!(config.max_position_pct(), dec!(0.5));
    assert!(config.volatility_scaling());
    assert_eq!(config.risk_per_trade_pct(), Some(dec!(0.03)));
}