Files
tts-workshop/packages/tabletop/src/setup.test.ts
T
hypercross cd08e6af04 feat(tabletop): add state, setup, mounting, and stacking
Implement the tabletop library's game state store, setup seeding with
bare-type expansion, surface mount tree resolution, part placement, and
the stacking positioning process with a dependency-free SVG path helper.
Wire the public API and add unit plus vite integration tests.
2026-08-09 22:34:18 +08:00

55 lines
1.8 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import type { Package } from '@tts/bgm';
import { expandSetupValue, seedFromSetup } from './setup.js';
const pkg: Package = {
meta: { id: 'harbor' },
parts: new Map([
['token#wood', { type: 'token', id: 'wood' }],
['token#grain', { type: 'token', id: 'grain' }],
['card#fleet', { type: 'card', id: 'fleet' }],
]),
surfaces: new Map([
['board#harbor', { type: 'board', id: 'harbor', layout: [] }],
['hud#hand', { type: 'hud', id: 'hand', layout: [] }],
]),
setups: new Map(),
};
describe('expandSetupValue', () => {
it('keeps a full part id', () => {
expect(expandSetupValue(pkg, 'harbor:card#fleet')).toEqual(['harbor:card#fleet']);
});
it('expands a bare type to all parts of that type', () => {
expect(expandSetupValue(pkg, 'harbor:token')).toEqual(['harbor:token#wood', 'harbor:token#grain']);
});
it('expands each entry of a list', () => {
expect(expandSetupValue(pkg, ['harbor:card#fleet', 'harbor:token'])).toEqual([
'harbor:card#fleet',
'harbor:token#wood',
'harbor:token#grain',
]);
});
});
describe('seedFromSetup', () => {
it('enables listed surfaces and places parts', () => {
const setup = {
type: 'game',
id: 'main',
surfaces: ['board#harbor'],
setup: { '/deck': 'harbor:card#fleet' },
};
const state = seedFromSetup(pkg, setup);
expect(state.surfaces).toEqual({ 'board#harbor': true });
expect(state.paths).toEqual({ '/deck': ['harbor:card#fleet'] });
});
it('enables all surfaces when omitted', () => {
const setup = { type: 'game', id: 'main', setup: {} };
const state = seedFromSetup(pkg, setup);
expect(state.surfaces).toEqual({ 'board#harbor': true, 'hud#hand': true });
});
});