#[cfg(feature = "memory_efficient")]
mod tests {
use scirs2_core::error::CoreError;
use scirs2_core::memory_efficient::{diagonal_view, transpose_view, ArrayView};
use scirs2_core::ndarray::Array2;
#[test]
fn test_transpose_view() {
let data = Array2::from_shape_fn((3, 4), |(i, j)| i * 10 + j);
let view = transpose_view(&data).expect("Test: operation failed");
assert_eq!(view.shape(), &[4, 3]);
for i in 0..3 {
for j in 0..4 {
assert_eq!(view[[j, i]], data[[i, j]]);
}
}
assert_eq!(view[[2, 1]], data[[1, 2]]);
}
#[test]
fn test_diagonal_view() {
let data = Array2::from_shape_fn((3, 3), |(i, j)| if i == j { i + 1 } else { 0 });
let view = diagonal_view(&data).expect("Test: operation failed");
assert_eq!(view.shape(), &[3]);
assert_eq!(view[0], 1);
assert_eq!(view[1], 2);
assert_eq!(view[2], 3);
}
#[test]
fn test_diagonal_view_non_square() {
let data = Array2::from_shape_fn((3, 4), |(i, j)| i * 10 + j);
let result = diagonal_view(&data);
assert!(result.is_err());
match result {
Err(CoreError::ValidationError(ctx)) => {
assert!(ctx.message.contains("square"));
}
_ => panic!("Expected ValidationError"),
}
}
#[test]
fn test_empty_array_views() {
let empty: Array2<f64> = Array2::from_shape_fn((0, 0), |_| 0.0);
let transpose_result = transpose_view(&empty);
let diagonal_result = diagonal_view(&empty);
assert!(transpose_result.is_err());
assert!(diagonal_result.is_err());
match transpose_result {
Err(CoreError::ValidationError(ctx)) => {
assert!(ctx.message.contains("empty"));
}
_ => panic!("Expected ValidationError"),
}
}
#[test]
fn test_view_as_differing_sizes_not_implemented() {
use scirs2_core::memory_efficient::view_as;
let data = Array2::from_shape_fn((3, 4), |(i, j)| i as f64 * 10.0 + j as f64);
let result = unsafe { view_as::<f64, u8, _, _>(&data) };
assert!(
result.is_err(),
"view_as with different element sizes must fail"
);
match result.expect_err("expected an error") {
CoreError::NotImplementedError(_) => {}
other => panic!("Expected NotImplementedError for differing sizes, got: {other:?}"),
}
}
#[test]
fn test_view_as_same_size_succeeds() {
use scirs2_core::memory_efficient::view_as;
let data = Array2::from_shape_fn((2, 2), |(i, j)| (i * 2 + j) as f64);
let result = unsafe { view_as::<f64, i64, _, _>(&data) };
assert!(
result.is_ok(),
"view_as should succeed for f64 → i64 (same size)"
);
let view = result.expect("view_as returned Err unexpectedly");
assert_eq!(view.shape(), data.shape());
}
}