Newer
Older
use num_traits::AsPrimitive;
use test_case::test_case;
#[test_case(0, 0 => 0)]
#[test_case(4, 0 => 4)]
#[test_case(0, 3 => 15)]
#[test_case(4, 3 => 19)]
#[test_case(2, 2 => 12)]
#[test_case(1i32, 1i32 => 6)]
#[test_case(2.5f32, 1.2f32 => 7)] // Floating point coordinates are truncated
fn test_indexer_calculates_correct_index(
x: impl AsPrimitive<i64>,
y: impl AsPrimitive<i64>,
) -> usize {
let indexer = Indexer::new(5, 4);
indexer.index(x, y)
}
#[test_case(0 => (0, 0))]
#[test_case(4 => (4, 0))]
#[test_case(5 => (0, 1))]
#[test_case(9 => (4, 1))]
#[test_case(10 => (0, 2))]
#[test_case(14 => (4, 2))]
fn test_indexer_reverse(index: usize) -> (usize, usize) {
}
#[test_case(0, 0)]
#[test_case(4, 0)]
#[test_case(0, 1)]
#[test_case(2, 2)]
#[test_case(4, 2)]
fn test_index_is_reflexive(x: usize, y: usize) {
let indexer = Indexer::new(5, 3);
let idx = indexer.index(x, y);
let (x_rev, y_rev) = indexer.reverse(idx);
}
#[test_case(5, -1)]
#[test_case(5, 10)]
#[test_case(10, 10)]
#[test_case(10, 3)]
#[test_case(-12, 3)]
#[test_case(-00, 123_000_000)]
fn test_indexer_index_checked_returns_none_for_out_of_bounds(x: i64, y: i64) {
let indexer = Indexer::new(10, 10);
assert_eq!(indexer.index_checked(x, y), None);
}
#[test]
fn test_indexer_with_zero_dimensions() {
// Create an indexer with zero width
let zero_width_indexer = Indexer::new(0, 10);
assert_eq!(zero_width_indexer.width(), 0);
assert_eq!(zero_width_indexer.height(), 10);
// Zero width should make all x coordinates invalid
assert!(!zero_width_indexer.is_valid(0, 5));
assert_eq!(zero_width_indexer.index_checked(0, 5), None);
// Index calculation with zero width
assert_eq!(zero_width_indexer.index(2, 3), 0); // 3 * 0 + 2 = 0
// Reverse calculation with zero width
let (x, y) = zero_width_indexer.reverse(5);
assert_eq!(x, 0); // Any index % 0 is treated as 0 due to .max(0)
assert_eq!(y, 0); // Any index / 0 is treated as 0 due to .max(0)
// Create an indexer with zero height
let zero_height_indexer = Indexer::new(10, 0);
assert_eq!(zero_height_indexer.width(), 10);
assert_eq!(zero_height_indexer.height(), 0);
// Zero height should make all y coordinates invalid
assert!(!zero_height_indexer.is_valid(5, 0));
assert_eq!(zero_height_indexer.index_checked(5, 0), None);
// Test flip_y with zero height
let flipped = zero_height_indexer.flip_y(IVec2::new(5, 3));
assert_eq!(flipped, IVec2::new(5, -3)); // 0 - 3 = -3