Files
NumberSwipe_New/modes/03-hex-walls/tests/board.test.ts
T
cabinw 8026e4628d 初始提交:三玩法 Web 原型与设计文档
- 玩法一 数字一笔:规则库、求解器、26 关、竖屏触摸 Web 原型、测试
- 玩法二 连连气球:连消畅玩版核心、Web 原型、Cocos 球槽组件与导出脚本
- 玩法三 六边一笔:规则库、求解器、10 关 + 转墙实验包、Web 原型、测试
- 产品文档、UI 设计规范、各玩法 GDD / HANDOFF
- 文档移除全部外部参考作引用;删除玩法二 v0 旧稿
2026-09-16 14:30:59 +08:00

58 lines
2.7 KiB
TypeScript

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);
});