matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
474 lines • 17.9 kB
JavaScript
import { describe, expect, it } from 'vitest';
import { MapInfo } from '../../../../core/application/models/MapInfo.js';
describe('MapInfo', () => {
describe('constructor', () => {
it('should parse map info with rooms', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [{ mapFlag: 4, add_time: 1768854177 }],
rooms: [
{
id: 1,
tag: 0,
iot_name_id: 'room1',
iot_name: 'Living Room',
},
{
id: 2,
tag: 1,
iot_name_id: 'room2',
iot_name: 'Kitchen',
},
],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.maps).toHaveLength(1);
expect(mapInfo.maps[0].id).toBe(0);
expect(mapInfo.maps[0].name).toBe('Home');
expect(mapInfo.maps[0].rooms).toHaveLength(2);
expect(mapInfo.allRooms).toHaveLength(2);
});
it('should parse map info without rooms', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [{ mapFlag: 4, add_time: 1768854177 }],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.maps).toHaveLength(1);
expect(mapInfo.maps[0].id).toBe(0);
expect(mapInfo.maps[0].name).toBe('Home');
expect(mapInfo.maps[0].rooms).toHaveLength(0);
expect(mapInfo.allRooms).toHaveLength(0);
});
it('should assign mapId to rooms', () => {
const multimap = {
max_multi_map: 2,
max_bak_map: 1,
multi_map_count: 2,
map_info: [
{
mapFlag: 10,
add_time: 1769874960,
length: 4,
name: 'First Floor',
bak_maps: [],
rooms: [
{
id: 1,
tag: 0,
iot_name_id: 'room1',
iot_name: 'Living Room',
},
],
},
{
mapFlag: 20,
add_time: 1769874960,
length: 4,
name: 'Second Floor',
bak_maps: [],
rooms: [
{
id: 2,
tag: 0,
iot_name_id: 'room2',
iot_name: 'Bedroom',
},
],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.maps[0].rooms[0]).toHaveProperty('iot_map_id', 10);
expect(mapInfo.maps[1].rooms[0]).toHaveProperty('iot_map_id', 20);
expect(mapInfo.allRooms).toHaveLength(2);
expect(mapInfo.allRooms[0]).toHaveProperty('iot_map_id', 10);
expect(mapInfo.allRooms[1]).toHaveProperty('iot_map_id', 20);
});
it('should decode URL-encoded map names', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'My%20Home',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.maps[0].name).toBe('My Home');
});
it('should handle multiple maps', () => {
const multimap = {
max_multi_map: 3,
max_bak_map: 1,
multi_map_count: 3,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'First',
bak_maps: [],
},
{
mapFlag: 1,
add_time: 1769874961,
length: 6,
name: 'Second',
bak_maps: [],
},
{
mapFlag: 2,
add_time: 1769874962,
length: 5,
name: 'Third',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.maps).toHaveLength(3);
expect(mapInfo.maps[0].id).toBe(0);
expect(mapInfo.maps[1].id).toBe(1);
expect(mapInfo.maps[2].id).toBe(2);
});
});
describe('getById', () => {
it('should return map name for existing id', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 42,
add_time: 1769874960,
length: 4,
name: 'TestMap',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.getById(42)).toBe('TestMap');
});
it('should return undefined for non-existing id', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.getById(999)).toBeUndefined();
});
});
describe('getByName', () => {
it('should return map id for existing name', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 42,
add_time: 1769874960,
length: 4,
name: 'TestMap',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.getByName('TestMap')).toBe(42);
});
it('should return undefined for non-existing name', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.getByName('Unknown')).toBeUndefined();
});
it('should be case insensitive', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 42,
add_time: 1769874960,
length: 4,
name: 'TestMap',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.getByName('testmap')).toBe(42);
expect(mapInfo.getByName('TESTMAP')).toBe(42);
expect(mapInfo.getByName('TeStMaP')).toBe(42);
});
});
describe('hasRooms', () => {
it('should return true when rooms exist', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [],
rooms: [
{
id: 1,
tag: 0,
iot_name_id: 'room1',
iot_name: 'Living Room',
},
],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.hasRooms).toBe(true);
});
it('should return false when no rooms exist', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.hasRooms).toBe(false);
});
it('should return false when rooms array is empty', () => {
const multimap = {
max_multi_map: 1,
max_bak_map: 1,
multi_map_count: 1,
map_info: [
{
mapFlag: 0,
add_time: 1769874960,
length: 4,
name: 'Home',
bak_maps: [],
rooms: [],
},
],
};
const mapInfo = new MapInfo(multimap);
expect(mapInfo.hasRooms).toBe(false);
});
it('real data test 1', () => {
const multimap = {
max_multi_map: 4,
max_bak_map: 1,
multi_map_count: 2,
map_info: [
{
mapFlag: 0,
add_time: 1771060270,
length: 9,
name: 'First Map',
bak_maps: [{ mapFlag: 4, add_time: 1771577723 }],
rooms: [
{
id: 1,
tag: 14,
iot_name_id: '11100845',
iot_name: 'Kitchen',
},
{
id: 2,
tag: 9,
iot_name_id: '11100849',
iot_name: 'Study',
},
{
id: 3,
tag: 6,
iot_name_id: '11100842',
iot_name: 'Living room',
},
{
id: 4,
tag: 1,
iot_name_id: '11100847',
iot_name: 'Bedroom',
},
],
furnitures: [],
},
{
mapFlag: 1,
add_time: 1771580198,
length: 0,
name: '',
bak_maps: [{ mapFlag: 5, add_time: 1771579916 }],
rooms: [
{
id: 1,
tag: 2,
iot_name_id: '12461109',
iot_name: 'Master bedroom',
},
{
id: 2,
tag: 9,
iot_name_id: '11100849',
iot_name: 'Study',
},
{
id: 3,
tag: 6,
iot_name_id: '11100842',
iot_name: 'Living room',
},
{
id: 4,
tag: 14,
iot_name_id: '11100845',
iot_name: 'Kitchen',
},
],
furnitures: [],
},
],
};
const mapInfo = new MapInfo(multimap);
const roomForMap0 = mapInfo.allRooms.filter((x) => x.iot_map_id === 0);
const roomForMap1 = mapInfo.allRooms.filter((x) => x.iot_map_id === 1);
// console.log(mapInfo.allRooms);
expect(mapInfo.hasRooms).toBe(true);
expect(roomForMap0.length).toEqual(4);
expect(roomForMap1.length).toEqual(4);
});
});
describe('getActiveMapId', () => {
const multimap = {
max_multi_map: 4,
max_bak_map: 1,
multi_map_count: 2,
map_info: [
{
mapFlag: 0,
add_time: 1771060270,
length: 9,
name: 'First Map',
bak_maps: [{ mapFlag: 4, add_time: 1771577723 }],
rooms: [
{ id: 1, tag: 14, iot_name_id: '11100845', iot_name: 'Kitchen' },
{ id: 2, tag: 9, iot_name_id: '11100849', iot_name: 'Study' },
{ id: 3, tag: 6, iot_name_id: '11100842', iot_name: 'Living room' },
{ id: 4, tag: 1, iot_name_id: '11100847', iot_name: 'Bedroom' },
],
furnitures: [],
},
{
mapFlag: 1,
add_time: 1771580198,
length: 4,
name: 'abcd',
bak_maps: [{ mapFlag: 5, add_time: 1771585501 }],
rooms: [
{ id: 1, tag: 2, iot_name_id: '12461109', iot_name: 'Master bedroom' },
{ id: 2, tag: 9, iot_name_id: '11100849', iot_name: 'Study' },
{ id: 3, tag: 6, iot_name_id: '11100842', iot_name: 'Living room' },
{ id: 4, tag: 14, iot_name_id: '11100845', iot_name: 'Kitchen' },
],
furnitures: [],
},
],
};
it('should return mapFlag 0 when roomData matches first map', () => {
const mapInfo = new MapInfo(multimap);
const roomData = [
[1, '11100845', 14],
[2, '11100849', 9],
[3, '11100842', 6],
[4, '11100847', 1],
];
expect(mapInfo.getActiveMapId(roomData)).toBe(0);
});
it('should return mapFlag 1 when roomData matches second map', () => {
const mapInfo = new MapInfo(multimap);
const roomData = [
[1, '12461109', 2],
[2, '11100849', 9],
[3, '11100842', 6],
[4, '11100845', 14],
];
expect(mapInfo.getActiveMapId(roomData)).toBe(1);
});
it('should return 0 when roomData matches no map', () => {
const mapInfo = new MapInfo(multimap);
const roomData = [[1, 'unknown-room', 0]];
expect(mapInfo.getActiveMapId(roomData)).toBe(0);
});
it('should return 0 when roomData is empty', () => {
const mapInfo = new MapInfo(multimap);
expect(mapInfo.getActiveMapId([])).toBe(0);
});
});
});
//# sourceMappingURL=MapInfo.test.js.map