import { describe, it, expect } from 'vitest';
import { IsometricTileMap, type TileMapData } from '../IsometricTileMap';
function makeData(): TileMapData {
return {
width: 4,
height: 4,
tiles: new Array(16).fill(0),
blocked: [2],
tall: { 3: { height: 24, ground: 0 } }
};
}
describe('IsometricTileMap.setTile', () => {
it('обновляет данные и проходимость ячейки', () => {
const map = new IsometricTileMap(makeData(), new Map());
expect(map.isWalkable(1, 1)).toBe(true);
map.setTile(1, 1, 3); // высокий объект
expect(map.data.tiles[1 * 4 + 1]).toBe(3);
expect(map.isWalkable(1, 1)).toBe(true); // 3 не в blocked
map.setTile(1, 1, 2); // блокирующий id
expect(map.data.tiles[1 * 4 + 1]).toBe(2);
expect(map.isWalkable(1, 1)).toBe(false);
});
it('игнорирует координаты за границей карты', () => {
const map = new IsometricTileMap(makeData(), new Map());
expect(() => map.setTile(-1, 0, 2)).not.toThrow();
expect(() => map.setTile(4, 0, 2)).not.toThrow();
expect(() => map.setTile(0, 4, 2)).not.toThrow();
// данные не изменились
expect(map.data.tiles.every((t) => t === 0)).toBe(true);
});
});
describe('IsometricTileMap.props', () => {
it('блокирует весь footprint и нормализует размеры', () => {
const data = makeData();
data.props = [{ id: 7, x: 1, y: 1, w: 2, h: 2 }];
const map = new IsometricTileMap(data, new Map());
expect(map.props).toEqual([{ id: 7, x: 1, y: 1, w: 2, h: 2 }]);
// весь footprint 2×2 непроходим, вокруг — проходим
expect(map.isWalkable(1, 1)).toBe(false);
expect(map.isWalkable(2, 2)).toBe(false);
expect(map.isWalkable(0, 1)).toBe(true);
expect(map.isWalkable(1, 3)).toBe(true);
// спрайт пропа отдан сцене для depth-слоя
expect(map.propViews).toHaveLength(1);
expect(map.propViews[0]!.prop).toBe(map.props[0]);
});
it('footprint по умолчанию 1×1', () => {
const data = makeData();
data.props = [{ id: 7, x: 2, y: 0 }];
const map = new IsometricTileMap(data, new Map());
expect(map.props[0]!.w).toBe(1);
expect(map.props[0]!.h).toBe(1);
expect(map.isWalkable(2, 0)).toBe(false);
expect(map.isWalkable(3, 0)).toBe(true);
});
it('setTile внутри footprint не снимает блокировку', () => {
const data = makeData();
data.props = [{ id: 7, x: 1, y: 1 }];
const map = new IsometricTileMap(data, new Map());
map.setTile(1, 1, 0);
expect(map.isWalkable(1, 1)).toBe(false);
});
});