use super::*;
use rust_decimal_macros::dec;
#[test]
fn total_return_positive() {
let equity = vec![dec!(10000), dec!(10500)];
assert_eq!(
total_return(&equity).expect("positive total return"),
dec!(5)
);
}
#[test]
fn total_return_negative() {
let equity = vec![dec!(10000), dec!(9000)];
assert_eq!(
total_return(&equity).expect("negative total return"),
dec!(-10)
);
}
#[test]
fn total_return_multi_period() {
let equity = vec![dec!(10000), dec!(10500), dec!(10200), dec!(11000)];
assert_eq!(
total_return(&equity).expect("multi-period total return"),
dec!(10)
);
}
#[test]
fn total_return_insufficient_data() {
let equity = vec![dec!(10000)];
assert_eq!(
total_return(&equity),
Err(MetricsError::InsufficientData {
required: 2,
actual: 1
})
);
}
#[test]
fn total_return_zero_start() {
let equity = vec![dec!(0), dec!(10000)];
assert_eq!(
total_return(&equity),
Err(MetricsError::DivisionByZero {
context: "starting equity is zero"
})
);
}
#[test]
fn cagr_one_year_10_percent() {
let equity = vec![dec!(10000), dec!(11000)];
let result = cagr(&equity, dec!(1)).expect("CAGR for 1-year 10% growth");
assert!((result - dec!(10)).abs() < dec!(0.1));
}
#[test]
fn cagr_two_years() {
let equity = vec![dec!(10000), dec!(12100)];
let result = cagr(&equity, dec!(2)).expect("CAGR for 2-year growth");
assert!((result - dec!(10)).abs() < dec!(0.5));
}
#[test]
fn cagr_invalid_years() {
let equity = vec![dec!(10000), dec!(11000)];
assert!(matches!(
cagr(&equity, dec!(0)),
Err(MetricsError::InvalidParameter(_))
));
}
#[test]
fn annualized_return_daily() {
let mut equity = vec![dec!(10000)];
for _ in 0..251 {
equity.push(dec!(10000)); }
equity.push(dec!(10500));
let result = annualized_return(&equity, 252).expect("annualized return for daily equity");
assert!((result - dec!(5)).abs() < dec!(1));
}
#[test]
fn ln_known_values() {
assert_eq!(ln_approx(dec!(1)), dec!(0));
let e = dec!(2.71828);
let ln_e = ln_approx(e);
assert!(ln_e > dec!(0.5) && ln_e < dec!(1.5));
}
#[test]
fn exp_known_values() {
assert_eq!(exp_approx(dec!(0)), dec!(1));
assert!((exp_approx(dec!(1)) - dec!(2.718)).abs() < dec!(0.01));
}