Added MIDI IO tests.
This commit is contained in:
		
							parent
							
								
									0b0bd7eda5
								
							
						
					
					
						commit
						8b5e81ed86
					
				|  | @ -48,6 +48,39 @@ TEST(MidiInput, getTypeFromStatusByte) | ||||||
|     EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfd), midi::InvalidType); |     EXPECT_EQ(MidiInterface::getTypeFromStatusByte(0xfd), midi::InvalidType); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | TEST(MidiInput, getChannelFromStatusByte) | ||||||
|  | { | ||||||
|  |     EXPECT_EQ(MidiInterface::getChannelFromStatusByte(0x00), 1); | ||||||
|  |     EXPECT_EQ(MidiInterface::getChannelFromStatusByte(0x80), 1); | ||||||
|  |     EXPECT_EQ(MidiInterface::getChannelFromStatusByte(0x94), 5); | ||||||
|  |     EXPECT_EQ(MidiInterface::getChannelFromStatusByte(0xaf), 16); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | TEST(MidiInput, isChannelMessage) | ||||||
|  | { | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::InvalidType),           false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::NoteOff),               true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::NoteOn),                true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::AfterTouchPoly),        true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::ControlChange),         true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::ProgramChange),         true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::AfterTouchChannel),     true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::PitchBend),             true); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::SystemExclusive),       false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::TimeCodeQuarterFrame),  false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::SongPosition),          false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::SongSelect),            false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::TuneRequest),           false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::Clock),                 false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::Start),                 false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::Continue),              false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::Stop),                  false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::ActiveSensing),         false); | ||||||
|  |     EXPECT_EQ(MidiInterface::isChannelMessage(midi::SystemReset),           false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // --
 | ||||||
|  | 
 | ||||||
| TEST(MidiInput, begin) | TEST(MidiInput, begin) | ||||||
| { | { | ||||||
|     SerialMock serial; |     SerialMock serial; | ||||||
|  | @ -64,4 +97,26 @@ TEST(MidiInput, begin) | ||||||
|     EXPECT_EQ(midi.getInputChannel(), 12); |     EXPECT_EQ(midi.getInputChannel(), 12); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | TEST(MidiInput, initInputChannel) | ||||||
|  | { | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  | 
 | ||||||
|  |     EXPECT_EQ(midi.getInputChannel(), 0); | ||||||
|  |     midi.setInputChannel(12); | ||||||
|  |     EXPECT_EQ(midi.getInputChannel(), 12); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | TEST(MidiInput, initMessage) | ||||||
|  | { | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     EXPECT_EQ(midi.getType(),               midi::InvalidType); | ||||||
|  |     EXPECT_EQ(midi.getChannel(),            0); | ||||||
|  |     EXPECT_EQ(midi.getData1(),              0); | ||||||
|  |     EXPECT_EQ(midi.getData2(),              0); | ||||||
|  |     EXPECT_EQ(midi.getSysExArrayLength(),   0); | ||||||
|  |     EXPECT_EQ(midi.check(),                 false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| END_UNNAMED_NAMESPACE | END_UNNAMED_NAMESPACE | ||||||
|  |  | ||||||
|  | @ -0,0 +1,146 @@ | ||||||
|  | #include "unit-tests.h" | ||||||
|  | #include <src/MIDI.h> | ||||||
|  | #include <test/mocks/test-mocks_SerialMock.h> | ||||||
|  | 
 | ||||||
|  | BEGIN_MIDI_NAMESPACE | ||||||
|  | 
 | ||||||
|  | END_MIDI_NAMESPACE | ||||||
|  | 
 | ||||||
|  | // -----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | BEGIN_UNNAMED_NAMESPACE | ||||||
|  | 
 | ||||||
|  | template<bool RunningStatus, bool OneByteParsing> | ||||||
|  | struct VariableSettings : public midi::DefaultSettings | ||||||
|  | { | ||||||
|  |     static const bool UseRunningStatus = RunningStatus; | ||||||
|  |     static const bool Use1ByteParsing  = OneByteParsing; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template<bool A, bool B> | ||||||
|  | const bool VariableSettings<A, B>::UseRunningStatus; | ||||||
|  | template<bool A, bool B> | ||||||
|  | const bool VariableSettings<A, B>::Use1ByteParsing; | ||||||
|  | 
 | ||||||
|  | using namespace testing; | ||||||
|  | typedef test_mocks::SerialMock<32> SerialMock; | ||||||
|  | typedef midi::MidiInterface<SerialMock> MidiInterface; | ||||||
|  | 
 | ||||||
|  | // --
 | ||||||
|  | 
 | ||||||
|  | TEST(MidiOutput, sendSingle) | ||||||
|  | { | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     test_mocks::uint8 buffer[3] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     midi.begin(); | ||||||
|  |     midi.send(midi::NoteOn, 47, 42, 12); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 3); | ||||||
|  |     serial.mTxBuffer.read(buffer, 3); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0x9b, 47, 42)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | TEST(MidiOutput, sendWithRunningStatus) | ||||||
|  | { | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     test_mocks::uint8 buffer[5] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     midi.begin(); | ||||||
|  |     EXPECT_EQ(MidiInterface::Settings::UseRunningStatus, true); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.isEmpty(), true); | ||||||
|  |     midi.send(midi::NoteOn, 47, 42, 12); | ||||||
|  |     midi.send(midi::NoteOn, 42, 47, 12); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 5); | ||||||
|  |     serial.mTxBuffer.read(buffer, 5); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0x9b, 47, 42, 42, 47)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | TEST(MidiOutput, sendWithoutRunningStatus) | ||||||
|  | { | ||||||
|  |     typedef VariableSettings<false, true> Settings; // No running status
 | ||||||
|  |     typedef midi::MidiInterface<SerialMock, Settings> MidiInterface; | ||||||
|  | 
 | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     test_mocks::uint8 buffer[6] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     // Same status byte
 | ||||||
|  |     midi.begin(); | ||||||
|  |     EXPECT_EQ(MidiInterface::Settings::UseRunningStatus, false); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.isEmpty(), true); | ||||||
|  |     midi.send(midi::NoteOn, 47, 42, 12); | ||||||
|  |     midi.send(midi::NoteOn, 42, 47, 12); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 6); | ||||||
|  |     serial.mTxBuffer.read(buffer, 6); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0x9b, 47, 42, 0x9b, 42, 47)); | ||||||
|  | 
 | ||||||
|  |     // Different status byte
 | ||||||
|  |     midi.begin(); | ||||||
|  |     midi.send(midi::NoteOn,  47, 42, 12); | ||||||
|  |     midi.send(midi::NoteOff, 47, 42, 12); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 6); | ||||||
|  |     serial.mTxBuffer.read(buffer, 6); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0x9b, 47, 42, 0x8b, 47, 42)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | TEST(MidiOutput, sendBreakingRunningStatus) | ||||||
|  | { | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     test_mocks::uint8 buffer[6] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     midi.begin(); | ||||||
|  |     midi.send(midi::NoteOn,  47, 42, 12); | ||||||
|  |     midi.send(midi::NoteOff, 47, 42, 12); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 6); | ||||||
|  |     serial.mTxBuffer.read(buffer, 6); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0x9b, 47, 42, 0x8b, 47, 42)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | TEST(MidiOutput, sendMultipleNoteOff) | ||||||
|  | { | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     test_mocks::uint8 buffer[5] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     midi.begin(); | ||||||
|  |     midi.send(midi::NoteOff, 10, 11, 12); | ||||||
|  |     midi.send(midi::NoteOff, 12, 13, 12); | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 5); | ||||||
|  |     serial.mTxBuffer.read(buffer, 5); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0x8b, 10, 11, 12, 13)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* TEST(MidiOutput, Issue41)
 | ||||||
