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}