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 basic_npv() {
let args = [
Value::Number(0.1),
Value::Number(-1000.0),
Value::Number(200.0),
Value::Number(300.0),
Value::Number(400.0),
Value::Number(500.0),
];
assert!(approx(npv_fn(&args), 65.26, 0.1));
}
#[test]
fn zero_rate_sums_cash_flows() {
let args = [
Value::Number(0.0),
Value::Number(-100.0),
Value::Number(50.0),
Value::Number(80.0),
];
assert!(approx(npv_fn(&args), 30.0, 1e-9));
}
#[test]
fn single_cash_flow() {
let args = [Value::Number(0.1), Value::Number(110.0)];
assert!(approx(npv_fn(&args), 100.0, 1e-9));
}