#![allow(clippy::approx_constant, clippy::manual_range_contains)]
use epics_base_rs::calc::{ArrayInputs, ArrayStackValue, acalc};
fn eval_arr_with(expr: &str, inputs: &mut ArrayInputs) -> ArrayStackValue {
acalc(expr, inputs).unwrap()
}
#[test]
fn test_smooth_basic() {
let mut inputs = ArrayInputs::new(10);
inputs.arrays[0] = vec![0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0];
let result = eval_arr_with("SMOO(AA)", &mut inputs);
match result {
ArrayStackValue::Array(cell) => {
let arr = cell.buf();
assert_eq!(arr.len(), 10);
assert_eq!(arr[0], 0.0);
assert_eq!(arr[1], 0.0);
assert_eq!(arr[8], 0.0);
assert_eq!(arr[9], 0.0);
assert!(arr[4] < 10.0);
assert!(arr[4] > 0.0);
}
_ => panic!("expected Array"),
}
}
#[test]
fn test_nsmooth() {
let mut inputs = ArrayInputs::new(10);
inputs.arrays[0] = vec![0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0];
let once = acalc("SMOO(AA)", &mut inputs).unwrap();
let mut inputs2 = ArrayInputs::new(10);
inputs2.arrays[0] = vec![0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0];
let twice = acalc("NSMOO(AA, 2)", &mut inputs2).unwrap();
match (once, twice) {
(ArrayStackValue::Array(a), ArrayStackValue::Array(b)) => {
let (a, b) = (a.buf(), b.buf());
assert!(b[4] < a[4], "twice smoothed should be lower");
}
_ => panic!("expected Arrays"),
}
}
#[test]
fn test_deriv_linear() {
let mut inputs = ArrayInputs::new(10);
inputs.arrays[0] = (0..10).map(|i| 2.0 * i as f64).collect();
let result = eval_arr_with("DERIV(AA)", &mut inputs);
match result {
ArrayStackValue::Array(cell) => {
for v in cell.buf() {
assert!((*v - 2.0).abs() < 1e-10, "deriv={}", v);
}
}
_ => panic!("expected Array"),
}
}
#[test]
fn test_nderiv_linear() {
let mut inputs = ArrayInputs::new(10);
inputs.arrays[0] = (0..10).map(|i| 3.0 * i as f64).collect();
let result = eval_arr_with("NDERIV(AA, 5)", &mut inputs);
match result {
ArrayStackValue::Array(cell) => {
for (i, &v) in cell.buf().iter().enumerate() {
assert!((v - 3.0).abs() < 0.5, "nderiv[{}]={}", i, v);
}
}
_ => panic!("expected Array"),
}
}
#[test]
fn test_cum() {
let mut inputs = ArrayInputs::new(4);
inputs.arrays[0] = vec![1.0, 2.0, 3.0, 4.0];
let result = eval_arr_with("CUM(AA)", &mut inputs);
assert_eq!(result, ArrayStackValue::array(vec![1.0, 3.0, 6.0, 10.0]));
}
#[test]
fn test_cat_arrays_cannot_exceed_array_size() {
let mut inputs = ArrayInputs::new(3);
inputs.arrays[0] = vec![1.0, 2.0, 3.0];
inputs.arrays[1] = vec![4.0, 5.0, 6.0];
let result = eval_arr_with("CAT(AA, BB)", &mut inputs);
assert_eq!(result, ArrayStackValue::array(vec![1.0, 2.0, 3.0]));
}
#[test]
fn test_cat_array_scalar_cannot_exceed_array_size() {
let mut inputs = ArrayInputs::new(3);
inputs.arrays[0] = vec![1.0, 2.0, 3.0];
let result = eval_arr_with("CAT(AA, 4)", &mut inputs);
assert_eq!(result, ArrayStackValue::array(vec![1.0, 2.0, 3.0]));
}
#[test]
fn test_cat_array_scalar_appends_when_the_buffer_has_room() {
let mut inputs = ArrayInputs::new(4);
inputs.arrays[0] = vec![1.0, 2.0, 3.0, 9.0];
let result = eval_arr_with("CAT(AA[0,2], 4)", &mut inputs);
assert_eq!(result, ArrayStackValue::array(vec![1.0, 2.0, 3.0, 4.0]));
}
#[test]
fn test_arndm() {
let mut inputs = ArrayInputs::new(5);
let result = eval_arr_with("ARNDM", &mut inputs);
match result {
ArrayStackValue::Array(cell) => {
let arr = cell.buf();
assert_eq!(arr.len(), 5);
for &v in arr {
assert!(v >= 0.0 && v <= 1.0, "random value {} out of range", v);
}
}
_ => panic!("expected Array"),
}
}
#[test]
fn test_array_subrange_not_implemented_yet() {
}