23 lines
1.2 KiB
JavaScript
23 lines
1.2 KiB
JavaScript
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);
|
|
});
|