import 'package:flutter_test/flutter_test.dart'; import 'package:melo/library/categories.dart'; import 'package:melo/library/database.dart'; Song _song(String id, {String? coverPath, String title = 'T'}) => Song( id: id, path: '/$id.mp3', title: title, dateAddedMs: 0, updatedAtMs: 0, deleted: false, playCount: 0, coverPath: coverPath, categoriesEdited: false, metadataEdited: false, ); void main() { group('parseCategories', () { test('trennt an Semikolon, Komma, Schrägstrich und Pipe', () { expect(parseCategories('Rock; Pop'), ['Rock', 'Pop']); expect(parseCategories('Rock,Pop'), ['Rock', 'Pop']); expect(parseCategories('Rock/Pop'), ['Rock', 'Pop']); expect(parseCategories('Rock|Pop'), ['Rock', 'Pop']); }); test('behält Leerzeichen innerhalb einer Kategorie', () { expect(parseCategories('Hip Hop; Trap cool'), ['Hip Hop', 'Trap cool']); }); test('entfernt Leereinträge und doppelte Kategorien', () { expect(parseCategories('Rock;;rock; Pop ;Rock'), ['Rock', 'Pop']); }); test('leerer oder fehlender Tag ergibt keine Kategorie', () { expect(parseCategories(null), isEmpty); expect(parseCategories(' '), isEmpty); }); test('verarbeitet auch eine Liste aus mehreren Tag-Feldern', () { expect(parseCategoryList(['Rock', 'Pop;Trap', 'rock']), ['Rock', 'Pop', 'Trap']); }); }); group('categoryCovers', () { test('nimmt je Kategorie das erste vorhandene Cover', () { final songs = [ _song('1', title: 'A', coverPath: null), _song('2', title: 'B', coverPath: '/cover_b.img'), _song('3', title: 'C', coverPath: '/cover_c.img'), ]; final categories = { '1': ['Rock'], '2': ['Rock'], '3': ['Pop'], }; final covers = categoryCovers(songs, categories); expect(covers['Rock'], '/cover_b.img'); expect(covers['Pop'], '/cover_c.img'); }); test('Kategorie ganz ohne Cover taucht nicht auf', () { final songs = [_song('1', coverPath: null)]; final covers = categoryCovers(songs, {'1': ['Leer']}); expect(covers.containsKey('Leer'), isFalse); }); test('ist unabhängig von der Reihenfolge der Eingabeliste', () { final songs = [ _song('2', title: 'B', coverPath: '/cover_b.img'), _song('1', title: 'A', coverPath: '/cover_a.img'), ]; final categories = {'1': ['Rock'], '2': ['Rock']}; expect(categoryCovers(songs, categories)['Rock'], '/cover_a.img'); }); }); group('effectiveCover', () { final covers = {'Rock': '/rock.img', 'Pop': '/pop.img'}; test('nimmt das Cover der ersten Kategorie', () { final cover = effectiveCover( _song('1', coverPath: '/eigen.img'), ['Pop', 'Rock'], covers, groupByCategory: true, ); expect(cover, '/pop.img'); }); test('fällt auf das eigene Cover zurück, wenn die Kategorie keins hat', () { final cover = effectiveCover( _song('1', coverPath: '/eigen.img'), ['Unbekannt'], covers, groupByCategory: true, ); expect(cover, '/eigen.img'); }); test('abgeschaltet gilt immer das eigene Cover', () { final cover = effectiveCover( _song('1', coverPath: '/eigen.img'), ['Pop'], covers, groupByCategory: false, ); expect(cover, '/eigen.img'); }); test('ohne Kategorien gilt das eigene Cover', () { final cover = effectiveCover( _song('1', coverPath: '/eigen.img'), const [], covers, groupByCategory: true, ); expect(cover, '/eigen.img'); }); }); }