package org.pitest.mutationtest.statistics;
import java.util.LinkedHashMap;
import java.util.Map;
import org.pitest.functional.F;
import org.pitest.functional.F2;
import org.pitest.functional.FCollection;
import org.pitest.mutationtest.DetectionStatus;
class ScorePrecursor {
private final String mutatorName;
private final Map<DetectionStatus, StatusCount> counts;
ScorePrecursor(final String name) {
this.mutatorName = name;
this.counts = createMap();
}
void registerResult(final DetectionStatus result) {
final StatusCount total = this.counts.get(result);
total.increment();
}
Iterable<StatusCount> getCounts() {
return this.counts.values();
}
private long getTotalMutations() {
return FCollection.fold(addTotals(), 0L, this.counts.values());
}
private long getTotalDetectedMutations() {
return FCollection.fold(addTotals(), 0L,
FCollection.filter(this.counts.values(), isDetected()));
}
private static F<StatusCount, Boolean> isDetected() {
return new F<StatusCount, Boolean>() {
@Override
public Boolean apply(final StatusCount a) {
return a.getStatus().isDetected();
}
};
}
private F2<Long, StatusCount, Long> addTotals() {
return new F2<Long, StatusCount, Long>() {
@Override
public Long apply(final Long a, final StatusCount b) {
return a + b.getCount();
}
};
}
private static Map<DetectionStatus, StatusCount> createMap() {
final Map<DetectionStatus, StatusCount> map = new LinkedHashMap<DetectionStatus, StatusCount>();
for (final DetectionStatus each : DetectionStatus.values()) {
map.put(each, new StatusCount(each, 0L));
}
return map;
}
Score toScore() {
return new Score(mutatorName, this.getCounts(), this.getTotalMutations(),
this.getTotalDetectedMutations());
}
}