#[derive(Debug, Clone, Default)]
pub struct StockSnapshot {
pub last: f64,
pub bid: f64,
pub ask: f64,
pub close: f64,
}
#[derive(Debug, Clone, Default)]
pub struct OptionSnapshot {
pub bid: f64,
pub ask: f64,
pub last: f64,
pub option_iv: f64,
pub option_delta: f64,
pub option_gamma: f64,
pub option_theta: f64,
pub option_price: f64,
pub underlying_price: f64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stock_snapshot_default_is_zero() {
let snap = StockSnapshot::default();
assert_eq!(snap.last, 0.0);
assert_eq!(snap.bid, 0.0);
assert_eq!(snap.ask, 0.0);
assert_eq!(snap.close, 0.0);
}
#[test]
fn stock_snapshot_fields_are_accessible() {
let snap = StockSnapshot {
last: 450.25,
bid: 450.20,
ask: 450.30,
close: 448.00,
};
assert!((snap.bid - snap.last).abs() < 0.10);
assert!(snap.ask > snap.bid);
}
#[test]
fn option_snapshot_default_is_zero() {
let snap = OptionSnapshot::default();
assert_eq!(snap.bid, 0.0);
assert_eq!(snap.ask, 0.0);
assert_eq!(snap.option_iv, 0.0);
assert_eq!(snap.option_delta, 0.0);
assert_eq!(snap.option_gamma, 0.0);
assert_eq!(snap.option_theta, 0.0);
assert_eq!(snap.option_price, 0.0);
assert_eq!(snap.underlying_price, 0.0);
}
#[test]
fn option_snapshot_with_greeks() {
let snap = OptionSnapshot {
bid: 2.50,
ask: 2.60,
last: 2.55,
option_iv: 0.25,
option_delta: 0.45,
option_gamma: 0.05,
option_theta: -0.03,
option_price: 2.55,
underlying_price: 450.0,
};
assert!(snap.ask > snap.bid);
assert!((snap.option_delta - 0.45).abs() < 0.01);
assert!(snap.option_theta < 0.0);
}
}