use std::collections::HashMap;
use crate::expand::{choices_from_args, expand_arg_to_idx, swizzle_args};
#[test]
fn test_expand_arg_to_idx_single() {
let args = vec![(0, 4)];
let mut rpk = HashMap::new();
rpk.insert(0, 2);
assert_eq!(expand_arg_to_idx(&args, &rpk), 2);
}
#[test]
fn test_expand_arg_to_idx_multi() {
let args = vec![(0, 2), (1, 3)];
let mut rpk = HashMap::new();
rpk.insert(0, 1);
rpk.insert(1, 2);
assert_eq!(expand_arg_to_idx(&args, &rpk), 5);
}
#[test]
fn test_expand_arg_to_idx_missing_axis() {
let args = vec![(0, 4), (1, 3)];
let mut rpk = HashMap::new();
rpk.insert(0, 2);
assert_eq!(expand_arg_to_idx(&args, &rpk), 6);
}
#[test]
fn test_expand_arg_to_idx_three_axes() {
let args = vec![(0, 2), (1, 3), (2, 4)];
let mut rpk = HashMap::new();
rpk.insert(0, 1);
rpk.insert(1, 2);
rpk.insert(2, 3);
assert_eq!(expand_arg_to_idx(&args, &rpk), 23);
}
#[test]
fn test_choices_from_args_single() {
let args = vec![(0, 3)];
let choices = choices_from_args(&args);
assert_eq!(choices.len(), 3);
assert_eq!(choices[0].get(&0), Some(&0));
assert_eq!(choices[1].get(&0), Some(&1));
assert_eq!(choices[2].get(&0), Some(&2));
}
#[test]
fn test_choices_from_args_multi() {
let args = vec![(0, 2), (1, 3)];
let choices = choices_from_args(&args);
assert_eq!(choices.len(), 6);
let expected: Vec<(usize, usize)> = vec![(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)];
for (i, (ax0, ax1)) in expected.into_iter().enumerate() {
assert_eq!(choices[i].get(&0), Some(&ax0), "mismatch at index {}", i);
assert_eq!(choices[i].get(&1), Some(&ax1), "mismatch at index {}", i);
}
}
#[test]
fn test_choices_from_args_empty() {
let args: Vec<(usize, usize)> = vec![];
let choices = choices_from_args(&args);
assert_eq!(choices.len(), 1);
assert!(choices[0].is_empty());
}
#[test]
fn test_swizzle_identity() {
let args = vec![(0, 4)];
let indices = swizzle_args(&args, &args, &[]);
assert_eq!(indices, vec![0, 1, 2, 3]);
}
#[test]
fn test_swizzle_with_exclude() {
let cargs = vec![(0, 2), (1, 2)];
let eargs = vec![(0, 2), (1, 2)];
let indices = swizzle_args(&cargs, &eargs, &[1]);
assert_eq!(indices, vec![0, 0, 2, 2]);
}
#[test]
fn test_swizzle_different_axes() {
let cargs = vec![(1, 2)];
let eargs = vec![(0, 2), (1, 2)];
let indices = swizzle_args(&cargs, &eargs, &[]);
assert_eq!(indices, vec![0, 1]);
}
#[test]
fn test_swizzle_subset_axes() {
let cargs = vec![(0, 2)];
let eargs = vec![(0, 2), (1, 2)];
let indices = swizzle_args(&cargs, &eargs, &[]);
assert_eq!(indices, vec![0, 2]);
}
#[test]
fn test_swizzle_contract_middle_axis() {
let cargs = vec![(1, 2)];
let eargs = vec![(0, 2), (1, 2), (2, 2)];
let indices = swizzle_args(&cargs, &eargs, &[]);
assert_eq!(indices, vec![0, 2]);
}