diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 0000000..ca5c46d --- /dev/null +++ b/src/tests.rs @@ -0,0 +1,85 @@ +mod common { + use crate::currency::{Symbol, SymbolPair}; + use crate::models::{Position, PositionState, TradingPlatform}; + use crate::models::PositionProfitState::Loss; + + // Generates two short positions with different profit/loss ratios. Both are position in "Loss". + pub fn get_short_loss_positions(pair: SymbolPair) -> (Position, Position) { + let almost_critical = Position::new(pair.clone(), + PositionState::Open, + -0.1, + 100.0, + -2.0, + -2.0, + 150.0, + 0, + TradingPlatform::Margin, + 0.0) + .with_profit_state(Some(Loss)); + let loss = Position::new(pair.clone(), + PositionState::Open, + -0.1, + 100.0, + -1.0, + -1.0, + 150.0, + 0, + TradingPlatform::Margin, + 0.0) + .with_profit_state(Some(Loss)); + + (almost_critical, loss) + } + + pub fn get_btcusd_pair() -> SymbolPair { + SymbolPair::new(Symbol::BTC, Symbol::USD) + } +} + +#[cfg(test)] +mod positions { + use crate::models::{Position, PositionState, TradingPlatform}; + use crate::models::PositionProfitState::Loss; + use crate::tests::common::{get_btcusd_pair, get_short_loss_positions}; + + #[test] + fn short_positions() { + let pair = get_btcusd_pair(); + + let one = Position::new(pair.clone(), + PositionState::Open, + -0.1, + 100.0, + -2.0, + -2.0, + 150.0, + 0, + TradingPlatform::Margin, + 0.0); + + assert_eq!(one.pair(), &pair); + assert_eq!(one.is_long(), false); + assert_eq!(one.is_short(), true); + assert_eq!(one.profit_state(), None); + assert_eq!(one.platform(), TradingPlatform::Margin); + assert_eq!(one.amount(), -0.1); + assert_eq!(one.base_price(), 100.0); + assert_eq!(one.pl(), -2.0); + assert_eq!(one.pl_perc(), -2.0); + assert_eq!(one.id(), 0); + assert_eq!(one.leverage(), 0.0); + assert_eq!(one.price_liq(), 150.0); + assert!(one.price_liq() > one.base_price()); + + let (two, three) = get_short_loss_positions(pair); + + assert_eq!(two.is_short(), true); + assert_eq!(two.is_long(), false); + assert_eq!(three.is_short(), true); + assert_eq!(three.is_long(), false); + assert_eq!(two.profit_state(), Some(Loss)); + assert_eq!(three.profit_state(), Some(Loss)); + + // TODO: add more test positions with and without profit states + } +} \ No newline at end of file