matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
464 lines • 34.3 kB
JavaScript
import { RvcOperationalState, RvcRunMode } from 'matterbridge/matter/clusters';
import { describe, expect, it } from 'vitest';
import { OperationStatusCode } from '../../roborockCommunication/enums/index.js';
import { StatusChangeMessage } from '../../roborockCommunication/models/deviceStatus.js';
import { resolveDeviceState } from '../../share/stateResolver.js';
describe('resolveDeviceState - 56-row State Resolution Matrix', () => {
describe('Priority 0: Status Override Rules (Highest Priority)', () => {
describe('Idle Status Override - Row 11', () => {
it('should ignore all flags and return Idle/Docked', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Idle, true, true, true, true, true, true);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
});
describe('EmptyingDustContainer Status Override - Row 53', () => {
it('should ignore all flags and return Cleaning/EmptyingDustBin (real data: 02:09:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.EmptyingDustContainer, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.EmptyingDustBin);
});
});
describe('WashingTheMop Status Override - Row 54', () => {
it('should ignore all flags and return Cleaning/CleaningMop (real data: 01:01:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
});
describe('GoingToWashTheMop Status Override - Row 55', () => {
it('should ignore all flags and return Cleaning/CleaningMop (real data: 01:13:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.GoingToWashTheMop, true, true, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
});
describe('Mapping Status Override - Row 56', () => {
it('should ignore all flags and return Mapping/Running', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Mapping, true, true, true, true, true, true);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Mapping);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
});
});
describe('Priority 1: Cleaning Status Special Overrides', () => {
describe('Cleaning + inWarmup Override - Row 13', () => {
it('should ignore all other flags and return Cleaning/CleaningMop (real data: 01:50:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, true);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should override inReturning when inWarmup is true', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, true, undefined, undefined, undefined, true);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
});
describe('Cleaning + isLocating Override - Row 14', () => {
it('should ignore all other flags except inWarmup/inReturning and return Cleaning/UpdatingMaps', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, true, true, true, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.UpdatingMaps);
});
});
describe('Cleaning + isExploring Override - Row 15', () => {
it('should ignore all other flags except inWarmup/inReturning and return Cleaning/UpdatingMaps', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, true, false, true, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.UpdatingMaps);
});
});
});
describe('Priority 2: Modifier Priority Chain', () => {
describe('Base State Resolution - Row 12', () => {
it('should return base state when no modifiers are active (real data: 01:03:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should return base state when all flags are undefined (REST API)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
});
describe('Priority 2a: inReturning Modifier (High Priority)', () => {
it('should override to SeekingCharger for ReturningDock status - Row 21 (real data: 02:05:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.ReturningDock, true, true, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should override to SeekingCharger for Cleaning status - Row 16', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, true, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should override isExploring when both are true - Row 17', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, // inCleaning
true, // inReturning
undefined, // inFreshState
undefined, // isLocating
true, // isExploring
undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.UpdatingMaps);
});
it('should override inFreshState when both are true - Row 18', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, // inCleaning
true, // inReturning
true, // inFreshState
undefined, // isLocating
undefined, // isExploring
undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should override all modifiers when inReturning is true - Row 19', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, true, true, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.UpdatingMaps);
});
it('should maintain Paused state when status is Paused - Row 33', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Paused, undefined, true, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Paused);
});
it('should work for Charging status - Row 27', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, undefined, true, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
});
describe('Priority 2b: isExploring Modifier (Medium Priority)', () => {
it('should change runMode to Mapping for ManualMode - Row 25', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.ManualMode, undefined, undefined, undefined, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.UpdatingMaps);
});
it('should change runMode to Mapping for ReturningDock - Row 22', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.ReturningDock, undefined, undefined, undefined, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Mapping);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should change runMode to Mapping for Paused - Row 40', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Paused, undefined, undefined, undefined, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Mapping);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Paused);
});
it('should be blocked when status is Charging (invalid state)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, undefined, undefined, undefined, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
it('should be blocked when status is Paused (10) with explicit false flags - Row 34', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Paused, undefined, false, false, false, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Mapping);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Paused);
});
});
describe('Priority 2c: inFreshState Modifier (Low Priority)', () => {
it('should transition to Idle/Docked when status is Charging - Row 28 (real data: 01:00:04, 02:10:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, false, false, true, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
it('should be ignored when status is Cleaning (invalid state removed)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, undefined, undefined, true, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should be overridden by inReturning - Row 30', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, undefined, true, true, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should be overridden by both inReturning and isExploring - Row 31', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, undefined, true, true, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
});
});
describe('Edge Cases and Unknown Status Codes', () => {
describe('Unknown Status - Rows 1-4', () => {
it('should fallback to Idle/Docked for unknown status - Row 1', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Unknown, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
it('should apply inReturning for unknown status - Row 2', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Unknown, undefined, true, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should apply isExploring for unknown status - Row 3', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Unknown, undefined, undefined, undefined, undefined, true, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Mapping);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
});
describe('Other Status Codes', () => {
it('should handle Initiating status - Row 5', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Initiating, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle Sleeping status base case - Row 10', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Sleeping, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Paused);
});
it('should handle InError status - Row 31', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.InError, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Error);
});
it('should handle ChargingError status - Row 35', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.ChargingError, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Error);
});
it('should handle ZoneClean status - Row 41', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.ZoneClean, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle RoomClean status - Row 44', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.RoomClean, undefined, undefined, undefined, undefined, undefined, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
});
});
describe('Real Cleaning Process Data', () => {
it('should handle initial idle state (01:00:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, false, false, true, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
it('should handle pre-cleaning mop wash (01:01:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle active cleaning (01:03:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle mid-cleaning return to wash (01:13:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.GoingToWashTheMop, true, true, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle warmup phase (01:50:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, true);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle final return to dock (02:05:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.ReturningDock, true, true, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.SeekingCharger);
});
it('should handle drying phase (02:09:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.EmptyingDustContainer, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.EmptyingDustBin);
});
it('should handle pre-cleaning wash phase 2 (01:02:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle active cleaning phase 2 (01:04:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle active cleaning phase 3 (01:12:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle mid-cleaning wash phase 1 (01:14:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle mid-cleaning wash phase 2 (01:15:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle mid-cleaning wash phase 3 (01:16:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle active cleaning phase 4 (01:17:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle active cleaning phase 5 (01:18:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle active cleaning phase 6 (01:25:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle mid-cleaning return to wash 2 (01:26:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.GoingToWashTheMop, true, true, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle mid-cleaning wash phase 4 (01:27:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle mid-cleaning wash phase 5 (01:28:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle mid-cleaning wash phase 6 (01:29:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle active cleaning phase 7 (01:30:04)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle active cleaning phase 8 (01:46:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle final wash phase 1 (01:47:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle final wash phase 2 (01:48:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle final wash phase 3 (01:49:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle active cleaning phase 9 (01:51:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle active cleaning phase 10 (02:04:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Cleaning, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Running);
});
it('should handle final wash phase 4 (02:06:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle final wash phase 5 (02:07:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle final wash phase 6 (02:08:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.WashingTheMop, true, false, false, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.CleaningMop);
});
it('should handle final idle state (02:10:03)', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Charging, false, false, true, false, false, false);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Idle);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Docked);
});
it('should handle paused cleaning for a long time', () => {
const message = new StatusChangeMessage('test-duid', OperationStatusCode.Sleeping, true, false, false, false, false, undefined);
const result = resolveDeviceState(message);
expect(result.runMode).toBe(RvcRunMode.ModeTag.Cleaning);
expect(result.operationalState).toBe(RvcOperationalState.OperationalState.Paused);
});
});
});
//# sourceMappingURL=stateResolver.test.js.map