/
docNemo
/
tactic-hack-core
Обзор
Документация
Войти
/
docNemo
/
tactic-hack-core
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/placement.test.ts
66 строк
2 KB
neo
Implement rules engine: geometry, placement, attack reducer, replay, projection, deduction, protocol types
19 июл 2026, 00:03
19 июл 2026, 00:03
d1403fb
Код
Авторство
О чём код?
import { describe, expect, it } from "vitest"; import { canPlaceShip, validatePlacement, validateShipPlacement } from "./placement.js"; import { Cell } from "./types.js"; /** Валидная расстановка: разные строки, столбцы и диагонали. */ export const PLACEMENT_A: Cell[] = [ { row: 0, col: 0 }, { row: 1, col: 2 }, { row: 2, col: 4 }, { row: 3, col: 6 }, { row: 4, col: 8 }, ]; describe("validateShipPlacement", () => { it("разрешает свободную клетку", () => { expect(canPlaceShip([{ row: 0, col: 0 }], { row: 2, col: 5 })).toBe(true); }); it("отклоняет клетку на линии другого корабля", () => { const result = validateShipPlacement([{ row: 0, col: 0 }], { row: 0, col: 7 }); expect(result).toEqual({ ok: false, code: "cellOnLine" }); }); it("отклоняет занятую клетку", () => { const result = validateShipPlacement([{ row: 3, col: 3 }], { row: 3, col: 3 }); expect(result).toEqual({ ok: false, code: "cellOccupied" }); }); it("отклоняет клетку вне поля", () => { expect(validateShipPlacement([], { row: -1, col: 0 })).toEqual({ ok: false, code: "outOfBounds", }); expect(validateShipPlacement([], { row: 0, col: 10 })).toEqual({ ok: false, code: "outOfBounds", }); }); }); describe("validatePlacement", () => { it("принимает расстановку неатакующих ферзей", () => { expect(validatePlacement(PLACEMENT_A)).toEqual({ ok: true }); }); it("отклоняет расстановку не из 5 кораблей", () => { expect(validatePlacement(PLACEMENT_A.slice(0, 4))).toEqual({ ok: false, code: "wrongShipCount", }); expect( validatePlacement([...PLACEMENT_A, { row: 9, col: 1 }]), ).toEqual({ ok: false, code: "wrongShipCount" }); }); it("отклоняет два корабля на одной диагонали", () => { const ships: Cell[] = [ { row: 0, col: 0 }, { row: 1, col: 1 }, { row: 2, col: 5 }, { row: 5, col: 2 }, { row: 7, col: 9 }, ]; expect(validatePlacement(ships)).toEqual({ ok: false, code: "cellOnLine" }); }); });