package com.xenoage.zong.core.util;
import static com.xenoage.utils.math.Fraction._0;
import static com.xenoage.utils.math.Fraction._1$8;
import static com.xenoage.zong.core.music.Pitch.C;
import static com.xenoage.zong.core.music.Pitch.pi;
import static com.xenoage.zong.core.music.chord.ChordFactory.chord;
import static com.xenoage.zong.core.position.MP.atBeat;
import static com.xenoage.zong.core.position.MP.atElement;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.music.beam.Beam;
import com.xenoage.zong.core.music.rest.Rest;
import com.xenoage.zong.core.position.MP;
import com.xenoage.zong.io.selection.Cursor;
/**
* Tests for {@link BeamIterator}.
*
* @author Andreas Wenger
*/
public class BeamIteratorTest {
@Test public void test() {
BeamIterator it = new BeamIterator(createTestScore());
//first beam
assertTrue(it.hasNext());
Beam beam = it.next();
assertEquals(atBeat(0, 0, 1, _0), beam.getMP());
//second beam (two staves)
assertTrue(it.hasNext());
beam = it.next();
assertEquals(atBeat(0, 2, 0, _0), beam.getMP());
assertEquals(atBeat(0, 2, 0, _0), beam.getChord(0).getMP());
assertEquals(atBeat(1, 2, 0, _1$8), beam.getChord(1).getMP());
//third chord
assertTrue(it.hasNext());
beam = it.next();
assertEquals(atBeat(1, 3, 0, _0), beam.getMP());
//finished
assertFalse(it.hasNext());
}
/**
* Test score with 2 staves and 4 measures. In measure 0, there is a beam in
* staff 0 in voice 1. In measure 2, there is a beam spanning over two staves.
* In measure 3, there is a beam in staff 1 in voice 0.
*/
public static Score createTestScore() {
Score score = new Score();
Cursor cursor = new Cursor(score, MP.mp0, true);
//first beam
cursor.setMp(atElement(0, 0, 1, 0));
cursor.openBeam();
cursor.write(chord(pi(C, 4), _1$8));
cursor.write(chord(pi(C, 4), _1$8));
cursor.write(chord(pi(C, 4), _1$8));
cursor.write(chord(pi(C, 4), _1$8));
cursor.closeBeam();
//second beam
cursor.setMp(atElement(0, 2, 0, 0));
cursor.openBeam();
cursor.write(chord(pi(C, 4), _1$8));
cursor.setMp(atElement(1, 2, 0, 0));
cursor.write(new Rest(_1$8));
cursor.write(chord(pi(C, 4), _1$8));
cursor.closeBeam();
//third beam
cursor.setMp(atElement(1, 3, 0, 0));
cursor.openBeam();
cursor.write(chord(pi(C, 4), _1$8));
cursor.write(chord(pi(C, 4), _1$8));
cursor.closeBeam();
return score;
}
}