import pytest from notifier import Notifier from player_mock import Player @pytest.fixture def mockPlayer(): return Player() @pytest.fixture def uut(mockPlayer): return Notifier(mockPlayer) def checkEvent(uut, event): callbacks = 2 calledFlags = [False] * 2 def createCallback(i): def cb(): nonlocal calledFlags calledFlags[i] = True return cb for i in range(0, callbacks): uut.registerCallback(event, createCallback(i)) assert not any(calledFlags) uut.notify(event) assert all(calledFlags) def test_allEvents(uut): checkEvent(uut, Notifier.PLAYING_STATE_EVENT) checkEvent(uut, Notifier.PLAYBACK_VOLUME_EVENT) checkEvent(uut, Notifier.PLAYBACK_RATE_EVENT) def test_eventWithoutRegisteredCallbacks(uut): uut.notify(Notifier.PLAYING_STATE_EVENT) # expect no crash def test_eventsWithMockPlayer(uut, mockPlayer): def testEvent(eventCode, simulateEvent): called = False def callback(): nonlocal called called = True uut.registerCallback(eventCode, callback) assert not called simulateEvent() assert called testEvent(Notifier.PLAYING_STATE_EVENT, mockPlayer.simulatePlayingStateChanged) testEvent(Notifier.PLAYBACK_VOLUME_EVENT, mockPlayer.simulatePlaybackVolumeChanged) def test_singleEventNotification(uut): playingStateCalled = False def playingStateCallback(): nonlocal playingStateCalled playingStateCalled = True volumeCalled = False def volumeCallback(): nonlocal volumeCalled volumeCalled = True uut.registerCallback(Notifier.PLAYING_STATE_EVENT, playingStateCallback) uut.registerCallback(Notifier.PLAYBACK_VOLUME_EVENT, volumeCallback) assert not playingStateCalled assert not volumeCalled uut.notify(Notifier.PLAYING_STATE_EVENT) assert playingStateCalled assert not volumeCalled playingStateCalled = False uut.notify(Notifier.PLAYBACK_VOLUME_EVENT) assert not playingStateCalled assert volumeCalled volumeCalled = False uut.notify(Notifier.PLAYBACK_RATE_EVENT) assert not playingStateCalled assert not volumeCalled