mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 01:21:20 -04:00
78 lines
2.9 KiB
JavaScript
78 lines
2.9 KiB
JavaScript
// Rover assignment ranking tests
|
|
// Purpose: Locks the operator-defined rover priority order against accidental comparator regressions.
|
|
// Scope: Tests pure ranking only; assignment side effects and access policy remain owned by their existing services.
|
|
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const { compareRoversForAssignment } = require('./roverRanking');
|
|
|
|
function rover({ id, docked, battery, drivers = 0 }) {
|
|
/*
|
|
Set size matches the production rover contract without introducing socket or
|
|
rover-manager dependencies into these focused ordering tests.
|
|
*/
|
|
return {
|
|
id,
|
|
docked,
|
|
batteryState: battery == null ? null : { percentDisplay: battery },
|
|
drivers: new Set(Array.from({ length: drivers }, (_, index) => `${id}-driver-${index}`)),
|
|
};
|
|
}
|
|
|
|
function rankedIds(entries) {
|
|
return entries.sort(compareRoversForAssignment).map((entry) => entry.id);
|
|
}
|
|
|
|
test('an empty rover outranks an occupied rover regardless of battery or docking state', () => {
|
|
const result = rankedIds([
|
|
rover({ id: 'occupied-high', docked: false, battery: 100, drivers: 1 }),
|
|
rover({ id: 'docked-empty', docked: true, battery: 20 }),
|
|
]);
|
|
|
|
assert.deepEqual(result, ['docked-empty', 'occupied-high']);
|
|
});
|
|
|
|
test('an undocked rover is preferred when both rovers are empty', () => {
|
|
const result = rankedIds([
|
|
rover({ id: 'docked-high', docked: true, battery: 100 }),
|
|
rover({ id: 'undocked-low', docked: false, battery: 20 }),
|
|
]);
|
|
|
|
assert.deepEqual(result, ['undocked-low', 'docked-high']);
|
|
});
|
|
|
|
test('lowest driver count ranks occupied rovers before battery percentage', () => {
|
|
const result = rankedIds([
|
|
rover({ id: 'busy-high', docked: false, battery: 100, drivers: 4 }),
|
|
rover({ id: 'quieter-low', docked: false, battery: 20, drivers: 1 }),
|
|
]);
|
|
|
|
assert.deepEqual(result, ['quieter-low', 'busy-high']);
|
|
});
|
|
|
|
test('battery percentage ranks rovers after availability and load are equal', () => {
|
|
const result = rankedIds([
|
|
rover({ id: 'low', docked: false, battery: 35, drivers: 1 }),
|
|
rover({ id: 'high', docked: false, battery: 90, drivers: 1 }),
|
|
rover({ id: 'middle', docked: false, battery: 60, drivers: 1 }),
|
|
]);
|
|
|
|
assert.deepEqual(result, ['high', 'middle', 'low']);
|
|
});
|
|
|
|
test('known battery percentage outranks missing battery telemetry', () => {
|
|
const result = rankedIds([
|
|
rover({ id: 'unknown', docked: true, battery: null }),
|
|
rover({ id: 'known', docked: true, battery: 5 }),
|
|
]);
|
|
|
|
assert.deepEqual(result, ['known', 'unknown']);
|
|
});
|
|
|
|
test('exactly equivalent rovers remain tied for random selection by assignmentService', () => {
|
|
const left = rover({ id: 'left', docked: false, battery: 80, drivers: 1 });
|
|
const right = rover({ id: 'right', docked: false, battery: 80, drivers: 1 });
|
|
|
|
assert.equal(compareRoversForAssignment(left, right), 0);
|
|
assert.equal(compareRoversForAssignment(right, left), 0);
|
|
});
|