import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:qlyra/core/calls/audio_devices.dart'; import 'package:qlyra/core/calls/pulse_audio.dart'; import 'package:qlyra/core/config/call_no_mute.dart'; const _deviceId = 'mic-test-0'; const _sourcesJson = ''' [ { "name": "alsa_input.test-device", "description": "(null)", "monitor_source": "", "properties": {"device.description": "Тестовая звуковая карта"} }, { "name": "alsa_output.test-device.monitor", "description": "(null)", "monitor_source": "alsa_output.test-device", "properties": {"device.description": "Тестовая звуковая карта"} }, { "name": "virtual_sink.monitor", "description": "Monitor of Virtual Sink", "monitor_source": "virtual_sink", "properties": {} }, { "name": "qlyra_capture_4242", "description": "qlyra_capture_4242", "monitor_source": "", "properties": {} } ] '''; void main() { tearDown(() { debugDefaultTargetPlatformOverride = null; CallNoMute.enabled = false; }); test('--no-mute включается только своим флагом', () { CallNoMute.enabled = false; CallNoMute.parse(const ['--debug-test']); expect(CallNoMute.enabled, isFalse); CallNoMute.parse(const ['--debug-test', '--no-mute']); expect(CallNoMute.enabled, isTrue); }); test('desktop выбирает вход через sourceId', () { debugDefaultTargetPlatformOverride = TargetPlatform.linux; expect(AudioDevices.switchesInsideEngine, isFalse); expect(AudioDevices.micConstraints(_deviceId), { 'optional': [ {'sourceId': _deviceId}, ], }); }); test('мобильные платформы переключают вход внутри движка', () { debugDefaultTargetPlatformOverride = TargetPlatform.android; expect(AudioDevices.switchesInsideEngine, isTrue); expect(AudioDevices.micConstraints(_deviceId), isTrue); }); test('без выбранного устройства ограничений нет', () { debugDefaultTargetPlatformOverride = TargetPlatform.linux; expect(AudioDevices.micConstraints(null), isTrue); expect(AudioDevices.micConstraints(''), isTrue); }); test('захват монитора глушит шумодав и АРУ, но оставляет эхоподавление', () { debugDefaultTargetPlatformOverride = TargetPlatform.linux; final constraints = AudioDevices.micConstraints(_deviceId, monitorCapture: true) as Map; expect(constraints['optional'], [ {'sourceId': _deviceId}, ]); expect(constraints['echoCancellation'], isTrue); expect(constraints['noiseSuppression'], isFalse); expect(constraints['autoGainControl'], isFalse); expect(constraints['highpassFilter'], isFalse); }); test('источники pulse разбираются вместе с мониторами', () { final sources = PulseAudio.parseSources(_sourcesJson); expect(sources.map((s) => s.name), [ 'alsa_input.test-device', 'alsa_output.test-device.monitor', 'virtual_sink.monitor', ]); expect(sources[0].isMonitor, isFalse); expect(sources[0].label, 'Тестовая звуковая карта'); expect(sources[1].isMonitor, isTrue); expect(sources[1].label, 'Monitor of Тестовая звуковая карта'); expect(sources[2].label, 'Monitor of Virtual Sink'); }); test('битый вывод pactl не роняет разбор', () { expect(PulseAudio.parseSources('не json'), isEmpty); }); }