Files
Melo/test/player/queue_screen_test.dart
Hermes (Server)andClaude Haiku 4.5 d267bb9658 feat(player): Warteschlangen-Ansicht mit Springen, Entfernen, Umsortieren
- 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>
2026-08-18 17:55:01 +02:00

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);
});
});
}