From c774a19826cc5639022337df020e7a9d0287c574 Mon Sep 17 00:00:00 2001 From: hided62 Date: Sun, 26 Jul 2026 01:44:17 +0000 Subject: [PATCH] test: cover nation research commands --- .../turn-state-differential-testing.md | 8 +++--- .../src/actions/turn/nation/che_물자원조.ts | 13 +++------ .../test/actions/turn/nationMissing.test.ts | 2 +- ...urnCommandNationMatrix.integration.test.ts | 27 ++++++++++++++++++- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/docs/architecture/turn-state-differential-testing.md b/docs/architecture/turn-state-differential-testing.md index d639f25..d2c7675 100644 --- a/docs/architecture/turn-state-differential-testing.md +++ b/docs/architecture/turn-state-differential-testing.md @@ -62,8 +62,8 @@ normalized to the core `*Id` spelling before command identity comparison. The matrix includes the four-call `전투태세` path, lifecycle and appointment commands, troop assembly, rebellion and all three founding variants. - - `turnCommandNationMatrix.integration.test.ts`: 8 successful nation - command paths. + - `turnCommandNationMatrix.integration.test.ts`: 26 successful nation + command paths, including all nine unit-research commands. - `turnCommandCoreReference.integration.test.ts`: declaration and live sortie fixtures. @@ -168,11 +168,11 @@ Compatibility is established per case only when: 4. live sortie also passes the battle trace comparison; 5. any ignored path is documented in the case evidence. -As of 2026-07-25, 54 general matrix cases, 8 nation matrix cases, declaration +As of 2026-07-26, 54 general matrix cases, 26 nation matrix cases, declaration and live sortie pass this boundary. Live sortie is the remaining general command key and covers battle entry, conquest, defeated-general neutralization and last-city nation collapse. Thus all 55 general command keys have a -completed success-path comparison. This is 64 executable comparison cases; +completed success-path comparison. This is 82 executable comparison cases; it is not yet a claim that failure/boundary paths or all 38 nation commands have been dynamically compared. diff --git a/packages/logic/src/actions/turn/nation/che_물자원조.ts b/packages/logic/src/actions/turn/nation/che_물자원조.ts index 3c72444..61f8bd0 100644 --- a/packages/logic/src/actions/turn/nation/che_물자원조.ts +++ b/packages/logic/src/actions/turn/nation/che_물자원조.ts @@ -137,16 +137,9 @@ export class ActionDefinition< : {}; const recvKey = `n${nation.id}`; const priorEntry = - typeof recvAssist[recvKey] === 'object' && - recvAssist[recvKey] !== null && - !Array.isArray(recvAssist[recvKey]) - ? recvAssist[recvKey] - : {}; - const priorAmount = Number(priorEntry['1'] ?? 0); - recvAssist[recvKey] = { - 0: nation.id, - 1: (Number.isFinite(priorAmount) ? priorAmount : 0) + actualGold + actualRice, - }; + typeof recvAssist[recvKey] === 'object' && recvAssist[recvKey] !== null ? recvAssist[recvKey] : {}; + const priorAmount = Number(Array.isArray(priorEntry) ? priorEntry[1] : (priorEntry['1'] ?? 0)); + recvAssist[recvKey] = [nation.id, (Number.isFinite(priorAmount) ? priorAmount : 0) + actualGold + actualRice]; const effects: Array> = [ createNationPatchEffect( diff --git a/packages/logic/test/actions/turn/nationMissing.test.ts b/packages/logic/test/actions/turn/nationMissing.test.ts index 01a4f2e..01209be 100644 --- a/packages/logic/test/actions/turn/nationMissing.test.ts +++ b/packages/logic/test/actions/turn/nationMissing.test.ts @@ -384,7 +384,7 @@ describe('Nation Missing Actions', () => { gold: 200, rice: 150, meta: expect.objectContaining({ - recv_assist: { n1: { 0: 1, 1: 150 } }, + recv_assist: { n1: [1, 150] }, }), }), }); diff --git a/tools/integration-tests/test/turnCommandNationMatrix.integration.test.ts b/tools/integration-tests/test/turnCommandNationMatrix.integration.test.ts index 964710d..c0e3b64 100644 --- a/tools/integration-tests/test/turnCommandNationMatrix.integration.test.ts +++ b/tools/integration-tests/test/turnCommandNationMatrix.integration.test.ts @@ -69,6 +69,22 @@ interface FixturePatches { randomFoundingCandidateCityIds?: number[]; } +type NationMatrixCase = [string, Record | undefined, FixturePatches?]; + +const researchCase = (action: string, command: string, term: number): NationMatrixCase => [ + action, + undefined, + { + nations: { + 1: { + turnLastByOfficerLevel: { + 12: { command, term }, + }, + }, + }, + }, +]; + const buildRequest = ( action: string, args?: Record, @@ -192,7 +208,7 @@ const buildRequest = ( }, }); -const cases: Array<[string, Record | undefined, FixturePatches?]> = [ +const cases: NationMatrixCase[] = [ ['휴식', undefined], ['che_포상', { isGold: true, amount: 100, destGeneralID: 3 }], ['che_선전포고', { destNationID: 2 }], @@ -282,6 +298,15 @@ const cases: Array<[string, Record | undefined, FixturePatches? randomFoundingCandidateCityIds: [70], }, ], + researchCase('event_원융노병연구', '원융노병 연구', 23), + researchCase('event_화시병연구', '화시병 연구', 11), + researchCase('event_음귀병연구', '음귀병 연구', 11), + researchCase('event_대검병연구', '대검병 연구', 11), + researchCase('event_화륜차연구', '화륜차 연구', 23), + researchCase('event_산저병연구', '산저병 연구', 11), + researchCase('event_극병연구', '극병 연구', 23), + researchCase('event_상병연구', '상병 연구', 23), + researchCase('event_무희연구', '무희 연구', 23), ]; integration('nation command success matrix', () => {