27 lines
1.1 KiB
JavaScript
27 lines
1.1 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { validateScenario } from '../../src/core/scenario.js';
|
|
import afterimage from '../../src/scenarios/afterimage.js';
|
|
import { getRulePack } from '../../src/dice/rulepacks/index.js';
|
|
|
|
describe('scenario validation', () => {
|
|
it('flags missing required fields', () => {
|
|
expect(validateScenario(null)).toContain('scenario must be an object');
|
|
const errs = validateScenario({ meta: {}, timeline: [] });
|
|
expect(errs).toContain('meta.id required');
|
|
expect(errs).toContain('meta.system required');
|
|
expect(errs).toContain('timeline must be a non-empty array');
|
|
});
|
|
|
|
it('flags a beat missing targetMin', () => {
|
|
const errs = validateScenario({ meta: { id: 'x', system: 'year-zero' }, timeline: [{ id: 'a' }] });
|
|
expect(errs).toContain('timeline[0].targetMin must be a number');
|
|
});
|
|
|
|
it('accepts the AFTERIMAGE pilot and its system resolves', () => {
|
|
expect(validateScenario(afterimage)).toEqual([]);
|
|
expect(afterimage.meta.system).toBe('year-zero');
|
|
expect(getRulePack(afterimage.meta.system)).not.toBe(null);
|
|
expect(afterimage.timeline.length).toBeGreaterThan(3);
|
|
});
|
|
});
|