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