package com.xenoage.zong.core.util;
import static com.xenoage.utils.math.Fraction._0;
import static com.xenoage.utils.math.Fraction.fr;
import static com.xenoage.zong.core.music.barline.Barline.barline;
import static com.xenoage.zong.core.music.barline.Barline.barlineRegular;
import static com.xenoage.zong.core.music.barline.BarlineStyle.LightLight;
import static com.xenoage.zong.core.music.barline.BarlineStyle.Regular;
import static com.xenoage.zong.core.music.time.TimeType.time_4_4;
import static com.xenoage.zong.core.position.MP.atBeat;
import static com.xenoage.zong.core.position.MP.atMeasure;
import static com.xenoage.zong.core.position.MP.mp;
import static com.xenoage.zong.core.position.MP.unknown;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import com.xenoage.zong.core.music.time.TimeSignature;
import org.junit.Test;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.header.ColumnHeader;
import com.xenoage.zong.core.music.ColumnElement;
import com.xenoage.zong.core.music.barline.Barline;
import com.xenoage.zong.core.position.MP;
import com.xenoage.zong.io.selection.Cursor;
/**
* Tests for {@link ColumnElementIterator}.
*
* @author Andreas Wenger
*/
public class ColumnElementIteratorTest {
@Test public void test() {
ColumnElementIterator it = new ColumnElementIterator(createTestScore());
for (int measure : new int[]{1, 3}) {
//middle barline is reported first (known beat)
assertTrue(it.hasNext());
ColumnElement e = it.next();
assertEquals(atBeat(unknown, measure, unknown, fr(1, 4)), it.getMp());
assertEquals(Regular, ((Barline) e).getStyle());
//time signature
assertTrue(it.hasNext());
e = it.next();
assertEquals(atMeasure(unknown, measure), it.getMp());
assertEquals(time_4_4, ((TimeSignature) e).getType());
//end barline
assertTrue(it.hasNext());
e = it.next();
assertEquals(atMeasure(unknown, measure), it.getMp());
assertEquals(LightLight, ((Barline) e).getStyle());
}
assertFalse(it.hasNext());
}
/**
* Test score with 4 measures. The measures 1 and 3 have each
* a time signature, a middle barline at 1/4 and an end barline.
*/
public static Score createTestScore() {
Score score = new Score();
Cursor cursor = new Cursor(score, MP.mp0, true);
for (int measure : new int[]{1, 3}) {
cursor.setMp(mp(unknown, measure, 0, _0, 0));
cursor.write(new TimeSignature(time_4_4));
cursor.setMp(mp(unknown, measure, unknown, fr(1, 4), 0));
cursor.write(barlineRegular());
ColumnHeader column = score.getColumnHeader(measure);
column.setEndBarline(barline(LightLight));
}
return score;
}
}