import pytest from midi_controller_launchpad_mini import MidiController from solo_tool import SoloTool from player_mock import Player as PlayerMock class MidiWrapperMock: def __init__(self): self.callback = None self.connectedDevice = None self.lastMessageSent = None def setCallback(self, callback): self.callback = callback def connect(self, deviceName): self.connectedDevice = deviceName def sendMessage(self, note, velocity=127, channel=0): pass def simulateInput(self, note, velocity=127, channel=0): if self.callback is not None: from mido import Message msg = Message("note_on", note=note, velocity=velocity, channel=channel) self.callback(msg) @pytest.fixture def playerMock(): return PlayerMock() @pytest.fixture def soloTool(playerMock): return SoloTool(playerMock) @pytest.fixture def midiWrapperMock(): return MidiWrapperMock() @pytest.fixture def uut(soloTool, midiWrapperMock): return MidiController(soloTool, midiWrapperMock) def test_connect(uut, midiWrapperMock): expectedDevice = "Launchpad Mini MIDI 1" uut.connect() assert midiWrapperMock.connectedDevice == expectedDevice def test_startStopAndPauseButtons(uut, midiWrapperMock, playerMock): playPauseButton = 112 stopButton = 96 uut.connect() assert playerMock.state == PlayerMock.STOPPED midiWrapperMock.simulateInput(playPauseButton) assert playerMock.state == PlayerMock.PLAYING midiWrapperMock.simulateInput(stopButton) assert playerMock.state == PlayerMock.STOPPED midiWrapperMock.simulateInput(playPauseButton) midiWrapperMock.simulateInput(playPauseButton) assert playerMock.state == PlayerMock.PAUSED midiWrapperMock.simulateInput(playPauseButton) assert playerMock.state == PlayerMock.PLAYING midiWrapperMock.simulateInput(playPauseButton) midiWrapperMock.simulateInput(stopButton) assert playerMock.state == PlayerMock.STOPPED def test_jumpToAButton(uut, midiWrapperMock, soloTool, playerMock): ab = (0.5, 0.6) uut.connect() soloTool.setAbLimits(ab[0], ab[1]) assert playerMock.position == 0.0 midiWrapperMock.simulateInput(101) assert playerMock.position == ab[0] def test_previousAndNextSongButtons(uut, midiWrapperMock, soloTool, playerMock): songs = [ "test.flac", "test.mp3" ] for s in songs: soloTool.addSong(s) uut.connect() assert playerMock.currentSong == None midiWrapperMock.simulateInput(119) assert playerMock.currentSong == songs[0] midiWrapperMock.simulateInput(119) assert playerMock.currentSong == songs[1] midiWrapperMock.simulateInput(118) assert playerMock.currentSong == songs[0] midiWrapperMock.simulateInput(118) assert playerMock.currentSong == songs[0] def test_unprogrammedButton(uut, midiWrapperMock): unusedButton = 48 uut.connect() # expect no crash midiWrapperMock.simulateInput(48)