Files
MultiRoombaRover/server/src/services/assignmentService/roverRanking.test.js
T

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);
});