|
|
@@ -0,0 +1,248 @@
|
|
|
+import { describe, expect, it } from '@ohos/hypium'
|
|
|
+import { MusicPlaybackController } from '../../../main/ets/controller/MusicPlaybackController'
|
|
|
+
|
|
|
+export default function musicPlaybackControllerTest() {
|
|
|
+ describe('MusicPlaybackControllerTest', () => {
|
|
|
+ it('dispatchRegisteredActions', 0, async () => {
|
|
|
+ const controller = MusicPlaybackController.getInstance()
|
|
|
+ const calls: string[] = []
|
|
|
+
|
|
|
+ controller.clearActions()
|
|
|
+ controller.setActions({
|
|
|
+ playOrPause: () => {
|
|
|
+ calls.push('playOrPause')
|
|
|
+ },
|
|
|
+ playNext: () => {
|
|
|
+ calls.push('playNext')
|
|
|
+ },
|
|
|
+ playPrevious: () => {
|
|
|
+ calls.push('playPrevious')
|
|
|
+ },
|
|
|
+ setLoopMode: () => {
|
|
|
+ calls.push('setLoopMode')
|
|
|
+ },
|
|
|
+ seekTo: (value: string, source?: string) => {
|
|
|
+ calls.push(`seekTo:${value}:${source ?? ''}`)
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ controller.playOrPause()
|
|
|
+ await controller.playNext()
|
|
|
+ await controller.playPrevious()
|
|
|
+ await controller.setLoopMode()
|
|
|
+ await controller.seekTo('88', 'test')
|
|
|
+
|
|
|
+ expect(calls.join(',')).assertEqual('playOrPause,playNext,playPrevious,setLoopMode,seekTo:88:test')
|
|
|
+ controller.clearActions()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('clearActionsStopsFurtherDispatch', 0, async () => {
|
|
|
+ const controller = MusicPlaybackController.getInstance()
|
|
|
+ let count = 0
|
|
|
+
|
|
|
+ const actions = {
|
|
|
+ playOrPause: () => {
|
|
|
+ count++
|
|
|
+ },
|
|
|
+ playNext: () => {
|
|
|
+ count++
|
|
|
+ },
|
|
|
+ playPrevious: () => {
|
|
|
+ count++
|
|
|
+ },
|
|
|
+ setLoopMode: () => {
|
|
|
+ count++
|
|
|
+ },
|
|
|
+ seekTo: (_value: string, _source?: string) => {
|
|
|
+ count++
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ controller.clearActions()
|
|
|
+ controller.setActions(actions)
|
|
|
+ controller.clearActions(actions)
|
|
|
+
|
|
|
+ controller.playOrPause()
|
|
|
+ await controller.playNext()
|
|
|
+ await controller.seekTo('1', 'cleared')
|
|
|
+
|
|
|
+ expect(count).assertEqual(0)
|
|
|
+ controller.clearActions()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('missingActionsAreSafeNoop', 0, async () => {
|
|
|
+ const controller = MusicPlaybackController.getInstance()
|
|
|
+
|
|
|
+ controller.clearActions()
|
|
|
+ controller.playOrPause()
|
|
|
+ await controller.playNext()
|
|
|
+ await controller.playPrevious()
|
|
|
+ await controller.setLoopMode()
|
|
|
+ await controller.seekTo('50', 'noop')
|
|
|
+
|
|
|
+ expect(true).assertTrue()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('advanceLoopModeWithBoundedCycle', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(0).playType).assertEqual(1)
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(1).playType).assertEqual(2)
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(2).playType).assertEqual(3)
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(3).playType).assertEqual(4)
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(4).playType).assertEqual(0)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveLoopModeToastText', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(0).toastText).assertEqual('单曲循环')
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(1).toastText).assertEqual('单曲播完')
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(2).toastText).assertEqual('随机播放')
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(3).toastText).assertEqual('连续播放不循环')
|
|
|
+ expect(MusicPlaybackController.resolveNextLoopMode(4).toastText).assertEqual('连续循环播放')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveSessionLoopModeMapping', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveSessionLoopMode(0).playType).assertEqual(1)
|
|
|
+ expect(MusicPlaybackController.resolveSessionLoopMode(1).playType).assertEqual(0)
|
|
|
+ expect(MusicPlaybackController.resolveSessionLoopMode(2).playType).assertEqual(3)
|
|
|
+ expect(MusicPlaybackController.resolveSessionLoopMode(3).playType).assertEqual(2)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveAvSessionLoopModeMapping', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveAvSessionLoopMode(0)).assertEqual(2)
|
|
|
+ expect(MusicPlaybackController.resolveAvSessionLoopMode(1)).assertEqual(1)
|
|
|
+ expect(MusicPlaybackController.resolveAvSessionLoopMode(2)).assertEqual(0)
|
|
|
+ expect(MusicPlaybackController.resolveAvSessionLoopMode(3)).assertEqual(3)
|
|
|
+ expect(MusicPlaybackController.resolveAvSessionLoopMode(4)).assertEqual(4)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveSeekPositionClampsByDuration', 0, () => {
|
|
|
+ const result = MusicPlaybackController.resolveSeekPosition({
|
|
|
+ requestedValue: '5000',
|
|
|
+ activeDuration: 3000
|
|
|
+ })
|
|
|
+
|
|
|
+ expect(result.canSeek).assertTrue()
|
|
|
+ expect(result.seekPos).assertEqual(2800)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveSeekPositionAppliesCueOffsets', 0, () => {
|
|
|
+ const result = MusicPlaybackController.resolveSeekPosition({
|
|
|
+ requestedValue: '1000',
|
|
|
+ activeDuration: 5000,
|
|
|
+ cueTrackStartOffset: 2000,
|
|
|
+ cueTrackEndOffset: 6000
|
|
|
+ })
|
|
|
+
|
|
|
+ expect(result.canSeek).assertTrue()
|
|
|
+ expect(result.seekPos).assertEqual(3000)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveSeekPositionBlocksUnknownDurationRemoteSeek', 0, () => {
|
|
|
+ const result = MusicPlaybackController.resolveSeekPosition({
|
|
|
+ requestedValue: '1000',
|
|
|
+ activeDuration: 0,
|
|
|
+ isRemoteSong: true
|
|
|
+ })
|
|
|
+
|
|
|
+ expect(result.canSeek).assertFalse()
|
|
|
+ expect(result.seekPos).assertEqual(1000)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveSeekValueFromPercentClampsInput', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveSeekValueFromPercent(25, 4000)).assertEqual(1000)
|
|
|
+ expect(MusicPlaybackController.resolveSeekValueFromPercent(-10, 4000)).assertEqual(0)
|
|
|
+ expect(MusicPlaybackController.resolveSeekValueFromPercent(120, 4000)).assertEqual(4000)
|
|
|
+ expect(MusicPlaybackController.resolveSeekValueFromPercent(50, 0)).assertEqual(0)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveNextQueueIndexWrapsAtEnd', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveNextQueueIndex(1, 3).nextIndex).assertEqual(2)
|
|
|
+ expect(MusicPlaybackController.resolveNextQueueIndex(2, 3).nextIndex).assertEqual(0)
|
|
|
+ expect(MusicPlaybackController.resolveNextQueueIndex(2, 3).reachedBoundary).assertTrue()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolvePreviousQueueIndexWrapsAtStart', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolvePreviousQueueIndex(2, 3).nextIndex).assertEqual(1)
|
|
|
+ expect(MusicPlaybackController.resolvePreviousQueueIndex(0, 3).nextIndex).assertEqual(2)
|
|
|
+ expect(MusicPlaybackController.resolvePreviousQueueIndex(0, 3).reachedBoundary).assertTrue()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveQueueSongIndexUsesExistingQueuePosition', 0, () => {
|
|
|
+ const resolution = MusicPlaybackController.resolveQueueSongIndex(
|
|
|
+ ['/music/a.flac', '/music/b.flac', '/music/c.flac'],
|
|
|
+ '/music/b.flac'
|
|
|
+ )
|
|
|
+
|
|
|
+ expect(resolution.index).assertEqual(1)
|
|
|
+ expect(resolution.shouldAppend).assertFalse()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveQueueSongIndexAppendsMissingSong', 0, () => {
|
|
|
+ const resolution = MusicPlaybackController.resolveQueueSongIndex(
|
|
|
+ ['/music/a.flac', '/music/b.flac'],
|
|
|
+ '/music/c.flac'
|
|
|
+ )
|
|
|
+
|
|
|
+ expect(resolution.index).assertEqual(2)
|
|
|
+ expect(resolution.shouldAppend).assertTrue()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('stopAtQueueEndOnlyForNonLoopSequentialMode', 0, () => {
|
|
|
+ expect(MusicPlaybackController.shouldStopAtQueueEnd(4, 2, 3)).assertTrue()
|
|
|
+ expect(MusicPlaybackController.shouldStopAtQueueEnd(4, 1, 3)).assertFalse()
|
|
|
+ expect(MusicPlaybackController.shouldStopAtQueueEnd(0, 2, 3)).assertFalse()
|
|
|
+ expect(MusicPlaybackController.shouldStopAtQueueEnd(4, 0, 0)).assertFalse()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveCompletionActionByPlayMode', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveCompletionAction(0, 1, 3).action).assertEqual('play_next')
|
|
|
+ expect(MusicPlaybackController.resolveCompletionAction(1, 1, 3).action).assertEqual('replay_current')
|
|
|
+ expect(MusicPlaybackController.resolveCompletionAction(2, 1, 3).action).assertEqual('stop_current')
|
|
|
+ expect(MusicPlaybackController.resolveCompletionAction(3, 1, 3).action).assertEqual('random_next')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveCompletionActionStopsAtBoundaryForModeFour', 0, () => {
|
|
|
+ const resolution = MusicPlaybackController.resolveCompletionAction(4, 2, 3)
|
|
|
+
|
|
|
+ expect(resolution.action).assertEqual('stop_current')
|
|
|
+ expect(resolution.showBoundaryToast).assertTrue()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveNextPlaybackActionForRandomMode', 0, () => {
|
|
|
+ const resolution = MusicPlaybackController.resolveNextPlaybackAction(3, 1, 5)
|
|
|
+
|
|
|
+ expect(resolution).assertEqual('random_play')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveNextPlaybackActionStopsAtQueueBoundary', 0, () => {
|
|
|
+ const resolution = MusicPlaybackController.resolveNextPlaybackAction(4, 2, 3)
|
|
|
+
|
|
|
+ expect(resolution).assertEqual('stop_at_end')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveNextPlaybackActionAdvancesQueueByDefault', 0, () => {
|
|
|
+ const resolution = MusicPlaybackController.resolveNextPlaybackAction(0, 1, 3)
|
|
|
+
|
|
|
+ expect(resolution).assertEqual('advance_queue')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolvePreviousPlaybackActionUsesHistoryOnlyForRandomMode', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolvePreviousPlaybackAction(3)).assertEqual('history_previous')
|
|
|
+ expect(MusicPlaybackController.resolvePreviousPlaybackAction(0)).assertEqual('queue_previous')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveTogglePlaybackAction', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveTogglePlaybackAction(true, false)).assertEqual('pause')
|
|
|
+ expect(MusicPlaybackController.resolveTogglePlaybackAction(false, true)).assertEqual('resume_cast')
|
|
|
+ expect(MusicPlaybackController.resolveTogglePlaybackAction(false, false)).assertEqual('resume_local')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('resolveItemPlaybackToggleAction', 0, () => {
|
|
|
+ expect(MusicPlaybackController.resolveItemPlaybackToggleAction('/a.flac', '/a.flac', false))
|
|
|
+ .assertEqual('toggle_current')
|
|
|
+ expect(MusicPlaybackController.resolveItemPlaybackToggleAction('/a.flac', '/b.flac', false))
|
|
|
+ .assertEqual('play_target')
|
|
|
+ expect(MusicPlaybackController.resolveItemPlaybackToggleAction('/a.flac', '/b.flac', true, true))
|
|
|
+ .assertEqual('toggle_current')
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|