#[cfg(feature = "memory_efficient")]
mod tests {
use scirs2_core::memory_efficient::{ChunkedArray, ChunkingStrategy};
use scirs2_core::ndarray::Array1;
#[test]
fn test_chunked_array_map_1d() {
let data = Array1::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]);
let chunked = ChunkedArray::new(data.clone(), ChunkingStrategy::Fixed(3));
let results = chunked.map(|chunk| chunk.sum());
let expected = Array1::from_vec(vec![6.0, 15.0, 15.0]);
assert_eq!(results, expected);
}
#[test]
fn test_chunked_array_map_with_different_strategies() {
let data = Array1::from_vec(vec![1.0; 10]);
let chunked = ChunkedArray::new(data.clone(), ChunkingStrategy::NumChunks(5));
let results = chunked.map(|chunk| chunk.len());
let expected = Array1::from_vec(vec![2; 5]);
assert_eq!(results, expected);
let chunked = ChunkedArray::new(data.clone(), ChunkingStrategy::Fixed(4));
let results = chunked.map(|chunk| chunk.len());
let expected = Array1::from_vec(vec![4, 4, 2]);
assert_eq!(results, expected);
}
#[test]
fn test_chunked_array_map_mean() {
let data = Array1::linspace(0.0, 100.0, 100);
let chunked = ChunkedArray::new(data, ChunkingStrategy::Fixed(25));
let results = chunked.map(|chunk| chunk.mean().expect("Test: operation failed"));
assert_eq!(results.len(), 4);
assert!((results[0] - 12.12f64).abs() < 1.0);
assert!((results[1] - 37.37f64).abs() < 1.0);
assert!((results[2] - 62.63f64).abs() < 1.0);
assert!((results[3] - 87.88f64).abs() < 1.0);
}
#[cfg(feature = "parallel")]
#[test]
fn test_chunked_array_par_map() {
let data = Array1::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]);
let chunked = ChunkedArray::new(data.clone(), ChunkingStrategy::Fixed(3));
let results = chunked.par_map(|chunk| chunk.sum());
let expected = Array1::from_vec(vec![6.0, 15.0, 15.0]);
assert_eq!(results, expected);
}
#[cfg(feature = "parallel")]
#[test]
fn test_chunked_array_par_map_large() {
let size = 10_000;
let data = Array1::linspace(0.0, 1000.0, size);
let chunked = ChunkedArray::new(data.clone(), ChunkingStrategy::Fixed(1000));
let results =
chunked.par_map(|chunk| chunk.iter().map(|&x: &f64| x.sin() * x.cos()).sum::<f64>());
assert_eq!(results.len(), 10);
let sequential_results =
chunked.map(|chunk| chunk.iter().map(|&x: &f64| x.sin() * x.cos()).sum::<f64>());
for (par, seq) in results.iter().zip(sequential_results.iter()) {
assert!((par - seq).abs() < 1e-10);
}
}
#[test]
fn test_chunked_array_map_different_output_type() {
let data = Array1::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
let chunked = ChunkedArray::new(data, ChunkingStrategy::Fixed(2));
let results = chunked.map(|chunk| chunk.sum() > 5.0);
let expected = Array1::from_vec(vec![false, true, true]);
assert_eq!(results, expected);
}
#[test]
fn test_chunked_array_map_single_chunk() {
let data = Array1::from_vec(vec![1.0, 2.0, 3.0, 4.0]);
let chunked = ChunkedArray::new(data.clone(), ChunkingStrategy::Fixed(10));
assert_eq!(chunked.num_chunks(), 1);
let results = chunked.map(|chunk| chunk.sum());
let expected = Array1::from_vec(vec![10.0]);
assert_eq!(results, expected);
}
#[test]
fn test_chunked_array_map_empty_edge_case() {
let data = Array1::from_vec(vec![1.0]);
let chunked = ChunkedArray::new(data, ChunkingStrategy::Fixed(1));
let results = chunked.map(|chunk| chunk.sum());
let expected = Array1::from_vec(vec![1.0]);
assert_eq!(results, expected);
}
}