- Neuer QueueScreen: zeigt handler.queue, hebt aktuell spielenden Titel hervor (fett/rot), Antippen springt per skipToQueueItem - Entfernen und Umsortieren ohne Änderung an MeloAudioHandler: Queue wird clientseitig neu berechnet und per loadPlaylist neu geladen; Position wird nur wiederhergestellt, wenn der abgespielte Titel unverändert blieb - Reine Queue-Logik (removeFromQueue/reorderQueue/newPlayingIndex) als eigenständige, ohne AudioHandler testbare Funktionen extrahiert - Warteschlangen-Button in der Now-Playing-AppBar verlinkt den neuen Screen Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
86 lines
2.3 KiB
Dart
86 lines
2.3 KiB
Dart
import 'package:audio_service/audio_service.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:melo/player/queue_screen.dart';
|
|
|
|
MediaItem _item(String id) => MediaItem(id: id, title: 'Titel $id');
|
|
|
|
void main() {
|
|
group('removeFromQueue', () {
|
|
test('entfernt den Titel am angegebenen Index und verschiebt den Rest', () {
|
|
final queue = [_item('a'), _item('b'), _item('c')];
|
|
|
|
final result = removeFromQueue(queue, 1);
|
|
|
|
expect(result.map((e) => e.id), ['a', 'c']);
|
|
});
|
|
|
|
test('lässt die Original-Liste unverändert', () {
|
|
final queue = [_item('a'), _item('b')];
|
|
|
|
removeFromQueue(queue, 0);
|
|
|
|
expect(queue.map((e) => e.id), ['a', 'b']);
|
|
});
|
|
});
|
|
|
|
group('reorderQueue', () {
|
|
test('verschiebt einen Titel nach hinten', () {
|
|
final queue = [_item('a'), _item('b'), _item('c')];
|
|
|
|
final result = reorderQueue(queue, 0, 2);
|
|
|
|
expect(result.map((e) => e.id), ['b', 'c', 'a']);
|
|
});
|
|
|
|
test('verschiebt einen Titel nach vorne', () {
|
|
final queue = [_item('a'), _item('b'), _item('c')];
|
|
|
|
final result = reorderQueue(queue, 2, 0);
|
|
|
|
expect(result.map((e) => e.id), ['c', 'a', 'b']);
|
|
});
|
|
});
|
|
|
|
group('newPlayingIndex', () {
|
|
test('findet den abgespielten Titel an seiner neuen Position', () {
|
|
final newQueue = [_item('b'), _item('c'), _item('a')];
|
|
|
|
final index = newPlayingIndex(newQueue, 'a', 0);
|
|
|
|
expect(index, 2);
|
|
});
|
|
|
|
test('fällt auf fallbackIndex zurück, wenn der Titel entfernt wurde', () {
|
|
// 'b' wurde entfernt (war der abgespielte Titel); an Index 1 steht jetzt 'c'.
|
|
final newQueue = [_item('a'), _item('c')];
|
|
|
|
final index = newPlayingIndex(newQueue, 'b', 1);
|
|
|
|
expect(index, 1);
|
|
});
|
|
|
|
test('begrenzt fallbackIndex auf die neue Listenlänge', () {
|
|
// Letzter Titel der Liste wurde entfernt, fallbackIndex zeigt hinter das Ende.
|
|
final newQueue = [_item('a')];
|
|
|
|
final index = newPlayingIndex(newQueue, 'b', 1);
|
|
|
|
expect(index, 0);
|
|
});
|
|
|
|
test('gibt 0 zurück, wenn die neue Queue leer ist', () {
|
|
final index = newPlayingIndex(const [], 'a', 0);
|
|
|
|
expect(index, 0);
|
|
});
|
|
|
|
test('nutzt fallbackIndex, wenn playingId null ist', () {
|
|
final newQueue = [_item('a'), _item('b')];
|
|
|
|
final index = newPlayingIndex(newQueue, null, 1);
|
|
|
|
expect(index, 1);
|
|
});
|
|
});
|
|
}
|