88 lines
2.5 KiB
TypeScript
88 lines
2.5 KiB
TypeScript
import { content } from "@deadhead/content";
|
|
import { describe, expect, it } from "vitest";
|
|
import {
|
|
createDispatchRecord,
|
|
MS_PER_HOUR,
|
|
travelTimeGameHours,
|
|
type Contract,
|
|
type RecordInput,
|
|
} from "../src/index";
|
|
|
|
/** Fuel enough for any leg in these tests (decision 0.5.94), bought at 10 cr/fu. */
|
|
const PLENTY = { fuelFu: 10_000, avgPrice: 10 };
|
|
|
|
const now = Date.parse("2100-01-01T00:30:00Z");
|
|
const contract: Contract = {
|
|
id: "c1",
|
|
originId: "earth",
|
|
destinationId: "moon",
|
|
cargoTypeId: "standard",
|
|
goodId: "consumer-goods",
|
|
shipper: "Pacific Orbital Logistics",
|
|
priority: false,
|
|
deliveryWindowGameHours: null,
|
|
tier: 0,
|
|
massTonnes: 10,
|
|
payout: 2000,
|
|
requiredSkill: null,
|
|
requiredLongHaulLevel: 0,
|
|
offeredAt: Date.parse("2100-01-01T00:00:00Z"),
|
|
expiresAt: Date.parse("2100-01-01T01:00:00Z"),
|
|
firstContact: false,
|
|
};
|
|
const input: RecordInput = {
|
|
id: "d1",
|
|
ship: { id: "s1", modelId: "courier", locationId: "earth", inFlight: false, tank: PLENTY },
|
|
pilot: {
|
|
id: "p1",
|
|
isAvatar: false,
|
|
assignedShipId: "s1",
|
|
inFlight: false,
|
|
skills: {},
|
|
restEndsAt: null,
|
|
},
|
|
contract,
|
|
tutorial: false,
|
|
now,
|
|
worldSeed: 7,
|
|
};
|
|
|
|
describe("dispatch record", () => {
|
|
it("arrives after exactly the travel time converted to real time", () => {
|
|
const record = createDispatchRecord(input, content);
|
|
const courier = content.shipModel("courier")!;
|
|
const travelGameMs =
|
|
travelTimeGameHours(courier, record.distanceMillionKm, contract.massTonnes, content.config) *
|
|
MS_PER_HOUR;
|
|
expect(record.arrivalAt - record.departureAt).toBe(
|
|
Math.round(travelGameMs / content.config.timeCompression),
|
|
);
|
|
});
|
|
|
|
it("copies the route, payout and parties, and charges fuel", () => {
|
|
const record = createDispatchRecord(input, content);
|
|
expect(record).toMatchObject({
|
|
id: "d1",
|
|
shipId: "s1",
|
|
pilotId: "p1",
|
|
originId: "earth",
|
|
destinationId: "moon",
|
|
departureAt: now,
|
|
expectedPayout: 2000,
|
|
tutorial: false,
|
|
});
|
|
expect(record.fuelCost).toBeGreaterThan(0);
|
|
});
|
|
|
|
it("charges no fuel on a tutorial run", () => {
|
|
expect(createDispatchRecord({ ...input, tutorial: true }, content).fuelCost).toBe(0);
|
|
});
|
|
|
|
it("is identical for identical inputs and seeded per dispatch", () => {
|
|
expect(createDispatchRecord(input, content)).toEqual(createDispatchRecord(input, content));
|
|
expect(createDispatchRecord({ ...input, id: "d2" }, content).seed).not.toBe(
|
|
createDispatchRecord(input, content).seed,
|
|
);
|
|
});
|
|
});
|