140 lines
3.6 KiB
TypeScript
140 lines
3.6 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import type { CityRow, GeneralRow, NationRow, WorldStateRow } from '../src/context.js';
|
|
import { buildTurnCommandTable } from '../src/turns/commandTable.js';
|
|
|
|
const buildWorldState = (joinMode = 'full'): WorldStateRow =>
|
|
({
|
|
id: 1,
|
|
scenarioCode: 'default',
|
|
currentYear: 3,
|
|
currentMonth: 1,
|
|
tickSeconds: 600,
|
|
config: {
|
|
joinMode,
|
|
const: {
|
|
baseGold: 1000,
|
|
baseRice: 1000,
|
|
develCost: 100,
|
|
},
|
|
},
|
|
meta: {
|
|
scenarioMeta: {
|
|
startYear: 1,
|
|
},
|
|
},
|
|
updatedAt: new Date('2026-01-01T00:00:00Z'),
|
|
}) as unknown as WorldStateRow;
|
|
|
|
const buildGeneral = (): GeneralRow =>
|
|
({
|
|
id: 1,
|
|
name: 'TestGeneral',
|
|
nationId: 1,
|
|
cityId: 1,
|
|
troopId: 0,
|
|
leadership: 70,
|
|
strength: 60,
|
|
intel: 60,
|
|
experience: 0,
|
|
dedication: 0,
|
|
officerLevel: 6,
|
|
personalCode: null,
|
|
specialCode: null,
|
|
special2Code: null,
|
|
horseCode: null,
|
|
weaponCode: null,
|
|
bookCode: null,
|
|
itemCode: null,
|
|
injury: 0,
|
|
gold: 0,
|
|
rice: 0,
|
|
crew: 100,
|
|
crewTypeId: 1100,
|
|
train: 0,
|
|
atmos: 0,
|
|
age: 25,
|
|
npcState: 0,
|
|
meta: { killturn: 24 },
|
|
}) as unknown as GeneralRow;
|
|
|
|
const buildCity = (): CityRow =>
|
|
({
|
|
id: 1,
|
|
name: 'TestCity',
|
|
nationId: 1,
|
|
level: 5,
|
|
population: 100000,
|
|
populationMax: 200000,
|
|
agriculture: 1000,
|
|
agricultureMax: 2000,
|
|
commerce: 1000,
|
|
commerceMax: 2000,
|
|
security: 1000,
|
|
securityMax: 2000,
|
|
supplyState: 1,
|
|
frontState: 0,
|
|
defence: 0,
|
|
defenceMax: 0,
|
|
wall: 0,
|
|
wallMax: 0,
|
|
meta: {},
|
|
trust: 50,
|
|
trade: 0,
|
|
region: 0,
|
|
}) as unknown as CityRow;
|
|
|
|
const buildNation = (): NationRow =>
|
|
({
|
|
id: 1,
|
|
name: 'TestNation',
|
|
color: '#000000',
|
|
capitalCityId: 1,
|
|
gold: 0,
|
|
rice: 0,
|
|
level: 1,
|
|
typeCode: 'default',
|
|
tech: 0,
|
|
meta: {},
|
|
}) as unknown as NationRow;
|
|
|
|
describe('buildTurnCommandTable', () => {
|
|
it('uses min-condition constraints for availability', async () => {
|
|
const table = await buildTurnCommandTable({
|
|
worldState: buildWorldState(),
|
|
general: buildGeneral(),
|
|
city: buildCity(),
|
|
nation: buildNation(),
|
|
nationGenerals: null,
|
|
});
|
|
|
|
const nationCommand = table.nation
|
|
.flatMap((group) => group.values)
|
|
.find((command) => command.key === 'che_포상');
|
|
|
|
expect(nationCommand).toBeDefined();
|
|
expect(nationCommand?.possible).toBe(true);
|
|
expect(nationCommand?.status).not.toBe('blocked');
|
|
});
|
|
|
|
it('provides join_mode to reservation availability constraints', async () => {
|
|
const table = await buildTurnCommandTable({
|
|
worldState: buildWorldState('onlyRandom'),
|
|
general: buildGeneral(),
|
|
city: buildCity(),
|
|
nation: buildNation(),
|
|
nationGenerals: null,
|
|
});
|
|
|
|
const appointment = table.general
|
|
.flatMap((group) => group.values)
|
|
.find((command) => command.key === 'che_임관');
|
|
|
|
expect(appointment).toMatchObject({
|
|
possible: false,
|
|
status: 'blocked',
|
|
reason: '랜덤 임관만 가능합니다',
|
|
});
|
|
});
|
|
});
|