use neurodoom::map::MapData;
use neurodoom::wad::Wad;
fn load_wad() -> Vec<u8> {
let path = std::env::var("DOOM_WAD")
.unwrap_or_else(|_| "doom1.wad".to_string());
std::fs::read(&path).unwrap_or_else(|e| panic!("failed to read WAD at {path}: {e}"))
}
#[test]
fn load_e1m1() {
let data = load_wad();
let wad = Wad::parse(&data).unwrap();
let map = MapData::load(&wad, "E1M1").unwrap();
assert_eq!(map.vertexes.len(), 467);
assert!(map.lines.len() > 400, "expected >400 linedefs, got {}", map.lines.len());
assert!(map.sectors.len() > 80, "expected >80 sectors, got {}", map.sectors.len());
assert!(map.segs.len() > 0);
assert!(map.subsectors.len() > 0);
assert!(map.nodes.len() > 0);
assert!(map.things.len() > 0);
}
#[test]
fn bsp_root_valid() {
let data = load_wad();
let wad = Wad::parse(&data).unwrap();
let map = MapData::load(&wad, "E1M1").unwrap();
let root = map.root_node();
assert_eq!(root as usize, map.nodes.len() - 1);
}
#[test]
fn blockmap_dimensions() {
let data = load_wad();
let wad = Wad::parse(&data).unwrap();
let map = MapData::load(&wad, "E1M1").unwrap();
assert!(map.blockmap.width > 0);
assert!(map.blockmap.height > 0);
assert_eq!(map.blockmap.offsets.len(), map.blockmap.width * map.blockmap.height);
}
#[test]
fn player_start_exists() {
let data = load_wad();
let wad = Wad::parse(&data).unwrap();
let map = MapData::load(&wad, "E1M1").unwrap();
let p1_start = map.things.iter().find(|t| t.type_num == 1);
assert!(p1_start.is_some(), "player 1 start not found in E1M1");
}
#[test]
fn lines_have_valid_sides() {
let data = load_wad();
let wad = Wad::parse(&data).unwrap();
let map = MapData::load(&wad, "E1M1").unwrap();
for (i, line) in map.lines.iter().enumerate() {
assert!(
line.sidenum[0].is_some(),
"line {i} has no front side"
);
assert!(
(line.v1 as usize) < map.vertexes.len(),
"line {i} v1 out of bounds"
);
assert!(
(line.v2 as usize) < map.vertexes.len(),
"line {i} v2 out of bounds"
);
}
}