use super::{
errors::MazeSaveError,
formatters::{Formatter, Saveable},
grid::Grid,
validate::validate,
};
use std::fmt;
pub struct OrthogonalMaze {
grid: Grid,
}
impl OrthogonalMaze {
pub fn new(width: usize, height: usize) -> OrthogonalMaze {
OrthogonalMaze {
grid: Grid::new(width, height),
}
}
pub(crate) fn get_grid_mut(&mut self) -> &mut Grid {
&mut self.grid
}
pub fn is_valid(&self) -> bool {
validate(&self.grid)
}
pub fn save<F, T>(&self, path: &str, formatter: F) -> Result<String, MazeSaveError>
where
F: Formatter<T>,
T: Saveable,
{
let data = formatter.format(&self.grid);
Saveable::save(&data, path)
}
pub fn format<F, T>(&self, formatter: F) -> T
where
F: Formatter<T>,
T: Saveable,
{
formatter.format(&self.grid)
}
}
impl fmt::Display for OrthogonalMaze {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.grid)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use crate::maze::grid::cell::Cell;
use super::*;
#[test]
fn display_orthogonal_maze() {
let mut expected = String::new();
expected.push_str(" _______ \n");
expected.push_str("| |___ |\n");
expected.push_str("|_ _| |\n");
expected.push_str("| _____|\n");
expected.push_str("|_______|\n");
let grid = generate_valid_maze();
let maze = OrthogonalMaze { grid };
let actual = maze.to_string();
assert_eq!(actual, expected);
}
#[test]
fn valid_maze() {
let grid = generate_valid_maze();
let maze = OrthogonalMaze { grid };
assert!(maze.is_valid());
}
#[test]
fn invalid_maze() {
let grid = generate_invalid_maze();
let maze = OrthogonalMaze { grid };
assert!(!maze.is_valid());
}
fn generate_valid_maze() -> Grid {
let mut grid = Grid::new(4, 4);
grid.carve_passage((0, 0), Cell::SOUTH).unwrap();
grid.carve_passage((0, 1), Cell::EAST).unwrap();
grid.carve_passage((0, 2), Cell::EAST).unwrap();
grid.carve_passage((0, 2), Cell::SOUTH).unwrap();
grid.carve_passage((0, 3), Cell::EAST).unwrap();
grid.carve_passage((1, 0), Cell::EAST).unwrap();
grid.carve_passage((1, 1), Cell::EAST).unwrap();
grid.carve_passage((1, 1), Cell::SOUTH).unwrap();
grid.carve_passage((1, 2), Cell::EAST).unwrap();
grid.carve_passage((1, 3), Cell::EAST).unwrap();
grid.carve_passage((2, 0), Cell::EAST).unwrap();
grid.carve_passage((2, 2), Cell::EAST).unwrap();
grid.carve_passage((2, 3), Cell::EAST).unwrap();
grid.carve_passage((3, 1), Cell::NORTH).unwrap();
grid.carve_passage((3, 1), Cell::SOUTH).unwrap();
grid
}
fn generate_invalid_maze() -> Grid {
let mut grid = Grid::new(4, 4);
grid.carve_passage((0, 0), Cell::SOUTH).unwrap();
grid.carve_passage((0, 1), Cell::EAST).unwrap();
grid.carve_passage((0, 2), Cell::EAST).unwrap();
grid.carve_passage((0, 2), Cell::SOUTH).unwrap();
grid.carve_passage((0, 3), Cell::EAST).unwrap();
grid.carve_passage((1, 1), Cell::EAST).unwrap();
grid.carve_passage((1, 1), Cell::NORTH).unwrap();
grid.carve_passage((1, 2), Cell::EAST).unwrap();
grid.carve_passage((1, 3), Cell::EAST).unwrap();
grid.carve_passage((2, 0), Cell::EAST).unwrap();
grid.carve_passage((2, 2), Cell::EAST).unwrap();
grid.carve_passage((2, 3), Cell::EAST).unwrap();
grid.carve_passage((3, 1), Cell::NORTH).unwrap();
grid.carve_passage((3, 1), Cell::SOUTH).unwrap();
grid
}
}