package org.pitest.coverage.execute;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.pitest.dependency.DependencyExtractor;
import org.pitest.functional.F;
import org.pitest.functional.FCollection;
import org.pitest.functional.predicate.Predicate;
import org.pitest.testapi.TestUnit;
import org.pitest.util.Unchecked;
class DependencyFilter {
private final DependencyExtractor analyser;
private final Predicate<String> filter;
DependencyFilter(final DependencyExtractor analyser,
final Predicate<String> filter) {
this.analyser = analyser;
this.filter = filter;
}
List<TestUnit> filterTestsByDependencyAnalysis(final List<TestUnit> tus) {
if (this.analyser.getMaxDistance() < 0) {
return tus;
} else {
return FCollection.filter(tus, isWithinReach());
}
}
private F<TestUnit, Boolean> isWithinReach() {
return new F<TestUnit, Boolean>() {
private final Map<String, Boolean> cache = new HashMap<String, Boolean>();
@Override
public Boolean apply(final TestUnit testUnit) {
final String testClass = testUnit.getDescription().getFirstTestClass();
try {
if (this.cache.containsKey(testClass)) {
return this.cache.get(testClass);
} else {
final boolean inReach = !DependencyFilter.this.analyser
.extractCallDependenciesForPackages(testClass,
DependencyFilter.this.filter).isEmpty();
this.cache.put(testClass, inReach);
return inReach;
}
} catch (final IOException e) {
throw Unchecked.translateCheckedException(e);
}
}
};
}
}