blob: e870a845ab2b177e3199bfd4afca3a21c5973628 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Evgeny S. Sidorenko
*/
package org.apache.harmony.sound.tests.javax.sound.midi;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.ShortMessage;
import junit.framework.TestCase;
public class ShortMessageTest extends TestCase {
/**
* test constants
*
*/
public void test_constants() {
assertEquals(254, ShortMessage.ACTIVE_SENSING);
assertEquals(208, ShortMessage.CHANNEL_PRESSURE);
assertEquals(251, ShortMessage.CONTINUE);
assertEquals(176, ShortMessage.CONTROL_CHANGE);
assertEquals(247, ShortMessage.END_OF_EXCLUSIVE);
assertEquals(241, ShortMessage.MIDI_TIME_CODE);
assertEquals(128, ShortMessage.NOTE_OFF);
assertEquals(144, ShortMessage.NOTE_ON);
assertEquals(224, ShortMessage.PITCH_BEND);
assertEquals(160, ShortMessage.POLY_PRESSURE);
assertEquals(192, ShortMessage.PROGRAM_CHANGE);
assertEquals(242, ShortMessage.SONG_POSITION_POINTER);
assertEquals(243, ShortMessage.SONG_SELECT);
assertEquals(250, ShortMessage.START);
assertEquals(252, ShortMessage.STOP);
assertEquals(255, ShortMessage.SYSTEM_RESET);
assertEquals(248, ShortMessage.TIMING_CLOCK);
assertEquals(246, ShortMessage.TUNE_REQUEST);
}
/**
* test constructors
*
*/
public void test_constructor_ShortMessage1() {
ShortMessage1 message = new ShortMessage1();
assertEquals(0, message.getChannel());
assertEquals(144, message.getCommand());
assertEquals(64, message.getData1());
assertEquals(127, message.getData2());
assertEquals(3, message.getLength());
assertEquals(144, message.getStatus());
assertEquals(3, message.getMessage().length);
assertEquals(-112, message.getMessage()[0]);
assertEquals(64, message.getMessage()[1]);
assertEquals(127, message.getMessage()[2]);
byte[] bt = new byte[] { -95, -5, 9, 56, -18 };
ShortMessage1 message1 = new ShortMessage1(bt);
assertEquals(1, message1.getChannel());
assertEquals(160, message1.getCommand());
assertEquals(251, message1.getData1());
assertEquals(9, message1.getData2());
assertEquals(5, message1.getLength());
assertEquals(161, message1.getStatus());
assertEquals(5, message1.getMessage().length);
assertEquals(-95, message1.getMessage()[0]);
assertEquals(-5, message1.getMessage()[1]);
assertEquals(9, message1.getMessage()[2]);
assertEquals(56, message1.getMessage()[3]);
assertEquals(-18, message1.getMessage()[4]);
bt[0] = 1;
bt[1] = 2;
bt[2] = 3;
bt[3] = 4;
bt[4] = 5;
/*
* values change
*/
assertEquals(1, message1.getChannel());
assertEquals(0, message1.getCommand());
assertEquals(2, message1.getData1());
assertEquals(3, message1.getData2());
assertEquals(5, message1.getLength());
assertEquals(1, message1.getStatus());
assertEquals(1, message1.getMessage()[0]);
assertEquals(2, message1.getMessage()[1]);
assertEquals(3, message1.getMessage()[2]);
assertEquals(4, message1.getMessage()[3]);
assertEquals(5, message1.getMessage()[4]);
ShortMessage1 message2 = new ShortMessage1(new byte[] { 95, 14 });
assertEquals(15, message2.getChannel());
assertEquals(80, message2.getCommand());
assertEquals(14, message2.getData1());
assertEquals(0, message2.getData2());
assertEquals(2, message2.getLength());
assertEquals(95, message2.getStatus());
assertEquals(2, message2.getMessage().length);
ShortMessage1 message3 = new ShortMessage1(null);
assertEquals(0, message3.getChannel());
assertEquals(0, message3.getCommand());
assertEquals(0, message3.getData1());
assertEquals(0, message3.getData2());
assertEquals(0, message3.getLength());
assertEquals(0, message3.getStatus());
try {
message3.getMessage();
fail("NullPointerException expected");
} catch (NullPointerException e) {}
ShortMessage1 message4 = new ShortMessage1(new byte[] {0});
assertEquals(0, message4.getChannel());
assertEquals(0, message4.getCommand());
assertEquals(0, message4.getData1());
assertEquals(0, message4.getData2());
assertEquals(1, message4.getLength());
assertEquals(0, message4.getStatus());
assertEquals(1, message4.getMessage().length);
ShortMessage1 message5 = new ShortMessage1(new byte[0]);
assertEquals(0, message5.getChannel());
assertEquals(0, message5.getCommand());
assertEquals(0, message5.getData1());
assertEquals(0, message5.getData2());
assertEquals(0, message5.getLength());
assertEquals(0, message5.getStatus());
assertEquals(0, message5.getMessage().length);
}
/**
* test method setMessage(int) of class ShortMessage
*/
public void test_setMessage1() throws Exception {
ShortMessage1 message = new ShortMessage1();
/*
* value of variable status is more or equals 246 and
* less or equals 255
*/
try {
message.setMessage(245);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.setMessage(256);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
message.setMessage(250);
/*
* channel change from 0 up to 15, and
* channel + command == status, so
* the value of command divisible by 16
*/
assertEquals(10, message.getChannel());
assertEquals(240, message.getCommand());
assertEquals(0, message.getData1());
assertEquals(0, message.getData2());
assertEquals(1, message.getLength());
assertEquals(250, message.getStatus());
assertEquals(1, message.getMessage().length);
}
/**
* test method setMessage(int, int, int) of
* class ShortMessage
*/
public void test_setMessage2() throws Exception {
ShortMessage1 message = new ShortMessage1();
/*
* value of variable status is more or equals 246 and
* less or equals 255
*/
try {
message.setMessage(245, 34, 56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.setMessage(256, 34, 56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
message.setMessage(250, 34, 56);
/*
* channel change from 0 up to 15, and
* channel + command == status, so
* the value of command divisible by 16.
*/
assertEquals(10, message.getChannel());
assertEquals(240, message.getCommand());
assertEquals(0, message.getData1());
assertEquals(0, message.getData2());
assertEquals(1, message.getLength());
assertEquals(250, message.getStatus());
assertEquals(1, message.getMessage().length);
}
/**
* test method setMessage(int, int, int, int) of
* class ShortMessage
*/
public void test_setMessage3() throws Exception {
ShortMessage1 message = new ShortMessage1();
/*
* value of variable command is more or equals 128 and
* less or equals 239
*/
try {
message.setMessage(127, 10, 34, 56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.setMessage(240, 34, 56, 13);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
/*
* value of variable channel is more or equals 0 and
* less or equals 15
*/
try {
message.setMessage(200, -1, 34, 56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.setMessage(200, 16, 34, 56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
/*
* value of data1 and data2 is more or equals 0 and
* less or equals 127, but when command more or
* equals 192 and less or equals 223 the second data,
* data2, is unused, because getDataLength(int) return 1
* in this case, and in other cases it return 2
*/
try {
message.setMessage(200, 12, -1, 56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.setMessage(225, 8, 34, 456);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
/*
* it's all right
*/
message.setMessage(200, 8, 34, 456);
message.setMessage(200, 9, 34, 56);
/*
* channel change from 0 up to 15
* command must to divisible by 16, and so it less or
* equals parameter command
* status is sum of channel and command
*/
assertEquals(9, message.getChannel());
assertEquals(192, message.getCommand());
assertEquals(34, message.getData1());
assertEquals(0, message.getData2());
assertEquals(2, message.getLength());
assertEquals(201, message.getStatus());
assertEquals(2, message.getMessage().length);
message.setMessage(148, 9, 34, 56);
assertEquals(9, message.getChannel());
assertEquals(144, message.getCommand());
assertEquals(34, message.getData1());
assertEquals(56, message.getData2());
assertEquals(3, message.getLength());
assertEquals(153, message.getStatus());
assertEquals(3, message.getMessage().length);
}
/**
* test method getChannel() of class ShortMessage
*
*/
public void test_getChannel() throws Exception {
ShortMessage message = new ShortMessage();
assertEquals(0, message.getChannel());
byte[] bt = new byte[] {23, 16, 35};
ShortMessage1 message1 = new ShortMessage1(bt);
assertEquals(7, message1.getChannel());
bt[0] = 15;
/*
* value change
*/
assertEquals(15, message1.getChannel());
ShortMessage1 message2 = new ShortMessage1(null);
assertEquals(0, message2.getChannel());
message.setMessage(249);
assertEquals(9, message.getChannel());
message.setMessage(250, 14, 62);
assertEquals(10, message.getChannel());
message.setMessage(234, 15, 14, 62);
assertEquals(15, message.getChannel());
}
/**
* test method getCommand() of class ShortMessage
*
*/
public void test_getCommand() throws Exception {
ShortMessage message = new ShortMessage();
assertEquals(144, message.getCommand());
byte[] bt = new byte[] {23, 16, 35};
ShortMessage1 message1 = new ShortMessage1(bt);
assertEquals(16, message1.getCommand());
bt[0] = 4;
/*
* value change
*/
assertEquals(0, message1.getCommand());
ShortMessage1 message2 = new ShortMessage1(null);
assertEquals(0, message2.getCommand());
message.setMessage(249);
assertEquals(240, message.getCommand());
message.setMessage(250, 14, 62);
assertEquals(240, message.getCommand());
message.setMessage(234, 15, 14, 62);
assertEquals(224, message.getCommand());
}
/**
* test method getLength() of class ShortMessage
*
*/
public void test_getLength() throws Exception {
ShortMessage message = new ShortMessage();
assertEquals(3, message.getLength());
ShortMessage1 message1 = new ShortMessage1(new byte[] {23, 16, 35});
assertEquals(3, message1.getLength());
ShortMessage1 message2 = new ShortMessage1(null);
assertEquals(0, message2.getLength());
message.setMessage(249);
assertEquals(1, message.getLength());
message.setMessage(250, 14, 62);
assertEquals(1, message.getLength());
message.setMessage(234, 15, 14, 62);
assertEquals(3, message.getLength());
message.setMessage(214, 15, 14, 62);
assertEquals(2, message.getLength());
}
/**
* test method getStatus() of class ShortMessage
*
*/
public void test_getStatus() throws Exception {
ShortMessage message = new ShortMessage();
assertEquals(144, message.getStatus());
byte[] bt = new byte[] {23, 16, 35};
ShortMessage1 message1 = new ShortMessage1(bt);
assertEquals(23, message1.getStatus());
bt[0] = 84;
/*
* value change
*/
assertEquals(84, message1.getStatus());
ShortMessage1 message2 = new ShortMessage1(null);
assertEquals(0, message2.getStatus());
message.setMessage(249);
assertEquals(249, message.getStatus());
message.setMessage(250, 14, 62);
assertEquals(250, message.getStatus());
message.setMessage(234, 15, 14, 62);
assertEquals(239, message.getStatus());
}
/**
* test methods getData1() and getData2() of
* class ShortMessage
*
*/
public void test_getData1_2() throws Exception {
ShortMessage message = new ShortMessage();
assertEquals(64, message.getData1());
assertEquals(127, message.getData2());
byte[] bt = new byte[] { 23, 16, 35 };
ShortMessage1 message1 = new ShortMessage1(bt);
assertEquals(16, message1.getData1());
assertEquals(35, message1.getData2());
bt[1] = 84;
bt[2] = -16;
/*
* values change
*/
assertEquals(84, message1.getData1());
assertEquals(240, message1.getData2());
ShortMessage1 message11 = new ShortMessage1(new byte[] { 23, 16 });
assertEquals(16, message11.getData1());
assertEquals(0, message11.getData2());
ShortMessage1 message12 = new ShortMessage1(new byte[] { 23 });
assertEquals(0, message12.getData1());
assertEquals(0, message12.getData2());
ShortMessage1 message2 = new ShortMessage1(null);
assertEquals(0, message2.getData1());
assertEquals(0, message2.getData2());
message.setMessage(249);
assertEquals(0, message.getData1());
assertEquals(0, message.getData2());
message.setMessage(250, 14, 62);
assertEquals(0, message.getData1());
assertEquals(0, message.getData2());
message.setMessage(234, 15, 14, 62);
assertEquals(14, message.getData1());
assertEquals(62, message.getData2());
message.setMessage(198, 15, 14, 62);
assertEquals(14, message.getData1());
assertEquals(0, message.getData2());
ShortMessage1 message15 = new ShortMessage1(new byte[] {-16, 16, 35});
assertEquals(16, message15.getData1());
assertEquals(35, message15.getData2());
}
/**
* test method getDataLength() of class ShortMessage
*
*/
public void test_getDataLength() throws Exception {
ShortMessage1 message = new ShortMessage1();
/*
* I have some question about this method. I didn't understand how
* should to work this method, but some results I get by
* experimental method.
* From 0 up to 127, from 256 up to 383 and so on this method throw
* out exception, i.e. after 256 begin cycle with some small
* differences in the first lap, from 0 up to 255. From the second
* lap and so on this method, getDataLength(int), throw out
* exception with value of status from 496 up to 511, from 752 up to
* 767 and so on, i.e. on the last 16 number of 256-lap.
* And now differences in the first lap. This method don't throw out
* exception with value of status from 240 up to 255. It has next
* behavior:
* - value of status equals 240 -- throw out exception;
* - 241 -- return 1;
* - 242 -- return 2;
* - 243 -- return 1;
* - from 244 up to 245 -- throw out exception;
* - from 246 up to 255 -- return 0;
*/
try {
message.getDataLength1(-1);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(56);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(127);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(240);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(244);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(245);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(256);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
try {
message.getDataLength1(519);
fail("InvalidMidiDataException expected");
} catch (InvalidMidiDataException e) {}
assertEquals(2, message.getDataLength1(128));
assertEquals(1, message.getDataLength1(200));
assertEquals(2, message.getDataLength1(230));
assertEquals(1, message.getDataLength1(241));
assertEquals(2, message.getDataLength1(242));
assertEquals(1, message.getDataLength1(243));
assertEquals(0, message.getDataLength1(250));
assertEquals(2, message.getDataLength1(647));
}
/**
* tests method clone() of class ShortMessage
*
*/
public void test_clone1() {
ShortMessage message = new ShortMessage();
assertTrue(message.clone() != message);
assertEquals(message.clone().getClass(), message.getClass());
ShortMessage tmessage;
tmessage = (ShortMessage) message.clone();
assertEquals(message.getLength(), tmessage.getLength());
assertEquals(message.getMessage().length, tmessage.getMessage().length);
assertEquals(message.getData1(), tmessage.getData1());
assertEquals(message.getData2(), tmessage.getData2());
assertEquals(message.getChannel(), tmessage.getChannel());
assertEquals(message.getCommand(), tmessage.getCommand());
assertEquals(message.getStatus(), tmessage.getStatus());
if (message.getMessage().length != 0) {
for (int i = 0; i < message.getMessage().length; i++) {
assertEquals(message.getMessage()[i], tmessage.getMessage()[i]);
}
}
}
public void test_clone2() {
byte[] bt = new byte[] {1, 2, 3, 4, 5};
ShortMessage1 message = new ShortMessage1(bt);
assertTrue(message.clone() != message);
ShortMessage tmessage;
tmessage = (ShortMessage) message.clone();
assertEquals(message.getLength(), tmessage.getLength());
assertEquals(message.getMessage().length, tmessage.getMessage().length);
assertEquals(message.getData1(), tmessage.getData1());
assertEquals(message.getData2(), tmessage.getData2());
assertEquals(message.getChannel(), tmessage.getChannel());
assertEquals(message.getCommand(), tmessage.getCommand());
assertEquals(message.getStatus(), tmessage.getStatus());
if (message.getMessage().length != 0) {
for (int i = 0; i < message.getMessage().length; i++) {
assertEquals(message.getMessage()[i], tmessage.getMessage()[i]);
}
}
bt[0] = 10;
bt[1] = 20;
bt[2] = 30;
bt[3] = 40;
bt[4] = 50;
/*
* 'real' ShortMessage change, but 'clone' not
*/
//'real'
assertEquals(10, message.getChannel());
assertEquals(0, message.getCommand());
assertEquals(20, message.getData1());
assertEquals(30, message.getData2());
assertEquals(10, message.getStatus());
assertEquals(10, message.getMessage()[0]);
assertEquals(20, message.getMessage()[1]);
assertEquals(30, message.getMessage()[2]);
assertEquals(40, message.getMessage()[3]);
assertEquals(50, message.getMessage()[4]);
//'clone'
assertEquals(1, tmessage.getChannel());
assertEquals(0, tmessage.getCommand());
assertEquals(2, tmessage.getData1());
assertEquals(3, tmessage.getData2());
assertEquals(1, tmessage.getStatus());
assertEquals(1, tmessage.getMessage()[0]);
assertEquals(2, tmessage.getMessage()[1]);
assertEquals(3, tmessage.getMessage()[2]);
assertEquals(4, tmessage.getMessage()[3]);
assertEquals(5, tmessage.getMessage()[4]);
}
public void test_clone3() throws Exception {
ShortMessage message = new ShortMessage();
message.setMessage(150, 14, 45, 60);
assertTrue(message.clone() != message);
assertEquals(message.clone().getClass(), message.getClass());
ShortMessage tmessage;
tmessage = (ShortMessage) message.clone();
assertEquals(message.getLength(), tmessage.getLength());
assertEquals(message.getMessage().length, tmessage.getMessage().length);
assertEquals(message.getData1(), tmessage.getData1());
assertEquals(message.getData2(), tmessage.getData2());
assertEquals(message.getChannel(), tmessage.getChannel());
assertEquals(message.getCommand(), tmessage.getCommand());
assertEquals(message.getStatus(), tmessage.getStatus());
if (message.getMessage().length != 0) {
for (int i = 0; i < message.getMessage().length; i++) {
assertEquals(message.getMessage()[i], tmessage.getMessage()[i]);
}
}
}
/**
* Subsidiary class in order to use constructor
* and method getDataLength( int ) of class Instrument,
* because its declared as protected
*/
static class ShortMessage1 extends ShortMessage {
ShortMessage1() {
super();
}
ShortMessage1(byte[] data) {
super(data);
}
public int getDataLength1(int status) throws InvalidMidiDataException {
return super.getDataLength(status);
}
}
}