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: '랜덤 임관만 가능합니다', }); }); });