fix: v0.10.1 — dispatch pickers independent per accepted contract (placeholder default, no first-eligible auto-fallback; stale-select fix via explicit placeholder option)
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { dispatchSelection } from './RightPane';
|
||||
import type { ContractState, PlaneState } from '@/lib/game/state';
|
||||
|
||||
// v0.10.1 — the per-contract dispatch picker rule: a row's effective selection is the user's
|
||||
// explicit pick while it stays eligible (available AND at the contract origin), else NOTHING
|
||||
// (placeholder). The old "auto-track first eligible" fallback made every accepted-contract row
|
||||
// display the same plane, so selections looked shared across contracts.
|
||||
|
||||
const contract: ContractState = {
|
||||
id: 'contract-a',
|
||||
originIcao: 'EDDF',
|
||||
originName: 'Frankfurt Main',
|
||||
destIcao: 'EDDM',
|
||||
destName: 'Munich',
|
||||
reward: 1000,
|
||||
cargoType: 'mail',
|
||||
cargoCount: 4,
|
||||
deadlineSimTime: 1_000_000,
|
||||
status: 'accepted',
|
||||
planeId: null,
|
||||
createdSimTime: 0,
|
||||
};
|
||||
|
||||
function plane(over: Partial<PlaneState> & Pick<PlaneState, 'id'>): PlaneState {
|
||||
return {
|
||||
model: 'atr72',
|
||||
status: 'available',
|
||||
fuel: 100,
|
||||
maxFuel: 100,
|
||||
locationIcao: 'EDDF',
|
||||
locationName: 'Frankfurt Main',
|
||||
contractId: null,
|
||||
departureSimTime: null,
|
||||
lat: 50,
|
||||
lon: 8.5,
|
||||
...over,
|
||||
};
|
||||
}
|
||||
|
||||
describe('dispatchSelection (per-contract dispatch picker rule)', () => {
|
||||
it('defaults to the placeholder — no auto-selection of the first eligible plane', () => {
|
||||
const planes = [plane({ id: 'p1' }), plane({ id: 'p2' })]; // both eligible at EDDF
|
||||
expect(dispatchSelection(planes, contract, null)).toBeNull();
|
||||
});
|
||||
|
||||
it('returns the user pick while it stays eligible (available AND at the origin)', () => {
|
||||
const planes = [plane({ id: 'p1' }), plane({ id: 'p2', locationIcao: 'EDDM' })];
|
||||
expect(dispatchSelection(planes, contract, 'p1')?.id).toBe('p1');
|
||||
});
|
||||
|
||||
it('drops to the placeholder when a poll makes the pick ineligible (flew away)', () => {
|
||||
const planes = [plane({ id: 'p1', status: 'flying' })];
|
||||
expect(dispatchSelection(planes, contract, 'p1')).toBeNull();
|
||||
});
|
||||
|
||||
it('drops to the placeholder when a poll moves the pick off the origin', () => {
|
||||
const planes = [plane({ id: 'p1', locationIcao: 'EDDM' })];
|
||||
expect(dispatchSelection(planes, contract, 'p1')).toBeNull();
|
||||
});
|
||||
|
||||
it('unknown selection id resolves to the placeholder', () => {
|
||||
const planes = [plane({ id: 'p1' })];
|
||||
expect(dispatchSelection(planes, contract, 'no-such-plane')).toBeNull();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user