Skip to content
Snippets Groups Projects
indexer.rs 2.51 KiB
Newer Older
use glam::IVec2;
Louis's avatar
Louis committed
use micro_ldtk::Indexer;
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
Louis's avatar
Louis committed
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) {
Louis's avatar
Louis committed
	let indexer = Indexer::new(5, 3);
	indexer.reverse(index)
}

#[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) {
Louis's avatar
Louis committed
	let indexer = Indexer::new(5, 3);
	let idx = indexer.index(x, y);
	let (x_rev, y_rev) = indexer.reverse(idx);
Louis's avatar
Louis committed
	assert_eq!((x, y), (x_rev, y_rev));
}

#[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) {
Louis's avatar
Louis committed
	let indexer = Indexer::new(10, 10);
	assert_eq!(indexer.index_checked(x, y), None);
}

#[test]
fn test_indexer_with_zero_dimensions() {
Louis's avatar
Louis committed
	// Create an indexer with zero width
	let zero_width_indexer = Indexer::new(0, 10);
Louis's avatar
Louis committed
	assert_eq!(zero_width_indexer.width(), 0);
	assert_eq!(zero_width_indexer.height(), 10);
Louis's avatar
Louis committed
	// 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);
Louis's avatar
Louis committed
	// Index calculation with zero width
	assert_eq!(zero_width_indexer.index(2, 3), 0); // 3 * 0 + 2 = 0
Louis's avatar
Louis committed
	// 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)
Louis's avatar
Louis committed
	// 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);
Louis's avatar
Louis committed
	// 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);
Louis's avatar
Louis committed
	// 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