fix(player): 重构单层过渡并阻止锁定集串播
This commit is contained in:
1 parent
70d8e0f982
commit
0cb0ab0613
8 files changed
+657
-335
No files matched your search
@@ -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(
|
||||
|
||||
Reference in new issue
Block a user