clone

a browser grid puzzle game where you push words around to rewrite the rules of each level

Verify world progress and locks stay isolated

Dami committed 1e0b686
commit
1e0b686425f383e89d5ee0a884b73bef8aaeec63
parent
c00fc51be3c0fc4b65b5d727d0997b4306ff164b
author
Dami <dami.etoile@gmail.com>
1 file changed, +39 -0
Mtests/map.test.js39++++++++++++++++++++++++++++++
M tests/map.test.js +39 -0
@@ -273,3 +273,42 @@ test('catalog pack metadata becomes world metadata and completion is scoped', ()
273273 const detachedGetNode = decorated.getNode;274274 assert.equal(detachedGetNode('tidewater:one').id, 'tidewater:one');275275 });276+277+test('world openers stay available while solved counts and locks remain isolated', () => {278+ const layout = createIndexLayout([279+ level('alpha', 'opener'), level('alpha', 'second'), level('alpha', 'third'),280+ level('beta', 'opener'), level('beta', 'second'),281+ ]);282+ const storage = new Map();283+ const fakeStorage = {284+ get length() { return storage.size; },285+ key(index) { return [...storage.keys()][index] ?? null; },286+ getItem(key) { return storage.get(key) ?? null; },287+ setItem(key, value) { storage.set(key, String(value)); },288+ removeItem(key) { storage.delete(key); },289+ };290+ const progress = createProgressStore(fakeStorage);291+292+ progress.markSolved('alpha', 'opener');293+ progress.markSolved('alpha', 'second');294+ let indexed = decorateIndex(layout, progress);295+ assert.deepEqual(indexed.worlds.map(world => world.completedCount), [2, 0]);296+ assert.deepEqual(indexed.nodes.map(node => [node.id, node.state]), [297+ ['alpha:opener', 'solved'], ['alpha:second', 'solved'], ['alpha:third', 'available'],298+ ['beta:opener', 'available'], ['beta:second', 'locked'],299+ ]);300+301+ // Rebuilding INDEX after changing alpha progress must leave beta unchanged.302+ progress.clear('alpha', 'second');303+ indexed = decorateIndex(layout, progress);304+ assert.deepEqual(indexed.worlds.map(world => world.completedCount), [1, 0]);305+ assert.equal(indexed.getNode('alpha:third').state, 'locked');306+ assert.equal(indexed.getNode('beta:opener').state, 'available');307+ assert.equal(indexed.getNode('beta:second').state, 'locked');308+309+ progress.markSolved('beta', 'opener');310+ indexed = decorateIndex(layout, progress);311+ assert.deepEqual(indexed.worlds.map(world => world.completedCount), [1, 1]);312+ assert.equal(indexed.getNode('alpha:third').state, 'locked');313+ assert.equal(indexed.getNode('beta:second').state, 'available');314+});