@@ -11,12 +11,20 @@ import com.lasthopesoftware.bluewater.client.playback.engine.bootstrap.ManagedPl
1111import com.lasthopesoftware.bluewater.client.playback.engine.preparation.PreparedPlaybackQueueResourceManagement
1212import com.lasthopesoftware.bluewater.client.playback.file.PositionedFile
1313import com.lasthopesoftware.bluewater.client.playback.file.PositionedPlayingFile
14- import com.lasthopesoftware.bluewater.client.playback.file.preparation.FakeMappedPlayableFilePreparationSourceProvider
14+ import com.lasthopesoftware.bluewater.client.playback.file.fakes.FakePreparedPlayableFile
15+ import com.lasthopesoftware.bluewater.client.playback.file.fakes.ResolvablePlaybackHandler
1516import com.lasthopesoftware.bluewater.client.playback.file.preparation.queues.CompletingFileQueueProvider
1617import com.lasthopesoftware.bluewater.client.playback.nowplaying.storage.NowPlayingRepository
1718import com.lasthopesoftware.bluewater.client.playback.volume.PlaylistVolumeManager
19+ import com.lasthopesoftware.bluewater.shared.promises.extensions.DeferredPromise
1820import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture
21+ import com.lasthopesoftware.promises.ForwardedResponse.Companion.thenForward
22+ import com.lasthopesoftware.promises.extensions.keepPromise
23+ import com.lasthopesoftware.promises.PromiseDelay
24+ import com.lasthopesoftware.promises.toFuture
1925import com.namehillsoftware.handoff.promises.Promise
26+ import io.mockk.every
27+ import io.mockk.mockk
2028import org.assertj.core.api.Assertions.assertThat
2129import org.joda.time.Duration
2230import org.junit.jupiter.api.BeforeAll
@@ -30,19 +38,29 @@ class `When changing tracks many times` {
3038 }
3139
3240 private val mut by lazy {
33- val fakePlaybackPreparerProvider = FakeMappedPlayableFilePreparationSourceProvider (
34- listOf (
35- ServiceFile (" 1" ),
36- ServiceFile (" 2" ),
37- ServiceFile (" 3" ),
38- ServiceFile (" 4" ),
39- ServiceFile (" 5" )
40- )
41- )
41+ val deferredPlaybackHandlers = listOf (
42+ ServiceFile (" 1" ),
43+ ServiceFile (" 2" ),
44+ ServiceFile (" 3" ),
45+ ServiceFile (" 4" ),
46+ ServiceFile (" 5" )
47+ ).associateWith {
48+ val playbackHandler = ResolvablePlaybackHandler ()
49+ Pair (playbackHandler, DeferredPromise (FakePreparedPlayableFile (playbackHandler)))
50+ }
51+
4252 val library = Library (id = libraryId)
4353 val libraryProvider = FakeLibraryRepository (library)
44- val preparedPlaybackQueueResourceManagement =
45- PreparedPlaybackQueueResourceManagement (fakePlaybackPreparerProvider, FakePlaybackQueueConfiguration ())
54+ val preparedPlaybackQueueResourceManagement = PreparedPlaybackQueueResourceManagement (
55+ mockk {
56+ every { providePlayableFilePreparationSource() } returns mockk {
57+ every { promisePreparedPlaybackFile(LibraryId (libraryId), any(), any()) } answers {
58+ deferredPlaybackHandlers[secondArg()]?.second.keepPromise().thenForward()
59+ }
60+ }
61+ },
62+ FakePlaybackQueueConfiguration ()
63+ )
4664 val repository = NowPlayingRepository (
4765 FakeSelectedLibraryProvider (),
4866 libraryProvider,
@@ -61,7 +79,7 @@ class `When changing tracks many times` {
6179 playbackBootstrapper,
6280 playbackBootstrapper,
6381 )
64- Pair (fakePlaybackPreparerProvider , playbackEngine)
82+ Pair (deferredPlaybackHandlers , playbackEngine)
6583 }
6684
6785 private var nextSwitchedFile: PositionedFile ? = null
@@ -70,7 +88,7 @@ class `When changing tracks many times` {
7088
7189 @BeforeAll
7290 fun act () {
73- val (fakePlaybackPreparerProvider , playbackEngine) = mut
91+ val (preparedFiles , playbackEngine) = mut
7492
7593 val promisedFinalFile = Promise {
7694 playbackEngine
@@ -82,7 +100,7 @@ class `When changing tracks many times` {
82100 }
83101 }
84102
85- val playlist = fakePlaybackPreparerProvider.deferredResolutions .keys.toList()
103+ val playlist = preparedFiles .keys.toList()
86104
87105 val promisedStart = playbackEngine
88106 .startPlaylist(
@@ -91,7 +109,8 @@ class `When changing tracks many times` {
91109 1
92110 )
93111
94- val playingPlaybackHandler = fakePlaybackPreparerProvider.deferredResolutions[ServiceFile (" 2" )]?.resolve()
112+ val (playingPlaybackHandler, resolvablePlaybackHandler) = preparedFiles.getValue(ServiceFile (" 2" ))
113+ resolvablePlaybackHandler.resolve()
95114 promisedStart.toExpiringFuture().get()
96115
97116 val promisedChanges = Promise .whenAll(
@@ -101,19 +120,22 @@ class `When changing tracks many times` {
101120 )
102121
103122 // Resolve the skipped tracks as well to ensure that they aren't the last switched track
104- fakePlaybackPreparerProvider.deferredResolutions [playlist[2 ]]?.resolve()
123+ preparedFiles [playlist[2 ]]?.second ?.resolve()
105124
106- val finalPreparableFile = fakePlaybackPreparerProvider.deferredResolutions [playlist[4 ]]
107- finalPreparableFile?.resolve()
125+ val finalPreparableFile = preparedFiles [playlist[4 ]]
126+ finalPreparableFile?.second?. resolve()
108127
109128 nextSwitchedFile = promisedChanges.toExpiringFuture().get()?.lastOrNull()?.second
110129
111- // Resolve the first skipped tracks afterward to ensure a cancellation is tested.
112- fakePlaybackPreparerProvider.deferredResolutions [playlist[0 ]]?.resolve()
130+ // Resolve the first skipped track afterward to ensure a cancellation is tested.
131+ preparedFiles [playlist[0 ]]?.second ?.resolve()
113132
114- playingPlaybackHandler? .resolve()
133+ playingPlaybackHandler.resolve()
115134
116- latestFile = promisedFinalFile.toExpiringFuture().get()
135+ latestFile = Promise .whenAny(
136+ promisedFinalFile,
137+ PromiseDelay .delay(Duration .standardSeconds(10 ))
138+ ).toFuture().get()
117139 }
118140
119141 @Test
0 commit comments