Notification_Center
Notification Center
didSet
class MockAVPlayItem: AVPlayerItem {
nonisolated(unsafe) private var _status: AVPlayerItem.Status = .unknown
override dynamic var status: AVPlayerItem.Status {
set(newStatus) {
willChangeValue(for: \.status)
_status = newStatus
didChangeValue(for: \.status)
}
get {
return _status
}
}
}
status property is overridden which can be modified & new changes reflects in KVO
self.playerItem = MockAVPlayerItem(url: testUrl)
self.player = MockAVPlayer()
self.bus = EngineEventBus()
player.replaceCurrentItem(with: playerItem)
self.observer = AVPlayerObserver(url: testUrl,
player: player,
playerItem: playerItem,
telemetry: bus)
func testPlayerItemReadyEvent() {
let expectation = self.expectation(description: "Receive Player Item Ready To Play Event")
subscription = bus.events
.filter { $0.type == .playerItemStatusChanged }
.sink { event in
// filtering out for desired event type here
guard event.data?.playerItemStatus == .readyToPlay else { return }
expectation.fulfill()
}
playerItem.status = .readyToPlay // deliberately update player item status
wait(for: [expectation], timeout: 3.0)
}
Notification Center
func testPlayerItemReadyEvent() {
let expectation = self.expectation(description: "Receive Player Item Ready To Play Event")
subscription = bus.events
.filter { $0.type == .playerItemTimeJumped }
.sink { event in
// filtering out for desired event type here
XCTAssertEqual(event.url, self.testUrl)
expectation.fulfill()
}
NotificationCenter.default.post(name: AVPlayerItem.timeJumpedNotification, object: player.currentItem)
wait(for: [expectation], timeout: 5.0)
}