feat: add v2 queued taps and free board rotation

This commit is contained in:
cabinw
2026-09-09 12:37:18 +08:00
parent 9f8990b579
commit 4ea5949cfb
9 changed files with 91 additions and 23 deletions
+22
View File
@@ -0,0 +1,22 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { TapQueue } from '../src/tap-queue.js';
import { Game, available } from '../src/core.js';
import { LEVELS } from '../src/levels.js';
test('rapid taps retain order, ignore duplicate/active pieces, and discard stale IDs',()=>{
const queue=new TapQueue();
assert.equal(queue.add('a','a'),false);
queue.add('b');queue.add('gone');queue.add('c');assert.equal(queue.add('b'),false);
const tiles=[{id:'c'},{id:'b'}];
assert.equal(queue.take(tiles).id,'b');assert.equal(queue.take(tiles).id,'c');assert.equal(queue.take(tiles),null);
queue.add('b');queue.clear();assert.equal(queue.take(tiles),null);
});
test('buffered removals are evaluated in order against the updated game, with undo intact',()=>{
const game=new Game(LEVELS[0]),queue=new TapQueue();
const free=available(game.level,game.tiles).slice(0,3);assert.ok(free.length>=2);
for(const tile of free)queue.add(tile.id);
const start=game.moves;
while(queue.ids.length){const tile=queue.take(game.tiles);assert.equal(game.tap(tile.id).status,'exit');}
assert.equal(game.moves,start-free.length);
assert.ok(game.undo());assert.equal(game.moves,start-free.length+1);
});