use super::*;
use crate::test_helpers::helpers::{make_candle, ts};
use rust_decimal_macros::dec;
#[test]
fn wma_basic() {
let candles: Vec<Candle> = vec![
make_candle(dec!(10), ts(0)),
make_candle(dec!(20), ts(1)),
make_candle(dec!(30), ts(2)),
];
let wma = Wma::new(3).expect("valid WMA period");
let series = wma.compute(&candles).expect("sufficient data for WMA");
let values = series.decimal_values();
let expected = dec!(140) / dec!(6);
assert!(
(values[0] - expected).abs() < dec!(0.01),
"WMA {} != expected {}",
values[0],
expected
);
}
#[test]
fn wma_emphasizes_recent() {
let candles: Vec<Candle> = vec![make_candle(dec!(100), ts(0)), make_candle(dec!(200), ts(1))];
let wma = Wma::new(2).expect("valid WMA period");
let series = wma.compute(&candles).expect("sufficient data for WMA");
let values = series.decimal_values();
assert!(
values[0] > dec!(150),
"WMA {} should be > SMA 150 for recent higher prices",
values[0]
);
}
#[test]
fn wma_insufficient_data() {
let candles: Vec<Candle> = vec![make_candle(dec!(100), ts(0)), make_candle(dec!(102), ts(1))];
let wma = Wma::new(3).expect("valid WMA period");
let result = wma.compute(&candles);
assert!(matches!(
result,
Err(IndicatorError::InsufficientData {
required: 3,
actual: 2
})
));
}
#[test]
fn wma_period_zero() {
let result = Wma::new(0);
assert!(matches!(
result,
Err(IndicatorError::InvalidParameter { .. })
));
}
#[test]
fn wma_name() {
let wma = Wma::new(20).expect("valid WMA period");
assert_eq!(wma.name(), "WMA(20)");
}