139 lines
5.1 KiB
TypeScript
139 lines
5.1 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
findTurnDifferentialWorkspaceRoot,
|
|
runReferenceTurnCommandTraceRequest,
|
|
} from '../src/turn-differential/referenceSnapshot.js';
|
|
|
|
const configuredWorkspaceRoot = process.env.TURN_DIFFERENTIAL_WORKSPACE_ROOT;
|
|
const workspaceRoot = configuredWorkspaceRoot ?? findTurnDifferentialWorkspaceRoot(process.cwd());
|
|
const integration = describe.skipIf(!workspaceRoot || process.env.TURN_DIFFERENTIAL_REFERENCE !== '1');
|
|
|
|
const baseSetup = (state: number, term: number) => ({
|
|
isolateWorld: true,
|
|
world: { year: 190, month: 3 },
|
|
nations: [
|
|
{ id: 1, name: '수락국', capitalCityId: 1 },
|
|
{ id: 2, name: '제안국', capitalCityId: 2 },
|
|
],
|
|
cities: [
|
|
{ id: 1, nationId: 1, supplyState: 1, frontState: 1 },
|
|
{ id: 2, nationId: 2, supplyState: 1, frontState: 1 },
|
|
],
|
|
generals: [
|
|
{ id: 1, name: '수락장수', nationId: 1, cityId: 1, officerLevel: 5 },
|
|
{ id: 2, name: '제안장수', nationId: 2, cityId: 2, officerLevel: 5 },
|
|
],
|
|
diplomacy: [
|
|
{ fromNationId: 1, toNationId: 2, state, term },
|
|
{ fromNationId: 2, toNationId: 1, state, term },
|
|
],
|
|
});
|
|
|
|
const observe = {
|
|
generalIds: [1, 2],
|
|
nationIds: [1, 2],
|
|
cityIds: [1, 2],
|
|
logAfterId: 0,
|
|
messageAfterId: 0,
|
|
};
|
|
|
|
const addedLogs = (trace: ReturnType<typeof runReferenceTurnCommandTraceRequest>) =>
|
|
trace.after.logs.filter((log) => Number(log.id) > trace.before.watermarks.logId);
|
|
|
|
integration('legacy instant diplomacy responses', () => {
|
|
it('accepts non-aggression without RNG and copies received assistance', () => {
|
|
const setup = baseSetup(2, 0);
|
|
setup.nations[1] = {
|
|
...setup.nations[1],
|
|
nationEnv: { recv_assist: { n1: [1, 37] } },
|
|
} as (typeof setup.nations)[number];
|
|
const trace = runReferenceTurnCommandTraceRequest(workspaceRoot!, {
|
|
kind: 'instantNation',
|
|
actorGeneralId: 1,
|
|
action: 'che_불가침수락',
|
|
args: { destNationID: 2, destGeneralID: 2, year: 191, month: 2 },
|
|
setup,
|
|
observe,
|
|
});
|
|
|
|
expect(trace.execution).toMatchObject({
|
|
kind: 'instantNation',
|
|
action: 'che_불가침수락',
|
|
seedDomain: 'none',
|
|
});
|
|
expect(trace.rng).toEqual([]);
|
|
expect(trace.after.diplomacy).toEqual([
|
|
expect.objectContaining({ fromNationId: 1, toNationId: 2, state: 7, term: 12 }),
|
|
expect.objectContaining({ fromNationId: 2, toNationId: 1, state: 7, term: 12 }),
|
|
]);
|
|
expect(trace.after.nations[1]).toMatchObject({
|
|
meta: {
|
|
recv_assist: { n1: [1, 37] },
|
|
resp_assist: { n1: [1, 37] },
|
|
},
|
|
});
|
|
expect(addedLogs(trace).map((log) => [log.generalId, log.category])).toEqual([
|
|
[1, 'history'],
|
|
[1, 'action'],
|
|
[2, 'history'],
|
|
[2, 'action'],
|
|
]);
|
|
});
|
|
|
|
it('accepts non-aggression cancellation with legacy grouped log order', () => {
|
|
const trace = runReferenceTurnCommandTraceRequest(workspaceRoot!, {
|
|
kind: 'instantNation',
|
|
actorGeneralId: 1,
|
|
action: 'che_불가침파기수락',
|
|
args: { destNationID: 2, destGeneralID: 2 },
|
|
setup: baseSetup(7, 12),
|
|
observe,
|
|
});
|
|
|
|
expect(trace.rng).toEqual([]);
|
|
expect(trace.after.diplomacy).toEqual([
|
|
expect.objectContaining({ fromNationId: 1, toNationId: 2, state: 2, term: 0 }),
|
|
expect.objectContaining({ fromNationId: 2, toNationId: 1, state: 2, term: 0 }),
|
|
]);
|
|
expect(addedLogs(trace).map((log) => [log.generalId, log.category])).toEqual([
|
|
[1, 'history'],
|
|
[1, 'action'],
|
|
[0, 'history'],
|
|
[2, 'history'],
|
|
[2, 'action'],
|
|
]);
|
|
expect(addedLogs(trace)[2]?.text).toContain('수락장수');
|
|
});
|
|
|
|
it('accepts stop-war and recalculates both nations fronts', () => {
|
|
const setup = baseSetup(0, 6);
|
|
setup.diplomacy[1] = { fromNationId: 2, toNationId: 1, state: 1, term: 6 };
|
|
const trace = runReferenceTurnCommandTraceRequest(workspaceRoot!, {
|
|
kind: 'instantNation',
|
|
actorGeneralId: 1,
|
|
action: 'che_종전수락',
|
|
args: { destNationID: 2, destGeneralID: 2 },
|
|
setup,
|
|
observe,
|
|
});
|
|
|
|
expect(trace.rng).toEqual([]);
|
|
expect(trace.after.diplomacy).toEqual([
|
|
expect.objectContaining({ fromNationId: 1, toNationId: 2, state: 2, term: 0 }),
|
|
expect.objectContaining({ fromNationId: 2, toNationId: 1, state: 2, term: 0 }),
|
|
]);
|
|
expect(trace.after.cities).toEqual([
|
|
expect.objectContaining({ id: 1, frontState: 2 }),
|
|
expect.objectContaining({ id: 2, frontState: 2 }),
|
|
]);
|
|
expect(addedLogs(trace).map((log) => [log.generalId, log.category])).toEqual([
|
|
[1, 'history'],
|
|
[1, 'action'],
|
|
[0, 'history'],
|
|
[2, 'history'],
|
|
[2, 'action'],
|
|
]);
|
|
});
|
|
});
|