Files
core2026/app/game-api/test/commandInput.test.ts
T

58 lines
2.2 KiB
TypeScript

import {
GENERAL_TURN_COMMAND_KEYS,
NATION_TURN_COMMAND_KEYS,
loadGeneralTurnCommandSpecs,
loadNationTurnCommandSpecs,
} from '@sammo-ts/logic';
import { describe, expect, it } from 'vitest';
import {
buildTurnCommandInputFields,
parseReservedTurnArgs,
} from '../src/turns/commandInput.js';
describe('turn command argument input', () => {
it('builds supported fields for every argument-bearing command module', async () => {
const [general, nation] = await Promise.all([
loadGeneralTurnCommandSpecs([...GENERAL_TURN_COMMAND_KEYS]),
loadNationTurnCommandSpecs([...NATION_TURN_COMMAND_KEYS]),
]);
const argumentSpecs = [...general, ...nation].filter((spec) => spec.reqArg);
const fields = argumentSpecs.map((spec) => ({
key: spec.key,
fields: buildTurnCommandInputFields(spec),
}));
expect(argumentSpecs).toHaveLength(44);
expect(fields.every((entry) => entry.fields.length > 0)).toBe(true);
expect(fields.find((entry) => entry.key === 'che_화계')?.fields).toMatchObject([
{ key: 'destCityId', kind: 'select', optionSource: 'cities' },
]);
expect(fields.find((entry) => entry.key === 'che_물자원조')?.fields).toMatchObject([
{ key: 'destNationId', kind: 'select', optionSource: 'nations' },
{ key: 'amountList', kind: 'numberTuple' },
]);
});
it('normalizes valid arguments and rejects malformed or wrong-scope commands', async () => {
await expect(parseReservedTurnArgs('general', 'che_화계', { destCityId: 7 })).resolves.toEqual({
destCityId: 7,
});
await expect(parseReservedTurnArgs('general', 'che_화계', { destCityId: '7' })).rejects.toBeDefined();
await expect(
parseReservedTurnArgs('nation', 'che_포상', {
isGold: true,
amount: 200,
destGeneralId: 7,
})
).resolves.toEqual({
isGold: true,
amount: 200,
destGeneralId: 7,
});
await expect(parseReservedTurnArgs('general', 'che_포상', {})).rejects.toThrow(
'Unknown general turn command'
);
});
});