51 lines
1.6 KiB
JavaScript
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);
|
|
});
|