import { describe, it, expect, beforeEach, vi } from 'vitest';
import { LyngdorfTransport } from './transport.js';
import type { LyngdorfDevice } from './types.js';
describe('LyngdorfTransport', () => {
let transport: LyngdorfTransport;
let mockDevice: LyngdorfDevice;
beforeEach(() => {
mockDevice = {
ip: '192.168.1.100',
port: 84,
model: 'TDAI-1120',
hostname: 'TDAI-1120.local'
};
transport = new LyngdorfTransport(mockDevice);
});
describe('Response Parsing', () => {
it('parses volume response correctly', () => {
expect(transport.parseVolumeResponse('!VOL(-30.0)')).toBe(-30);
expect(transport.parseVolumeResponse('!VOL(0)')).toBe(0);
expect(transport.parseVolumeResponse('!VOL(120)')).toBe(120);
expect(transport.parseVolumeResponse('!VOL(-45.5)')).toBe(-45.5);
expect(transport.parseVolumeResponse('invalid')).toBeNull();
});
it('parses source response correctly', () => {
expect(transport.parseSourceResponse('!SRC(1)')).toBe(1);
expect(transport.parseSourceResponse('!SRC(0)')).toBe(0);
expect(transport.parseSourceResponse('!SRC(5)')).toBe(5);
expect(transport.parseSourceResponse('invalid')).toBeNull();
});
it('should parse RoomPerfect response correctly', () => {
expect(transport.parseRoomPerfectResponse('!RP(0)')).toBe('Bypass');
expect(transport.parseRoomPerfectResponse('!RP(1)')).toBe('Focus 1');
expect(transport.parseRoomPerfectResponse('!RP(8)')).toBe('Focus 8');
expect(transport.parseRoomPerfectResponse('!RP(9)')).toBe('Global');
expect(transport.parseRoomPerfectResponse('invalid')).toBeNull();
});
it('parses voicing response correctly', () => {
expect(transport.parseVoicingResponse('!VOI(1)')).toBe(1);
expect(transport.parseVoicingResponse('!VOI(0)')).toBe(0);
expect(transport.parseVoicingResponse('!VOI(10)')).toBe(10);
expect(transport.parseVoicingResponse('invalid')).toBeNull();
});
});
describe('Command Formatting', () => {
it('formats commands with carriage return', () => {
const testSocket = {
write: vi.fn()
};
// Mock the socket
(transport as any).socket = testSocket;
(transport as any).connected = true;
// Note: sendCommand is async and would normally write to socket
// This test verifies the format would be correct
const command = '!VOL(-30)';
expect(command + '\r').toBe('!VOL(-30)\r');
});
});
describe('Connection Management', () => {
it('initializes with correct device info', () => {
// Verify the device was passed to the constructor
expect((transport as any).device).toEqual(mockDevice);
});
it('starts in disconnected state', () => {
expect(transport.isConnected()).toBe(false);
});
});
});