#[cfg(test)]
mod tests {
use crate::OrderBook;
use pricelevel::{Id, Side, TimeInForce};
#[test]
fn test_price_at_depth_buy_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 100, 10, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 99, 20, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 98, 30, Side::Buy, TimeInForce::Gtc, None);
assert_eq!(book.price_at_depth(10, Side::Buy), Some(100));
assert_eq!(book.price_at_depth(25, Side::Buy), Some(99));
assert_eq!(book.price_at_depth(60, Side::Buy), Some(98));
assert_eq!(book.price_at_depth(100, Side::Buy), None);
}
#[test]
fn test_price_at_depth_sell_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 101, 15, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 102, 25, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 103, 35, Side::Sell, TimeInForce::Gtc, None);
assert_eq!(book.price_at_depth(15, Side::Sell), Some(101));
assert_eq!(book.price_at_depth(30, Side::Sell), Some(102));
assert_eq!(book.price_at_depth(75, Side::Sell), Some(103));
assert_eq!(book.price_at_depth(100, Side::Sell), None);
}
#[test]
fn test_price_at_depth_empty_book() {
let book: OrderBook<()> = OrderBook::new("TEST");
assert_eq!(book.price_at_depth(10, Side::Buy), None);
assert_eq!(book.price_at_depth(10, Side::Sell), None);
}
#[test]
fn test_cumulative_depth_to_target_buy_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 100, 10, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 99, 20, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 98, 30, Side::Buy, TimeInForce::Gtc, None);
assert_eq!(
book.cumulative_depth_to_target(10, Side::Buy),
Some((100, 10))
);
assert_eq!(
book.cumulative_depth_to_target(25, Side::Buy),
Some((99, 30))
);
assert_eq!(
book.cumulative_depth_to_target(60, Side::Buy),
Some((98, 60))
);
assert_eq!(book.cumulative_depth_to_target(100, Side::Buy), None);
}
#[test]
fn test_cumulative_depth_to_target_sell_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 101, 15, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 102, 25, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 103, 35, Side::Sell, TimeInForce::Gtc, None);
assert_eq!(
book.cumulative_depth_to_target(15, Side::Sell),
Some((101, 15))
);
assert_eq!(
book.cumulative_depth_to_target(30, Side::Sell),
Some((102, 40))
);
assert_eq!(
book.cumulative_depth_to_target(75, Side::Sell),
Some((103, 75))
);
assert_eq!(book.cumulative_depth_to_target(100, Side::Sell), None);
}
#[test]
fn test_cumulative_depth_to_target_empty_book() {
let book: OrderBook<()> = OrderBook::new("TEST");
assert_eq!(book.cumulative_depth_to_target(10, Side::Buy), None);
assert_eq!(book.cumulative_depth_to_target(10, Side::Sell), None);
}
#[test]
fn test_total_depth_at_levels_buy_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 100, 10, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 99, 20, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 98, 30, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 97, 40, Side::Buy, TimeInForce::Gtc, None);
assert_eq!(book.total_depth_at_levels(1, Side::Buy), 10);
assert_eq!(book.total_depth_at_levels(2, Side::Buy), 30);
assert_eq!(book.total_depth_at_levels(3, Side::Buy), 60);
assert_eq!(book.total_depth_at_levels(4, Side::Buy), 100);
assert_eq!(book.total_depth_at_levels(10, Side::Buy), 100);
}
#[test]
fn test_total_depth_at_levels_sell_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 101, 15, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 102, 25, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 103, 35, Side::Sell, TimeInForce::Gtc, None);
assert_eq!(book.total_depth_at_levels(1, Side::Sell), 15);
assert_eq!(book.total_depth_at_levels(2, Side::Sell), 40);
assert_eq!(book.total_depth_at_levels(3, Side::Sell), 75);
assert_eq!(book.total_depth_at_levels(10, Side::Sell), 75);
}
#[test]
fn test_total_depth_at_levels_empty_book() {
let book: OrderBook<()> = OrderBook::new("TEST");
assert_eq!(book.total_depth_at_levels(5, Side::Buy), 0);
assert_eq!(book.total_depth_at_levels(5, Side::Sell), 0);
}
#[test]
fn test_total_depth_at_levels_zero_levels() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 100, 10, Side::Buy, TimeInForce::Gtc, None);
assert_eq!(book.total_depth_at_levels(0, Side::Buy), 0);
assert_eq!(book.total_depth_at_levels(0, Side::Sell), 0);
}
#[test]
fn test_depth_methods_with_multiple_orders_per_level() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 100, 10, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 100, 15, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 99, 20, Side::Buy, TimeInForce::Gtc, None);
assert_eq!(book.price_at_depth(25, Side::Buy), Some(100));
assert_eq!(book.price_at_depth(30, Side::Buy), Some(99));
assert_eq!(
book.cumulative_depth_to_target(25, Side::Buy),
Some((100, 25))
);
assert_eq!(
book.cumulative_depth_to_target(30, Side::Buy),
Some((99, 45))
);
assert_eq!(book.total_depth_at_levels(1, Side::Buy), 25);
assert_eq!(book.total_depth_at_levels(2, Side::Buy), 45);
}
#[test]
fn test_depth_methods_priority_order_buy_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 98, 30, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 100, 10, Side::Buy, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 99, 20, Side::Buy, TimeInForce::Gtc, None);
assert_eq!(book.total_depth_at_levels(1, Side::Buy), 10); assert_eq!(book.total_depth_at_levels(2, Side::Buy), 30); assert_eq!(book.total_depth_at_levels(3, Side::Buy), 60); }
#[test]
fn test_depth_methods_priority_order_sell_side() {
let book: OrderBook<()> = OrderBook::new("TEST");
let _ = book.add_limit_order(Id::new(), 103, 35, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 101, 15, Side::Sell, TimeInForce::Gtc, None);
let _ = book.add_limit_order(Id::new(), 102, 25, Side::Sell, TimeInForce::Gtc, None);
assert_eq!(book.total_depth_at_levels(1, Side::Sell), 15); assert_eq!(book.total_depth_at_levels(2, Side::Sell), 40); assert_eq!(book.total_depth_at_levels(3, Side::Sell), 75); }
}