use super::super::*;
use crate::types::Value;
fn approx(a: Value, b: f64, tol: f64) -> bool {
if let Value::Number(n) = a { (n - b).abs() < tol } else { false }
}
#[test]
fn pricedisc_6month_tbill() {
let args = [
Value::Number(44927.0), Value::Number(45108.0), Value::Number(0.05),
Value::Number(100.0),
Value::Number(2.0), ];
assert!(approx(pricedisc_fn(&args), 97.4861, 1e-4));
}
#[test]
fn pricedisc_default_basis() {
let args = [
Value::Number(44927.0), Value::Number(45108.0), Value::Number(0.05),
Value::Number(100.0),
];
assert!(approx(pricedisc_fn(&args), 97.5, 1e-4));
}
#[test]
fn disc_recovers_known_rate() {
let args = [
Value::Number(44927.0), Value::Number(45108.0), Value::Number(97.4861111111111),
Value::Number(100.0),
Value::Number(2.0),
];
assert!(approx(disc_fn(&args), 0.05, 1e-4));
}
#[test]
fn disc_basic_30_360() {
let args = [
Value::Number(44927.0), Value::Number(45108.0), Value::Number(97.5),
Value::Number(100.0),
];
assert!(approx(disc_fn(&args), 0.05, 1e-4));
}
#[test]
fn tbillprice_5pct_6month() {
let args = [
Value::Number(44927.0), Value::Number(45108.0), Value::Number(0.05),
];
assert!(approx(tbillprice_fn(&args), 97.4861, 1e-4));
}
#[test]
fn coupdays_semiannual_actual() {
let args = [
Value::Number(44927.0), Value::Number(45658.0), Value::Number(2.0), Value::Number(1.0), ];
assert!(approx(coupdays_fn(&args), 181.0, 1e-4));
}
#[test]
fn coupdays_semiannual_30_360() {
let args = [
Value::Number(44927.0), Value::Number(45658.0), Value::Number(2.0), Value::Number(0.0), ];
assert!(approx(coupdays_fn(&args), 180.0, 1e-4));
}