import 'package:audio_service/audio_service.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:melo/player/audio_handler.dart'; MediaItem _item(String id) => MediaItem(id: id, title: 'Titel $id'); /// Entfernen und Umsortieren luden früher die ganze Warteschlange neu /// (`loadPlaylist`). Das riss die Wiedergabe hörbar auf und setzte dabei /// `_lastCountedIndex` zurück — der laufende Titel wurde jedes Mal erneut als /// Wiedergabe gezählt und verfälschte die Sortierung "Wie oft abgespielt". void main() { group('removeFromQueue', () { test('entfernt den Titel am angegebenen Index und verschiebt den Rest', () { final queue = [_item('a'), _item('b'), _item('c')]; expect(removeFromQueue(queue, 1).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')]; expect(reorderQueue(queue, 0, 2).map((e) => e.id), ['b', 'c', 'a']); }); test('verschiebt einen Titel nach vorne', () { final queue = [_item('a'), _item('b'), _item('c')]; expect(reorderQueue(queue, 2, 0).map((e) => e.id), ['c', 'a', 'b']); }); test('lässt die Original-Liste unverändert', () { final queue = [_item('a'), _item('b')]; reorderQueue(queue, 0, 1); expect(queue.map((e) => e.id), ['a', 'b']); }); }); group('gezaehlterIndexNachEntfernen', () { test('ein Titel vor dem gezählten rückt ihn eine Stelle nach vorn', () { // Sonst zeigt der gemerkte Index nach dem Entfernen auf den Nachbarn // und der laufende Titel wird ein zweites Mal gezählt. expect(gezaehlterIndexNachEntfernen(3, 1), 2); }); test('ein Titel hinter dem gezählten ändert nichts', () { expect(gezaehlterIndexNachEntfernen(1, 3), 1); }); test('wird der gezählte Titel selbst entfernt, gilt keiner mehr', () { expect(gezaehlterIndexNachEntfernen(2, 2), isNull); }); test('ohne gezählten Titel bleibt es dabei', () { expect(gezaehlterIndexNachEntfernen(null, 0), isNull); }); }); group('gezaehlterIndexNachVerschieben', () { test('der gezählte Titel selbst wandert mit', () { expect(gezaehlterIndexNachVerschieben(1, 1, 3), 3); }); test('ein Titel von vorn nach hinten rückt den gezählten nach vorn', () { // [a b C d] → b nach 3 → [a C d b]: C war 2, ist jetzt 1. expect(gezaehlterIndexNachVerschieben(2, 1, 3), 1); }); test('ein Titel von hinten nach vorn rückt den gezählten nach hinten', () { // [a B c d] → d nach 1 → [a d B c]: B war 1, ist jetzt 2. expect(gezaehlterIndexNachVerschieben(1, 3, 1), 2); }); test('eine Verschiebung ganz hinter dem gezählten ändert nichts', () { expect(gezaehlterIndexNachVerschieben(0, 2, 3), 0); }); test('eine Verschiebung ganz vor dem gezählten ändert nichts', () { expect(gezaehlterIndexNachVerschieben(3, 0, 1), 3); }); test('ohne gezählten Titel bleibt es dabei', () { expect(gezaehlterIndexNachVerschieben(null, 0, 1), isNull); }); }); }