mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-06 03:15:48 -06:00
118 lines
3.5 KiB
Rust
118 lines
3.5 KiB
Rust
use pacman::entity::direction::Direction;
|
|
use pacman::entity::ghost::{Ghost, GhostType};
|
|
use pacman::entity::graph::{Graph, Node};
|
|
use pacman::texture::sprite::{AtlasMapper, MapperFrame, SpriteAtlas};
|
|
use std::collections::HashMap;
|
|
|
|
fn create_test_atlas() -> SpriteAtlas {
|
|
let mut frames = HashMap::new();
|
|
let directions = ["up", "down", "left", "right"];
|
|
let ghost_types = ["blinky", "pinky", "inky", "clyde"];
|
|
|
|
for ghost_type in &ghost_types {
|
|
for (i, dir) in directions.iter().enumerate() {
|
|
frames.insert(
|
|
format!("ghost/{}/{}_{}.png", ghost_type, dir, "a"),
|
|
MapperFrame {
|
|
x: i as u16 * 16,
|
|
y: 0,
|
|
width: 16,
|
|
height: 16,
|
|
},
|
|
);
|
|
frames.insert(
|
|
format!("ghost/{}/{}_{}.png", ghost_type, dir, "b"),
|
|
MapperFrame {
|
|
x: i as u16 * 16,
|
|
y: 16,
|
|
width: 16,
|
|
height: 16,
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
let mapper = AtlasMapper { frames };
|
|
let dummy_texture = unsafe { std::mem::zeroed() };
|
|
SpriteAtlas::new(dummy_texture, mapper)
|
|
}
|
|
|
|
#[test]
|
|
fn test_ghost_pathfinding() {
|
|
// Create a simple test graph
|
|
let mut graph = Graph::new();
|
|
|
|
// Add nodes in a simple line: 0 -> 1 -> 2
|
|
let node0 = graph.add_node(Node {
|
|
position: glam::Vec2::new(0.0, 0.0),
|
|
});
|
|
let node1 = graph.add_node(Node {
|
|
position: glam::Vec2::new(10.0, 0.0),
|
|
});
|
|
let node2 = graph.add_node(Node {
|
|
position: glam::Vec2::new(20.0, 0.0),
|
|
});
|
|
|
|
// Connect the nodes
|
|
graph.connect(node0, node1, false, None, Direction::Right).unwrap();
|
|
graph.connect(node1, node2, false, None, Direction::Right).unwrap();
|
|
|
|
// Create a test atlas for the ghost
|
|
let atlas = create_test_atlas();
|
|
|
|
// Create a ghost at node 0
|
|
let ghost = Ghost::new(&graph, node0, GhostType::Blinky, &atlas);
|
|
|
|
// Test pathfinding from node 0 to node 2
|
|
let path = ghost.calculate_path_to_target(&graph, node2);
|
|
|
|
assert!(path.is_some());
|
|
let path = path.unwrap();
|
|
assert_eq!(path, vec![node0, node1, node2]);
|
|
}
|
|
|
|
#[test]
|
|
fn test_ghost_pathfinding_no_path() {
|
|
// Create a test graph with disconnected components
|
|
let mut graph = Graph::new();
|
|
|
|
let node0 = graph.add_node(Node {
|
|
position: glam::Vec2::new(0.0, 0.0),
|
|
});
|
|
let node1 = graph.add_node(Node {
|
|
position: glam::Vec2::new(10.0, 0.0),
|
|
});
|
|
|
|
// Don't connect the nodes
|
|
let atlas = create_test_atlas();
|
|
let ghost = Ghost::new(&graph, node0, GhostType::Blinky, &atlas);
|
|
|
|
// Test pathfinding when no path exists
|
|
let path = ghost.calculate_path_to_target(&graph, node1);
|
|
|
|
assert!(path.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn test_ghost_debug_colors() {
|
|
let atlas = create_test_atlas();
|
|
let mut graph = Graph::new();
|
|
let node = graph.add_node(Node {
|
|
position: glam::Vec2::new(0.0, 0.0),
|
|
});
|
|
|
|
let blinky = Ghost::new(&graph, node, GhostType::Blinky, &atlas);
|
|
let pinky = Ghost::new(&graph, node, GhostType::Pinky, &atlas);
|
|
let inky = Ghost::new(&graph, node, GhostType::Inky, &atlas);
|
|
let clyde = Ghost::new(&graph, node, GhostType::Clyde, &atlas);
|
|
|
|
// Test that each ghost has a different debug color
|
|
let colors = std::collections::HashSet::from([
|
|
blinky.debug_color(),
|
|
pinky.debug_color(),
|
|
inky.debug_color(),
|
|
clyde.debug_color(),
|
|
]);
|
|
assert_eq!(colors.len(), 4, "All ghost colors should be unique");
|
|
}
|