#include "unit-tests.h" #include #include #include BEGIN_MIDI_NAMESPACE END_MIDI_NAMESPACE // ----------------------------------------------------------------------------- BEGIN_UNNAMED_NAMESPACE using Buffer = midi::RingBuffer; TEST(MidiUsbPacketInterfaceTx, EmptyBufferShouldNotComposeAPacket) { midiEventPacket_t packet; Buffer buffer; const bool result = midi::composeTxPacket(buffer, packet); EXPECT_FALSE(result) << "Empty buffer should not compose a packet"; } TEST(MidiUsbPacketInterfaceTx, IncompleteDataShouldNotComposeAPacket) { midiEventPacket_t packet; Buffer buffer; bool result = false; buffer.write(0x81); result = midi::composeTxPacket(buffer, packet); EXPECT_FALSE(result) << "Insufficient data should not compose a packet"; EXPECT_EQ(1, buffer.getLength()) << "Partial data should not be read out of the buffer"; buffer.write(0x12); buffer.write(0x42); result = midi::composeTxPacket(buffer, packet); EXPECT_TRUE(result) << "Complete data should compose a packet"; EXPECT_EQ(0, buffer.getLength()) << "Complete packet data should be read out of the buffer"; EXPECT_EQ(midi::CodeIndexNumbers::noteOff, packet.header); EXPECT_EQ(0x81, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); } // Channel Voice Messages -- TEST(MidiUsbPacketInterfaceTx, NoteOff) { midiEventPacket_t packet; Buffer buffer; buffer.write(0x80); buffer.write(0x12); buffer.write(0x42); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::noteOff, packet.header); EXPECT_EQ(0x80, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, NoteOn) { midiEventPacket_t packet; Buffer buffer; buffer.write(0x91); buffer.write(0x12); buffer.write(0x42); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::noteOn, packet.header); EXPECT_EQ(0x91, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, PolyPressure) { midiEventPacket_t packet; Buffer buffer; buffer.write(0xA2); buffer.write(0x12); buffer.write(0x42); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::polyPressure, packet.header); EXPECT_EQ(0xA2, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, ControlChange) { midiEventPacket_t packet; Buffer buffer; buffer.write(0xB3); buffer.write(0x12); buffer.write(0x42); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::controlChange, packet.header); EXPECT_EQ(0xB3, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, ProgramChange) { midiEventPacket_t packet; Buffer buffer; buffer.write(0xC4); buffer.write(0x12); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::programChange, packet.header); EXPECT_EQ(0xC4, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, ChannelPressure) { midiEventPacket_t packet; Buffer buffer; buffer.write(0xD5); buffer.write(0x12); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::channelPressure, packet.header); EXPECT_EQ(0xD5, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, PitchBend) { midiEventPacket_t packet; Buffer buffer; buffer.write(0xE6); buffer.write(0x12); buffer.write(0x42); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::pitchBend, packet.header); EXPECT_EQ(0xE6, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } // System Real Time Messages -- TEST(MidiUsbPacketInterfaceTx, Clock) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::Clock); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::singleByte, packet.header); EXPECT_EQ(midi::Clock, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, Start) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::Start); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::singleByte, packet.header); EXPECT_EQ(midi::Start, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, Stop) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::Stop); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::singleByte, packet.header); EXPECT_EQ(midi::Stop, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, Continue) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::Continue); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::singleByte, packet.header); EXPECT_EQ(midi::Continue, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, ActiveSensing) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::ActiveSensing); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::singleByte, packet.header); EXPECT_EQ(midi::ActiveSensing, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SystemReset) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::SystemReset); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::singleByte, packet.header); EXPECT_EQ(midi::SystemReset, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } // System Common Messages -- TEST(MidiUsbPacketInterfaceTx, TuneRequest) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::TuneRequest); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::systemCommon1Byte, packet.header); EXPECT_EQ(midi::TuneRequest, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SongSelect) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::SongSelect); buffer.write(0x12); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::systemCommon2Bytes, packet.header); EXPECT_EQ(midi::SongSelect, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SongPosition) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::SongPosition); buffer.write(0x12); buffer.write(0x42); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::systemCommon3Bytes, packet.header); EXPECT_EQ(midi::SongPosition, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x42, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, TimeCodeQuarterFrame) { midiEventPacket_t packet; Buffer buffer; buffer.write(midi::TimeCodeQuarterFrame); buffer.write(0x12); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::systemCommon2Bytes, packet.header); EXPECT_EQ(midi::TimeCodeQuarterFrame, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } // System Exclusive -- TEST(MidiUsbPacketInterfaceTx, SysExNotEnoughData) { midiEventPacket_t packet; Buffer buffer; buffer.write(0x12); buffer.write(0x42); EXPECT_FALSE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(2, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SysExSinglePacket) { midiEventPacket_t packet; Buffer buffer; // Two-byte SysEx (utterly useless) buffer.write(0xf0); buffer.write(0xf7); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExEnds2Bytes, packet.header); EXPECT_EQ(0xf0, packet.byte1); EXPECT_EQ(0xf7, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); // Single-data byte SysEx (non-spec conformant ?) buffer.write(0xf0); buffer.write(0x12); buffer.write(0xf7); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExEnds3Bytes, packet.header); EXPECT_EQ(0xf0, packet.byte1); EXPECT_EQ(0x12, packet.byte2); EXPECT_EQ(0xf7, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SysExTwoPackets) { midiEventPacket_t packet; Buffer buffer; const byte deviceIdentityRequest[6] = { 0xf0, 0x7e, 0x7f, 0x06, 0x01, 0xf7 }; buffer.write(deviceIdentityRequest, 6); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExStart, packet.header); EXPECT_EQ(0xf0, packet.byte1); EXPECT_EQ(0x7e, packet.byte2); EXPECT_EQ(0x7f, packet.byte3); EXPECT_EQ(3, buffer.getLength()); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExEnds3Bytes, packet.header); EXPECT_EQ(0x06, packet.byte1); EXPECT_EQ(0x01, packet.byte2); EXPECT_EQ(0xf7, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SysExMultiplePacketsEndingWith1Byte) { midiEventPacket_t packet; Buffer buffer; const byte message[7] = { 0xf0, 0x01, 0x02, 0x03, 0x04, 0x05, 0xf7 }; buffer.write(message, 7); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExStart, packet.header); EXPECT_EQ(0xf0, packet.byte1); EXPECT_EQ(0x01, packet.byte2); EXPECT_EQ(0x02, packet.byte3); EXPECT_EQ(4, buffer.getLength()); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExContinue, packet.header); EXPECT_EQ(0x03, packet.byte1); EXPECT_EQ(0x04, packet.byte2); EXPECT_EQ(0x05, packet.byte3); EXPECT_EQ(1, buffer.getLength()); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExEnds1Byte, packet.header); EXPECT_EQ(0xf7, packet.byte1); EXPECT_EQ(0x00, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } TEST(MidiUsbPacketInterfaceTx, SysExMultiplePacketsEndingWith2Bytes) { midiEventPacket_t packet; Buffer buffer; const byte message[8] = { 0xf0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xf7 }; buffer.write(message, 8); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExStart, packet.header); EXPECT_EQ(0xf0, packet.byte1); EXPECT_EQ(0x01, packet.byte2); EXPECT_EQ(0x02, packet.byte3); EXPECT_EQ(5, buffer.getLength()); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExContinue, packet.header); EXPECT_EQ(0x03, packet.byte1); EXPECT_EQ(0x04, packet.byte2); EXPECT_EQ(0x05, packet.byte3); EXPECT_EQ(2, buffer.getLength()); EXPECT_TRUE(midi::composeTxPacket(buffer, packet)); EXPECT_EQ(midi::CodeIndexNumbers::sysExEnds2Bytes, packet.header); EXPECT_EQ(0x06, packet.byte1); EXPECT_EQ(0xf7, packet.byte2); EXPECT_EQ(0x00, packet.byte3); EXPECT_EQ(0, buffer.getLength()); } // ----------------------------------------------------------------------------- TEST(MidiUsbPacketInterfaceRx, PacketParsing) { } END_UNNAMED_NAMESPACE