Initial commit

This commit is contained in:
admin1
2026-07-14 11:11:36 +08:00
commit 656499cf94
604 changed files with 119518 additions and 0 deletions
@@ -0,0 +1,107 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:smplayer/core/contracts/playback.dart';
import 'package:smplayer/features/player/session/initial_subtitle_resolver.dart';
import 'package:smplayer/providers/subtitle_settings_provider.dart';
const subtitles = <EmbySubtitleTrack>[
EmbySubtitleTrack(index: 2, language: 'chi', title: '简体中文'),
EmbySubtitleTrack(index: 3, language: 'eng', title: 'English'),
];
RememberedSubtitleTrack rememberedSubtitle({
int streamIndex = 2,
String? language,
String? title,
}) {
return RememberedSubtitleTrack(
streamIndex: streamIndex,
language: language,
title: title,
updatedAt: DateTime(2026),
);
}
InitialSubtitleSelection resolveSelection({
List<EmbySubtitleTrack> availableSubtitles = subtitles,
int? preferredSubtitleStreamIndex,
int? defaultSubtitleStreamIndex,
RememberedSubtitleTrack? remembered,
}) {
return resolveInitialSubtitleSelection(
subtitles: availableSubtitles,
preferredSubtitleStreamIndex: preferredSubtitleStreamIndex,
defaultSubtitleStreamIndex: defaultSubtitleStreamIndex,
rememberedSubtitle: remembered,
);
}
void main() {
test('显式 route 轨优先于记忆与服务器默认轨', () {
final selection = resolveSelection(
preferredSubtitleStreamIndex: 3,
defaultSubtitleStreamIndex: 2,
remembered: rememberedSubtitle(streamIndex: 2),
);
expect(selection.type, InitialSubtitleSelectionType.track);
expect(selection.track?.index, 3);
});
test('route -1 且没有记忆时禁用字幕', () {
final selection = resolveSelection(
preferredSubtitleStreamIndex: -1,
defaultSubtitleStreamIndex: 2,
);
expect(selection.type, InitialSubtitleSelectionType.disabled);
expect(selection.track, isNull);
});
test('禁用字幕记忆优先于 route -1 与服务器默认轨', () {
final selection = resolveSelection(
preferredSubtitleStreamIndex: -1,
defaultSubtitleStreamIndex: 2,
remembered: RememberedSubtitleTrack(
streamIndex: -1,
updatedAt: DateTime(2026),
),
);
expect(selection.type, InitialSubtitleSelectionType.disabled);
});
test('跨集记忆按语言与标题匹配可用轨', () {
final selection = resolveSelection(
defaultSubtitleStreamIndex: 3,
remembered: rememberedSubtitle(
streamIndex: 99,
language: 'CHI',
title: '简体中文',
),
);
expect(selection.type, InitialSubtitleSelectionType.track);
expect(selection.track?.index, 2);
});
test('记忆未命中时回落服务器默认轨', () {
final selection = resolveSelection(
defaultSubtitleStreamIndex: 3,
remembered: rememberedSubtitle(
streamIndex: 99,
language: 'jpn',
title: '日本語',
),
);
expect(selection.type, InitialSubtitleSelectionType.track);
expect(selection.track?.index, 3);
});
test('没有 route、记忆或服务器默认轨时保持引擎状态', () {
final selection = resolveSelection(availableSubtitles: const []);
expect(selection.type, InitialSubtitleSelectionType.unchanged);
expect(selection.track, isNull);
});
}