use numrs2::array::Array;
use numrs2::error::NumRs2Error;
#[test]
fn try_tril_errs_on_non_2d_array() {
let a: Array<i32> = Array::from_vec(vec![1, 2, 3, 4]); let result = a.try_tril(0);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
NumRs2Error::DimensionMismatch(_)
));
}
#[test]
fn try_tril_matches_panicking_original_on_valid_input() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]).reshape(&[3, 3]);
let expected = a.tril(0);
let actual = a
.try_tril(0)
.expect("try_tril should succeed on a 2D array");
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.to_vec(), vec![1, 0, 0, 4, 5, 0, 7, 8, 9]);
}
#[test]
#[should_panic(expected = "tril requires a 2D array")]
fn tril_still_panics_on_non_2d_array() {
let a: Array<i32> = Array::from_vec(vec![1, 2, 3, 4]);
let _ = a.tril(0);
}
#[test]
fn try_triu_errs_on_non_2d_array() {
let a: Array<i32> = Array::from_vec(vec![1, 2, 3, 4]); let result = a.try_triu(0);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
NumRs2Error::DimensionMismatch(_)
));
}
#[test]
fn try_triu_matches_panicking_original_on_valid_input() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]).reshape(&[3, 3]);
let expected = a.triu(0);
let actual = a
.try_triu(0)
.expect("try_triu should succeed on a 2D array");
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.to_vec(), vec![1, 2, 3, 0, 5, 6, 0, 0, 9]);
}
#[test]
#[should_panic(expected = "triu requires a 2D array")]
fn triu_still_panics_on_non_2d_array() {
let a: Array<i32> = Array::from_vec(vec![1, 2, 3, 4]);
let _ = a.triu(0);
}
#[test]
fn try_create_diagonal_matrix_helper_errs_on_non_1d_array() {
let v: Array<i32> = Array::from_vec(vec![1, 2, 3, 4]).reshape(&[2, 2]); let result = Array::<i32>::try_create_diagonal_matrix_helper(&v, 0);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
NumRs2Error::DimensionMismatch(_)
));
}
#[test]
fn try_create_diagonal_matrix_helper_matches_panicking_original() {
let v = Array::from_vec(vec![1, 2, 3]);
let expected = Array::<i32>::create_diagonal_matrix_helper(&v, 0);
let actual = Array::<i32>::try_create_diagonal_matrix_helper(&v, 0)
.expect("try_create_diagonal_matrix_helper should succeed on a 1D array");
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.to_vec(), vec![1, 0, 0, 0, 2, 0, 0, 0, 3]);
}
#[test]
#[should_panic(expected = "diag requires a 1D array")]
fn create_diagonal_matrix_helper_still_panics_on_non_1d_array() {
let v: Array<i32> = Array::from_vec(vec![1, 2, 3, 4]).reshape(&[2, 2]);
let _ = Array::<i32>::create_diagonal_matrix_helper(&v, 0);
}
#[test]
fn try_create_diagonal_matrix_errs_on_3d_array() {
let v: Array<i32> = Array::from_vec(vec![1; 8]).reshape(&[2, 2, 2]); let result = Array::<i32>::try_create_diagonal_matrix(&v, 0);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
NumRs2Error::DimensionMismatch(_)
));
}
#[test]
fn try_create_diagonal_matrix_matches_panicking_original_1d_and_2d() {
let v1 = Array::from_vec(vec![1, 2, 3]);
let expected1 = Array::<i32>::create_diagonal_matrix(&v1, 0);
let actual1 = Array::<i32>::try_create_diagonal_matrix(&v1, 0)
.expect("try_create_diagonal_matrix should succeed on a 1D array");
assert_eq!(actual1.to_vec(), expected1.to_vec());
assert_eq!(actual1.to_vec(), vec![1, 0, 0, 0, 2, 0, 0, 0, 3]);
let v2 = Array::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]).reshape(&[3, 3]);
let expected2 = Array::<i32>::create_diagonal_matrix(&v2, 0);
let actual2 = Array::<i32>::try_create_diagonal_matrix(&v2, 0)
.expect("try_create_diagonal_matrix should succeed on a 2D array");
assert_eq!(actual2.to_vec(), expected2.to_vec());
assert_eq!(actual2.to_vec(), vec![1, 5, 9]);
}
#[test]
#[should_panic(expected = "diag requires a 1D or 2D array")]
fn create_diagonal_matrix_still_panics_on_3d_array() {
let v: Array<i32> = Array::from_vec(vec![1; 8]).reshape(&[2, 2, 2]);
let _ = Array::<i32>::create_diagonal_matrix(&v, 0);
}
#[test]
fn try_reshape_errs_on_size_mismatch() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]); let result = a.try_reshape(&[4, 4]); assert!(result.is_err());
}
#[test]
fn try_reshape_matches_panicking_original_on_valid_input() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]);
let expected = a.reshape(&[2, 3]);
let actual = a
.try_reshape(&[2, 3])
.expect("try_reshape should succeed when sizes match");
assert_eq!(actual.shape(), expected.shape());
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.to_vec(), vec![1, 2, 3, 4, 5, 6]);
}
#[test]
#[should_panic]
fn reshape_still_panics_on_size_mismatch() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]);
let _ = a.reshape(&[4, 4]);
}
#[test]
fn try_reshape_succeeds_on_non_contiguous_array() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let b = a.transpose_axis(0, 1);
assert_eq!(b.shape(), vec![3, 2]);
assert_eq!(b.to_vec(), vec![1, 4, 2, 5, 3, 6]);
let flat = b
.try_reshape(&[6])
.expect("try_reshape must not panic on a non-contiguous array");
assert_eq!(flat.to_vec(), vec![1, 4, 2, 5, 3, 6]);
}
#[test]
fn try_reshape_with_errs_on_size_mismatch() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]);
assert!(a.try_reshape_with(&[4, 4], true).is_err());
assert!(a.try_reshape_with(&[4, 4], false).is_err());
}
#[test]
fn try_reshape_with_matches_panicking_original_on_valid_input() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]);
for copy in [true, false] {
let expected = a.reshape_with(&[3, 2], copy);
let actual = a
.try_reshape_with(&[3, 2], copy)
.expect("try_reshape_with should succeed when sizes match");
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.to_vec(), vec![1, 2, 3, 4, 5, 6]);
}
}
#[test]
#[should_panic]
fn reshape_with_still_panics_on_size_mismatch() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]);
let _ = a.reshape_with(&[4, 4], true);
}
#[test]
fn try_flatten_errs_on_invalid_order() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let result = a.try_flatten(Some("Z"));
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), NumRs2Error::InvalidInput(_)));
}
#[test]
fn try_flatten_matches_panicking_original_on_valid_input() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let expected = a.flatten(Some("C"));
let actual = a
.try_flatten(Some("C"))
.expect("try_flatten should succeed with a valid order");
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.to_vec(), vec![1, 2, 3, 4, 5, 6]);
}
#[test]
#[should_panic(expected = "Invalid order parameter")]
fn flatten_still_panics_on_invalid_order() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let _ = a.flatten(Some("Z"));
}
#[test]
fn try_flatten_f_order_succeeds_on_non_contiguous_array() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let b = a.transpose_axis(0, 1); let result = b
.try_flatten(Some("F"))
.expect("try_flatten(\"F\") must not panic or error on a non-contiguous array");
assert_eq!(result.shape(), vec![6]);
assert_eq!(result.size(), 6);
}
#[test]
fn try_transpose_axis_errs_on_out_of_bounds_axis() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let result = a.try_transpose_axis(0, 5);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
NumRs2Error::IndexOutOfBounds(_)
));
}
#[test]
fn try_transpose_axis_matches_panicking_original_on_valid_input() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let expected = a.transpose_axis(0, 1);
let actual = a
.try_transpose_axis(0, 1)
.expect("try_transpose_axis should succeed for valid axes");
assert_eq!(actual.shape(), expected.shape());
assert_eq!(actual.to_vec(), expected.to_vec());
assert_eq!(actual.shape(), vec![3, 2]);
assert_eq!(actual.to_vec(), vec![1, 4, 2, 5, 3, 6]);
}
#[test]
#[should_panic(expected = "Axis out of bounds")]
fn transpose_axis_still_panics_on_out_of_bounds_axis() {
let a = Array::from_vec(vec![1, 2, 3, 4, 5, 6]).reshape(&[2, 3]);
let _ = a.transpose_axis(0, 5);
}
#[test]
fn broadcast_to_errs_instead_of_panicking_on_empty_array() {
let empty: Array<f64> = Array::from_vec(vec![]);
let result = empty.broadcast_to(&[3]);
assert!(result.is_err());
}
#[test]
fn broadcast_to_errs_on_incompatible_shape_instead_of_silently_tiling() {
let a = Array::from_vec(vec![1, 2]);
let result = a.broadcast_to(&[4]);
assert!(
result.is_err(),
"broadcasting [2] to [4] is not valid NumPy broadcasting and must error, got {:?}",
result
);
}
#[test]
fn broadcast_to_still_succeeds_on_valid_broadcast() {
let a = Array::from_vec(vec![1, 2, 3]);
let result = a
.broadcast_to(&[3, 3])
.expect("broadcasting [3] to [3, 3] is valid NumPy broadcasting");
assert_eq!(result.shape(), vec![3, 3]);
assert_eq!(result.to_vec(), vec![1, 2, 3, 1, 2, 3, 1, 2, 3]);
}
#[test]
fn broadcast_to_scalar_like_one_element_array() {
let a = Array::from_vec(vec![5]);
let result = a
.broadcast_to(&[2, 3])
.expect("broadcasting [1] to [2, 3] is valid NumPy broadcasting");
assert_eq!(result.shape(), vec![2, 3]);
assert_eq!(result.to_vec(), vec![5, 5, 5, 5, 5, 5]);
}