- commit
- 1e0b686425f383e89d5ee0a884b73bef8aaeec63
- parent
- c00fc51be3c0fc4b65b5d727d0997b4306ff164b
- author
- Dami <dami.etoile@gmail.com>
| M | tests/ | 39 | ++++++++++++++++++++++++++++++ |
@@ -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+});