/* * Copyright (C) 2013-2017 たんらる */ package fourthline.mmlTools; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import org.junit.Test; import fourthline.mmlTools.core.MMLTicks; import fourthline.mmlTools.core.UndefinedTickException; /** * @author fourthline * */ public class MMLEventListTest { /** * Test method for {@link fourthline.mmlTools.MMLEventList#getMMLNoteEventList(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testGetMMLNoteEventList() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); MMLEventList eventList = new MMLEventList("aaa"); List<MMLNoteEvent> expectList = Arrays.asList( new MMLNoteEvent(57, t4, 0), new MMLNoteEvent(57, t4, t4), new MMLNoteEvent(57, t4, t4*2) ); List<MMLNoteEvent> noteList = eventList.getMMLNoteEventList(); System.out.println(noteList); System.out.println(expectList); assertEquals(expectList.toString(), noteList.toString()); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#addMMLNoteEvent(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testAddMMLNoteEvent_0() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); MMLEventList eventList = new MMLEventList("aaa"); MMLEventList expectList = new MMLEventList("ab-a"); // 2つ目のノートを上書きします. eventList.addMMLNoteEvent(new MMLNoteEvent(58, t4, t4)); String expected = expectList.getMMLNoteEventList().toString(); String actual = eventList.getMMLNoteEventList().toString(); System.out.println(expected); System.out.println(actual); assertEquals(expected, actual); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#addMMLNoteEvent(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testAddMMLNoteEvent_1() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); int t16 = MMLTicks.getTick("16"); MMLEventList eventList = new MMLEventList("aaa"); MMLEventList expectList = new MMLEventList("a8.b-16aa"); // 1つ目のノートの途中位置に新しく挿入します. eventList.addMMLNoteEvent(new MMLNoteEvent(58, t16, t4 - t16)); String expected = expectList.getMMLNoteEventList().toString(); String actual = eventList.getMMLNoteEventList().toString(); System.out.println(expected); System.out.println(actual); assertEquals(expected, actual); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#addMMLNoteEvent(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testAddMMLNoteEvent_2() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); int t16 = MMLTicks.getTick("16"); MMLEventList eventList = new MMLEventList("aaa"); MMLEventList expectList = new MMLEventList("a8.b-16&b-a"); // 1つ目のノートの途中位置に新しく挿入します. かつ、2つ目のノートを上書きします. eventList.addMMLNoteEvent(new MMLNoteEvent(58, t16+t4, t4 - t16)); String expected = expectList.getMMLNoteEventList().toString(); String actual = eventList.getMMLNoteEventList().toString(); System.out.println(expected); System.out.println(actual); assertEquals(expected, actual); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#addMMLNoteEvent(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testAddMMLNoteEvent_3() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); int t8 = MMLTicks.getTick("8"); int t16 = MMLTicks.getTick("16"); MMLEventList eventList = new MMLEventList("aaa"); MMLEventList expectList = new MMLEventList("a8.b-16&b-8r8a"); // 1つ目のノートの途中位置に新しく挿入します. かつ、2つ目のノートを上書きしますが、tickが足りないパターンです. eventList.addMMLNoteEvent(new MMLNoteEvent(58, t16+t8, t4 - t16)); String expected = expectList.getMMLNoteEventList().toString(); String actual = eventList.getMMLNoteEventList().toString(); System.out.println(expected); System.out.println(actual); assertEquals(expected, actual); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#addMMLNoteEvent(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testAddMMLNoteEvent_4() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); int t16 = MMLTicks.getTick("16"); MMLEventList eventList = new MMLEventList("aaa"); MMLEventList expectList = new MMLEventList("a8.b-16&b-4&b-4"); // 1つ目のノートの途中位置に新しく挿入します. かつ、2つ目、3つ目のノートを上書きします. eventList.addMMLNoteEvent(new MMLNoteEvent(58, t16+t4+t4, t4 - t16)); String expected = expectList.getMMLNoteEventList().toString(); String actual = eventList.getMMLNoteEventList().toString(); System.out.println(expected); System.out.println(actual); assertEquals(expected, actual); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#addMMLNoteEvent(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testAddMMLNoteEvent_5() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); MMLEventList eventList = new MMLEventList("rra"); MMLEventList expectList = new MMLEventList("rb-a"); // 休符の位置に挿入します. eventList.addMMLNoteEvent(new MMLNoteEvent(58, t4, t4)); String expected = expectList.getMMLNoteEventList().toString(); String actual = eventList.getMMLNoteEventList().toString(); System.out.println(expected); System.out.println(actual); assertEquals(expected, actual); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#searchOnTickOffset(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testSearchOnTickOffset() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); int t16 = MMLTicks.getTick("16"); MMLEventList eventList = new MMLEventList("ab-a"); // 0 MMLNoteEvent noteEvent0 = eventList.searchOnTickOffset(0); assertEquals(57, noteEvent0.getNote()); // 1 MMLNoteEvent noteEvent1 = eventList.searchOnTickOffset(t4-1); assertEquals(57, noteEvent1.getNote()); // 2 MMLNoteEvent noteEvent2 = eventList.searchOnTickOffset(t4); assertEquals(58, noteEvent2.getNote()); // 2 MMLNoteEvent noteEvent3 = eventList.searchOnTickOffset(t4+t16); assertEquals(58, noteEvent3.getNote()); } /** * Test method for {@link fourthline.mmlTools.MMLEventList#searchPrevNoteOnTickOffset(fourthline.mmlTools.MMLNoteEvent)}. * @throws UndefinedTickException */ @Test public void testSearchPrevNoteOnTickOffset() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); MMLEventList eventList = new MMLEventList("ab-a"); // 0 MMLNoteEvent noteEvent0 = eventList.searchPrevNoteOnTickOffset(0); assertEquals(null, noteEvent0); // 1 MMLNoteEvent noteEvent1 = eventList.searchPrevNoteOnTickOffset(t4); assertEquals(57, noteEvent1.getNote()); // 2 MMLNoteEvent noteEvent2 = eventList.searchPrevNoteOnTickOffset(t4+t4-1); assertEquals(58, noteEvent2.getNote()); // 2 MMLNoteEvent noteEvent3 = eventList.searchPrevNoteOnTickOffset(t4+t4); assertEquals(58, noteEvent3.getNote()); } @Test public void testToMMLString_0() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("ara"); String mml = eventList.toMMLString(); System.out.println(mml); assertEquals(eventList.toString(), new MMLEventList(mml).toString()); } /** * オクターブ変化を付けたMMLの双方向変換のテスト. * @throws UndefinedTickException */ @Test public void testToMMLString_1() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("cdef-gab>cdef+gab+<c1"); String mml = eventList.toMMLString(); System.out.println(mml); assertEquals(eventList.toString(), new MMLEventList(mml).toString()); } /** * tieによる連結が必要な音価さん. * @throws UndefinedTickException */ @Test public void testToMMLString_2() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("c4&c16g2&g8d1.&d1.&d1.&d24"); String mml = eventList.toMMLString(); System.out.println(mml); assertEquals(eventList.toString(), new MMLEventList(mml).toString()); } /** * tempo, velocity を含むMML. * @throws UndefinedTickException */ @Test public void testToMMLString_3() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("T150v10c8.g16e4v8g-<at120<b-"); String mml = eventList.toMMLString(true, true); System.out.println(mml); assertEquals(eventList.toString(), new MMLEventList(mml).toString()); } /** * tempo, velocity を含むMML. (テンポを跨ぐNoteがある) * @throws UndefinedTickException */ @Test public void testToMMLString_4() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("c2d4"); List<MMLTempoEvent> globalTempoList = new ArrayList<MMLTempoEvent>(); String expectMML = "c8t150v0c8t130c4v8d4"; globalTempoList.add(new MMLTempoEvent(150, 48)); globalTempoList.add(new MMLTempoEvent(130, 96)); eventList.setGlobalTempoList(globalTempoList); String mml = eventList.toMMLString(true, true); System.out.println(mml); assertEquals(expectMML, mml); } /** * tempo, velocity を含むMML. (テンポ指定が最終ノートより後方にある) * @throws UndefinedTickException */ @Test public void testToMMLString_5() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("c4d4"); String expectMML = "c4d4r1.r1.t150"; List<MMLTempoEvent> globalTempoList = new ArrayList<MMLTempoEvent>(); globalTempoList.add(new MMLTempoEvent(150, 96*2+96*12)); eventList.setGlobalTempoList(globalTempoList); String mml = eventList.toMMLString(true, false); System.out.println(mml); assertEquals(expectMML, mml); } /** * tempo, velocity を含むMML. (rTn式) * @throws UndefinedTickException */ @Test public void testToMMLString_7() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("c1r1t150c1"); String expectMML = "c1v0c1t150v8c1"; String mml = eventList.toMMLString(true, true); System.out.println(mml); assertEquals(expectMML, mml); } /** * tempo, velocity を含むMML. (r後のv) * @throws UndefinedTickException */ @Test public void testToMMLString_8() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("v12rc"); String expectMML = "r4v12c4"; String mml = eventList.toMMLString(true, true); System.out.println(mml); assertEquals(expectMML, mml); } /** * 調律符の判定テスト. * @throws UndefinedTickException */ @Test public void testTuningNote() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("c64&c64&c64&c64"); String expectMML = "c64&c64&c64&c64"; String mml = eventList.toMMLString(true, true); System.out.println(mml); assertEquals(expectMML, mml); } /** * オクターブ上限のテスト. */ @Test public void testTopOctave() { MMLEventList eventList = new MMLEventList("c>>>>>c<<<<c"); MMLNoteEvent event1 = eventList.getMMLNoteEventList().get(0); MMLNoteEvent event2 = eventList.getMMLNoteEventList().get(2); assertEquals(event1.getNote(), event2.getNote()); } /** * オクターブ下限のテスト. */ @Test public void testBottomOctave() { MMLEventList eventList = new MMLEventList("c<<<<<c>>>>c"); MMLNoteEvent event1 = eventList.getMMLNoteEventList().get(0); MMLNoteEvent event2 = eventList.getMMLNoteEventList().get(2); assertEquals(event1.getNote(), event2.getNote()); } /** * テンポ+休符のテスト. * @throws UndefinedTickException */ @Test public void testTempoAndR() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("v12t110rt60rt90c"); String expectMML = "t110v0c4t60c4t90v12c4"; String mml = eventList.toMMLString(true, true); System.out.println(mml); assertEquals(expectMML, mml); } /** * list2に1つだけ */ @Test public void testAlignmentStartTick0() { MMLEventList eventList1 = new MMLEventList("rrrc"); MMLEventList eventList2 = new MMLEventList("rrc2"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); MMLNoteEvent note2 = eventList2.getMMLNoteEventList().get(0); int result = eventList1.getAlignmentStartTick(eventList2, note1.getTickOffset()); assertEquals(note2.getTickOffset(), result); } /** * list1のひとつ前まで. */ @Test public void testAlignmentStartTick1() { MMLEventList eventList1 = new MMLEventList("rcrc"); MMLEventList eventList2 = new MMLEventList("r.c2"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); MMLNoteEvent note2 = eventList1.getMMLNoteEventList().get(1); int result = eventList1.getAlignmentStartTick(eventList2, note2.getTickOffset()); assertEquals(note1.getTickOffset(), result); } /** * 同じoffset */ @Test public void testAlignmentStartTick2() { MMLEventList eventList1 = new MMLEventList("rc"); MMLEventList eventList2 = new MMLEventList("rc"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); MMLNoteEvent note2 = eventList1.getMMLNoteEventList().get(0); int result = eventList1.getAlignmentStartTick(eventList2, note1.getTickOffset()); assertEquals(note2.getTickOffset(), result); } /** * endTick = tickOffset */ @Test public void testAlignmentStartTick3() { MMLEventList eventList1 = new MMLEventList("c"); MMLEventList eventList2 = new MMLEventList("rc"); MMLNoteEvent note1 = eventList2.getMMLNoteEventList().get(0); int result = eventList1.getAlignmentStartTick(eventList2, note1.getTickOffset()); assertEquals(note1.getTickOffset(), result); } /** * list2に1つだけ */ @Test public void testAlignmentEndTick0() { MMLEventList eventList1 = new MMLEventList("rrc"); MMLEventList eventList2 = new MMLEventList("rrc2"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); MMLNoteEvent note2 = eventList2.getMMLNoteEventList().get(0); int result = eventList1.getAlignmentEndTick(eventList2, note1.getEndTick()); assertEquals(note2.getEndTick(), result); } /** * list1の1つ後ろまで. */ @Test public void testAlignmentEndTick1() { MMLEventList eventList1 = new MMLEventList("rcrc"); MMLEventList eventList2 = new MMLEventList("r.c2"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); MMLNoteEvent note2 = eventList1.getMMLNoteEventList().get(1); int result = eventList1.getAlignmentEndTick(eventList2, note1.getEndTick()); assertEquals(note2.getEndTick(), result); } /** * 同じoffset */ @Test public void testAlignmentEndTick2() { MMLEventList eventList1 = new MMLEventList("rc"); MMLEventList eventList2 = new MMLEventList("rc"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); MMLNoteEvent note2 = eventList1.getMMLNoteEventList().get(0); int result = eventList1.getAlignmentEndTick(eventList2, note1.getEndTick()); assertEquals(note2.getEndTick(), result); } /** * endTick = tickOffset */ @Test public void testAlignmentEndTick3() { MMLEventList eventList1 = new MMLEventList("c"); MMLEventList eventList2 = new MMLEventList("rc"); MMLNoteEvent note1 = eventList1.getMMLNoteEventList().get(0); int result = eventList1.getAlignmentEndTick(eventList2, note1.getEndTick()); assertEquals(note1.getEndTick(), result); } /** * swap * @throws UndefinedTickException */ @Test public void testSwap0() throws UndefinedTickException { MMLEventList eventList1 = new MMLEventList("rcrc"); MMLEventList eventList2 = new MMLEventList("r.c2"); String mml1 = eventList1.toMMLString(); String mml2 = eventList2.toMMLString(); int endTick = eventList1.getAlignmentEndTick(eventList2, eventList1.getMMLNoteEventList().get(1).getEndTick()); eventList1.swap(eventList2, 0, endTick); System.out.println(eventList1.getMMLNoteEventList().size()); System.out.println(eventList2.getMMLNoteEventList().size()); assertEquals(mml1, eventList2.toMMLString()); assertEquals(mml2, eventList1.toMMLString()); } /** * move * @throws UndefinedTickException */ @Test public void testMove0() throws UndefinedTickException { MMLEventList eventList1 = new MMLEventList("rcrc"); MMLEventList eventList2 = new MMLEventList("r.c2"); String mml1 = eventList1.toMMLString(); int endTick = eventList1.getAlignmentEndTick(eventList2, eventList1.getMMLNoteEventList().get(1).getEndTick()); eventList1.move(eventList2, 0, endTick); System.out.println(eventList1.getMMLNoteEventList().size()); System.out.println(eventList2.getMMLNoteEventList().size()); assertEquals(mml1, eventList2.toMMLString()); assertEquals("", eventList1.toMMLString()); } /** * copy * @throws UndefinedTickException */ @Test public void testCopy0() throws UndefinedTickException { MMLEventList eventList1 = new MMLEventList("rcrc"); MMLEventList eventList2 = new MMLEventList("r.c2"); String mml1 = eventList1.toMMLString(); int endTick = eventList1.getAlignmentEndTick(eventList2, eventList1.getMMLNoteEventList().get(1).getEndTick()); eventList1.copy(eventList2, 0, endTick); System.out.println(eventList1.getMMLNoteEventList().size()); System.out.println(eventList2.getMMLNoteEventList().size()); assertEquals(mml1, eventList2.toMMLString()); assertEquals(mml1, eventList1.toMMLString()); } @Test public void testIndexOfMMLString_1() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); MMLEventList eventList = new MMLEventList("rrcd&drrf."); assertArrayEquals( new int[]{0, 2}, eventList.indexOfMMLString(0) ); assertArrayEquals( new int[]{0, 2}, eventList.indexOfMMLString(t4) ); assertArrayEquals( new int[]{0, 2}, eventList.indexOfMMLString(t4*2-1) ); assertArrayEquals( new int[]{2, 3}, eventList.indexOfMMLString(t4*2) ); assertArrayEquals( new int[]{2, 3}, eventList.indexOfMMLString(t4*3-1) ); assertArrayEquals( new int[]{3, 6}, eventList.indexOfMMLString(t4*3) ); assertArrayEquals( new int[]{3, 6}, eventList.indexOfMMLString(t4*4) ); assertArrayEquals( new int[]{3, 6}, eventList.indexOfMMLString(t4*5-1) ); assertArrayEquals( new int[]{6, 8}, eventList.indexOfMMLString(t4*5) ); assertArrayEquals( new int[]{6, 8}, eventList.indexOfMMLString(t4*6) ); assertArrayEquals( new int[]{6, 8}, eventList.indexOfMMLString(t4*7-1) ); assertArrayEquals( new int[]{8, 10}, eventList.indexOfMMLString(t4*7) ); assertArrayEquals( new int[]{8, 10}, eventList.indexOfMMLString(t4*8+t4/2-1) ); assertArrayEquals( new int[]{10, 10}, eventList.indexOfMMLString(t4*8+t4/2) ); } @Test public void testIndexOfMMLString_2() throws UndefinedTickException { int t4 = MMLTicks.getTick("4"); MMLEventList eventList = new MMLEventList("rrv10c8t250l16d"); assertArrayEquals( new int[]{0, 5}, eventList.indexOfMMLString(0) ); assertArrayEquals( new int[]{5, 7}, eventList.indexOfMMLString(t4*2) ); assertArrayEquals( new int[]{14, 15}, eventList.indexOfMMLString(t4*2+t4/2) ); assertArrayEquals( new int[]{15, 15}, eventList.indexOfMMLString(t4*4) ); } @Test public void testIndexOfMMLString_3() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("l64c&c&c&c&c&c&c&c"); assertArrayEquals( new int[]{3, 18}, eventList.indexOfMMLString(0) ); } @Test public void testV0_4() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("v0cdcd"); assertEquals("v0c4d4c4d4", eventList.toMMLString()); } @Test public void testSetUnsetVelocity_0() throws UndefinedTickException { MMLEventList eventList = new MMLEventList("v12cdefv7g"); MMLEventList eventList2 = new MMLEventList("v12cdv10efv7g"); MMLEventList eventList3 = new MMLEventList("v12cdefv7g"); MMLNoteEvent target = eventList.getMMLNoteEventList().get(2); eventList.setVelocityCommand(target, 10); assertEquals(eventList2.toMMLString(), eventList.toMMLString()); eventList.unsetVelocityCommand(target); assertEquals(eventList3.toMMLString(), eventList.toMMLString()); } @Test public void test_clone() throws CloneNotSupportedException { MMLEventList eventList1 = new MMLEventList("t120cde"); MMLEventList eventList2 = eventList1.clone(); Objects.deepEquals(eventList1, eventList2); assertEquals( eventList1.getGlobalTempoList().get(0), eventList2.getGlobalTempoList().get(0)); assertNotSame( eventList1.getGlobalTempoList().get(0), eventList2.getGlobalTempoList().get(0)); assertEquals( eventList1.getMMLNoteEventList().get(0), eventList2.getMMLNoteEventList().get(0)); assertNotSame( eventList1.getMMLNoteEventList().get(0), eventList2.getMMLNoteEventList().get(0)); } @Test public void test_plus() throws UndefinedTickException { MMLEventList eventList1 = new MMLEventList("c+"); MMLEventList eventList2 = new MMLEventList("c#"); assertEquals(eventList1.toString(), eventList2.toString()); } @Test public void test_illegalMML() throws UndefinedTickException { MMLEventList eventList1 = new MMLEventList("l8bNwMub+4.ebb+htt16b16c.cc+c2."); System.out.println(eventList1.getTickLength()); MMLEventList eventList2 = new MMLEventList("l8bb+4.ebb+b16c.cc+c2."); System.out.println(eventList2.getTickLength()); assertEquals(eventList1.toMMLString(), eventList2.toMMLString()); } @Test public void testParse_m1() throws UndefinedTickException { MMLEventList eventList1 = new MMLEventList("o0c-"); assertEquals("<<<<c-4", eventList1.toMMLString()); } @Test public void testOverlap() { MMLEventList eventList = new MMLEventList("crc"); MMLNoteEvent e1 = new MMLEventList("rc").getMMLNoteEventList().get(0); assertEquals(false, eventList.isOverlapNote(e1)); e1.setTickOffset(e1.getTickOffset()-1); assertEquals(true, eventList.isOverlapNote(e1)); e1.setTickOffset(e1.getTickOffset()+2); assertEquals(true, eventList.isOverlapNote(e1)); e1.setTick(e1.getTick()-1); assertEquals(false, eventList.isOverlapNote(e1)); } }