|  | { | ||||||
|  |     typedef VariableSettings<true, false> Settings; // Running status, multibyte parsing
 | ||||||
|  |     typedef midi::MidiInterface<SerialMock, Settings> MidiInterface; | ||||||
|  | 
 | ||||||
|  |     // #41: issue with sending series of ControlChange
 | ||||||
|  |     SerialMock serial; | ||||||
|  |     MidiInterface midi(serial); | ||||||
|  |     test_mocks::uint8 buffer[9] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     midi.begin(MIDI_CHANNEL_OMNI); | ||||||
|  |     midi.turnThruOff(); | ||||||
|  | 
 | ||||||
|  |     // Simulate some pitch bend messages
 | ||||||
|  |     serial.mRxBuffer.write(0xe0); | ||||||
|  |     serial.mRxBuffer.write(0); | ||||||
|  |     serial.mRxBuffer.write(12); | ||||||
|  |     serial.mRxBuffer.write(0); | ||||||
|  |     serial.mRxBuffer.write(42); | ||||||
|  |     serial.mRxBuffer.write(0); | ||||||
|  |     serial.mRxBuffer.write(47); | ||||||
|  |     midi.read(); | ||||||
|  | 
 | ||||||
|  |     EXPECT_EQ(serial.mTxBuffer.getLength(), 9); | ||||||
|  |     serial.mTxBuffer.read(buffer, 9); | ||||||
|  |     EXPECT_THAT(buffer, ElementsAre(0xbb, 80, 42, 80, 47, 80, 42, 80, 47)); | ||||||
|  | } */ | ||||||
|  | 
 | ||||||
|  | // --
 | ||||||
|  | 
 | ||||||
|  | END_UNNAMED_NAMESPACE | ||||||
		Loading…
	
		Reference in New Issue
	
	 Francois Best
						Francois Best