feat(content): add action costs and multi-yield schema

This commit is contained in:
ginnoir
2026-06-11 18:16:26 -05:00
parent 458a795014
commit ee3d463c9c
9 changed files with 85 additions and 18 deletions
+55 -3
View File
@@ -3,7 +3,12 @@ import { buildContent } from '../schema';
const validResources = [{ id: 'gold', name: 'Gold' }];
const validActions = [
{ id: 'forage', name: 'Forage', durationMs: 3000, yields: { resourceId: 'gold', amount: 1 } },
{
id: 'forage',
name: 'Forage',
durationMs: 3000,
yields: [{ resourceId: 'gold', amount: 1 }],
},
];
describe('buildContent()', () => {
@@ -24,7 +29,7 @@ describe('buildContent()', () => {
id: 'forage',
name: 'Forage',
durationMs: 3000,
yields: { resourceId: 'ghost', amount: 1 },
yields: [{ resourceId: 'ghost', amount: 1 }],
},
];
expect(() => buildContent({ resources: validResources, actions })).toThrow(/unknown resource/i);
@@ -40,8 +45,55 @@ describe('buildContent()', () => {
it('rejects a structurally invalid definition', () => {
const actions = [
{ id: 'forage', name: 'Forage', durationMs: -1, yields: { resourceId: 'gold', amount: 1 } },
{
id: 'forage',
name: 'Forage',
durationMs: -1,
yields: [{ resourceId: 'gold', amount: 1 }],
},
];
expect(() => buildContent({ resources: validResources, actions })).toThrow();
});
});
describe('costs and multi-yield', () => {
it('accepts optional costs and multiple yields', () => {
const resources = [
{ id: 'gold', name: 'Gold' },
{ id: 'wood', name: 'Wood' },
];
const actions = [
{
id: 'craft',
name: 'Craft',
durationMs: 1000,
costs: [{ resourceId: 'wood', amount: 2 }],
yields: [
{ resourceId: 'gold', amount: 1 },
{ resourceId: 'wood', amount: 1 },
],
},
];
const content = buildContent({ resources, actions });
expect(content.actionsById.craft.costs).toEqual([{ resourceId: 'wood', amount: 2 }]);
expect(content.actionsById.craft.yields).toHaveLength(2);
});
it('rejects cost referencing unknown resource', () => {
const actions = [
{
id: 'craft',
name: 'Craft',
durationMs: 1000,
costs: [{ resourceId: 'ghost', amount: 1 }],
yields: [{ resourceId: 'gold', amount: 1 }],
},
];
expect(() => buildContent({ resources: validResources, actions })).toThrow(/unknown resource/i);
});
it('defaults costs to empty array', () => {
const content = buildContent({ resources: validResources, actions: validActions });
expect(content.actionsById.forage.costs).toEqual([]);
});
});