package com.xenoage.zong.musiclayout.spacer.beat;
import static com.xenoage.utils.collections.CollectionUtils.alist;
import static com.xenoage.utils.math.Fraction.fr;
import static com.xenoage.zong.core.music.barline.Barline.barlineBackwardRepeat;
import static com.xenoage.zong.core.music.barline.Barline.barlineForwardRepeat;
import static com.xenoage.zong.core.music.barline.Barline.barlineMiddleBothRepeat;
import static com.xenoage.zong.core.music.barline.Barline.barlineRegular;
import static com.xenoage.zong.core.music.barline.BarlineStyle.HeavyLight;
import static com.xenoage.zong.core.music.barline.BarlineStyle.LightHeavy;
import static com.xenoage.zong.core.music.barline.BarlineStyle.LightLight;
import static com.xenoage.zong.musiclayout.spacer.beat.BarlinesBeatOffsetter.barlinesBeatOffsetter;
import static org.junit.Assert.assertEquals;
import java.util.List;
import org.junit.Test;
import com.xenoage.zong.core.header.ColumnHeader;
import com.xenoage.zong.musiclayout.spacing.BeatOffset;
/**
* Tests for {@link BarlinesBeatOffsetter}.
*
* @author Andreas Wenger
*/
public class BarlinesBeatOffsetterTest {
private BarlinesBeatOffsetter testee = barlinesBeatOffsetter;
@Test public void computeBeatOffsetsTest() {
//notes: | 1/4 1/4 || 1/4 | 1/4 |
//barlines: |: :||: | :|
float d = 2; //original distance between notes
float is = 1.5f; //interline space
//create original offsets
List<BeatOffset> baseOffsets = alist(
new BeatOffset(fr(0, 4), 0 * d), new BeatOffset(fr(1, 4), 1 * d),
new BeatOffset(fr(2, 4), 2 * d), new BeatOffset(fr(3, 4), 3 * d),
new BeatOffset(fr(4, 4), 4 * d));
//create barlines
ColumnHeader ch = new ColumnHeader(null, 0);
ch.setStartBarline(barlineForwardRepeat(HeavyLight));
ch.setMiddleBarline(barlineMiddleBothRepeat(LightLight, 1), fr(2, 4));
ch.setMiddleBarline(barlineRegular(), fr(3, 4));
ch.setEndBarline(barlineBackwardRepeat(LightHeavy, 1));
//compute new offsets and check results
BarlinesBeatOffsetter.Result result = testee.compute(baseOffsets, ch, is);
float dRep = BarlinesBeatOffsetter.repeatSpace * is;
float dMid = BarlinesBeatOffsetter.midBarlineSpace * is;
//note offsets
List<BeatOffset> vo = result.voiceElementOffsets;
assertEquals(5, vo.size());
assertEquals(new BeatOffset(fr(0, 4), 0 * d + 1 * dRep), vo.get(0));
assertEquals(new BeatOffset(fr(1, 4), 1 * d + 1 * dRep), vo.get(1));
assertEquals(new BeatOffset(fr(2, 4), 2 * d + 3 * dRep + 1 * dMid), vo.get(2));
assertEquals(new BeatOffset(fr(3, 4), 3 * d + 3 * dRep + 2 * dMid), vo.get(3));
assertEquals(new BeatOffset(fr(4, 4), 4 * d + 3 * dRep + 2 * dMid), vo.get(4));
//barline offsets
List<BeatOffset> bo = result.barlineOffsets;
assertEquals(4, bo.size());
assertEquals(new BeatOffset(fr(0, 4), 0 * d + 0 * dRep), bo.get(0));
assertEquals(new BeatOffset(fr(2, 4), 2 * d + 2 * dRep), bo.get(1));
assertEquals(new BeatOffset(fr(3, 4), 3 * d + 3 * dRep + 1 * dMid), bo.get(2));
assertEquals(new BeatOffset(fr(4, 4), 4 * d + 4 * dRep + 2 * dMid), bo.get(3));
}
}