use super::*;
#[test]
fn test_compute_order_handles_empty_inputs_and_destination_reordering() {
let dims = [2usize, 3];
assert_eq!(compute_order(&dims, &[], None), vec![0, 1]);
let first = [1isize, 2];
let second = [2isize, 1];
let strides = vec![&first[..], &second[..]];
for dest_index in [None, Some(0), Some(1), Some(2)] {
let order = compute_order(&dims, &strides, dest_index);
assert_eq!(order.len(), dims.len());
let mut sorted = order.clone();
sorted.sort_unstable();
assert_eq!(sorted, vec![0, 1]);
}
}
#[test]
fn test_compute_order_column_major() {
let dims = [4usize, 5];
let strides = [1isize, 4];
let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[0], 0);
assert_eq!(order[1], 1);
}
#[test]
fn test_compute_order_row_major() {
let dims = [4usize, 5];
let strides = [5isize, 1];
let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[0], 1);
assert_eq!(order[1], 0);
}
#[test]
fn test_compute_order_mixed() {
let dims = [4usize, 5];
let out_strides = [1isize, 4]; let in_strides = [5isize, 1]; let strides_list: Vec<&[isize]> = vec![&out_strides, &in_strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[0], 0);
assert_eq!(order[1], 1);
}
#[test]
fn test_compute_order_3d() {
let dims = [3usize, 4, 5];
let strides = [20isize, 5, 1]; let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[0], 2);
}
#[test]
fn test_compute_order_size_one_dims() {
let dims = [4usize, 1, 5];
let strides = [1isize, 4, 4];
let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[2], 1);
}
#[test]
fn test_compute_order_empty() {
let dims: [usize; 0] = [];
let strides: [isize; 0] = [];
let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert!(order.is_empty());
}
#[test]
fn test_compute_order_with_zero_stride_broadcast() {
let dims = [4usize, 5, 3];
let strides = [0isize, 1, 5]; let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order, vec![1, 2, 0]);
}
#[test]
fn test_compute_order_negative_strides() {
let dims = [4usize, 5];
let strides = [-1isize, -4]; let strides_list: Vec<&[isize]> = vec![&strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[0], 0);
assert_eq!(order[1], 1);
}
#[test]
fn test_compute_order_4d_permuted() {
let dims = [2usize, 3, 4, 5];
let out_strides = [60isize, 20, 5, 1]; let in_strides = [1isize, 2, 6, 24]; let strides_list: Vec<&[isize]> = vec![&out_strides, &in_strides];
let order = compute_order(&dims, &strides_list, Some(0));
assert_eq!(order[0], 3);
}