package com.xenoage.zong.core.util;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.music.VoiceElement;
import com.xenoage.zong.core.music.rest.Rest;
import com.xenoage.zong.core.position.MP;
import com.xenoage.zong.io.selection.Cursor;
import org.junit.Test;
import static com.xenoage.utils.kernel.Range.range;
import static com.xenoage.utils.math.Fraction._0;
import static com.xenoage.utils.math.Fraction.fr;
import static com.xenoage.zong.core.position.MP.atElement;
import static com.xenoage.zong.core.position.MP.mp;
import static org.junit.Assert.*;
/**
* Tests for {@link VoiceElementIterator}.
*
* @author Andreas Wenger
*/
public class VoiceElementIteratorTest {
@Test public void test() {
VoiceElementIterator it = new VoiceElementIterator(createTestScore());
for (int staff : range(4)) {
for (int measure : range(4)) {
if ((staff == 1 || staff == 3) && (measure == 1 || measure == 3)) {
//expect two voices with each 4 quarter rests
for (int voice : range(2)) {
for (int element : range(4)) {
assertTrue(it.hasNext());
VoiceElement e = it.next();
assertEquals(mp(staff, measure, voice, fr(element, 4), element), it.getMp());
assertEquals(fr(1, 4), e.getDuration());
}
}
}
else {
//expect a full rest
assertTrue(it.hasNext());
VoiceElement e = it.next();
assertEquals(mp(staff, measure, 0, _0, 0), it.getMp());
assertEquals(fr(1), e.getDuration());
}
}
}
assertFalse(it.hasNext());
}
/**
* Test score with 4 staves and 4 measures. In staves 1 and 3, the measures 1 and 3 have each
* two voices with 4 quarter rests. The other measures have a single voice and
* a full rest.
*/
public static Score createTestScore() {
Score score = new Score();
Cursor cursor = new Cursor(score, MP.mp0, true);
for (int staff : range(4)) {
for (int measure : range(4)) {
if ((staff == 1 || staff == 3) && (measure == 1 || measure == 3)) {
//2 voices with each 4 quarter notes
for (int voice : range(2)) {
cursor.setMp(atElement(staff, measure, voice, 0));
for (int i = 0; i < 4; i++)
cursor.write(new Rest(fr(1, 4)));
}
}
else {
//full rest
cursor.setMp(atElement(staff, measure, 0, 0));
cursor.write(new Rest(fr(1)));
}
}
}
return score;
}
}