Documentation
pub mod adf;
pub mod kalman;
pub mod mackinnon;
pub mod metrics;
pub mod models;
pub mod simple;
pub mod utils;

use csv::Reader;
use serde::Deserialize;

pub type BoxErr = Box<dyn std::error::Error>;

#[derive(Debug, Deserialize)]
struct Record {
  series_1: f64,
  series_2: f64,
}

pub fn get_test_data() -> (Vec<f64>, Vec<f64>) {
  let mut rdr: Reader<std::fs::File> = Reader::from_path("data/data3.csv").unwrap();
  let mut series_1: Vec<f64> = vec![];
  let mut series_2: Vec<f64> = vec![];
  for result in rdr.deserialize() {
    let record: Record = result.unwrap();
    series_1.push(record.series_1);
    series_2.push(record.series_2);
  }
  (series_1, series_2)
}

#[cfg(test)]
mod tests {
  use super::*;
  use crate::metrics::{rolling_cointegration, rolling_correlation, rolling_zscore, spread_standard, spread_dynamic};

  #[test]
  fn integration_test() {
    let (series_1, series_2) = get_test_data();
    let x: &Vec<f64> = &series_1;
    let y: &Vec<f64> = &series_2;
    let w: usize = 50;

    let spread_std: Vec<f64> = spread_standard(x, y).unwrap();
    let spread_dyn: Vec<f64> = spread_dynamic(x, y).unwrap();

    let roll_coint: Vec<f64> = rolling_cointegration(x, y, w).unwrap();
    let roll_corr: Vec<f64> = rolling_correlation(x, y, w).unwrap();
    let roll_zscore: Vec<f64> = rolling_zscore(&spread_std, w).unwrap();

    assert_eq!(x.len(), y.len());
    assert_eq!(x.len(), spread_std.len());
    assert_eq!(x.len(), spread_dyn.len());
    assert_eq!(x.len(), roll_coint.len());
    assert_eq!(x.len(), roll_corr.len());
    assert_eq!(x.len(), roll_zscore.len());
  }
}