mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-06 03:15:48 -06:00
108 lines
4.3 KiB
Rust
108 lines
4.3 KiB
Rust
//! This module contains helper functions that are used throughout the game.
|
|
|
|
use glam::UVec2;
|
|
|
|
/// Checks if two grid positions are adjacent to each other
|
|
///
|
|
/// # Arguments
|
|
/// * `a` - First position as (x, y) coordinates
|
|
/// * `b` - Second position as (x, y) coordinates
|
|
/// * `diagonal` - Whether to consider diagonal adjacency (true) or only orthogonal (false)
|
|
///
|
|
/// # Returns
|
|
/// * `true` if positions are adjacent according to the diagonal parameter
|
|
/// * `false` otherwise
|
|
pub fn is_adjacent(a: UVec2, b: UVec2, diagonal: bool) -> bool {
|
|
let dx = a.x.abs_diff(b.x);
|
|
let dy = a.y.abs_diff(b.y);
|
|
if diagonal {
|
|
dx <= 1 && dy <= 1 && (dx != 0 || dy != 0)
|
|
} else {
|
|
(dx == 1 && dy == 0) || (dx == 0 && dy == 1)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_orthogonal_adjacency() {
|
|
// Test orthogonal adjacency (diagonal = false)
|
|
|
|
// Same position should not be adjacent
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(0, 0), false));
|
|
|
|
// Adjacent positions should be true
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(1, 0), false)); // Right
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(0, 1), false)); // Down
|
|
assert!(is_adjacent(UVec2::new(1, 1), UVec2::new(0, 1), false)); // Left
|
|
assert!(is_adjacent(UVec2::new(1, 1), UVec2::new(1, 0), false)); // Up
|
|
|
|
// Diagonal positions should be false
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(1, 1), false));
|
|
assert!(!is_adjacent(UVec2::new(0, 1), UVec2::new(1, 0), false));
|
|
|
|
// Positions more than 1 step away should be false
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(2, 0), false));
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(0, 2), false));
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(2, 2), false));
|
|
}
|
|
|
|
#[test]
|
|
fn test_diagonal_adjacency() {
|
|
// Test diagonal adjacency (diagonal = true)
|
|
|
|
// Same position should not be adjacent
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(0, 0), true));
|
|
|
|
// Orthogonal adjacent positions should be true
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(1, 0), true)); // Right
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(0, 1), true)); // Down
|
|
assert!(is_adjacent(UVec2::new(1, 1), UVec2::new(0, 1), true)); // Left
|
|
assert!(is_adjacent(UVec2::new(1, 1), UVec2::new(1, 0), true)); // Up
|
|
|
|
// Diagonal adjacent positions should be true
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(1, 1), true)); // Down-right
|
|
assert!(is_adjacent(UVec2::new(1, 0), UVec2::new(0, 1), true)); // Down-left
|
|
assert!(is_adjacent(UVec2::new(0, 1), UVec2::new(1, 0), true)); // Up-right
|
|
assert!(is_adjacent(UVec2::new(1, 1), UVec2::new(0, 0), true)); // Up-left
|
|
|
|
// Positions more than 1 step away should be false
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(2, 0), true));
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(0, 2), true));
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(2, 2), true));
|
|
assert!(!is_adjacent(UVec2::new(0, 0), UVec2::new(1, 2), true));
|
|
}
|
|
|
|
#[test]
|
|
fn test_edge_cases() {
|
|
// Test with larger coordinates
|
|
assert!(is_adjacent(UVec2::new(100, 100), UVec2::new(101, 100), false));
|
|
assert!(is_adjacent(UVec2::new(100, 100), UVec2::new(100, 101), false));
|
|
assert!(!is_adjacent(UVec2::new(100, 100), UVec2::new(102, 100), false));
|
|
|
|
assert!(is_adjacent(UVec2::new(100, 100), UVec2::new(101, 101), true));
|
|
assert!(!is_adjacent(UVec2::new(100, 100), UVec2::new(102, 102), true));
|
|
|
|
// Test with zero coordinates
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(1, 0), false));
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(0, 1), false));
|
|
assert!(is_adjacent(UVec2::new(0, 0), UVec2::new(1, 1), true));
|
|
}
|
|
|
|
#[test]
|
|
fn test_commutative_property() {
|
|
// The function should work the same regardless of parameter order
|
|
assert_eq!(
|
|
is_adjacent(UVec2::new(1, 2), UVec2::new(2, 2), false),
|
|
is_adjacent(UVec2::new(2, 2), UVec2::new(1, 2), false)
|
|
);
|
|
|
|
assert_eq!(
|
|
is_adjacent(UVec2::new(1, 2), UVec2::new(2, 3), true),
|
|
is_adjacent(UVec2::new(2, 3), UVec2::new(1, 2), true)
|
|
);
|
|
}
|
|
}
|