Files
SpotiFLAC-Mobile/test/lyrics_metadata_helper_test.dart
T
zarzet 1d96521c0f fix(lyrics): align usability checks with shared fixtures
Trim after removing inline timestamps before matching speaker prefixes in Dart. Run one 21-case usability corpus through Dart, Go, and Kotlin tests.

Document the shared fixture and trigger Dart and Go CI when its resources change.
2026-09-06 14:05:09 +07:00

88 lines
2.4 KiB
Dart

import 'dart:io';
import 'package:flutter_test/flutter_test.dart';
import 'package:spotiflac_android/utils/lyrics_metadata_helper.dart';
void main() {
group('shared lyric usability cases', () {
final cases = File(
'android/app/src/test/resources/lyrics_usability_cases.tsv',
).readAsLinesSync();
for (final line in cases) {
if (line.isEmpty || line.startsWith('#')) continue;
final fields = line.split('\t');
test(fields.first, () {
expect(fields, hasLength(3));
final lyrics = fields[2]
.replaceAll(r'\n', '\n')
.replaceAll(r'\r', '\r')
.replaceAll(r'\t', '\t');
expect(hasUsableLyricsContent(lyrics), fields[1] == 'true');
});
}
});
group('lyrics display normalization', () {
test('rejects metadata-only embedded LRC', () {
const raw = '''
[ti:Banna Re]
[ar:Dhvani Bhanushali]
[al:Banna Re]
[by:SpotiFLAC Mobile]
''';
expect(cleanLyricsForDisplay(raw), isEmpty);
expect(hasUsableLyricsContent(raw), isFalse);
expect(
hasEmbeddedLyricsMetadata({'LYRICS': raw, 'UNSYNCEDLYRICS': raw}),
isFalse,
);
});
test('keeps timed, background, and speaker lyric content', () {
const raw = '''
[ti:Song]
[00:01.25]Lead line
[bg:Background line]
[00:02:500]<00:02.500>v2: Harmony line
''';
expect(
cleanLyricsForDisplay(raw),
'Lead line\nBackground line\nHarmony line',
);
expect(hasUsableLyricsContent(raw), isTrue);
});
test('recognizes the instrumental marker without rendering it as text', () {
expect(isInstrumentalLyricsMarker(' [Instrumental:TRUE] '), isTrue);
expect(hasUsableLyricsContent('[instrumental:true]'), isTrue);
expect(cleanLyricsForDisplay('[instrumental:true]'), isEmpty);
});
});
group('metadata conversion merge', () {
test('preserves explicit advisory using the canonical tag', () {
final metadata = <String, String>{};
mergePlatformMetadataForTagEmbed(
target: metadata,
source: {'explicit': true},
);
expect(metadata['ITUNESADVISORY'], '1');
});
test('removes a stale explicit advisory for a non-explicit file', () {
final metadata = <String, String>{'ITUNESADVISORY': '1'};
mergePlatformMetadataForTagEmbed(
target: metadata,
source: {'explicit': false},
);
expect(metadata, isNot(contains('ITUNESADVISORY')));
});
});
}