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 test_allEvents(uut): def checkEvent(uut, event): callbacks = 2 calledFlags = [False] * callbacks values = [None] * callbacks def createCallback(i): def cb(value): nonlocal calledFlags, values calledFlags[i] = True values[i] = value return cb for i in range(0, callbacks): uut.registerCallback(event, createCallback(i)) assert not any(calledFlags) uut.notify(event, 123) assert all(calledFlags) assert values == [123] * callbacks checkEvent(uut, Notifier.PLAYING_STATE_EVENT) checkEvent(uut, Notifier.PLAYBACK_VOLUME_EVENT) checkEvent(uut, Notifier.PLAYBACK_RATE_EVENT) checkEvent(uut, Notifier.CURRENT_SONG_EVENT) checkEvent(uut, Notifier.CURRENT_AB_EVENT) def test_eventWithoutRegisteredCallbacks(uut): uut.notify(Notifier.PLAYING_STATE_EVENT, 0) # expect no crash def test_eventsWithMockPlayer(uut, mockPlayer): def checkEvent(eventCode, simulateEvent, expectedValue): called = False receivedValue = None def callback(value): nonlocal called, receivedValue called = True receivedValue = value uut.registerCallback(eventCode, callback) assert not called simulateEvent() assert called assert receivedValue == expectedValue mockPlayer.state = 1 mockPlayer.volume = 75 checkEvent(Notifier.PLAYING_STATE_EVENT, mockPlayer.simulatePlayingStateChanged, True) checkEvent(Notifier.PLAYBACK_VOLUME_EVENT, mockPlayer.simulatePlaybackVolumeChanged, 75) def test_singleEventNotification(uut): playingStateCalled = False def playingStateCallback(value): nonlocal playingStateCalled playingStateCalled = True volumeCalled = False def volumeCallback(value): 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, 0) assert playingStateCalled assert not volumeCalled playingStateCalled = False uut.notify(Notifier.PLAYBACK_VOLUME_EVENT, 0) assert not playingStateCalled assert volumeCalled volumeCalled = False uut.notify(Notifier.PLAYBACK_RATE_EVENT, 0) assert not playingStateCalled assert not volumeCalled