import { describe, it, expect } from 'vitest'; import { opponentStartPosition, deserializePhantoms } from '../src/phantoms.js'; describe('opponentStartPosition', () => { it('seeds 16 black pieces on ranks 7-8', () => { const p = opponentStartPosition('b'); expect(Object.keys(p).length).toBe(16); expect(p.e8).toEqual({ color: 'b', type: 'k' }); expect(p.d8).toEqual({ color: 'b', type: 'q' }); expect(p.a8).toEqual({ color: 'b', type: 'r' }); expect(p.h7).toEqual({ color: 'b', type: 'p' }); }); it('seeds 16 white pieces on ranks 1-2', () => { const p = opponentStartPosition('w'); expect(Object.keys(p).length).toBe(16); expect(p.e1).toEqual({ color: 'w', type: 'k' }); expect(p.a2).toEqual({ color: 'w', type: 'p' }); }); }); describe('deserializePhantoms', () => { it('returns {} for null or invalid JSON', () => { expect(deserializePhantoms(null)).toEqual({}); expect(deserializePhantoms('not json')).toEqual({}); expect(deserializePhantoms('[]')).toEqual({}); }); it('keeps valid entries and drops invalid ones', () => { const raw = JSON.stringify({ e5: { color: 'b', type: 'n' }, zz: { color: 'b', type: 'p' }, // invalid square a1: { color: 'x', type: 'p' }, // invalid colour b2: { color: 'b', type: 'z' }, // invalid type }); expect(deserializePhantoms(raw)).toEqual({ e5: { color: 'b', type: 'n' } }); }); });