airship-phaser-deploy/tests/progression.test.mjs

69 lines
2.6 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
bestAffordableMarketUpgrade,
buyAndInstallModule,
collectSalvage,
createStarterProgression,
deriveShipStats,
installModule,
salvageForPirate,
} from '../src/progression/ship-loadout.js';
test('starter loadout preserves current ship combat and handling values', () => {
const progression = createStarterProgression();
const stats = deriveShipStats(progression.loadout);
assert.equal(stats.maxHull, 100);
assert.equal(stats.maxSpeed, 180);
assert.equal(stats.turnRate, 76);
assert.equal(stats.reloadMs, 850);
assert.equal(stats.cannonDamage, 16);
});
test('installed modules derive meaningful ship stat changes', () => {
const progression = installModule(createStarterProgression(), 'corsair-overdrive');
const stats = deriveShipStats(progression.loadout);
assert.equal(stats.maxSpeed, 214);
assert.equal(stats.acceleration, 110);
assert.equal(stats.turnRate, 71);
});
test('port purchase deducts credits and installs the module', () => {
const starter = createStarterProgression();
const result = buyAndInstallModule(starter, 'tuned-propellers');
assert.equal(result.purchased, false);
const funded = { ...starter, credits: 1000 };
const fundedResult = buyAndInstallModule(funded, 'tuned-propellers');
assert.equal(fundedResult.purchased, true);
assert.equal(fundedResult.credits, funded.credits - 800);
assert.equal(fundedResult.loadout.engine, 'tuned-propellers');
});
test('pirate salvage is deterministic and collectible within salvage capacity', () => {
const salvageA = salvageForPirate({ seed: 'WORLD', classKey: 'captain', wave: 4, sequence: 2 });
const salvageB = salvageForPirate({ seed: 'WORLD', classKey: 'captain', wave: 4, sequence: 2 });
assert.deepEqual(salvageA, salvageB);
const starter = createStarterProgression();
const collected = collectSalvage(starter, salvageA);
assert.ok(collected.credits >= starter.credits);
assert.ok(collected.scrap >= starter.scrap);
});
test('market can select an affordable upgrade for a port', () => {
const starter = createStarterProgression();
const upgrade = bestAffordableMarketUpgrade(starter, { type: 'military' });
assert.ok(upgrade);
assert.ok(upgrade.price <= starter.credits);
});
test('rudder tier matches shipyard art and improves handling', () => {
const starter = { ...createStarterProgression(), credits: 650 };
const result = buyAndInstallModule(starter, 'reinforced-rudder');
const stats = deriveShipStats(result.loadout);
assert.equal(result.purchased, true);
assert.equal(result.credits, 250);
assert.equal(stats.turnRate, 88);
});