import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/utils/track_label_builder.dart'; void main() { group('buildTrackLabel', () { test('joins title, language, and extra parts with " · "', () { expect( buildTrackLabel(title: 'Director Cut', language: 'EN', extraParts: const ['AAC', '2ch'], index: 0), 'Director Cut · EN · AAC · 2ch', ); }); test('drops null/empty title and language', () { expect(buildTrackLabel(title: null, language: null, extraParts: const ['AAC'], index: 0), 'AAC'); expect(buildTrackLabel(title: '', language: '', extraParts: const ['AAC'], index: 0), 'AAC'); }); test('falls back to " " when no parts', () { expect(buildTrackLabel(index: 0), 'Track 1'); expect(buildTrackLabel(index: 4), 'Track 5'); expect(buildTrackLabel(index: 2, fallbackPrefix: 'Audio Track'), 'Audio Track 3'); }); test('preserves ordering: title, language, extras', () { expect(buildTrackLabel(title: 'A', language: 'B', extraParts: const ['C', 'D'], index: 0), 'A · B · C · D'); }); test('only language', () { expect(buildTrackLabel(language: 'FR', index: 0), 'FR'); }); test('only title', () { expect(buildTrackLabel(title: 'Commentary', index: 0), 'Commentary'); }); }); group('TrackLabelBuilder.buildAudioLabel', () { test('combines title, uppercased language, codec, channels', () { expect( TrackLabelBuilder.buildAudioLabel(title: 'Main', language: 'en', codec: 'aac', channelsCount: 2, index: 0), 'Main · EN · AAC · 2ch', ); }); test('uppercases language', () { expect( TrackLabelBuilder.buildAudioLabel(language: 'fr', codec: 'ac3', channelsCount: 6, index: 0), 'FR · AC3 · 6ch', ); }); test('formats codec via CodecUtils (e.g. eac3 -> E-AC3)', () { final label = TrackLabelBuilder.buildAudioLabel(codec: 'eac3', index: 0); expect(label, 'E-AC3'); }); test('omits codec when null/empty', () { expect(TrackLabelBuilder.buildAudioLabel(language: 'en', codec: null, index: 0), 'EN'); expect(TrackLabelBuilder.buildAudioLabel(language: 'en', codec: '', index: 0), 'EN'); }); test('omits channels when null', () { expect(TrackLabelBuilder.buildAudioLabel(language: 'en', codec: 'aac', index: 0), 'EN · AAC'); }); test('falls back to "Audio Track N" when nothing supplied', () { expect(TrackLabelBuilder.buildAudioLabel(index: 0), 'Audio Track 1'); expect(TrackLabelBuilder.buildAudioLabel(index: 3), 'Audio Track 4'); }); test('zero channel count is still rendered (caller decides validity)', () { // Behavior check: 0 is non-null, so it appears as 0ch. expect(TrackLabelBuilder.buildAudioLabel(channelsCount: 0, index: 0), '0ch'); }); }); group('TrackLabelBuilder.buildSubtitleLabel', () { test('combines title, uppercased language, friendly codec', () { expect( TrackLabelBuilder.buildSubtitleLabel(title: 'Forced', language: 'en', codec: 'subrip', index: 0), 'Forced · EN · SRT', ); }); test('uppercases language and formats codec', () { expect(TrackLabelBuilder.buildSubtitleLabel(language: 'fr', codec: 'webvtt', index: 0), 'FR · VTT'); expect(TrackLabelBuilder.buildSubtitleLabel(language: 'de', codec: 'hdmv_pgs_subtitle', index: 0), 'DE · PGS'); }); test('omits codec when null/empty', () { expect(TrackLabelBuilder.buildSubtitleLabel(language: 'en', index: 0), 'EN'); expect(TrackLabelBuilder.buildSubtitleLabel(language: 'en', codec: '', index: 0), 'EN'); }); test('does not duplicate forced when the title already says forced', () { expect( TrackLabelBuilder.buildSubtitleLabel(title: 'Forced', language: 'en', codec: 'subrip', forced: true, index: 0), 'Forced · EN · SRT', ); }); test('falls back to "Track N" with default prefix', () { expect(TrackLabelBuilder.buildSubtitleLabel(index: 0), 'Track 1'); expect(TrackLabelBuilder.buildSubtitleLabel(index: 7), 'Track 8'); }); test('cleans raw Jellyfin/ExoPlayer subtitle metadata prefixes', () { expect( TrackLabelBuilder.buildSubtitleLabel( title: 'title=German - SUBRIP', language: 'LANG=DEU', codec: 'srt', index: 0, ), 'German · DEU · SRT', ); expect( TrackLabelBuilder.buildSubtitleLabel( title: 'title=English - Default - SUBRIP', language: 'LANG=ENG', codec: 'subrip', index: 1, ), 'English - Default · ENG · SRT', ); }); }); }