use super::*;
use rust_decimal_macros::dec;
#[test]
fn win_rate_mixed() {
let trades = vec![dec!(100), dec!(-50), dec!(75), dec!(-25), dec!(80)];
assert_eq!(
win_rate(&trades).expect("win_rate with mixed trades"),
dec!(60)
); }
#[test]
fn win_rate_all_wins() {
let trades = vec![dec!(100), dec!(50), dec!(75)];
assert_eq!(
win_rate(&trades).expect("win_rate with all wins"),
dec!(100)
);
}
#[test]
fn win_rate_all_losses() {
let trades = vec![dec!(-100), dec!(-50), dec!(-75)];
assert_eq!(
win_rate(&trades).expect("win_rate with all losses"),
dec!(0)
);
}
#[test]
fn win_rate_empty() {
let trades: Vec<Decimal> = vec![];
assert_eq!(
win_rate(&trades),
Err(MetricsError::InsufficientData {
required: 1,
actual: 0
})
);
}
#[test]
fn win_rate_with_breakeven() {
let trades = vec![dec!(100), dec!(0), dec!(-50)];
let rate = win_rate(&trades).expect("win_rate with breakeven trades");
assert!((rate - dec!(33.333333)).abs() < dec!(0.001));
}
#[test]
fn profit_factor_profitable() {
let trades = vec![dec!(100), dec!(-50), dec!(75), dec!(-25)];
let pf = profit_factor(&trades).expect("profit_factor for profitable trades");
assert!((pf - dec!(2.333333)).abs() < dec!(0.001));
}
#[test]
fn profit_factor_losing() {
let trades = vec![dec!(50), dec!(-100), dec!(-75)];
let pf = profit_factor(&trades).expect("profit_factor for losing trades");
assert!(pf < dec!(1));
}
#[test]
fn profit_factor_no_losses() {
let trades = vec![dec!(100), dec!(50)];
assert_eq!(
profit_factor(&trades),
Err(MetricsError::DivisionByZero {
context: "no losing trades"
})
);
}
#[test]
fn avg_win_calculation() {
let trades = vec![dec!(100), dec!(-50), dec!(200), dec!(-30)];
assert_eq!(
avg_win(&trades).expect("avg_win with winning trades"),
dec!(150)
);
}
#[test]
fn avg_loss_calculation() {
let trades = vec![dec!(100), dec!(-50), dec!(200), dec!(-30)];
assert_eq!(
avg_loss(&trades).expect("avg_loss with losing trades"),
dec!(-40)
);
}
#[test]
fn expectancy_positive() {
let trades = vec![dec!(100), dec!(100), dec!(100), dec!(-50), dec!(-50)];
let exp = expectancy(&trades).expect("positive expectancy");
assert_eq!(exp, dec!(40));
}
#[test]
fn expectancy_negative() {
let trades = vec![dec!(50), dec!(50), dec!(-100), dec!(-100), dec!(-100)];
let exp = expectancy(&trades).expect("negative expectancy");
assert_eq!(exp, dec!(-40));
}
#[test]
fn expectancy_breakeven() {
let trades = vec![dec!(100), dec!(-100)];
let exp = expectancy(&trades).expect("breakeven expectancy");
assert_eq!(exp, dec!(0));
}