fix(player): 重构单层过渡并阻止锁定集串播

This commit is contained in:
Zhou Weidong committed 2026-10-26 14:41:18 +08:00
1 parent 70d8e0f982
commit 0cb0ab0613
8 files changed
+657 -335

No files matched your search

+86
View File
@@ -32,6 +32,92 @@ void main() {
await session.close();
});
test('should_release_previous_player_immediately_when_selecting_locked', () async {
final lockedEpisodes = [
Episode(
id: 'free',
number: 1,
title: 'Free',
isFree: true,
videoUrl: 'https://example.test/free.mp4',
),
Episode(
id: 'locked',
number: 2,
title: 'Locked',
isFree: false,
locked: true,
videoUrl: 'https://example.test/should-not-play.mp4',
),
Episode(
id: 'next',
number: 3,
title: 'Next',
isFree: true,
videoUrl: 'https://example.test/next.mp4',
),
];
final factory = FakeFactory();
final session = PlaybackSession(
episodes: lockedEpisodes,
factory: factory.create,
canPlay: (episode) => !episode.locked,
);
await session.select(0, preloadIndex: 1);
final previous = factory.created.single;
await session.selectLocked(1, preloadIndex: 2, previousIndex: 0);
await session.playbackSettled;
expect(session.active, isNull);
expect(previous.pauseCalls, greaterThan(0));
expect(previous.disposed, isTrue);
expect(factory.live, 0);
expect(factory.created, hasLength(1));
await session.select(2, previousIndex: 1);
expect(session.active, same(factory.created.last));
expect(factory.created.last.playCalls, greaterThan(0));
await session.close();
});
test('should_play_locked_episode_only_after_it_is_unlocked', () async {
final lockedEpisodes = [
Episode(
id: 'free',
number: 1,
title: 'Free',
isFree: true,
videoUrl: 'https://example.test/free.mp4',
),
Episode(
id: 'locked',
number: 2,
title: 'Locked',
isFree: false,
locked: true,
videoUrl: 'https://example.test/locked.mp4',
),
];
final unlocked = <String>{};
final factory = FakeFactory();
final session = PlaybackSession(
episodes: lockedEpisodes,
factory: factory.create,
canPlay: (episode) => episode.isFree || unlocked.contains(episode.id),
);
await session.select(0);
await session.selectLocked(1);
expect(session.active, isNull);
unlocked.add('locked');
await session.select(1);
expect(session.active, same(factory.created.last));
expect(factory.created.last.playCalls, greaterThan(0));
await session.close();
});
test('should_drop_stale_initialize_and_keep_one_player_when_selection_is_rapid', () async {
final factory = FakeFactory(holdFirstInitialize: true);
final session = PlaybackSession(