/** The browser side of #166: one stored entry per project and area, cleared per asset or per project. */ import { describe, expect, it } from 'vitest'; import { clearSaved, hasSaved, saveArea, saveKey } from '../../src/editor/saves'; function memoryStore() { const items = new Map(); return { items, getItem: (key: string) => items.get(key) ?? null, setItem: (key: string, value: string) => void items.set(key, value), removeItem: (key: string) => void items.delete(key), }; } describe('save areas', () => { it('keep projects and areas apart', () => { const store = memoryStore(); saveArea('p1', 'play', store).write({ a: { score: 1 } }); saveArea('p1', 'editor', store).write({ a: { score: 2 } }); saveArea('p2', 'play', store).write({ a: { score: 3 } }); expect(saveArea('p1', 'play', store).read()).toEqual({ a: { score: 1 } }); expect(saveArea('p1', 'editor', store).read()).toEqual({ a: { score: 2 } }); expect(saveArea('p2', 'play', store).read()).toEqual({ a: { score: 3 } }); }); it('leave an asset the run does not write as it was', () => { const store = memoryStore(); const area = saveArea('p1', 'play', store); area.write({ a: { score: 1 }, b: { coins: 4 } }); area.write({ a: { score: 2 } }); expect(area.read()).toEqual({ a: { score: 2 }, b: { coins: 4 } }); }); it('read an unreadable entry as nothing saved', () => { const store = memoryStore(); store.setItem(saveKey('p1', 'play'), '{broken'); expect(saveArea('p1', 'play', store).read()).toEqual({}); store.setItem(saveKey('p1', 'play'), JSON.stringify({ a: 5, b: { score: 1 } })); expect(saveArea('p1', 'play', store).read()).toEqual({ b: { score: 1 } }); }); it('keep working without storage', () => { const area = saveArea('p1', 'play', null); area.write({ a: { score: 1 } }); expect(area.read()).toEqual({}); }); }); describe('clearing saved data', () => { it('forgets one asset in both areas and keeps the others', () => { const store = memoryStore(); saveArea('p1', 'play', store).write({ a: { score: 1 }, b: { coins: 4 } }); saveArea('p1', 'editor', store).write({ a: { score: 2 } }); clearSaved('p1', 'a', store); expect(saveArea('p1', 'play', store).read()).toEqual({ b: { coins: 4 } }); expect(hasSaved('p1', 'a', store)).toBe(false); expect(store.items.has(saveKey('p1', 'editor'))).toBe(false); }); it('forgets the whole project and leaves other projects alone', () => { const store = memoryStore(); saveArea('p1', 'play', store).write({ a: { score: 1 } }); saveArea('p1', 'editor', store).write({ a: { score: 2 } }); saveArea('p2', 'play', store).write({ a: { score: 3 } }); expect(hasSaved('p1', undefined, store)).toBe(true); clearSaved('p1', undefined, store); expect(hasSaved('p1', undefined, store)).toBe(false); expect(hasSaved('p2', undefined, store)).toBe(true); }); });