package musicxmltestsuite; import musicxmltestsuite.report.StatusHtmlReport; import musicxmltestsuite.report.TestStatus; import musicxmltestsuite.tests.base.Base; import musicxmltestsuite.tests.base.OtherTests; import musicxmltestsuite.tests.utils.ToDo; import org.junit.extensions.cpsuite.ClasspathSuite; import org.junit.extensions.cpsuite.ClasspathSuite.BaseTypeFilter; import org.junit.runner.Description; import org.junit.runner.JUnitCore; import org.junit.runner.RunWith; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; import java.util.Arrays; import java.util.Map; /** * Suite for running the unofficial MusicXML Test Suite tests. * * Running this file as a JUnit suite runs all the tests in the suite. * * Running the {@link #runWithHtmlStatusReport()} method creates report HTML files * (see {@link StatusHtmlReport}). * * TODO: ZONG-105: Test midi-out with MusicXML Test Suite * * @author Andreas Wenger */ @RunWith(ClasspathSuite.class) @BaseTypeFilter(Base.class) public class MusicXmlTestSuite extends RunListener { private static JUnitCore runner = null; private static StatusHtmlReport report = new StatusHtmlReport(); public static void runWithHtmlStatusReport() { runner = new JUnitCore(); runner.addListener(new MusicXmlTestSuite()); runner.run(MusicXmlTestSuite.class); Map<TestStatus, String[]> otherTests = OtherTests.getOtherTests(); for (TestStatus status : otherTests.keySet()) Arrays.stream(otherTests.get(status)).forEach( t -> report.report(t, status)); report.writeToHtmlFile(); } @Override public void testFailure(Failure failure) { report(TestStatus.Failure, failure.getDescription()); } @Override public void testFinished(Description description) { if (isToDoAnnotated(description)) report(TestStatus.Incomplete, description); else report(TestStatus.Complete, description); } @Override public void testIgnored(Description description) { report(TestStatus.UnsupportedToDo, description); } private void report(TestStatus status, Description description) { String className = description.getClassName(); report.report(getTestFile(className), getProjectName(className), status); } private String getTestFile(String className) { try { Base base = (Base) Class.forName(className).newInstance(); return base.getFileName(); } catch (Exception ex) { return "?"; } } private String getProjectName(String className) { try { Base base = (Base) Class.forName(className).newInstance(); return base.getProjectName(); } catch (Exception ex) { return "?"; } } private boolean isToDoAnnotated(Description description) { if (description.getAnnotation(ToDo.class) != null) //@Test method annotated return true; if (description.getTestClass().isAnnotationPresent(ToDo.class)) //test class annotated return true; for (Class<?> interf : description.getTestClass().getInterfaces()) if (interf.isAnnotationPresent(ToDo.class)) //interface class annotated return true; return false; } }