package jetbrains.mps.tool.builder.unittest; /*Generated by MPS */ import org.junit.runner.notification.RunListener; import org.junit.runner.Description; import java.util.List; import org.junit.runner.Request; import org.junit.runner.JUnitCore; import java.util.ArrayList; import org.junit.runner.notification.Failure; import org.junit.runner.Result; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class UnitTestRunner extends RunListener { public static final String START_TEST_PREFIX = "<START_TEST>"; public static final String END_TEST_PREFIX = "<END_TEST>"; public static final String FAILURE_TEST_PREFIX = "<TEST_FAILURE_BEGIN>"; public static final String FAILURE_TEST_SUFFIX = "<TEST_FAILURE_END>"; private Description currentDesc; public UnitTestRunner() { } public void start(String[] argv) throws Throwable { runTests(collectTestsToRun(argv)); } private void runTests(List<Request> tests) { JUnitCore jUnitCore = new JUnitCore(); jUnitCore.addListener(this); for (Request test : tests) { if (test == null) { System.err.println("Can't run. Test is Null"); continue; } jUnitCore.run(test); } } private List<Request> collectTestsToRun(String[] argv) throws ClassNotFoundException { List<Request> tests = new ArrayList<Request>(); for (int i = 0; i < argv.length; i++) { if ("-c".equals(argv[i])) { i++; Class<?> testClass = Class.forName(argv[i]); tests.add(Request.aClass(testClass)); } else if ("-m".equals(argv[i])) { i++; String s = argv[i]; int index = s.lastIndexOf('.'); String testCase = s.substring(0, index); String method = s.substring(index + 1); Class<?> testClass = Class.forName(testCase); tests.add(Request.aClass(testClass).filterWith(Description.createTestDescription(testClass, method))); } } return tests; } private String getTestName(String testName) { String[] parts = testName.split("\\(|\\)"); return parts[1] + "." + parts[0]; } private void testFailed(Failure failure) { System.out.flush(); String testName = getTestName(failure.getTestHeader()); System.err.println(FAILURE_TEST_PREFIX + failure.getMessage()); failure.getException().printStackTrace(System.err); System.err.println(FAILURE_TEST_SUFFIX + testName); System.err.flush(); } @Override public void testRunStarted(Description description) throws Exception { this.currentDesc = description; } @Override public void testRunFinished(Result result) throws Exception { if (result.getRunCount() == 0) { System.err.println("No tests found in " + currentDesc.getDisplayName()); } } @Override public void testStarted(Description description) throws Exception { System.out.println(START_TEST_PREFIX + getTestName(description.getDisplayName())); System.out.flush(); } @Override public void testFinished(Description description) throws Exception { System.out.println(END_TEST_PREFIX + getTestName(description.getDisplayName())); System.out.flush(); } @Override public void testFailure(Failure failure) throws Exception { testFailed(failure); } @Override public void testAssumptionFailure(Failure failure) { testFailed(failure); } @Override public void testIgnored(Description description) throws Exception { super.testIgnored(description); } public static void main(String[] argv) { if (argv.length > 0 && "-w".equals(argv[0])) { try { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); r.readLine(); r.close(); } catch (IOException ignore) { } } UnitTestRunner runner = new UnitTestRunner(); try { runner.start(argv); } catch (Throwable t) { t.printStackTrace(System.err); System.exit(1); } } }