test: cover material aid accumulation and officer logs
This commit is contained in:
@@ -14,6 +14,10 @@ const integration = describe.skipIf(!workspaceRoot || process.env.TURN_DIFFERENT
|
|||||||
const readGold = (row: { gold?: unknown } | undefined): number => (typeof row?.gold === 'number' ? row.gold : 0);
|
const readGold = (row: { gold?: unknown } | undefined): number => (typeof row?.gold === 'number' ? row.gold : 0);
|
||||||
const readNationResource = (row: { gold?: unknown; rice?: unknown } | undefined, resource: 'gold' | 'rice'): number =>
|
const readNationResource = (row: { gold?: unknown; rice?: unknown } | undefined, resource: 'gold' | 'rice'): number =>
|
||||||
typeof row?.[resource] === 'number' ? row[resource] : 0;
|
typeof row?.[resource] === 'number' ? row[resource] : 0;
|
||||||
|
const readNationMeta = (row: { meta?: unknown } | undefined): Record<string, unknown> =>
|
||||||
|
typeof row?.meta === 'object' && row.meta !== null && !Array.isArray(row.meta)
|
||||||
|
? (row.meta as Record<string, unknown>)
|
||||||
|
: {};
|
||||||
const NPC_SEIZURE_MESSAGE_TEXT = '몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...';
|
const NPC_SEIZURE_MESSAGE_TEXT = '몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...';
|
||||||
|
|
||||||
const ignoredLifecyclePaths = [
|
const ignoredLifecyclePaths = [
|
||||||
@@ -182,6 +186,17 @@ const buildRequest = (
|
|||||||
{ ...general(1, 1, 3, 12), ...fixturePatches.generals?.[1] },
|
{ ...general(1, 1, 3, 12), ...fixturePatches.generals?.[1] },
|
||||||
{ ...general(2, 2, 70, 12), ...fixturePatches.generals?.[2] },
|
{ ...general(2, 2, 70, 12), ...fixturePatches.generals?.[2] },
|
||||||
{ ...general(3, 1, 3, 1), ...fixturePatches.generals?.[3] },
|
{ ...general(3, 1, 3, 1), ...fixturePatches.generals?.[3] },
|
||||||
|
...Object.entries(fixturePatches.generals ?? {})
|
||||||
|
.filter(([id]) => !['1', '2', '3'].includes(id))
|
||||||
|
.map(([id, patch]) => ({
|
||||||
|
...general(
|
||||||
|
Number(id),
|
||||||
|
typeof patch.nationId === 'number' ? patch.nationId : 0,
|
||||||
|
typeof patch.cityId === 'number' ? patch.cityId : 3,
|
||||||
|
typeof patch.officerLevel === 'number' ? patch.officerLevel : 1
|
||||||
|
),
|
||||||
|
...patch,
|
||||||
|
})),
|
||||||
],
|
],
|
||||||
...(fixturePatches.troops ? { troops: fixturePatches.troops } : {}),
|
...(fixturePatches.troops ? { troops: fixturePatches.troops } : {}),
|
||||||
...(fixturePatches.randomFoundingCandidateCityIds
|
...(fixturePatches.randomFoundingCandidateCityIds
|
||||||
@@ -1028,3 +1043,108 @@ integration('nation material aid target and input constraints', () => {
|
|||||||
120_000
|
120_000
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
integration('nation material aid accumulated assistance and officer logs', () => {
|
||||||
|
it.each([
|
||||||
|
{
|
||||||
|
name: 'array entry',
|
||||||
|
priorEntry: [1, 250],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'legacy object entry',
|
||||||
|
priorEntry: { 0: 1, 1: 250 },
|
||||||
|
},
|
||||||
|
])(
|
||||||
|
'accumulates a repeated aid amount from an existing $name',
|
||||||
|
async ({ priorEntry }) => {
|
||||||
|
const request = buildRequest(
|
||||||
|
'che_물자원조',
|
||||||
|
{
|
||||||
|
destNationID: 2,
|
||||||
|
amountList: [100, 200],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nations: {
|
||||||
|
2: {
|
||||||
|
nationEnv: {
|
||||||
|
recv_assist: {
|
||||||
|
n1: priorEntry,
|
||||||
|
n9: [9, 400],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
const reference = runReferenceTurnCommandTraceRequest(
|
||||||
|
workspaceRoot!,
|
||||||
|
request as unknown as Record<string, unknown>
|
||||||
|
);
|
||||||
|
const core = await runCoreTurnCommandTrace(request, reference.before);
|
||||||
|
const referenceDest = reference.after.nations.find((entry) => entry.id === 2);
|
||||||
|
const coreDest = core.after.nations.find((entry) => entry.id === 2);
|
||||||
|
|
||||||
|
expect(readNationMeta(referenceDest).recv_assist).toEqual({
|
||||||
|
n1: [1, 550],
|
||||||
|
n9: [9, 400],
|
||||||
|
});
|
||||||
|
expect(readNationMeta(coreDest).recv_assist).toEqual(readNationMeta(referenceDest).recv_assist);
|
||||||
|
expect(core.rng).toEqual(reference.rng);
|
||||||
|
expect(
|
||||||
|
compareTurnSnapshotDeltas(reference.before, reference.after, core.before, core.after, {
|
||||||
|
ignoredPathPatterns: ignoredLifecyclePaths,
|
||||||
|
})
|
||||||
|
).toEqual([]);
|
||||||
|
},
|
||||||
|
120_000
|
||||||
|
);
|
||||||
|
|
||||||
|
it('notifies eligible officers in both nations with the legacy messages', async () => {
|
||||||
|
const request = buildRequest(
|
||||||
|
'che_물자원조',
|
||||||
|
{
|
||||||
|
destNationID: 2,
|
||||||
|
amountList: [100, 200],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
generals: {
|
||||||
|
3: { officerLevel: 5 },
|
||||||
|
5: { nationId: 2, cityId: 70, officerLevel: 5, officerCityId: 70 },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
const reference = runReferenceTurnCommandTraceRequest(
|
||||||
|
workspaceRoot!,
|
||||||
|
request as unknown as Record<string, unknown>
|
||||||
|
);
|
||||||
|
const core = await runCoreTurnCommandTrace(request, reference.before);
|
||||||
|
const referenceLogs = reference.after.logs.slice(reference.before.logs.length);
|
||||||
|
const sourceOfficerLog = {
|
||||||
|
generalId: 3,
|
||||||
|
text: expect.stringContaining('<D><b>타국</b></>으로 금<C>100</> 쌀<C>200</>을 지원했습니다.'),
|
||||||
|
};
|
||||||
|
const destinationOfficerLog = {
|
||||||
|
generalId: 5,
|
||||||
|
text: expect.stringContaining('<D><b>아국</b></>에서 금<C>100</> 쌀<C>200</>을 원조했습니다.'),
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(referenceLogs).toEqual(
|
||||||
|
expect.arrayContaining([
|
||||||
|
expect.objectContaining(sourceOfficerLog),
|
||||||
|
expect.objectContaining(destinationOfficerLog),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
expect(core.after.logs).toEqual(
|
||||||
|
expect.arrayContaining([
|
||||||
|
expect.objectContaining(sourceOfficerLog),
|
||||||
|
expect.objectContaining(destinationOfficerLog),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
expect(core.rng).toEqual(reference.rng);
|
||||||
|
expect(
|
||||||
|
compareTurnSnapshotDeltas(reference.before, reference.after, core.before, core.after, {
|
||||||
|
ignoredPathPatterns: ignoredLifecyclePaths,
|
||||||
|
})
|
||||||
|
).toEqual([]);
|
||||||
|
}, 120_000);
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user