import assert from 'node:assert/strict'; import { test } from 'node:test'; import { HexBoard } from '../src/board'; import type { HexCellDef } from '../src/types'; const c = (id: string, q: number, r: number, clue?: number): HexCellDef => ({ id, q, r, clue }); test('六邻接:中心格有 6 个邻居,角落只有共边的', () => { const cells: HexCellDef[] = [c('o', 0, 0)]; const dirs: Array<[number, number]> = [[1, 0], [1, -1], [0, -1], [-1, 0], [-1, 1], [0, 1]]; dirs.forEach(([q, r], i) => cells.push(c(`n${i}`, q, r))); const b = HexBoard.fromCells(cells); assert.equal(b.adj[0].length, 6); // 外圈每格:中心 + 两个相邻外圈格 for (let i = 1; i <= 6; i++) assert.equal(b.adj[i].length, 3); // (1,1) 不是 (0,0) 的邻居 const b2 = HexBoard.fromCells([c('a', 0, 0), c('b', 1, 1)]); assert.equal(b2.areAdjacent(0, 1), false); assert.equal(b2.isConnected(), false); }); test('墙去掉一条邻接,几何邻接不变', () => { const b = HexBoard.fromCells([c('a', 0, 0), c('b', 1, 0), c('c', 0, 1)], [['a', 'b']]); assert.equal(b.areAdjacent(0, 1), false); assert.equal(b.isGeoNeighbor(0, 1), true); assert.equal(b.isWalled(0, 1), true); assert.equal(b.isWalled(1, 0), true); assert.equal(b.areAdjacent(0, 2), true); assert.equal(b.areAdjacent(1, 2), true); assert.equal(b.wallBetween(1, 0)?.index, 0); assert.equal(b.withoutWalls().areAdjacent(0, 1), true); assert.equal(b.isConnected(), true); }); test('墙把盘切开 → 不连通', () => { const b = HexBoard.fromCells([c('a', 0, 0), c('b', 1, 0)], [['a', 'b']]); assert.equal(b.isConnected(), false); }); test('非法盘抛错:坐标重叠、id 重复、墙不在共边、墙重复、线索越界', () => { assert.throws(() => HexBoard.fromCells([c('a', 0, 0), c('b', 0, 0)]), /重叠/); assert.throws(() => HexBoard.fromCells([c('a', 0, 0), c('a', 1, 0)]), /重复/); assert.throws(() => HexBoard.fromCells([c('a', 0, 0), c('b', 1, 1)], [['a', 'b']]), /共用边/); assert.throws(() => HexBoard.fromCells([c('a', 0, 0), c('b', 1, 0)], [['a', 'b'], ['b', 'a']]), /重复/); assert.throws(() => HexBoard.fromCells([c('a', 0, 0), c('b', 1, 0)], [['a', 'x']]), /不存在/); assert.throws(() => HexBoard.fromCells([c('a', 0, 0, 3), c('b', 1, 0)]), /超出/); assert.throws(() => HexBoard.fromCells([c('a', 0, 0, 1), c('b', 1, 0, 1)]), /线索重复/); }); test('cellAt / cellById / 线索索引', () => { const b = HexBoard.fromCells([c('a', -1, 2, 1), c('b', 0, 2, 2)]); assert.equal(b.cellAt(-1, 2), 0); assert.equal(b.cellAt(5, 5), -1); assert.equal(b.cellById('b').index, 1); assert.equal(b.startClueCell, 0); assert.equal(b.clueCellOfStep.get(2), 1); });