use super::*;
use crate::s;
use alloc::vec;
#[test]
fn test_into_ranges() {
let dims = [2, 3, 4, 5];
let shape = Shape::new(dims);
assert_eq!(shape.into_ranges(), vec![0..2, 0..3, 0..4, 0..5]);
}
#[allow(clippy::single_range_in_vec_init)]
#[test]
fn test_into_slices() {
let slices = Shape::new([3]).into_slices(1..4);
assert_eq!(slices[0].to_range(3), 1..3);
let slices = Shape::new([3, 4]).into_slices(s![1..4, 0..2]);
assert_eq!(slices[0].to_range(3), 1..3);
assert_eq!(slices[1].to_range(4), 0..2);
let slices = Shape::new([3]).into_slices(..-2);
assert_eq!(slices[0].to_range(3), 0..1);
let slices = Shape::new([2, 3, 4]).into_slices(s![.., 1..-1]);
assert_eq!(slices[0].to_range(2), 0..2);
assert_eq!(slices[1].to_range(3), 1..2);
let slices = Shape::new([2, 3, 4]).into_slices(s![..20, 2]);
assert_eq!(slices[0].to_range(2), 0..2);
assert_eq!(slices[1].to_range(3), 2..3);
}
#[test]
fn test_shape_as_slice() {
let dims = [2, 3, 4, 5];
let shape = Shape::new(dims);
assert_eq!(shape.as_slice(), dims.as_slice());
let shape_slice: &[usize] = &shape;
assert_eq!(shape_slice, *&[2, 3, 4, 5]);
}
#[test]
fn test_shape_as_mut_slice() {
let mut dims = [2, 3, 4, 5];
let mut shape = Shape::new(dims);
let shape_mut = shape.as_mut_slice();
assert_eq!(shape_mut, dims.as_mut_slice());
shape_mut[1] = 6;
assert_eq!(shape_mut, &[2, 6, 4, 5]);
let mut shape = Shape::new(dims);
let shape = &mut shape[..];
shape[1] = 6;
assert_eq!(shape, shape_mut)
}
#[test]
fn test_shape_slice_output_shape_basic() {
let slices = [
Slice::new(0, Some(5), 1), Slice::new(2, Some(8), 1), ];
let original_shape = Shape::new([10, 10, 10]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([5, 6, 10]));
}
#[test]
fn test_shape_slice_output_shape_with_positive_steps() {
let slices = [
Slice::new(0, Some(10), 2), Slice::new(1, Some(9), 3), Slice::new(0, Some(7), 4), ];
let original_shape = Shape::new([20, 20, 20, 30]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([5, 3, 2, 30]));
}
#[test]
fn test_shape_slice_output_shape_with_negative_steps() {
let slices = [
Slice::new(0, Some(10), -1), Slice::new(2, Some(8), -2), ];
let original_shape = Shape::new([20, 20, 20]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([10, 3, 20]));
}
#[test]
fn test_shape_slice_output_shape_mixed_steps() {
let slices = [
Slice::from_range_stepped(1..6, 1), Slice::from_range_stepped(0..10, -3), Slice::from_range_stepped(2..14, 4), ];
let original_shape = Shape::new([20, 20, 20]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([5, 4, 3]));
}
#[test]
fn test_shape_slice_output_shape_partial_dims() {
let slices = [
Slice::from_range_stepped(2..7, 2), ];
let original_shape = Shape::new([10, 20, 30, 40]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([3, 20, 30, 40]));
}
#[test]
fn test_shape_slice_output_shape_edge_cases() {
let slices = [
Slice::from_range_stepped(0..1, 1), Slice::from_range_stepped(0..10, 100), Slice::from_range_stepped(5..5, 1), ];
let original_shape = Shape::new([10, 20, 30]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([1, 1, 0]));
}
#[test]
fn test_shape_slice_output_shape_empty() {
let slices = [];
let original_shape = Shape::new([10, 20, 30]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([10, 20, 30]));
}
#[test]
fn test_shape_slice_output_shape_uneven_division() {
let slices = [
Slice::from_range_stepped(0..7, 3), Slice::from_range_stepped(0..11, 4), Slice::from_range_stepped(1..10, 5), ];
let original_shape = Shape::new([20, 20, 20]);
let result = original_shape.slice(&slices).unwrap();
assert_eq!(result, Shape::new([3, 3, 2]));
}