matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
203 lines • 10.4 kB
JavaScript
import { RvcOperationalState } from 'matterbridge/matter/clusters';
import { describe, expect, it } from 'vitest';
import { getErrorFromDSS, getOperationalErrorState } from '../../initialData/getOperationalStates.js';
import { DockStationStatus, DockStationStatusCode } from '../../model/DockStationStatus.js';
import { VacuumStatus } from '../../model/VacuumStatus.js';
import { VacuumErrorCode } from '../../roborockCommunication/enums/vacuumAndDockErrorCode.js';
import { asType } from '../testUtils.js';
describe('getOperationalStates', () => {
it('getOperationalErrorState returns undefined for None and Error for others', () => {
expect(getOperationalErrorState(VacuumErrorCode.None)).toBeUndefined();
expect(getOperationalErrorState(VacuumErrorCode.LidarBlocked)).toBeDefined();
});
it('getErrorFromErrorCode returns NoError for None', () => {
const vacuumStatus = new VacuumStatus(VacuumErrorCode.None);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.NoError);
});
it('getErrorFromErrorCode returns NavigationSensorObscured for sensor errors', () => {
const sensorErrors = [
VacuumErrorCode.LidarBlocked,
VacuumErrorCode.CompassError,
VacuumErrorCode.CliffSensorError,
VacuumErrorCode.OpticalFlowSensorDirt,
VacuumErrorCode.WallSensorDirty,
VacuumErrorCode.CameraError,
VacuumErrorCode.WallSensorError,
];
for (const code of sensorErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.NavigationSensorObscured);
}
});
it('getErrorFromErrorCode returns Stuck for physical obstruction errors', () => {
const stuckErrors = [
VacuumErrorCode.BumperStuck,
VacuumErrorCode.RobotTrapped,
VacuumErrorCode.RobotTilted,
VacuumErrorCode.VerticalBumperPressed,
VacuumErrorCode.VibrariseJammed,
VacuumErrorCode.RobotOnCarpet,
];
for (const code of stuckErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.Stuck);
}
});
it('getErrorFromErrorCode returns WheelsJammed for wheel errors', () => {
const vacuumStatus1 = new VacuumStatus(VacuumErrorCode.WheelsSuspended);
expect(vacuumStatus1.getErrorState()).toBe(RvcOperationalState.ErrorState.WheelsJammed);
const vacuumStatus2 = new VacuumStatus(VacuumErrorCode.WheelsJammed);
expect(vacuumStatus2.getErrorState()).toBe(RvcOperationalState.ErrorState.WheelsJammed);
});
it('getErrorFromErrorCode returns BrushJammed for brush and roller errors', () => {
const brushErrors = [
VacuumErrorCode.MainBrushJammed,
VacuumErrorCode.SideBrushJammed,
VacuumErrorCode.SideBrushError,
VacuumErrorCode.ClearBrushPositioningError,
VacuumErrorCode.MoppingRollerJammed,
VacuumErrorCode.MoppingRollerJammed2,
];
for (const code of brushErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.BrushJammed);
}
});
it('getErrorFromErrorCode returns DustBinMissing for dustbin errors', () => {
const dustbinErrors = [
VacuumErrorCode.NoDustbin,
VacuumErrorCode.StrainerError,
VacuumErrorCode.CleanAutoEmptyDock,
];
for (const code of dustbinErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.DustBinMissing);
}
});
it('getErrorFromErrorCode returns DustBinFull for clogged filter', () => {
const vacuumStatus = new VacuumStatus(VacuumErrorCode.FilterBlocked);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.DustBinFull);
});
it('getErrorFromErrorCode returns LowBattery only for low battery', () => {
const vacuumStatus = new VacuumStatus(VacuumErrorCode.LowBattery);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.LowBattery);
});
it('getErrorFromErrorCode returns UnableToStartOrResume for charging error', () => {
const vacuumStatus = new VacuumStatus(VacuumErrorCode.ChargingError);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.UnableToStartOrResume);
});
it('getErrorFromErrorCode returns FailedToFindChargingDock for dock errors', () => {
const dockErrors = [
VacuumErrorCode.DockNotConnectedToPower,
VacuumErrorCode.ReturnToDockFail,
VacuumErrorCode.DockLocatorError,
];
for (const code of dockErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.FailedToFindChargingDock);
}
});
it('getErrorFromErrorCode returns CannotReachTargetArea for zone errors', () => {
const zoneErrors = [
VacuumErrorCode.NogoZoneDetected,
VacuumErrorCode.InvisibleWallDetected,
VacuumErrorCode.CannotCrossCarpet,
];
for (const code of zoneErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.CannotReachTargetArea);
}
});
it('getErrorFromErrorCode returns UnableToCompleteOperation for system and hardware errors', () => {
const systemErrors = [
VacuumErrorCode.InternalError,
VacuumErrorCode.TemperatureProtection,
VacuumErrorCode.CleanCarouselException,
VacuumErrorCode.FanError,
VacuumErrorCode.BatteryError,
VacuumErrorCode.AutoEmptyDockVoltage,
VacuumErrorCode.AudioError,
VacuumErrorCode.MoppingRollerNotLowered,
VacuumErrorCode.SinkStrainerHoare,
VacuumErrorCode.CheckCleanCarouse,
];
for (const code of systemErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.UnableToCompleteOperation);
}
});
it('getErrorFromErrorCode returns WaterTankEmpty for empty clean water tank', () => {
const vacuumStatus = new VacuumStatus(VacuumErrorCode.ClearWaterTankEmpty);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.WaterTankEmpty);
});
it('getErrorFromErrorCode returns WaterTankMissing for water tank issues', () => {
const waterTankErrors = [
VacuumErrorCode.ClearWaterBoxHoare,
VacuumErrorCode.ClearBrushInstalledProperly,
VacuumErrorCode.FilterScreenException,
VacuumErrorCode.UpWaterException,
VacuumErrorCode.WaterCarriageDrop,
];
for (const code of waterTankErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.WaterTankMissing);
}
});
it('getErrorFromErrorCode returns DirtyWaterTankFull for dirty water errors', () => {
const dirtyWaterErrors = [
VacuumErrorCode.DirtyWaterBoxHoare,
VacuumErrorCode.DrainWaterException,
VacuumErrorCode.CleanCarouselWaterFull,
];
for (const code of dirtyWaterErrors) {
const vacuumStatus = new VacuumStatus(code);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.DirtyWaterTankFull);
}
});
it('getErrorFromErrorCode returns NoError for unknown error codes', () => {
const vacuumStatus = new VacuumStatus(999);
expect(vacuumStatus.getErrorState()).toBe(RvcOperationalState.ErrorState.NoError);
});
it('getErrorFromDSS handles undefined status', () => {
const noStatus = getErrorFromDSS(asType(undefined));
expect(noStatus).toBeDefined();
expect(noStatus?.errorStateLabel).toContain('No Docking Station Status');
});
it('getErrorFromDSS returns undefined when no errors present', () => {
const status = new DockStationStatus(DockStationStatusCode.OK, DockStationStatusCode.OK, DockStationStatusCode.OK, DockStationStatusCode.OK, DockStationStatusCode.OK, DockStationStatusCode.OK);
const err = getErrorFromDSS(status);
expect(err).toBeUndefined();
});
it('getErrorFromDSS handles cleanFluidStatus error', () => {
const status = new DockStationStatus(DockStationStatusCode.Error, 0, 0, 0, 0, 0);
const err = getErrorFromDSS(status);
expect(err).toBeDefined();
expect(err?.errorStateLabel).toBe('Clean Fluid Error');
expect(err?.errorStateDetails).toContain('clean fluid');
});
it('getErrorFromDSS handles waterBoxFilterStatus error', () => {
const status = new DockStationStatus(0, DockStationStatusCode.Error, 0, 0, 0, 0);
const err = getErrorFromDSS(status);
expect(err).toBeDefined();
expect(err?.errorStateLabel).toBe('Water Box Filter Error');
});
it('getErrorFromDSS handles dustBagStatus error', () => {
const status = new DockStationStatus(0, 0, DockStationStatusCode.Error, 0, 0, 0);
const err = getErrorFromDSS(status);
expect(err).toBeDefined();
expect(err?.errorStateLabel).toBe('Dust Bag Error');
});
it('getErrorFromDSS handles dirtyWaterBoxStatus error', () => {
const status = new DockStationStatus(0, 0, 0, DockStationStatusCode.Error, 0, 0);
const err = getErrorFromDSS(status);
expect(err).toBeDefined();
expect(err?.errorStateLabel).toBe('Dirty Water Box Error');
});
it('getErrorFromDSS handles clearWaterBoxStatus error', () => {
const status = new DockStationStatus(0, 0, 0, 0, DockStationStatusCode.Error, 0);
const err = getErrorFromDSS(status);
expect(err).toBeDefined();
expect(err?.errorStateLabel).toBe('Clear Water Box Error');
});
});
//# sourceMappingURL=getOperationalStates.test.js.map