001package org.hl7.fhir.utilities.tests.execution.junit4;
002
003import lombok.Getter;
004import org.hl7.fhir.utilities.tests.execution.CliTestSummary;
005import org.hl7.fhir.utilities.tests.execution.ModuleTestExecutor;
006import org.junit.runner.Description;
007import org.junit.runner.JUnitCore;
008import org.junit.runner.notification.Failure;
009import org.junit.runner.notification.RunListener;
010
011import java.io.PrintStream;
012import java.util.ArrayList;
013import java.util.Collections;
014import java.util.List;
015import java.util.regex.Pattern;
016import java.util.stream.Collectors;
017
018public class JUnit4TestExecutor extends ModuleTestExecutor {
019
020  @Getter
021  private final String moduleName;
022
023  private final List<String> classNames;
024  public JUnit4TestExecutor(String moduleName, List<String> classNames) {
025    this.moduleName = moduleName + " (JUnit4)";
026    this.classNames = Collections.unmodifiableList(new ArrayList<>(classNames));
027  }
028
029  private class JUnit4RunListener extends RunListener {
030
031    PrintStream writer;
032    public JUnit4RunListener(PrintStream writer) {
033      this.writer = writer;
034    }
035
036    @Override
037    public void testStarted(Description description) {
038      ModuleTestExecutor.printTestStarted(writer, description.getDisplayName());
039    }
040
041    @Override
042    public void testFinished(Description description) {
043      ModuleTestExecutor.printTestFinished(writer, description.getDisplayName(),
044        "FINISHED");
045    }
046
047    @Override
048    public void testFailure(Failure failure) {
049      ModuleTestExecutor.printTestFailed(writer,
050
051        failure.getDescription().getDisplayName(),
052        failure.getException()
053      );
054    }
055  }
056
057  public CliTestSummary executeTests(PrintStream out, String classNameFilter) {
058
059    JUnitCore junit = new JUnitCore();
060    junit.addListener(new JUnit4RunListener(System.out));
061
062    Pattern pattern = classNameFilter != null ? Pattern.compile(classNameFilter) : null;
063
064    List<Class<?>> classes = classNames.stream()
065      .filter(className -> pattern == null ? true : pattern.matcher(className).matches())
066      .map(className -> {
067        try {
068          return Class.forName(className);
069        } catch (ClassNotFoundException e) {
070          throw new RuntimeException(e);
071        }
072      })
073      .collect(Collectors.toList());
074
075    Class<?>[] classArray = new Class[classes.size()];
076    classes.toArray(classArray);
077
078      org.junit.runner.Result result = junit.run(classArray);
079      return new JUnit4TestSummaryAdapter(result);
080
081  }
082
083}