package org.pitest.testapi.execute;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.pitest.testapi.Configuration;
import org.pitest.testapi.TestUnit;
/**
* Scans classes to discover TestUnits
*
*/
public class FindTestUnits {
private final Configuration config;
public FindTestUnits(final Configuration config) {
this.config = config;
}
public List<TestUnit> findTestUnitsForAllSuppliedClasses(
final Iterable<Class<?>> classes) {
final List<TestUnit> testUnits = new ArrayList<TestUnit>();
for (final Class<?> c : classes) {
final Collection<TestUnit> testUnitsFromClass = getTestUnits(c);
testUnits.addAll(testUnitsFromClass);
}
return testUnits;
}
private Collection<TestUnit> getTestUnits(final Class<?> suiteClass) {
final List<TestUnit> tus = new ArrayList<TestUnit>();
final Set<Class<?>> visitedClasses = new HashSet<Class<?>>();
findTestUnits(tus, visitedClasses, suiteClass);
return tus;
}
private void findTestUnits(final List<TestUnit> tus,
final Set<Class<?>> visitedClasses, final Class<?> suiteClass) {
visitedClasses.add(suiteClass);
final Collection<Class<?>> tcs = this.config.testSuiteFinder().apply(
suiteClass);
for (final Class<?> tc : tcs) {
if (!visitedClasses.contains(tc)) {
findTestUnits(tus, visitedClasses, tc);
}
}
final List<TestUnit> testsInThisClass = this.config.testUnitFinder()
.findTestUnits(suiteClass);
if (!testsInThisClass.isEmpty()) {
tus.addAll(testsInThisClass);
}
}
}