import test from 'node:test'; import assert from 'node:assert/strict'; import { readSave, writeSave, clearSave, readAudio, writeAudio, saveFile, saveFileName, readSaveFile } from '../src/engine/storage.js'; import { memoryStorage } from './helpers.mjs'; test('scrive, rilegge e cancella il salvataggio', () => { const s = memoryStorage(); assert.equal(readSave(s), null); assert.ok(writeSave(s, { scene: 'piazza' })); assert.deepEqual(readSave(s), { scene: 'piazza' }); assert.ok(clearSave(s)); assert.equal(readSave(s), null); }); test('un archivio rotto o bloccato non fa cadere il gioco', () => { const broken = { getItem() { throw new Error('bloccato'); }, setItem() { throw new Error('pieno'); }, removeItem() { throw new Error('no'); } }; assert.equal(readSave(broken), null); assert.equal(writeSave(broken, {}), false); assert.equal(clearSave(broken), false); const garbage = memoryStorage(); garbage.setItem('leggenda-regolo-save', '{non è json'); assert.equal(readSave(garbage), null); }); test('volume della musica, volume delle voci e muto si ricordano', () => { const s = memoryStorage(); assert.equal(readAudio(s), null); assert.ok(writeAudio(s, { volume: 0.3, muted: true, voices: 0.4 })); assert.deepEqual(readAudio(s), { volume: 0.3, muted: true, voices: 0.4 }); writeAudio(s, { volume: 0.3, muted: false, voices: 0.4, effects: 0.65 }); assert.deepEqual(readAudio(s), { volume: 0.3, muted: false, voices: 0.4, effects: 0.65 }); writeAudio(s, { volume: 0.3, muted: false }); assert.deepEqual(readAudio(s), { volume: 0.3, muted: false }, 'un salvataggio di prima delle voci resta valido'); s.setItem('leggenda-regolo-audio', '{rotto'); assert.equal(readAudio(s), null); }); test('la partita va in un file e torna indietro uguale; un file qualsiasi non si carica', () => { const state = { scene: 'piazza', x: 300, y: 340, facing: -1, inventory: ['chiave'], flags: { 'visto:piazza': true }, used: {}, ended: false }; const date = new Date(2007, 4, 27, 9, 5); assert.deepEqual(readSaveFile(saveFile(state, date)), { state }); assert.equal(saveFileName(date), 'regolo-2007-05-27-0905.json'); const not = { error: 'not-save' }, env = extra => JSON.stringify({ game: 'la-leggenda-del-regolo', version: 1, state, ...extra }); assert.deepEqual(readSaveFile('{non è json'), not); assert.deepEqual(readSaveFile(JSON.stringify(state)), not, 'senza la busta del gioco no'); assert.deepEqual(readSaveFile(JSON.stringify({ game: 'altro-gioco', version: 1, state })), not); assert.deepEqual(readSaveFile(env({ state: [] })), not); assert.deepEqual(readSaveFile(env({ version: undefined })), not, 'senza versione no'); assert.deepEqual(readSaveFile(env({ version: 2 })), { error: 'newer' }, 'da una versione più nuova no'); });