From d3a5876ecca7a5dcfcdbaa07b6cff69931fe5257 Mon Sep 17 00:00:00 2001 From: Maximilian Bauer Date: Fri, 9 Apr 2021 21:01:53 +0200 Subject: [PATCH] UnitTests: fixing player seek tests --- Amperfy/Common/AppDelegate.swift | 2 +- Amperfy/Player/BackendAudioPlayer.swift | 5 ++- .../Cases/Player/MusicPlayerTest.swift | 38 ++++++++++++++++++- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Amperfy/Common/AppDelegate.swift b/Amperfy/Common/AppDelegate.swift index a377acfb..7ecd2bb1 100644 --- a/Amperfy/Common/AppDelegate.swift +++ b/Amperfy/Common/AppDelegate.swift @@ -20,7 +20,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return backendProxy }() lazy var player = { - return MusicPlayer(coreData: persistentLibraryStorage.getPlayerData(), downloadManager: downloadManager, backendAudioPlayer: BackendAudioPlayer(songDownloader: downloadManager, songCache: persistentLibraryStorage)) + return MusicPlayer(coreData: persistentLibraryStorage.getPlayerData(), downloadManager: downloadManager, backendAudioPlayer: BackendAudioPlayer(mediaPlayer: AVPlayer(), songDownloader: downloadManager, songCache: persistentLibraryStorage)) }() lazy var downloadManager: DownloadManager = { let requestManager = RequestManager() diff --git a/Amperfy/Player/BackendAudioPlayer.swift b/Amperfy/Player/BackendAudioPlayer.swift index ead30865..c280fca1 100644 --- a/Amperfy/Player/BackendAudioPlayer.swift +++ b/Amperfy/Player/BackendAudioPlayer.swift @@ -30,7 +30,7 @@ class BackendAudioPlayer: SongDownloadNotifiable { private let songDownloader: SongDownloadable private let songCache: SongFileCachable - private let player = AVPlayer() + private let player: AVPlayer private let updateElapsedTimeInterval = CMTime(seconds: 1.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC)) private var latestPlayRequest: PlayRequest? private let semaphore = DispatchSemaphore(value: 1) @@ -61,7 +61,8 @@ class BackendAudioPlayer: SongDownloadNotifiable { return player.currentItem != nil } - init(songDownloader: SongDownloadable, songCache: SongFileCachable) { + init(mediaPlayer: AVPlayer, songDownloader: SongDownloadable, songCache: SongFileCachable) { + self.player = mediaPlayer self.songDownloader = songDownloader self.songCache = songCache diff --git a/AmperfyTests/Cases/Player/MusicPlayerTest.swift b/AmperfyTests/Cases/Player/MusicPlayerTest.swift index a0baaae1..2ded1a8d 100644 --- a/AmperfyTests/Cases/Player/MusicPlayerTest.swift +++ b/AmperfyTests/Cases/Player/MusicPlayerTest.swift @@ -1,6 +1,34 @@ import XCTest +import AVFoundation @testable import Amperfy +class MOCK_AVPlayerItem: AVPlayerItem { + override var status: AVPlayerItem.Status { + return AVPlayerItem.Status.readyToPlay + } +} + +class MOCK_AVPlayer: AVPlayer { + var useMockCurrentItem = false + + override var currentItem: AVPlayerItem? { + guard let curItem = super.currentItem else { return nil } + if !useMockCurrentItem { + return curItem + } else { + return MOCK_AVPlayerItem(asset: curItem.asset) + } + } + + override func currentTime() -> CMTime { + let oldUseMock = useMockCurrentItem + useMockCurrentItem = false + let curTime = super.currentTime() + useMockCurrentItem = oldUseMock + return curTime + } +} + class MOCK_SongDownloader: SongDownloadable { var downloadCount = 0 @@ -32,7 +60,8 @@ class MusicPlayerTest: XCTestCase { var songDownloader: MOCK_SongDownloader! var backendPlayer: BackendAudioPlayer! var playerData: PlayerData! - var testPlayer: MusicPlayer! + var testPlayer: Amperfy.MusicPlayer! + var mockAVPlayer: MOCK_AVPlayer! var songCached: Song! var songToDownload: Song! @@ -42,7 +71,8 @@ class MusicPlayerTest: XCTestCase { cdHelper = CoreDataHelper() storage = cdHelper.createSeededStorage() songDownloader = MOCK_SongDownloader() - backendPlayer = BackendAudioPlayer(songDownloader: songDownloader, songCache: storage) + mockAVPlayer = MOCK_AVPlayer() + backendPlayer = BackendAudioPlayer(mediaPlayer: mockAVPlayer, songDownloader: songDownloader, songCache: storage) playerData = storage.getPlayerData() testPlayer = MusicPlayer(coreData: playerData, downloadManager: songDownloader, backendAudioPlayer: backendPlayer) @@ -216,7 +246,9 @@ class MusicPlayerTest: XCTestCase { func testSeek_FilledPlaylist() { testPlayer.play(song: songCached) testPlayer.seek(toSecond: 3.0) + mockAVPlayer.useMockCurrentItem = true XCTAssertEqual(testPlayer.elapsedTime, 3.0) + mockAVPlayer.useMockCurrentItem = false } func testPlayPreviousOrReplay_EmptyPlaylist() { @@ -236,7 +268,9 @@ class MusicPlayerTest: XCTestCase { prepareWithCachedPlaylist() testPlayer.play(songInPlaylistAt: 3) testPlayer.seek(toSecond: 10.0) + mockAVPlayer.useMockCurrentItem = true testPlayer.playPreviousOrReplay() + mockAVPlayer.useMockCurrentItem = false XCTAssertEqual(testPlayer.currentlyPlaying?.index, 3) XCTAssertEqual(testPlayer.elapsedTime, 0.0) }