airship-phaser/tests/trade-traffic.test.mjs

51 lines
1.6 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { generateWorld } from '../src/world/world-generator.js';
import {
createMerchantTrafficPlans,
merchantPointOnRoute,
merchantRouteEndpoint,
} from '../src/world/trade-traffic.js';
test('merchant traffic plans are deterministic for a world seed', () => {
const world = generateWorld({ seed: 'MERCHANTS' });
assert.deepEqual(
createMerchantTrafficPlans(world),
createMerchantTrafficPlans(world),
);
});
test('merchant traffic plans reference generated trade routes and stay bounded', () => {
const world = generateWorld({ seed: 'ROUTES' });
const plans = createMerchantTrafficPlans(world, { maxShips: 12 });
const routeIds = new Set(world.tradeRoutes.map(({ id }) => id));
assert.ok(plans.length > 0);
assert.ok(plans.length <= 12);
for (const plan of plans) {
assert.ok(routeIds.has(plan.routeId));
assert.ok(plan.progress >= 0 && plan.progress <= 1);
assert.ok(plan.maxHull > 0);
assert.ok(plan.cargoValue > 0);
}
});
test('merchant route point applies lane offset perpendicular to the route', () => {
const route = {
from: { x: 0, y: 0 },
to: { x: 100, y: 0 },
};
const point = merchantPointOnRoute(route, 0.5, 20);
assert.deepEqual(point, { x: 50, y: 20 });
});
test('merchant route endpoint follows direction', () => {
const route = {
from: { x: 10, y: 20 },
to: { x: 110, y: 120 },
};
assert.deepEqual(merchantRouteEndpoint(route, 1, 0), route.to);
assert.deepEqual(merchantRouteEndpoint(route, -1, 0), route.from);
});