use std::collections::HashMap;
use tse_client::adjust::adjust;
use tse_client::group::{Period, group};
use tse_client::models::{ClosingPrice, Share};
use tse_client::util::{
clean_fa, day_diff, greg_to_shamsi, shamsi_month_key, shamsi_to_greg, shamsi_week_key,
};
#[test]
fn clean_fa_normalizes_arabic_letters() {
assert_eq!(clean_fa("\u{0643}\u{064A}"), "\u{06A9}\u{06CC}");
assert_eq!(clean_fa("a\u{200B}b"), "ab");
}
#[test]
fn date_conversions_round_trip() {
let sh = greg_to_shamsi("20160102");
assert_eq!(sh.len(), 8);
let back = shamsi_to_greg(&sh);
assert_eq!(back, "20160102");
}
#[test]
fn day_diff_basic() {
assert_eq!(day_diff("20200101", "20200101"), 0);
assert_eq!(day_diff("20200101", "20200111"), 10);
}
fn cp(deven: &str, close: &str, yesterday: &str) -> ClosingPrice {
ClosingPrice::parse(&format!(
"1,{deven},{close},{close},10,100,1000,{close},{close},{yesterday},{close}"
))
.unwrap()
}
#[test]
fn adjust_passthrough_when_cond_zero() {
let prices = vec![cp("20200101", "100", "100"), cp("20200102", "110", "100")];
let res = adjust(0, &prices, &HashMap::new(), false, false);
assert_eq!(res.prices.unwrap().len(), 2);
}
#[test]
fn adjust_capital_increase_applies_coefficient() {
let prices = vec![
cp("20200101", "100", "100"),
cp("20200102", "120", "90"), ];
let mut shares: HashMap<String, Share> = HashMap::new();
shares.insert(
"20200102".to_string(),
Share::parse("1,1,20200102,200,100").unwrap(), );
let res = adjust(2, &prices, &shares, false, false);
let out = res.prices.unwrap();
assert_eq!(out.len(), 2);
assert_eq!(out[1].pclosing, "120");
assert_eq!(out[0].pclosing, "50.00");
}
#[allow(clippy::too_many_arguments)]
fn ohlcv(
deven: &str,
open: &str,
high: &str,
low: &str,
close: &str,
vol: &str,
yesterday: &str,
) -> ClosingPrice {
ClosingPrice::parse(&format!(
"1,{deven},{close},{close},10,{vol},1000,{low},{high},{yesterday},{open}"
))
.unwrap()
}
#[test]
fn shamsi_week_key_groups_saturday_to_friday() {
let sat = shamsi_week_key("20230527").unwrap();
let wed = shamsi_week_key("20230531").unwrap();
let fri = shamsi_week_key("20230602").unwrap();
assert_eq!(sat, wed);
assert_eq!(sat, fri);
let next_sat = shamsi_week_key("20230603").unwrap();
assert_ne!(sat, next_sat);
assert_eq!(sat, "20230527");
}
#[test]
fn shamsi_month_key_matches_jalali_month() {
let key = shamsi_month_key("20230421").unwrap();
assert_eq!(&key, "20230421");
}
#[test]
fn group_daily_returns_input_unchanged() {
let daily = vec![
ohlcv("20230527", "10", "12", "9", "11", "100", "10"),
ohlcv("20230528", "11", "13", "10", "12", "200", "11"),
];
let out = group(&daily, Period::Daily);
assert_eq!(out, daily);
}
#[test]
fn group_weekly_aggregates_ohlcv() {
let daily = vec![
ohlcv("20230527", "10", "15", "9", "11", "100", "8"),
ohlcv("20230528", "11", "20", "7", "12", "200", "11"),
ohlcv("20230529", "12", "14", "10", "13", "300", "12"),
ohlcv("20230603", "20", "22", "18", "21", "50", "13"),
];
let out = group(&daily, Period::Weekly);
assert_eq!(out.len(), 2);
let w1 = &out[0];
assert_eq!(w1.price_first, "10"); assert_eq!(w1.price_max, "20"); assert_eq!(w1.price_min, "7"); assert_eq!(w1.pclosing, "13"); assert_eq!(w1.price_yesterday, "8"); assert_eq!(w1.qtot_tran5j, "600"); assert_eq!(w1.deven, "20230527");
let w2 = &out[1];
assert_eq!(w2.price_first, "20");
assert_eq!(w2.pclosing, "21");
assert_eq!(w2.qtot_tran5j, "50");
assert_eq!(w2.deven, "20230603");
}
#[test]
fn group_monthly_aggregates_ohlcv() {
let daily = vec![
ohlcv("20230421", "10", "15", "9", "11", "100", "8"),
ohlcv("20230422", "11", "18", "10", "12", "150", "11"),
ohlcv("20230522", "20", "25", "19", "24", "300", "12"),
];
let out = group(&daily, Period::Monthly);
assert_eq!(out.len(), 2);
assert_eq!(out[0].price_max, "18");
assert_eq!(out[0].qtot_tran5j, "250");
assert_eq!(out[0].deven, "20230421");
assert_eq!(out[1].pclosing, "24");
assert_eq!(out[1].qtot_tran5j, "300");
assert_eq!(out[1].deven, "20230522");
}