Introduce multi-device EQ support allowing each audio output device (built-in speaker, wired, USB, individual Bluetooth by MAC) to have its own equalizer preset, combined with existing per-station presets for a full station×device matrix. - Add DispositivoAudio model and ServicioDispositivoAudio interface - Add Android platform channel (AudioDeviceCallback) for device detection - Add iOS AudioDevicesPlugin (AVAudioSession route tracking) - Extend ServicioEcualizador with device and matrix persistence keys - Implement 4-level resolution: matrix > station > device > global - Add advanced EQ settings section with feature toggle (off by default) - Extend export/import to v3 with backward compatibility - 184 tests passing, zero analyzer issues
95 lines
2.6 KiB
Dart
95 lines
2.6 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:pluriwave/modelos/dispositivo_audio.dart';
|
|
|
|
void main() {
|
|
group('TipoDispositivo', () {
|
|
test('has all required enum values', () {
|
|
expect(
|
|
TipoDispositivo.values,
|
|
containsAll([
|
|
TipoDispositivo.altavozInterno,
|
|
TipoDispositivo.auricularesCable,
|
|
TipoDispositivo.bluetoothA2dp,
|
|
TipoDispositivo.usbAudio,
|
|
TipoDispositivo.desconocido,
|
|
]),
|
|
);
|
|
});
|
|
});
|
|
|
|
group('DispositivoAudio', () {
|
|
const builtinSpeaker = DispositivoAudio(
|
|
id: 'builtin_speaker',
|
|
tipo: TipoDispositivo.altavozInterno,
|
|
nombre: 'Altavoz interno',
|
|
);
|
|
|
|
const btDevice = DispositivoAudio(
|
|
id: 'bt_a2dp:AA:BB:CC:DD:EE:FF',
|
|
tipo: TipoDispositivo.bluetoothA2dp,
|
|
nombre: 'Auriculares BT',
|
|
);
|
|
|
|
test('equality: same id and tipo are equal', () {
|
|
const a = DispositivoAudio(
|
|
id: 'builtin_speaker',
|
|
tipo: TipoDispositivo.altavozInterno,
|
|
nombre: 'Altavoz',
|
|
);
|
|
const b = DispositivoAudio(
|
|
id: 'builtin_speaker',
|
|
tipo: TipoDispositivo.altavozInterno,
|
|
nombre: 'Different name',
|
|
);
|
|
expect(a, equals(b));
|
|
});
|
|
|
|
test('equality: different id are not equal', () {
|
|
expect(builtinSpeaker, isNot(equals(btDevice)));
|
|
});
|
|
|
|
test('hashCode is consistent with equality', () {
|
|
const a = DispositivoAudio(
|
|
id: 'builtin_speaker',
|
|
tipo: TipoDispositivo.altavozInterno,
|
|
nombre: 'A',
|
|
);
|
|
const b = DispositivoAudio(
|
|
id: 'builtin_speaker',
|
|
tipo: TipoDispositivo.altavozInterno,
|
|
nombre: 'B',
|
|
);
|
|
expect(a.hashCode, equals(b.hashCode));
|
|
});
|
|
|
|
test('holds all required fields', () {
|
|
expect(builtinSpeaker.id, 'builtin_speaker');
|
|
expect(builtinSpeaker.tipo, TipoDispositivo.altavozInterno);
|
|
expect(builtinSpeaker.nombre, 'Altavoz interno');
|
|
});
|
|
|
|
test('BT device id format matches spec', () {
|
|
expect(btDevice.id, 'bt_a2dp:AA:BB:CC:DD:EE:FF');
|
|
expect(btDevice.tipo, TipoDispositivo.bluetoothA2dp);
|
|
});
|
|
|
|
test('wired headset type', () {
|
|
const wired = DispositivoAudio(
|
|
id: 'wired_headset',
|
|
tipo: TipoDispositivo.auricularesCable,
|
|
nombre: 'Auriculares cable',
|
|
);
|
|
expect(wired.tipo, TipoDispositivo.auricularesCable);
|
|
});
|
|
|
|
test('USB audio type', () {
|
|
const usb = DispositivoAudio(
|
|
id: 'usb_headset:some_address',
|
|
tipo: TipoDispositivo.usbAudio,
|
|
nombre: 'USB Headset',
|
|
);
|
|
expect(usb.tipo, TipoDispositivo.usbAudio);
|
|
});
|
|
});
|
|
}
|