1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
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)
|