import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo/player/audio_effects.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); const channel = MethodChannel('de.baka.melo/audio_effects'); late List calls; void mockChannel({Object? Function(MethodCall call)? handler}) { calls = []; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (call) async { calls.add(call); if (handler != null) return handler(call); if (call.method == 'attach') { return { 'bands': [ {'index': 0, 'centerFrequencyMilliHz': 60000, 'level': 0}, {'index': 1, 'centerFrequencyMilliHz': 14000000, 'level': 0}, ], 'presets': ['Normal', 'Rock'], 'minLevel': -1500, 'maxLevel': 1500, 'bassSupported': true, 'virtualizerSupported': true, }; } return null; }); } setUp(() { SharedPreferences.setMockInitialValues({}); mockChannel(); }); tearDown(() { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, null); }); test('attach liest Bänder, Presets und Grenzen vom Gerät', () async { final effects = AudioEffects(); await effects.attach(42); expect(effects.available, isTrue); expect(effects.bands.map((b) => b.centerHz), [60, 14000]); expect(effects.presets, ['Normal', 'Rock']); expect(effects.minLevel, -1500); expect(effects.bassSupported, isTrue); expect(calls.first.arguments['sessionId'], 42); }); test('Frequenz-Beschriftung wie in der Vorlage', () { expect(const EqBand(index: 0, centerHz: 60, level: 0).label, '60Hz'); expect(const EqBand(index: 4, centerHz: 14000, level: 0).label, '14.0kHz'); }); test('Bandpegel wird auf den erlaubten Bereich begrenzt', () async { final effects = AudioEffects(); await effects.attach(1); await effects.setBandLevel(0, 9999); expect(effects.bands.first.level, 1500); final call = calls.lastWhere((c) => c.method == 'setBandLevel'); expect(call.arguments['level'], 1500); }); test('Bass und Immersives Audio bleiben zwischen 0 und 1000', () async { final effects = AudioEffects(); await effects.attach(1); await effects.setBass(2000); await effects.setVirtualizer(-5); expect(effects.bass, 1000); expect(effects.virtualizer, 0); }); test('gespeicherte Werte werden beim nächsten Attach wiederhergestellt', () async { final effects = AudioEffects(); await effects.attach(1); await effects.setEnabled(true); await effects.setBandLevel(1, 600); await effects.setBass(300); final neu = AudioEffects(); await neu.init(); await neu.attach(2); expect(neu.enabled, isTrue); expect(neu.bands[1].level, 600); expect(neu.bass, 300); }); test('Gerät ohne Effekte meldet nicht verfügbar statt abzustürzen', () async { mockChannel(handler: (call) { throw PlatformException(code: 'audio_effects', message: 'nicht möglich'); }); final effects = AudioEffects(); await effects.attach(1); expect(effects.available, isFalse); expect(effects.error, 'nicht möglich'); }); }