package musicxmltestsuite.tests.utils;
import com.xenoage.utils.kernel.Tuple2;
import com.xenoage.utils.math.Fraction;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.core.header.ColumnHeader;
import com.xenoage.zong.core.music.Measure;
import com.xenoage.zong.core.music.barline.Barline;
import com.xenoage.zong.core.music.clef.Clef;
import com.xenoage.zong.core.music.direction.Direction;
import com.xenoage.zong.core.music.key.Key;
import com.xenoage.zong.core.music.volta.Volta;
import com.xenoage.zong.core.position.MP;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import static com.xenoage.utils.kernel.Range.range;
import static org.junit.Assert.*;
public class ScoreTest {
public static void testClefs(List<Tuple2<MP, Clef>> expectedClefs, Score score) {
testMeasureElements(expectedClefs, score, (measure, beat) -> measure.getClefs().get(beat));
}
public static void testDirections(List<Tuple2<MP, Direction>> expectedDirections, Score score) {
testMeasureElements(expectedDirections, score, (measure, beat) -> measure.getDirections().get(beat));
}
public static void testKeys(List<Tuple2<MP, Key>> expectedKeys, Score score) {
testColumnElements(expectedKeys, score, (column, beat) -> column.getKeys().get(beat));
}
public static void testMiddleBarlines(List<Tuple2<MP, Barline>> expectedBarlines, Score score) {
testColumnElements(expectedBarlines, score, (measure, beat) -> measure.getMiddleBarlines().get(beat));
}
private static <T> void testMeasureElements(List<Tuple2<MP, T>> expectedElements, Score score,
BiFunction<Measure, Fraction, T> getElementAtBeat) {
for (Tuple2<MP, T> expectedElement : expectedElements) {
MP mp = expectedElement.get1();
Measure measure = score.getMeasure(mp);
T element = getElementAtBeat.apply(measure, mp.beat);
assertNotNull(""+mp, element);
assertEquals(""+mp, expectedElement.get2(), element);
}
}
private static <T> void testColumnElements(List<Tuple2<MP, T>> expectedElements, Score score,
BiFunction<ColumnHeader, Fraction, T> getElementAtBeat) {
for (Tuple2<MP, T> expectedElement : expectedElements) {
MP mp = expectedElement.get1();
ColumnHeader columnHeader = score.getColumnHeader(mp.measure);
T element = getElementAtBeat.apply(columnHeader, mp.beat);
assertNotNull(""+mp, element);
assertEquals(""+mp, expectedElement.get2(), element);
}
}
public static void assertEqualsStartBarlines(Barline[] expectedStartBarlines, Score score) {
testColumnElements(expectedStartBarlines, score, ColumnHeader::getStartBarline);
}
public static void assertEqualsEndBarlines(Barline[] expectedEndBarlines, Score score) {
testColumnElements(expectedEndBarlines, score, ColumnHeader::getEndBarline);
}
public static void assertEqualsVoltas(Volta[] expectedVoltas, Score score) {
testColumnElements(expectedVoltas, score, ColumnHeader::getVolta);
}
private static <T> void testColumnElements(T[] expectedElements, Score score,
Function<ColumnHeader, T> getElement) {
assertEquals(expectedElements.length, score.getMeasuresCount());
for (int iMeasure : range(expectedElements.length)) {
T expectedElement = expectedElements[iMeasure];
T element = getElement.apply(score.getHeader().getColumnHeader(iMeasure));
if (expectedElement == null)
assertNull("Measure "+iMeasure, element);
else
assertEquals("Measure "+iMeasure, expectedElements[iMeasure], element);
}
}
}