aboutsummaryrefslogtreecommitdiffstats
path: root/midi_launchpad_mini_unittest.py
blob: 09f12dfc93ec4876c0c096921b02f8b2718448ce (plain)
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
from midi_controller_launchpad_mini import MidiController

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)

class SoloToolMock:
    STOPPED = 0
    PLAYING = 1
    PAUSED = 2

    def __init__(self):
        self.state = SoloToolMock.STOPPED
        self.position = 0.0
        self.currentAbLimit = (0.0, 0.0)

    def play(self):
        self.state = SoloToolMock.PLAYING

    def pause(self):
        self.state = SoloToolMock.PAUSED

    def stop(self):
        self.state = SoloToolMock.STOPPED

    def isPlaying(self):
        return self.state == SoloToolMock.PLAYING

    def jumpToA(self):
        self.position = self.currentAbLimit[0]

def test_connect():
    expectedDevice = "Launchpad Mini MIDI 1"

    soloToolMock = SoloToolMock()
    midiWrapperMock = MidiWrapperMock()
    uut = MidiController(soloToolMock, midiWrapperMock)
    uut.connect()

    assert midiWrapperMock.connectedDevice == expectedDevice

def test_startStopAndPauseButtons():
    playPauseButton = 112
    stopButton = 96

    soloToolMock = SoloToolMock()
    midiWrapperMock = MidiWrapperMock()
    uut = MidiController(soloToolMock, midiWrapperMock)
    uut.connect()

    assert soloToolMock.state == SoloToolMock.STOPPED

    midiWrapperMock.simulateInput(playPauseButton)
    assert soloToolMock.state == SoloToolMock.PLAYING

    midiWrapperMock.simulateInput(stopButton)
    assert soloToolMock.state == SoloToolMock.STOPPED

    midiWrapperMock.simulateInput(playPauseButton)
    midiWrapperMock.simulateInput(playPauseButton)
    assert soloToolMock.state == SoloToolMock.PAUSED

    midiWrapperMock.simulateInput(playPauseButton)
    assert soloToolMock.state == SoloToolMock.PLAYING

    midiWrapperMock.simulateInput(playPauseButton)
    midiWrapperMock.simulateInput(stopButton)
    assert soloToolMock.state == SoloToolMock.STOPPED

def test_jumpToAButton():
    ab = (0.5, 0.6)
    soloToolMock = SoloToolMock()
    midiWrapperMock = MidiWrapperMock()
    uut = MidiController(soloToolMock, midiWrapperMock)
    uut.connect()
    
    soloToolMock.currentAbLimit = (ab[0], ab[1])
    assert soloToolMock.position == 0.0

    midiWrapperMock.simulateInput(101)
    assert soloToolMock.position == ab[0]

def test_unprogrammedButton():
    unusedButton = 48
    midiWrapperMock = MidiWrapperMock()
    uut = MidiController(None, midiWrapperMock)
    uut.connect()

    # expect no crash
    midiWrapperMock.simulateInput(48)