lfest 0.77.0

A leveraged perpetual futures exchange for simulated trading and backtesting
Documentation
use crate::{
    base, bba, mock_exchange_linear,
    prelude::{ExchangeOrderMeta, LimitOrder, OrderId, Side, UserBalances},
    quote,
};

#[test]
fn cancel_limit_order() {
    let mut exchange = mock_exchange_linear();
    exchange
        .update_state(0.into(), &bba!(quote!(100), quote!(101)))
        .unwrap();

    let limit_price = quote!(100);
    let qty = base!(1);
    let order = LimitOrder::new(Side::Buy, limit_price, qty).unwrap();

    exchange.submit_limit_order(order.clone()).unwrap();

    let order_id: OrderId = 0.into();
    let meta = ExchangeOrderMeta::new(order_id, 0.into());
    let expected_order = order.into_pending(meta);

    assert_eq!(exchange.active_limit_orders().len(), 1);
    assert_eq!(
        exchange.active_limit_orders().get(&order_id).unwrap(),
        &expected_order
    );
    assert_eq!(
        exchange.user_balances(),
        UserBalances {
            available_wallet_balance: quote!(900),
            position_margin: quote!(0),
            order_margin: quote!(100)
        }
    );
    assert_eq!(exchange.position().outstanding_fees(), quote!(0));

    exchange.cancel_limit_order(order_id).unwrap();
    assert!(exchange.active_limit_orders().is_empty());
    assert_eq!(
        exchange.user_balances(),
        UserBalances {
            available_wallet_balance: quote!(1000),
            position_margin: quote!(0),
            order_margin: quote!(000)
        }
    );
}