use ndarray::{array, Array1, Array2};
use regression_diagnostics::multicollinearity::vif;
use regression_diagnostics::{OlsFit, RegressionError};
#[test]
fn perfectly_collinear_predictors_error() {
let x = array![
[1.0, 1.0, 2.0],
[1.0, 2.0, 4.0],
[1.0, 3.0, 6.0],
[1.0, 4.0, 8.0],
];
let y = array![1.0, 2.0, 3.0, 4.0];
let err = OlsFit::new(x, y).unwrap_err();
assert_eq!(err, RegressionError::RankDeficient);
}
#[test]
fn single_predictor_vif_is_one() {
let x = array![[1.0, 1.0], [1.0, 2.0], [1.0, 3.0], [1.0, 4.0], [1.0, 5.0]];
let y = array![1.1, 1.9, 3.2, 3.9, 5.1];
let fit = OlsFit::new(x, y).unwrap();
let v = vif(&fit);
assert!(v[0].is_nan()); assert!((v[1] - 1.0).abs() < 1e-9, "single-predictor VIF = {}", v[1]);
}
#[test]
fn too_few_observations_error() {
let x = array![[1.0, 1.0], [1.0, 2.0]];
let y = array![1.0, 2.0];
let err = OlsFit::new(x, y).unwrap_err();
assert!(matches!(
err,
RegressionError::NoResidualDegreesOfFreedom { n: 2, p: 2, .. }
));
}
#[test]
fn shape_mismatch_error() {
let x = Array2::<f64>::ones((5, 2));
let y = Array1::<f64>::zeros(4);
let err = OlsFit::new(x, y).unwrap_err();
assert!(matches!(err, RegressionError::ShapeMismatch { .. }));
}
#[test]
fn empty_input_error() {
let x = Array2::<f64>::zeros((0, 0));
let y = Array1::<f64>::zeros(0);
let err = OlsFit::new(x, y).unwrap_err();
assert!(matches!(err, RegressionError::EmptyInput { .. }));
}