feat(shared): pure phantom-model helpers (seed positions, deserialize)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
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' } });
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user