use ndarray::{arr1, arr2};
use unitforge::small_linalg::{Matrix2, Matrix2x3, Matrix3, Matrix3x2, Vector2, Vector3};
#[test]
fn vector2_from_ndarray_rejects_wrong_length() {
let err = Vector2::from_ndarray(arr1(&[1.0, 2.0, 3.0]).view()).unwrap_err();
assert_eq!(err, "Array length is not 2, it is 3");
}
#[test]
fn vector3_from_ndarray_rejects_wrong_length() {
let err = Vector3::from_ndarray(arr1(&[1.0, 2.0]).view()).unwrap_err();
assert_eq!(err, "Array length is not 3, it is 2");
}
#[test]
fn matrix2_from_ndarray_rejects_wrong_shape() {
let err = Matrix2::from_ndarray(arr2(&[[1.0, 2.0, 3.0]]).view()).unwrap_err();
assert_eq!(err, "Expected 2x2 ndarray for Matrix2");
}
#[test]
fn matrix3_from_ndarray_rejects_wrong_shape() {
let err = Matrix3::from_ndarray(arr2(&[[1.0, 2.0], [3.0, 4.0]]).view()).unwrap_err();
assert_eq!(err, "Expected 3x3 ndarray for Matrix3");
}
#[test]
fn matrix2x3_from_ndarray_rejects_wrong_shape() {
let err = Matrix2x3::from_ndarray(arr2(&[[1.0, 2.0], [3.0, 4.0]]).view()).unwrap_err();
assert_eq!(err, "Expected 2x3 ndarray for Matrix2x3");
}
#[test]
fn matrix3x2_from_ndarray_rejects_wrong_shape() {
let err = Matrix3x2::from_ndarray(arr2(&[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]).view())
.unwrap_err();
assert_eq!(err, "Expected 3x2 ndarray for Matrix3x2");
}
#[test]
fn vector2_zero_to_unit_vector_returns_zero() {
assert_eq!(Vector2::<f64>::zero().to_unit_vector(), Vector2::zero());
}
#[test]
fn vector3_zero_to_unit_vector_returns_zero() {
assert_eq!(Vector3::<f64>::zero().to_unit_vector(), Vector3::zero());
}
#[test]
fn matrix2x3_pseudoinverse_returns_none_for_rank_deficient_matrix() {
let matrix: Matrix2x3<f64> = Matrix2x3::from_f64([[1.0, 2.0, 3.0], [2.0, 4.0, 6.0]]);
assert_eq!(matrix.pseudoinverse::<f64, f64, f64, f64>(), None);
}
#[test]
fn matrix3x2_pseudoinverse_returns_none_for_rank_deficient_matrix() {
let matrix: Matrix3x2<f64> = Matrix3x2::from_f64([[1.0, 2.0], [2.0, 4.0], [3.0, 6.0]]);
assert_eq!(matrix.pseudoinverse::<f64, f64, f64, f64>(), None);
}
#[test]
fn matrix3_solve_returns_none_for_singular_matrix() {
let matrix = Matrix3::new([[1.0, 2.0, 3.0], [2.0, 4.0, 6.0], [3.0, 6.0, 9.0]]);
let rhs = Vector3::from_f64([1.0, 2.0, 3.0]);
assert_eq!(matrix.solve(&rhs), None);
}