mirror of
https://github.com/kristoferssolo/hexlab.git
synced 2026-02-04 06:22:06 +00:00
test(generator): 89% coverage
This commit is contained in:
66
tests/generator.rs
Normal file
66
tests/generator.rs
Normal file
@@ -0,0 +1,66 @@
|
||||
use hexlab::prelude::*;
|
||||
use rstest::rstest;
|
||||
|
||||
#[rstest]
|
||||
#[case(GeneratorType::RecursiveBacktracking, None, None)]
|
||||
#[case(GeneratorType::RecursiveBacktracking, Some(Hex::new(1, -1)), None)]
|
||||
#[case(GeneratorType::RecursiveBacktracking, None, Some(12345))]
|
||||
fn generator_type(
|
||||
#[case] generator: GeneratorType,
|
||||
#[case] start_pos: Option<Hex>,
|
||||
#[case] seed: Option<u64>,
|
||||
) {
|
||||
let mut maze = HexMaze::new();
|
||||
for q in -3..=3 {
|
||||
for r in -3..=3 {
|
||||
let hex = Hex::new(q, r);
|
||||
if hex.length() <= 3 {
|
||||
maze.add_tile(hex);
|
||||
}
|
||||
}
|
||||
}
|
||||
let initial_size = maze.len();
|
||||
|
||||
generator.generate(&mut maze, start_pos, seed);
|
||||
|
||||
assert_eq!(maze.len(), initial_size, "Maze size should not change");
|
||||
|
||||
// Check maze connectivity
|
||||
let start = start_pos.unwrap_or(Hex::ZERO);
|
||||
let mut to_visit = vec![start];
|
||||
let mut visited = std::collections::HashSet::new();
|
||||
while let Some(current) = to_visit.pop() {
|
||||
if !visited.insert(current) {
|
||||
continue;
|
||||
}
|
||||
for dir in EdgeDirection::ALL_DIRECTIONS {
|
||||
let neighbor = current + dir;
|
||||
if let Some(walls) = maze.get_walls(¤t) {
|
||||
if !walls.contains(dir) && maze.get_tile(&neighbor).is_some() {
|
||||
to_visit.push(neighbor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
assert_eq!(visited.len(), maze.len(), "All tiles should be connected");
|
||||
|
||||
// Check that each tile has at least one open wall
|
||||
for &pos in maze.keys() {
|
||||
let walls = maze.get_walls(&pos).unwrap();
|
||||
assert!(
|
||||
walls.count() < 6,
|
||||
"Tile at {:?} should have at least one open wall",
|
||||
pos
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_maze() {
|
||||
let mut maze = HexMaze::new();
|
||||
GeneratorType::RecursiveBacktracking.generate(&mut maze, None, None);
|
||||
assert!(
|
||||
maze.is_empty(),
|
||||
"Empty maze should remain empty after generation"
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user